mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06:00
Fix 64 bit issue in slirp
Signed-off-by: Gleb Natapov <gleb@redhat.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6288 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
cb457d7679
commit
429d0a3db8
11 changed files with 138 additions and 207 deletions
|
@ -71,7 +71,7 @@ tcp_seq tcp_iss; /* tcp initial send seq # */
|
|||
#ifdef TCP_ACK_HACK
|
||||
#define TCP_REASS(tp, ti, m, so, flags) {\
|
||||
if ((ti)->ti_seq == (tp)->rcv_nxt && \
|
||||
(tp)->seg_next == (tcpiphdrp_32)(tp) && \
|
||||
tcpfrag_list_empty(tp) && \
|
||||
(tp)->t_state == TCPS_ESTABLISHED) {\
|
||||
if (ti->ti_flags & TH_PUSH) \
|
||||
tp->t_flags |= TF_ACKNOW; \
|
||||
|
@ -94,7 +94,7 @@ tcp_seq tcp_iss; /* tcp initial send seq # */
|
|||
#else
|
||||
#define TCP_REASS(tp, ti, m, so, flags) { \
|
||||
if ((ti)->ti_seq == (tp)->rcv_nxt && \
|
||||
(tp)->seg_next == (tcpiphdrp_32)(tp) && \
|
||||
tcpfrag_list_empty(tp) && \
|
||||
(tp)->t_state == TCPS_ESTABLISHED) { \
|
||||
tp->t_flags |= TF_DELACK; \
|
||||
(tp)->rcv_nxt += (ti)->ti_len; \
|
||||
|
@ -134,8 +134,8 @@ tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
|
|||
/*
|
||||
* Find a segment which begins after this one does.
|
||||
*/
|
||||
for (q = (struct tcpiphdr *)tp->seg_next; q != (struct tcpiphdr *)tp;
|
||||
q = (struct tcpiphdr *)q->ti_next)
|
||||
for (q = tcpfrag_list_first(tp); !tcpfrag_list_end(q, tp);
|
||||
q = tcpiphdr_next(q))
|
||||
if (SEQ_GT(q->ti_seq, ti->ti_seq))
|
||||
break;
|
||||
|
||||
|
@ -144,9 +144,9 @@ tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
|
|||
* our data already. If so, drop the data from the incoming
|
||||
* segment. If it provides all of our data, drop us.
|
||||
*/
|
||||
if ((struct tcpiphdr *)q->ti_prev != (struct tcpiphdr *)tp) {
|
||||
if (!tcpfrag_list_end(tcpiphdr_prev(q), tp)) {
|
||||
register int i;
|
||||
q = (struct tcpiphdr *)q->ti_prev;
|
||||
q = tcpiphdr_prev(q);
|
||||
/* conversion to int (in i) handles seq wraparound */
|
||||
i = q->ti_seq + q->ti_len - ti->ti_seq;
|
||||
if (i > 0) {
|
||||
|
@ -166,36 +166,36 @@ tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
|
|||
ti->ti_len -= i;
|
||||
ti->ti_seq += i;
|
||||
}
|
||||
q = (struct tcpiphdr *)(q->ti_next);
|
||||
q = tcpiphdr_next(q);
|
||||
}
|
||||
STAT(tcpstat.tcps_rcvoopack++);
|
||||
STAT(tcpstat.tcps_rcvoobyte += ti->ti_len);
|
||||
REASS_MBUF(ti) = (mbufp_32) m; /* XXX */
|
||||
ti->ti_mbuf = m;
|
||||
|
||||
/*
|
||||
* While we overlap succeeding segments trim them or,
|
||||
* if they are completely covered, dequeue them.
|
||||
*/
|
||||
while (q != (struct tcpiphdr *)tp) {
|
||||
while (!tcpfrag_list_end(q, tp)) {
|
||||
register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq;
|
||||
if (i <= 0)
|
||||
break;
|
||||
if (i < q->ti_len) {
|
||||
q->ti_seq += i;
|
||||
q->ti_len -= i;
|
||||
m_adj((struct mbuf *) REASS_MBUF(q), i);
|
||||
m_adj(q->ti_mbuf, i);
|
||||
break;
|
||||
}
|
||||
q = (struct tcpiphdr *)q->ti_next;
|
||||
m = (struct mbuf *) REASS_MBUF((struct tcpiphdr *)q->ti_prev);
|
||||
remque_32((void *)(q->ti_prev));
|
||||
q = tcpiphdr_next(q);
|
||||
m = tcpiphdr_prev(q)->ti_mbuf;
|
||||
remque(tcpiphdr2qlink(tcpiphdr_prev(q)));
|
||||
m_freem(m);
|
||||
}
|
||||
|
||||
/*
|
||||
* Stick new segment in its place.
|
||||
*/
|
||||
insque_32(ti, (void *)(q->ti_prev));
|
||||
insque(tcpiphdr2qlink(ti), tcpiphdr2qlink(tcpiphdr_prev(q)));
|
||||
|
||||
present:
|
||||
/*
|
||||
|
@ -204,17 +204,17 @@ present:
|
|||
*/
|
||||
if (!TCPS_HAVEESTABLISHED(tp->t_state))
|
||||
return (0);
|
||||
ti = (struct tcpiphdr *) tp->seg_next;
|
||||
if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt)
|
||||
ti = tcpfrag_list_first(tp);
|
||||
if (tcpfrag_list_end(ti, tp) || ti->ti_seq != tp->rcv_nxt)
|
||||
return (0);
|
||||
if (tp->t_state == TCPS_SYN_RECEIVED && ti->ti_len)
|
||||
return (0);
|
||||
do {
|
||||
tp->rcv_nxt += ti->ti_len;
|
||||
flags = ti->ti_flags & TH_FIN;
|
||||
remque_32(ti);
|
||||
m = (struct mbuf *) REASS_MBUF(ti); /* XXX */
|
||||
ti = (struct tcpiphdr *)ti->ti_next;
|
||||
remque(tcpiphdr2qlink(ti));
|
||||
m = ti->ti_mbuf;
|
||||
ti = tcpiphdr_next(ti);
|
||||
/* if (so->so_state & SS_FCANTRCVMORE) */
|
||||
if (so->so_state & SS_FCANTSENDMORE)
|
||||
m_freem(m);
|
||||
|
@ -302,7 +302,8 @@ tcp_input(m, iphlen, inso)
|
|||
* Checksum extended TCP header and data.
|
||||
*/
|
||||
tlen = ((struct ip *)ti)->ip_len;
|
||||
ti->ti_next = ti->ti_prev = 0;
|
||||
tcpiphdr2qlink(ti)->next = tcpiphdr2qlink(ti)->prev = 0;
|
||||
memset(&ti->ti_i.ih_mbuf, 0 , sizeof(struct mbuf_ptr));
|
||||
ti->ti_x1 = 0;
|
||||
ti->ti_len = htons((u_int16_t)tlen);
|
||||
len = sizeof(struct ip ) + tlen;
|
||||
|
@ -560,7 +561,7 @@ findso:
|
|||
return;
|
||||
}
|
||||
} else if (ti->ti_ack == tp->snd_una &&
|
||||
tp->seg_next == (tcpiphdrp_32)tp &&
|
||||
tcpfrag_list_empty(tp) &&
|
||||
ti->ti_len <= sbspace(&so->so_rcv)) {
|
||||
/*
|
||||
* this is a pure, in-sequence data packet
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue