slirp updates
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEaw+sIYVmRulKotIAoAMZaCdBSIAFAlhZuSkACgkQoAMZaCdB SIC7Ww//WrLucx5WC4pp5Eoq4js5sZ4Z35LDj89VtCmVg9M09ti3ryzdphwuUk+s S82SojwRodSd1QzBkqk2m5AIGm1KbRF7tl8S31OrBwZqOwo5jSfXoXvrvnFbKxSg qXlACZ7rJeCp29CBZxy3Tw792tlZI9+YCkuDmOQzhDLe3iLHBP1PvTpvI2GiYfr6 OpfMtWqguQULjS4RQfNjplxhRa/W0e8KZAp7BZDOiG8KzqMV+7PBCXDUKsSvsVR6 VcYCL4f8V/9XCriWqOPica67sl9iwoPHESJM9f1MOPZYA7ykFPPW2qMFbyCaGpQV p6nghZSg+Q5dMIjvaolGG4x/JwggFy9LPtqzFuu3r2OpSnIYqGCwzL81QurJcj3G Iqzm4SINM8TSk+IRvCHo7qqrZukSFqx6gYBUO/tvxRTKqWIRmCMBgkSV2/yga1fi EeCKSoj+9gSUpdWsDqW+yeYTi3FvcHGadlNHvy0rJhAv5LGIvsF87gwwqqimtQgS AL8rw8kQ7RhwxFNo9OskICk8EAGKE04EPtdfqTTihmFg3d/Grlg0y07U2yZxVjNw 0+bv9gdIqLZdCEvmjqM+5zaL+jm6K2G7zoZ7wtT3hyvaY8Ls6hA90tUbywfF3AmP kx0VRtqtLoNxwyOz/DclEuweyTyMAA1URM1Rjv+QRaoOeV6I8Oc= =nqB8 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/thibault/tags/samuel-thibault' into staging slirp updates # gpg: Signature made Tue 20 Dec 2016 23:05:13 GMT # gpg: using RSA key 0xA003196827414880 # gpg: Good signature from "Samuel Thibault <samuel.thibault@gnu.org>" # gpg: aka "Samuel Thibault <sthibault@debian.org>" # gpg: aka "Samuel Thibault <samuel.thibault@inria.fr>" # gpg: aka "Samuel Thibault <samuel.thibault@labri.fr>" # gpg: aka "Samuel Thibault <samuel.thibault@ens-lyon.org>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 900C B024 B679 31D4 0F82 304B D017 8C76 7D06 9EE6 # Subkey fingerprint: 6B0F AC21 8566 46E9 4AA2 D200 A003 1968 2741 4880 * remotes/thibault/tags/samuel-thibault: slirp: support dynamic block size for TFTP transfers slirp, disas: Replace min/max with MIN/MAX macros Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
225adf16d2
@ -4698,10 +4698,6 @@ get_field (const unsigned char *data, enum floatformat_byteorders order,
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifndef min
|
||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
/* Convert from FMT to a double.
|
||||
FROM is the address of the extended float.
|
||||
Store the double in *TO. */
|
||||
@ -4733,7 +4729,7 @@ floatformat_to_double (const struct floatformat *fmt,
|
||||
nan = 0;
|
||||
while (mant_bits_left > 0)
|
||||
{
|
||||
mant_bits = min (mant_bits_left, 32);
|
||||
mant_bits = MIN(mant_bits_left, 32);
|
||||
|
||||
if (get_field (ufrom, fmt->byteorder, fmt->totalsize,
|
||||
mant_off, mant_bits) != 0)
|
||||
@ -4793,7 +4789,7 @@ floatformat_to_double (const struct floatformat *fmt,
|
||||
|
||||
while (mant_bits_left > 0)
|
||||
{
|
||||
mant_bits = min (mant_bits_left, 32);
|
||||
mant_bits = MIN(mant_bits_left, 32);
|
||||
|
||||
mant = get_field (ufrom, fmt->byteorder, fmt->totalsize,
|
||||
mant_off, mant_bits);
|
||||
|
@ -168,7 +168,7 @@ static void dhcpv6_info_request(Slirp *slirp, struct sockaddr_in6 *srcsas,
|
||||
sa[0], sa[1], sa[2], sa[3], sa[4], sa[5], sa[6], sa[7],
|
||||
sa[8], sa[9], sa[10], sa[11], sa[12], sa[13], sa[14],
|
||||
sa[15], slirp->bootp_filename);
|
||||
slen = min(slen, smaxlen);
|
||||
slen = MIN(slen, smaxlen);
|
||||
*resp++ = slen >> 8; /* option-len high byte */
|
||||
*resp++ = slen; /* option-len low byte */
|
||||
resp += slen;
|
||||
|
@ -95,7 +95,7 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code)
|
||||
#endif
|
||||
|
||||
rip->ip_nh = IPPROTO_ICMPV6;
|
||||
const int error_data_len = min(m->m_len,
|
||||
const int error_data_len = MIN(m->m_len,
|
||||
IF_MTU - (sizeof(struct ip6) + ICMP6_ERROR_MINLEN));
|
||||
rip->ip_pl = htons(ICMP6_ERROR_MINLEN + error_data_len);
|
||||
t->m_len = sizeof(struct ip6) + ntohs(rip->ip_pl);
|
||||
|
@ -774,7 +774,7 @@ void slirp_pollfds_poll(GArray *pollfds, int select_error)
|
||||
static void arp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len)
|
||||
{
|
||||
struct slirp_arphdr *ah = (struct slirp_arphdr *)(pkt + ETH_HLEN);
|
||||
uint8_t arp_reply[max(ETH_HLEN + sizeof(struct slirp_arphdr), 64)];
|
||||
uint8_t arp_reply[MAX(ETH_HLEN + sizeof(struct slirp_arphdr), 64)];
|
||||
struct ethhdr *reh = (struct ethhdr *)arp_reply;
|
||||
struct slirp_arphdr *rah = (struct slirp_arphdr *)(arp_reply + ETH_HLEN);
|
||||
int ar_op;
|
||||
|
@ -292,9 +292,4 @@ int tcp_emu(struct socket *, struct mbuf *);
|
||||
int tcp_ctl(struct socket *);
|
||||
struct tcpcb *tcp_drop(struct tcpcb *tp, int err);
|
||||
|
||||
#ifndef _WIN32
|
||||
#define min(x,y) ((x) < (y) ? (x) : (y))
|
||||
#define max(x,y) ((x) > (y) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -596,7 +596,7 @@ findso:
|
||||
win = sbspace(&so->so_rcv);
|
||||
if (win < 0)
|
||||
win = 0;
|
||||
tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt));
|
||||
tp->rcv_wnd = MAX(win, (int)(tp->rcv_adv - tp->rcv_nxt));
|
||||
}
|
||||
|
||||
switch (tp->t_state) {
|
||||
@ -1065,8 +1065,8 @@ trimthenstep6:
|
||||
else if (++tp->t_dupacks == TCPREXMTTHRESH) {
|
||||
tcp_seq onxt = tp->snd_nxt;
|
||||
u_int win =
|
||||
min(tp->snd_wnd, tp->snd_cwnd) / 2 /
|
||||
tp->t_maxseg;
|
||||
MIN(tp->snd_wnd, tp->snd_cwnd) /
|
||||
2 / tp->t_maxseg;
|
||||
|
||||
if (win < 2)
|
||||
win = 2;
|
||||
@ -1138,7 +1138,7 @@ trimthenstep6:
|
||||
|
||||
if (cw > tp->snd_ssthresh)
|
||||
incr = incr * incr / cw;
|
||||
tp->snd_cwnd = min(cw + incr, TCP_MAXWIN<<tp->snd_scale);
|
||||
tp->snd_cwnd = MIN(cw + incr, TCP_MAXWIN << tp->snd_scale);
|
||||
}
|
||||
if (acked > so->so_snd.sb_cc) {
|
||||
tp->snd_wnd -= so->so_snd.sb_cc;
|
||||
@ -1586,11 +1586,11 @@ tcp_mss(struct tcpcb *tp, u_int offer)
|
||||
|
||||
switch (so->so_ffamily) {
|
||||
case AF_INET:
|
||||
mss = min(IF_MTU, IF_MRU) - sizeof(struct tcphdr)
|
||||
mss = MIN(IF_MTU, IF_MRU) - sizeof(struct tcphdr)
|
||||
+ sizeof(struct ip);
|
||||
break;
|
||||
case AF_INET6:
|
||||
mss = min(IF_MTU, IF_MRU) - sizeof(struct tcphdr)
|
||||
mss = MIN(IF_MTU, IF_MRU) - sizeof(struct tcphdr)
|
||||
+ sizeof(struct ip6);
|
||||
break;
|
||||
default:
|
||||
@ -1598,8 +1598,8 @@ tcp_mss(struct tcpcb *tp, u_int offer)
|
||||
}
|
||||
|
||||
if (offer)
|
||||
mss = min(mss, offer);
|
||||
mss = max(mss, 32);
|
||||
mss = MIN(mss, offer);
|
||||
mss = MAX(mss, 32);
|
||||
if (mss < tp->t_maxseg || offer != 0)
|
||||
tp->t_maxseg = mss;
|
||||
|
||||
|
@ -88,7 +88,7 @@ tcp_output(struct tcpcb *tp)
|
||||
again:
|
||||
sendalot = 0;
|
||||
off = tp->snd_nxt - tp->snd_una;
|
||||
win = min(tp->snd_wnd, tp->snd_cwnd);
|
||||
win = MIN(tp->snd_wnd, tp->snd_cwnd);
|
||||
|
||||
flags = tcp_outflags[tp->t_state];
|
||||
|
||||
@ -127,7 +127,7 @@ again:
|
||||
}
|
||||
}
|
||||
|
||||
len = min(so->so_snd.sb_cc, win) - off;
|
||||
len = MIN(so->so_snd.sb_cc, win) - off;
|
||||
|
||||
if (len < 0) {
|
||||
/*
|
||||
@ -193,7 +193,7 @@ again:
|
||||
* taking into account that we are limited by
|
||||
* TCP_MAXWIN << tp->rcv_scale.
|
||||
*/
|
||||
long adv = min(win, (long)TCP_MAXWIN << tp->rcv_scale) -
|
||||
long adv = MIN(win, (long)TCP_MAXWIN << tp->rcv_scale) -
|
||||
(tp->rcv_adv - tp->rcv_nxt);
|
||||
|
||||
if (adv >= (long) (2 * tp->t_maxseg))
|
||||
|
@ -233,7 +233,7 @@ tcp_timers(register struct tcpcb *tp, int timer)
|
||||
* to go below this.)
|
||||
*/
|
||||
{
|
||||
u_int win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg;
|
||||
u_int win = MIN(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg;
|
||||
if (win < 2)
|
||||
win = 2;
|
||||
tp->snd_cwnd = tp->t_maxseg;
|
||||
|
@ -85,7 +85,7 @@ struct tcpiphdr {
|
||||
/* This is the difference between the size of a tcpiphdr structure, and the
|
||||
* size of actual ip+tcp headers, rounded up since we need to align data. */
|
||||
#define TCPIPHDR_DELTA\
|
||||
(max(0,\
|
||||
(MAX(0,\
|
||||
(sizeof(struct tcpiphdr)\
|
||||
- sizeof(struct ip) - sizeof(struct tcphdr) + 3) & ~3))
|
||||
|
||||
|
26
slirp/tftp.c
26
slirp/tftp.c
@ -72,6 +72,7 @@ static int tftp_session_allocate(Slirp *slirp, struct sockaddr_storage *srcsas,
|
||||
memset(spt, 0, sizeof(*spt));
|
||||
spt->client_addr = *srcsas;
|
||||
spt->fd = -1;
|
||||
spt->block_size = 512;
|
||||
spt->client_port = tp->udp.uh_sport;
|
||||
spt->slirp = slirp;
|
||||
|
||||
@ -115,7 +116,7 @@ static int tftp_read_data(struct tftp_session *spt, uint32_t block_nr,
|
||||
}
|
||||
|
||||
if (len) {
|
||||
lseek(spt->fd, block_nr * 512, SEEK_SET);
|
||||
lseek(spt->fd, block_nr * spt->block_size, SEEK_SET);
|
||||
|
||||
bytes_read = read(spt->fd, buf, len);
|
||||
}
|
||||
@ -189,7 +190,8 @@ static int tftp_send_oack(struct tftp_session *spt,
|
||||
values[i]) + 1;
|
||||
}
|
||||
|
||||
m->m_len = sizeof(struct tftp_t) - 514 + n - sizeof(struct udphdr);
|
||||
m->m_len = sizeof(struct tftp_t) - (TFTP_BLOCKSIZE_MAX + 2) + n
|
||||
- sizeof(struct udphdr);
|
||||
tftp_udp_output(spt, m, recv_tp);
|
||||
|
||||
return 0;
|
||||
@ -214,7 +216,7 @@ static void tftp_send_error(struct tftp_session *spt,
|
||||
tp->x.tp_error.tp_error_code = htons(errorcode);
|
||||
pstrcpy((char *)tp->x.tp_error.tp_msg, sizeof(tp->x.tp_error.tp_msg), msg);
|
||||
|
||||
m->m_len = sizeof(struct tftp_t) - 514 + 3 + strlen(msg)
|
||||
m->m_len = sizeof(struct tftp_t) - (TFTP_BLOCKSIZE_MAX + 2) + 3 + strlen(msg)
|
||||
- sizeof(struct udphdr);
|
||||
tftp_udp_output(spt, m, recv_tp);
|
||||
|
||||
@ -240,7 +242,8 @@ static void tftp_send_next_block(struct tftp_session *spt,
|
||||
tp->tp_op = htons(TFTP_DATA);
|
||||
tp->x.tp_data.tp_block_nr = htons((spt->block_nr + 1) & 0xffff);
|
||||
|
||||
nobytes = tftp_read_data(spt, spt->block_nr, tp->x.tp_data.tp_buf, 512);
|
||||
nobytes = tftp_read_data(spt, spt->block_nr, tp->x.tp_data.tp_buf,
|
||||
spt->block_size);
|
||||
|
||||
if (nobytes < 0) {
|
||||
m_free(m);
|
||||
@ -252,10 +255,11 @@ static void tftp_send_next_block(struct tftp_session *spt,
|
||||
return;
|
||||
}
|
||||
|
||||
m->m_len = sizeof(struct tftp_t) - (512 - nobytes) - sizeof(struct udphdr);
|
||||
m->m_len = sizeof(struct tftp_t) - (TFTP_BLOCKSIZE_MAX - nobytes)
|
||||
- sizeof(struct udphdr);
|
||||
tftp_udp_output(spt, m, recv_tp);
|
||||
|
||||
if (nobytes == 512) {
|
||||
if (nobytes == spt->block_size) {
|
||||
tftp_session_update(spt);
|
||||
}
|
||||
else {
|
||||
@ -385,13 +389,11 @@ static void tftp_handle_rrq(Slirp *slirp, struct sockaddr_storage *srcsas,
|
||||
} else if (strcasecmp(key, "blksize") == 0) {
|
||||
int blksize = atoi(value);
|
||||
|
||||
/* If blksize option is bigger than what we will
|
||||
* emit, accept the option with our packet size.
|
||||
* Otherwise, simply do as we didn't see the option.
|
||||
*/
|
||||
if (blksize >= 512) {
|
||||
/* Accept blksize up to our maximum size */
|
||||
if (blksize > 0) {
|
||||
spt->block_size = MIN(blksize, TFTP_BLOCKSIZE_MAX);
|
||||
option_name[nb_options] = "blksize";
|
||||
option_value[nb_options] = 512;
|
||||
option_value[nb_options] = spt->block_size;
|
||||
nb_options++;
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define TFTP_OACK 6
|
||||
|
||||
#define TFTP_FILENAME_MAX 512
|
||||
#define TFTP_BLOCKSIZE_MAX 1428
|
||||
|
||||
struct tftp_t {
|
||||
struct udphdr udp;
|
||||
@ -22,13 +23,13 @@ struct tftp_t {
|
||||
union {
|
||||
struct {
|
||||
uint16_t tp_block_nr;
|
||||
uint8_t tp_buf[512];
|
||||
uint8_t tp_buf[TFTP_BLOCKSIZE_MAX];
|
||||
} tp_data;
|
||||
struct {
|
||||
uint16_t tp_error_code;
|
||||
uint8_t tp_msg[512];
|
||||
uint8_t tp_msg[TFTP_BLOCKSIZE_MAX];
|
||||
} tp_error;
|
||||
char tp_buf[512 + 2];
|
||||
char tp_buf[TFTP_BLOCKSIZE_MAX + 2];
|
||||
} x;
|
||||
} __attribute__((packed));
|
||||
|
||||
@ -36,6 +37,7 @@ struct tftp_session {
|
||||
Slirp *slirp;
|
||||
char *filename;
|
||||
int fd;
|
||||
uint16_t block_size;
|
||||
|
||||
struct sockaddr_storage client_addr;
|
||||
uint16_t client_port;
|
||||
|
Loading…
x
Reference in New Issue
Block a user