Index: trunk/src/VBox/Devices/Network/slirp/if.c
===================================================================
--- trunk/src/VBox/Devices/Network/slirp/if.c	(revision 15471)
+++ trunk/src/VBox/Devices/Network/slirp/if.c	(revision 15472)
@@ -13,14 +13,14 @@
 static void ifs_insque(struct mbuf *ifm, struct mbuf *ifmhead)
 {
-        ifm->ifs_next = ifmhead->ifs_next;
-        ifmhead->ifs_next = ifm;
-        ifm->ifs_prev = ifmhead;
-        ifm->ifs_next->ifs_prev = ifm;
+    ifm->ifs_next = ifmhead->ifs_next;
+    ifmhead->ifs_next = ifm;
+    ifm->ifs_prev = ifmhead;
+    ifm->ifs_next->ifs_prev = ifm;
 }
 
 static void ifs_remque(struct mbuf *ifm)
 {
-        ifm->ifs_prev->ifs_next = ifm->ifs_next;
-        ifm->ifs_next->ifs_prev = ifm->ifs_prev;
+    ifm->ifs_prev->ifs_next = ifm->ifs_next;
+    ifm->ifs_next->ifs_prev = ifm->ifs_prev;
 }
 
@@ -28,15 +28,15 @@
 if_init(PNATState pData)
 {
-        /* 2 for alignment, 14 for ethernet, 40 for TCP/IP */
-        if_maxlinkhdr = 2 + 14 + 40;
-        if_queued = 0;
-        if_thresh = 10;
-        if_mtu = 1500;
-        if_mru = 1500;
-        if_comp = IF_AUTOCOMP;
-        if_fastq.ifq_next = if_fastq.ifq_prev = &if_fastq;
-        if_batchq.ifq_next = if_batchq.ifq_prev = &if_batchq;
-        /*      sl_compress_init(&comp_s); */
-        next_m = &if_batchq;
+    /* 2 for alignment, 14 for ethernet, 40 for TCP/IP */
+    if_maxlinkhdr = 2 + 14 + 40;
+    if_queued = 0;
+    if_thresh = 10;
+    if_mtu = 1500;
+    if_mru = 1500;
+    if_comp = IF_AUTOCOMP;
+    if_fastq.ifq_next = if_fastq.ifq_prev = &if_fastq;
+    if_batchq.ifq_next = if_batchq.ifq_prev = &if_batchq;
+/*  sl_compress_init(&comp_s); */
+    next_m = &if_batchq;
 }
 
@@ -57,91 +57,100 @@
 if_output(PNATState pData, struct socket *so, struct mbuf *ifm)
 {
-        struct mbuf *ifq;
-        int on_fastq = 1;
-
-        DEBUG_CALL("if_output");
-        DEBUG_ARG("so = %lx", (long)so);
-        DEBUG_ARG("ifm = %lx", (long)ifm);
-
+    struct mbuf *ifq;
+    int on_fastq = 1;
+
+    DEBUG_CALL("if_output");
+    DEBUG_ARG("so = %lx", (long)so);
+    DEBUG_ARG("ifm = %lx", (long)ifm);
+
+    /*
+     * First remove the mbuf from m_usedlist,
+     * since we're gonna use m_next and m_prev ourselves
+     * XXX Shouldn't need this, gotta change dtom() etc.
+     */
+    if (ifm->m_flags & M_USEDLIST)
+    {
+        remque(pData, ifm);
+        ifm->m_flags &= ~M_USEDLIST;
+    }
+
+    /*
+     * See if there's already a batchq list for this session.
+     * This can include an interactive session, which should go on fastq,
+     * but gets too greedy... hence it'll be downgraded from fastq to batchq.
+     * We mustn't put this packet back on the fastq (or we'll send it out of order)
+     * XXX add cache here?
+     */
+    for (ifq = if_batchq.ifq_prev; ifq != &if_batchq; ifq = ifq->ifq_prev)
+    {
+        if (so == ifq->ifq_so)
+        {
+            /* A match! */
+            ifm->ifq_so = so;
+            ifs_insque(ifm, ifq->ifs_prev);
+            goto diddit;
+        }
+    }
+
+    /* No match, check which queue to put it on */
+    if (so && (so->so_iptos & IPTOS_LOWDELAY))
+    {
+        ifq = if_fastq.ifq_prev;
+        on_fastq = 1;
         /*
-         * First remove the mbuf from m_usedlist,
-         * since we're gonna use m_next and m_prev ourselves
-         * XXX Shouldn't need this, gotta change dtom() etc.
+         * Check if this packet is a part of the last
+         * packet's session
          */
-        if (ifm->m_flags & M_USEDLIST) {
-                remque(pData, ifm);
-                ifm->m_flags &= ~M_USEDLIST;
-        }
-
+        if (ifq->ifq_so == so)
+        {
+            ifm->ifq_so = so;
+            ifs_insque(ifm, ifq->ifs_prev);
+            goto diddit;
+        }
+    }
+    else
+        ifq = if_batchq.ifq_prev;
+
+    /* Create a new doubly linked list for this session */
+    ifm->ifq_so = so;
+    ifs_init(ifm);
+    insque(pData, ifm, ifq);
+
+diddit:
+    ++if_queued;
+
+    if (so)
+    {
+        /* Update *_queued */
+        so->so_queued++;
+        so->so_nqueued++;
         /*
-         * See if there's already a batchq list for this session.
-         * This can include an interactive session, which should go on fastq,
-         * but gets too greedy... hence it'll be downgraded from fastq to batchq.
-         * We mustn't put this packet back on the fastq (or we'll send it out of order)
-         * XXX add cache here?
+         * Check if the interactive session should be downgraded to
+         * the batchq.  A session is downgraded if it has queued 6
+         * packets without pausing, and at least 3 of those packets
+         * have been sent over the link
+         * (XXX These are arbitrary numbers, probably not optimal..)
          */
-        for (ifq = if_batchq.ifq_prev; ifq != &if_batchq; ifq = ifq->ifq_prev) {
-                if (so == ifq->ifq_so) {
-                        /* A match! */
-                        ifm->ifq_so = so;
-                        ifs_insque(ifm, ifq->ifs_prev);
-                        goto diddit;
-                }
-        }
-
-        /* No match, check which queue to put it on */
-        if (so && (so->so_iptos & IPTOS_LOWDELAY)) {
-                ifq = if_fastq.ifq_prev;
-                on_fastq = 1;
-                /*
-                 * Check if this packet is a part of the last
-                 * packet's session
-                 */
-                if (ifq->ifq_so == so) {
-                        ifm->ifq_so = so;
-                        ifs_insque(ifm, ifq->ifs_prev);
-                        goto diddit;
-                }
-        } else
-                ifq = if_batchq.ifq_prev;
-
-        /* Create a new doubly linked list for this session */
-        ifm->ifq_so = so;
-        ifs_init(ifm);
-        insque(pData, ifm, ifq);
-
-diddit:
-        ++if_queued;
-
-        if (so) {
-                /* Update *_queued */
-                so->so_queued++;
-                so->so_nqueued++;
-                /*
-                 * Check if the interactive session should be downgraded to
-                 * the batchq.  A session is downgraded if it has queued 6
-                 * packets without pausing, and at least 3 of those packets
-                 * have been sent over the link
-                 * (XXX These are arbitrary numbers, probably not optimal..)
-                 */
-                if (on_fastq && ((so->so_nqueued >= 6) &&
-                                 (so->so_nqueued - so->so_queued) >= 3)) {
-
-                        /* Remove from current queue... */
-                        remque(pData, ifm->ifs_next);
-
-                        /* ...And insert in the new.  That'll teach ya! */
-                        insque(pData, ifm->ifs_next, &if_batchq);
-                }
-        }
+        if (on_fastq
+            && so->so_nqueued >= 6
+            && (so->so_nqueued - so->so_queued) >= 3)
+        {
+            /* Remove from current queue... */
+            remque(pData, ifm->ifs_next);
+
+            /* ...And insert in the new.  That'll teach ya! */
+            insque(pData, ifm->ifs_next, &if_batchq);
+        }
+    }
 
 #ifndef FULL_BOLT
-        /*
-         * This prevents us from malloc()ing too many mbufs
-         */
-        if (link_up) {
-                /* if_start will check towrite */
-                if_start(pData);
-        }
+    /*
+     * This prevents us from malloc()ing too many mbufs
+     */
+    if (link_up)
+    {
+        /* if_start will check towrite */
+        if_start(pData);
+    }
 #endif
 }
@@ -162,12 +171,13 @@
 if_start(PNATState pData)
 {
-        struct mbuf *ifm, *ifqt;
-
-        DEBUG_CALL("if_start");
-
-        if (if_queued == 0)
-           return; /* Nothing to do */
-
- again:
+    struct mbuf *ifm, *ifqt;
+
+    DEBUG_CALL("if_start");
+
+    if (!if_queued)
+        return; /* Nothing to do */
+
+    for (;;)
+    {
         /* check if we can really output */
         if (!slirp_can_output(pData->pvUser))
@@ -178,15 +188,16 @@
          * If there's something in the fastq, select it immediately
          */
-        if (if_fastq.ifq_next != &if_fastq) {
-                ifm = if_fastq.ifq_next;
-        } else {
-                /* Nothing on fastq, see if next_m is valid */
-                if (next_m != &if_batchq)
-                   ifm = next_m;
-                else
-                   ifm = if_batchq.ifq_next;
-
-                /* Set which packet to send on next iteration */
-                next_m = ifm->ifq_next;
+        if (if_fastq.ifq_next != &if_fastq)
+            ifm = if_fastq.ifq_next;
+        else
+        {
+            /* Nothing on fastq, see if next_m is valid */
+            if (next_m != &if_batchq)
+                ifm = next_m;
+            else
+                ifm = if_batchq.ifq_next;
+
+            /* Set which packet to send on next iteration */
+            next_m = ifm->ifq_next;
         }
         /* Remove it from the queue */
@@ -196,14 +207,16 @@
 
         /* If there are more packets for this session, re-queue them */
-        if (ifm->ifs_next != /* ifm->ifs_prev != */ ifm) {
-                insque(pData, ifm->ifs_next, ifqt);
-                ifs_remque(ifm);
+        if (ifm->ifs_next != /* ifm->ifs_prev != */ ifm)
+        {
+            insque(pData, ifm->ifs_next, ifqt);
+            ifs_remque(ifm);
         }
 
         /* Update so_queued */
-        if (ifm->ifq_so) {
-                if (--ifm->ifq_so->so_queued == 0)
-                   /* If there's no more queued, reset nqueued */
-                   ifm->ifq_so->so_nqueued = 0;
+        if (ifm->ifq_so)
+        {
+            if (--ifm->ifq_so->so_queued == 0)
+                /* If there's no more queued, reset nqueued */
+                ifm->ifq_so->so_nqueued = 0;
         }
 
@@ -213,5 +226,6 @@
         m_free(pData, ifm);
 
-        if (if_queued)
-           goto again;
-}
+        if (!if_queued)
+            return;
+    }
+}
Index: trunk/src/VBox/Devices/Network/slirp/tcp_input.c
===================================================================
--- trunk/src/VBox/Devices/Network/slirp/tcp_input.c	(revision 15471)
+++ trunk/src/VBox/Devices/Network/slirp/tcp_input.c	(revision 15472)
@@ -73,160 +73,174 @@
 tcp_reass(PNATState pData, struct tcpcb *tp, struct tcphdr *th, int *tlenp, struct mbuf *m)
 {
-        struct tseg_qent *q;
-        struct tseg_qent *p = NULL;
-        struct tseg_qent *nq;
-        struct tseg_qent *te = NULL;
-        struct socket *so = tp->t_socket;
-        int flags;
-
-        /*
-         * XXX: tcp_reass() is rather inefficient with its data structures
-         * and should be rewritten (see NetBSD for optimizations).  While
-         * doing that it should move to its own file tcp_reass.c.
-         */
-
-        /*
-         * Call with th==NULL after become established to
-         * force pre-ESTABLISHED data up to user socket.
-         */
-        if (th == NULL)
-                goto present;
-
-        /*
-         * Limit the number of segments in the reassembly queue to prevent
-         * holding on to too many segments (and thus running out of mbufs).
-         * Make sure to let the missing segment through which caused this
-         * queue.  Always keep one global queue entry spare to be able to
-         * process the missing segment.
-         */
-        if (th->th_seq != tp->rcv_nxt &&
-            (tcp_reass_qsize + 1 >= tcp_reass_maxseg ||
-             tp->t_segqlen >= tcp_reass_maxqlen)) {
-                tcp_reass_overflows++;
-                tcpstat.tcps_rcvmemdrop++;
+    struct tseg_qent *q;
+    struct tseg_qent *p = NULL;
+    struct tseg_qent *nq;
+    struct tseg_qent *te = NULL;
+    struct socket *so = tp->t_socket;
+    int flags;
+
+    /*
+     * XXX: tcp_reass() is rather inefficient with its data structures
+     * and should be rewritten (see NetBSD for optimizations).  While
+     * doing that it should move to its own file tcp_reass.c.
+     */
+
+    /*
+     * Call with th==NULL after become established to
+     * force pre-ESTABLISHED data up to user socket.
+     */
+    if (th == NULL)
+        goto present;
+
+    /*
+     * Limit the number of segments in the reassembly queue to prevent
+     * holding on to too many segments (and thus running out of mbufs).
+     * Make sure to let the missing segment through which caused this
+     * queue.  Always keep one global queue entry spare to be able to
+     * process the missing segment.
+     */
+    if (   th->th_seq != tp->rcv_nxt
+        && (   tcp_reass_qsize + 1 >= tcp_reass_maxseg
+            || tp->t_segqlen >= tcp_reass_maxqlen))
+    {
+        tcp_reass_overflows++;
+        tcpstat.tcps_rcvmemdrop++;
+        m_freem(pData, m);
+        *tlenp = 0;
+        return (0);
+    }
+
+    /*
+     * Allocate a new queue entry. If we can't, or hit the zone limit
+     * just drop the pkt.
+     */
+    te = malloc(sizeof(struct tseg_qent));
+    if (te == NULL)
+    {
+        tcpstat.tcps_rcvmemdrop++;
+        m_freem(pData, m);
+        *tlenp = 0;
+        return (0);
+    }
+    tp->t_segqlen++;
+    tcp_reass_qsize++;
+
+    /*
+     * Find a segment which begins after this one does.
+     */
+    LIST_FOREACH(q, &tp->t_segq, tqe_q)
+    {
+        if (SEQ_GT(q->tqe_th->th_seq, th->th_seq))
+            break;
+        p = q;
+    }
+
+    /*
+     * If there is a preceding segment, it may provide some of
+     * our data already.  If so, drop the data from the incoming
+     * segment.  If it provides all of our data, drop us.
+     */
+    if (p != NULL)
+    {
+        int i;
+        /* conversion to int (in i) handles seq wraparound */
+        i = p->tqe_th->th_seq + p->tqe_len - th->th_seq;
+        if (i > 0)
+        {
+            if (i >= *tlenp)
+            {
+                tcpstat.tcps_rcvduppack++;
+                tcpstat.tcps_rcvdupbyte += *tlenp;
                 m_freem(pData, m);
-                *tlenp = 0;
-                return (0);
-        }
-
-        /*
-         * Allocate a new queue entry. If we can't, or hit the zone limit
-         * just drop the pkt.
-         */
-        te = malloc(sizeof(struct tseg_qent));
-        if (te == NULL) {
-                tcpstat.tcps_rcvmemdrop++;
-                m_freem(pData, m);
-                *tlenp = 0;
-                return (0);
-        }
-        tp->t_segqlen++;
-        tcp_reass_qsize++;
-
-        /*
-         * Find a segment which begins after this one does.
-         */
-        LIST_FOREACH(q, &tp->t_segq, tqe_q) {
-                if (SEQ_GT(q->tqe_th->th_seq, th->th_seq))
-                        break;
-                p = q;
-        }
-
-        /*
-         * If there is a preceding segment, it may provide some of
-         * our data already.  If so, drop the data from the incoming
-         * segment.  If it provides all of our data, drop us.
-         */
-        if (p != NULL) {
-                int i;
-                /* conversion to int (in i) handles seq wraparound */
-                i = p->tqe_th->th_seq + p->tqe_len - th->th_seq;
-                if (i > 0) {
-                        if (i >= *tlenp) {
-                                tcpstat.tcps_rcvduppack++;
-                                tcpstat.tcps_rcvdupbyte += *tlenp;
-                                m_freem(pData, m);
-                                free(te);
-                                tp->t_segqlen--;
-                                tcp_reass_qsize--;
-                                /*
-                                 * Try to present any queued data
-                                 * at the left window edge to the user.
-                                 * This is needed after the 3-WHS
-                                 * completes.
-                                 */
-                                goto present;   /* ??? */
-                        }
-                        m_adj(m, i);
-                        *tlenp -= i;
-                        th->th_seq += i;
-                }
-        }
-        tcpstat.tcps_rcvoopack++;
-        tcpstat.tcps_rcvoobyte += *tlenp;
-
-        /*
-         * While we overlap succeeding segments trim them or,
-         * if they are completely covered, dequeue them.
-         */
-        while (q) {
-                int i = (th->th_seq + *tlenp) - q->tqe_th->th_seq;
-                if (i <= 0)
-                        break;
-                if (i < q->tqe_len) {
-                        q->tqe_th->th_seq += i;
-                        q->tqe_len -= i;
-                        m_adj(q->tqe_m, i);
-                        break;
-                }
-
-                nq = LIST_NEXT(q, tqe_q);
-                LIST_REMOVE(q, tqe_q);
-                m_freem(pData, q->tqe_m);
-                free(q);
+                free(te);
                 tp->t_segqlen--;
                 tcp_reass_qsize--;
-                q = nq;
-        }
-
-        /* Insert the new segment queue entry into place. */
-        te->tqe_m = m;
-        te->tqe_th = th;
-        te->tqe_len = *tlenp;
-
-        if (p == NULL) {
-                LIST_INSERT_HEAD(&tp->t_segq, te, tqe_q);
-        } else {
-                LIST_INSERT_AFTER(p, te, tqe_q);
-        }
+                /*
+                 * Try to present any queued data
+                 * at the left window edge to the user.
+                 * This is needed after the 3-WHS
+                 * completes.
+                 */
+                goto present;   /* ??? */
+            }
+            m_adj(m, i);
+            *tlenp -= i;
+            th->th_seq += i;
+        }
+    }
+    tcpstat.tcps_rcvoopack++;
+    tcpstat.tcps_rcvoobyte += *tlenp;
+
+    /*
+     * While we overlap succeeding segments trim them or,
+     * if they are completely covered, dequeue them.
+     */
+    while (q)
+    {
+        int i = (th->th_seq + *tlenp) - q->tqe_th->th_seq;
+        if (i <= 0)
+            break;
+        if (i < q->tqe_len)
+        {
+            q->tqe_th->th_seq += i;
+            q->tqe_len -= i;
+            m_adj(q->tqe_m, i);
+            break;
+        }
+
+        nq = LIST_NEXT(q, tqe_q);
+        LIST_REMOVE(q, tqe_q);
+        m_freem(pData, q->tqe_m);
+        free(q);
+        tp->t_segqlen--;
+        tcp_reass_qsize--;
+        q = nq;
+    }
+
+    /* Insert the new segment queue entry into place. */
+    te->tqe_m = m;
+    te->tqe_th = th;
+    te->tqe_len = *tlenp;
+
+    if (p == NULL)
+    {
+        LIST_INSERT_HEAD(&tp->t_segq, te, tqe_q);
+    }
+    else
+    {
+        LIST_INSERT_AFTER(p, te, tqe_q);
+    }
 
 present:
-        /*
-         * Present data to user, advancing rcv_nxt through
-         * completed sequence space.
+    /*
+     * Present data to user, advancing rcv_nxt through
+     * completed sequence space.
+     */
+    if (!TCPS_HAVEESTABLISHED(tp->t_state))
+        return (0);
+    q = LIST_FIRST(&tp->t_segq);
+    if (!q || q->tqe_th->th_seq != tp->rcv_nxt)
+        return (0);
+    do
+    {
+        tp->rcv_nxt += q->tqe_len;
+        flags = q->tqe_th->th_flags & TH_FIN;
+        nq = LIST_NEXT(q, tqe_q);
+        LIST_REMOVE(q, tqe_q);
+        /* XXX: This place should be checked for the same code in
+         * original BSD code for Slirp and current BSD used SS_FCANTRCVMORE
          */
-        if (!TCPS_HAVEESTABLISHED(tp->t_state))
-                return (0);
-        q = LIST_FIRST(&tp->t_segq);
-        if (!q || q->tqe_th->th_seq != tp->rcv_nxt)
-                return (0);
-        do {
-                tp->rcv_nxt += q->tqe_len;
-                flags = q->tqe_th->th_flags & TH_FIN;
-                nq = LIST_NEXT(q, tqe_q);
-                LIST_REMOVE(q, tqe_q);
-                /* XXX: This place should be checked for the same code in
-                 * original BSD code for Slirp and current BSD used SS_FCANTRCVMORE
-                 */
-                if (so->so_state & SS_FCANTSENDMORE)
-                        m_freem(pData, q->tqe_m);
-                else
-                        sbappend(pData, so, q->tqe_m);
-                free(q);
-                tp->t_segqlen--;
-                tcp_reass_qsize--;
-                q = nq;
-        } while (q && q->tqe_th->th_seq == tp->rcv_nxt);
-        return (flags);
+        if (so->so_state & SS_FCANTSENDMORE)
+            m_freem(pData, q->tqe_m);
+        else
+            sbappend(pData, so, q->tqe_m);
+        free(q);
+        tp->t_segqlen--;
+        tcp_reass_qsize--;
+        q = nq;
+    }
+    while (q && q->tqe_th->th_seq == tp->rcv_nxt);
+
+    return flags;
 }
 
@@ -238,367 +252,390 @@
 tcp_input(PNATState pData, register struct mbuf *m, int iphlen, struct socket *inso)
 {
-        struct ip save_ip, *ip;
-        register struct tcpiphdr *ti;
-        caddr_t optp = NULL;
-        int optlen = 0;
-        int len, tlen, off;
-        register struct tcpcb *tp = 0;
-        register int tiflags;
-        struct socket *so = 0;
-        int todrop, acked, ourfinisacked, needoutput = 0;
-/*      int dropsocket = 0; */
-        int iss = 0;
-        u_long tiwin;
-/*      int ts_present = 0; */
-
-        DEBUG_CALL("tcp_input");
-        DEBUG_ARGS((dfd," m = %8lx  iphlen = %2d  inso = %lx\n",
-                    (long )m, iphlen, (long )inso ));
+    struct ip save_ip, *ip;
+    register struct tcpiphdr *ti;
+    caddr_t optp = NULL;
+    int optlen = 0;
+    int len, tlen, off;
+    register struct tcpcb *tp = 0;
+    register int tiflags;
+    struct socket *so = 0;
+    int todrop, acked, ourfinisacked, needoutput = 0;
+/*  int dropsocket = 0; */
+    int iss = 0;
+    u_long tiwin;
+/*  int ts_present = 0; */
+
+    DEBUG_CALL("tcp_input");
+    DEBUG_ARGS((dfd," m = %8lx  iphlen = %2d  inso = %lx\n",
+                (long )m, iphlen, (long )inso ));
+
+    /*
+     * If called with m == 0, then we're continuing the connect
+     */
+    if (m == NULL)
+    {
+        so = inso;
+
+        /* Re-set a few variables */
+        tp = sototcpcb(so);
+        m = so->so_m;
+        so->so_m = 0;
+        ti = so->so_ti;
+        tiwin = ti->ti_win;
+        tiflags = ti->ti_flags;
+
+        goto cont_conn;
+    }
+
+    tcpstat.tcps_rcvtotal++;
+    /*
+     * Get IP and TCP header together in first mbuf.
+     * Note: IP leaves IP header in first mbuf.
+     */
+    ti = mtod(m, struct tcpiphdr *);
+    if (iphlen > sizeof(struct ip ))
+    {
+        ip_stripoptions(m, (struct mbuf *)0);
+        iphlen = sizeof(struct ip );
+    }
+    /* XXX Check if too short */
+
+
+    /*
+     * Save a copy of the IP header in case we want restore it
+     * for sending an ICMP error message in response.
+     */
+    ip = mtod(m, struct ip *);
+    save_ip = *ip;
+    save_ip.ip_len+= iphlen;
+
+    /*
+     * Checksum extended TCP header and data.
+     */
+    tlen = ((struct ip *)ti)->ip_len;
+    memset(ti->ti_x1, 0, 9);
+    ti->ti_len = htons((u_int16_t)tlen);
+    len = sizeof(struct ip ) + tlen;
+    /* keep checksum for ICMP reply
+     * ti->ti_sum = cksum(m, len);
+     * if (ti->ti_sum) { */
+    if (cksum(m, len))
+    {
+        tcpstat.tcps_rcvbadsum++;
+        goto drop;
+    }
+
+    /*
+     * Check that TCP offset makes sense,
+     * pull out TCP options and adjust length.              XXX
+     */
+    off = ti->ti_off << 2;
+    if (   off < sizeof (struct tcphdr)
+        || off > tlen)
+    {
+        tcpstat.tcps_rcvbadoff++;
+        goto drop;
+    }
+    tlen -= off;
+    ti->ti_len = tlen;
+    if (off > sizeof (struct tcphdr))
+    {
+        optlen = off - sizeof (struct tcphdr);
+        optp = mtod(m, caddr_t) + sizeof (struct tcpiphdr);
 
         /*
-         * If called with m == 0, then we're continuing the connect
+         * Do quick retrieval of timestamp options ("options
+         * prediction?").  If timestamp is the only option and it's
+         * formatted as recommended in RFC 1323 appendix A, we
+         * quickly get the values now and not bother calling
+         * tcp_dooptions(), etc.
          */
-        if (m == NULL) {
-                so = inso;
-
-                /* Re-set a few variables */
-                tp = sototcpcb(so);
-                m = so->so_m;
-                so->so_m = 0;
-                ti = so->so_ti;
-                tiwin = ti->ti_win;
-                tiflags = ti->ti_flags;
-
-                goto cont_conn;
-        }
-
-
-        tcpstat.tcps_rcvtotal++;
-        /*
-         * Get IP and TCP header together in first mbuf.
-         * Note: IP leaves IP header in first mbuf.
-         */
-        ti = mtod(m, struct tcpiphdr *);
-        if (iphlen > sizeof(struct ip )) {
-          ip_stripoptions(m, (struct mbuf *)0);
-          iphlen=sizeof(struct ip );
-        }
-        /* XXX Check if too short */
-
-
-        /*
-         * Save a copy of the IP header in case we want restore it
-         * for sending an ICMP error message in response.
-         */
-        ip=mtod(m, struct ip *);
-        save_ip = *ip;
-        save_ip.ip_len+= iphlen;
-
-        /*
-         * Checksum extended TCP header and data.
-         */
-        tlen = ((struct ip *)ti)->ip_len;
-        memset(ti->ti_x1, 0, 9);
-        ti->ti_len = htons((u_int16_t)tlen);
-        len = sizeof(struct ip ) + tlen;
-        /* keep checksum for ICMP reply
-         * ti->ti_sum = cksum(m, len);
-         * if (ti->ti_sum) { */
-        if(cksum(m, len)) {
-          tcpstat.tcps_rcvbadsum++;
-          goto drop;
-        }
-
-        /*
-         * Check that TCP offset makes sense,
-         * pull out TCP options and adjust length.              XXX
-         */
-        off = ti->ti_off << 2;
-        if (off < sizeof (struct tcphdr) || off > tlen) {
-          tcpstat.tcps_rcvbadoff++;
-          goto drop;
-        }
-        tlen -= off;
-        ti->ti_len = tlen;
-        if (off > sizeof (struct tcphdr)) {
-          optlen = off - sizeof (struct tcphdr);
-          optp = mtod(m, caddr_t) + sizeof (struct tcpiphdr);
-
-                /*
-                 * Do quick retrieval of timestamp options ("options
-                 * prediction?").  If timestamp is the only option and it's
-                 * formatted as recommended in RFC 1323 appendix A, we
-                 * quickly get the values now and not bother calling
-                 * tcp_dooptions(), etc.
-                 */
-/*              if ((optlen == TCPOLEN_TSTAMP_APPA ||
- *                   (optlen > TCPOLEN_TSTAMP_APPA &&
- *                      optp[TCPOLEN_TSTAMP_APPA] == TCPOPT_EOL)) &&
- *                   *(u_int32_t *)optp == htonl(TCPOPT_TSTAMP_HDR) &&
- *                   (ti->ti_flags & TH_SYN) == 0) {
- *                      ts_present = 1;
- *                      ts_val = ntohl(*(u_int32_t *)(optp + 4));
- *                      ts_ecr = ntohl(*(u_int32_t *)(optp + 8));
- *                      optp = NULL;   / * we've parsed the options * /
- *              }
- */
-        }
-        tiflags = ti->ti_flags;
-
-        /*
-         * Convert TCP protocol specific fields to host format.
-         */
-        NTOHL(ti->ti_seq);
-        NTOHL(ti->ti_ack);
-        NTOHS(ti->ti_win);
-        NTOHS(ti->ti_urp);
-
-        /*
-         * Drop TCP, IP headers and TCP options.
-         */
-        m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
-        m->m_len  -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
-
-        /*
-         * Locate pcb for segment.
-         */
+#if 0
+        if ((   optlen == TCPOLEN_TSTAMP_APPA
+             || (   optlen  > TCPOLEN_TSTAMP_APPA
+                 && optp[TCPOLEN_TSTAMP_APPA] == TCPOPT_EOL)) &&
+                *(u_int32_t *)optp == htonl(TCPOPT_TSTAMP_HDR) &&
+                (ti->ti_flags & TH_SYN) == 0)
+        {
+            ts_present = 1;
+            ts_val = ntohl(*(u_int32_t *)(optp + 4));
+            ts_ecr = ntohl(*(u_int32_t *)(optp + 8));
+            optp = NULL;   / * we have parsed the options * /
+        }
+#endif
+    }
+    tiflags = ti->ti_flags;
+
+    /*
+     * Convert TCP protocol specific fields to host format.
+     */
+    NTOHL(ti->ti_seq);
+    NTOHL(ti->ti_ack);
+    NTOHS(ti->ti_win);
+    NTOHS(ti->ti_urp);
+
+    /*
+     * Drop TCP, IP headers and TCP options.
+     */
+    m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
+    m->m_len  -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
+
+    /*
+     * Locate pcb for segment.
+     */
 findso:
-        so = tcp_last_so;
-        if (so->so_fport != ti->ti_dport ||
-            so->so_lport != ti->ti_sport ||
-            so->so_laddr.s_addr != ti->ti_src.s_addr ||
-            so->so_faddr.s_addr != ti->ti_dst.s_addr) {
-                so = solookup(&tcb, ti->ti_src, ti->ti_sport,
-                               ti->ti_dst, ti->ti_dport);
-                if (so)
-                        tcp_last_so = so;
-                ++tcpstat.tcps_socachemiss;
-        }
-
-        /*
-         * If the state is CLOSED (i.e., TCB does not exist) then
-         * all data in the incoming segment is discarded.
-         * If the TCB exists but is in CLOSED state, it is embryonic,
-         * but should either do a listen or a connect soon.
-         *
-         * state == CLOSED means we've done socreate() but haven't
-         * attached it to a protocol yet...
-         *
-         * XXX If a TCB does not exist, and the TH_SYN flag is
-         * the only flag set, then create a session, mark it
-         * as if it was LISTENING, and continue...
-         */
-        if (so == 0) {
-          if ((tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) != TH_SYN)
+    so = tcp_last_so;
+    if (   so->so_fport        != ti->ti_dport
+        || so->so_lport        != ti->ti_sport
+        || so->so_laddr.s_addr != ti->ti_src.s_addr
+        || so->so_faddr.s_addr != ti->ti_dst.s_addr)
+    {
+        so = solookup(&tcb, ti->ti_src, ti->ti_sport,
+                      ti->ti_dst, ti->ti_dport);
+        if (so)
+            tcp_last_so = so;
+        ++tcpstat.tcps_socachemiss;
+    }
+
+    /*
+     * If the state is CLOSED (i.e., TCB does not exist) then
+     * all data in the incoming segment is discarded.
+     * If the TCB exists but is in CLOSED state, it is embryonic,
+     * but should either do a listen or a connect soon.
+     *
+     * state == CLOSED means we've done socreate() but haven't
+     * attached it to a protocol yet...
+     *
+     * XXX If a TCB does not exist, and the TH_SYN flag is
+     * the only flag set, then create a session, mark it
+     * as if it was LISTENING, and continue...
+     */
+    if (so == 0)
+    {
+        if ((tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) != TH_SYN)
             goto dropwithreset;
 
-          if ((so = socreate()) == NULL)
+        if ((so = socreate()) == NULL)
             goto dropwithreset;
-          if (tcp_attach(pData, so) < 0) {
+        if (tcp_attach(pData, so) < 0)
+        {
             free(so); /* Not sofree (if it failed, it's not insqued) */
             goto dropwithreset;
-          }
-
-          sbreserve(&so->so_snd, tcp_sndspace);
-          sbreserve(&so->so_rcv, tcp_rcvspace);
-
-          /*            tcp_last_so = so; */  /* XXX ? */
-          /*            tp = sototcpcb(so);    */
-
-          so->so_laddr = ti->ti_src;
-          so->so_lport = ti->ti_sport;
-          so->so_faddr = ti->ti_dst;
-          so->so_fport = ti->ti_dport;
-
-          if ((so->so_iptos = tcp_tos(so)) == 0)
+        }
+
+        sbreserve(&so->so_snd, tcp_sndspace);
+        sbreserve(&so->so_rcv, tcp_rcvspace);
+
+/*      tcp_last_so = so; */  /* XXX ? */
+/*      tp = sototcpcb(so);    */
+
+        so->so_laddr = ti->ti_src;
+        so->so_lport = ti->ti_sport;
+        so->so_faddr = ti->ti_dst;
+        so->so_fport = ti->ti_dport;
+
+        if ((so->so_iptos = tcp_tos(so)) == 0)
             so->so_iptos = ((struct ip *)ti)->ip_tos;
 
-          tp = sototcpcb(so);
-          tp->t_state = TCPS_LISTEN;
-        }
-
-        /*
-         * If this is a still-connecting socket, this probably
-         * a retransmit of the SYN.  Whether it's a retransmit SYN
-         * or something else, we nuke it.
-         */
-        if (so->so_state & SS_ISFCONNECTING)
-                goto drop;
-
         tp = sototcpcb(so);
-
-        /* XXX Should never fail */
-        if (tp == 0)
-                goto dropwithreset;
-        if (tp->t_state == TCPS_CLOSED)
-                goto drop;
-
-        /* Unscale the window into a 32-bit value. */
-/*      if ((tiflags & TH_SYN) == 0)
- *              tiwin = ti->ti_win << tp->snd_scale;
- *      else
+        tp->t_state = TCPS_LISTEN;
+    }
+
+    /*
+     * If this is a still-connecting socket, this probably
+     * a retransmit of the SYN.  Whether it's a retransmit SYN
+     * or something else, we nuke it.
+     */
+    if (so->so_state & SS_ISFCONNECTING)
+        goto drop;
+
+    tp = sototcpcb(so);
+
+    /* XXX Should never fail */
+    if (tp == 0)
+        goto dropwithreset;
+    if (tp->t_state == TCPS_CLOSED)
+        goto drop;
+
+    /* Unscale the window into a 32-bit value. */
+/*  if ((tiflags & TH_SYN) == 0)
+ *      tiwin = ti->ti_win << tp->snd_scale;
+ *  else
  */
-                tiwin = ti->ti_win;
-
-        /*
-         * Segment received on connection.
-         * Reset idle time and keep-alive timer.
-         */
-        tp->t_idle = 0;
-        if (so_options)
-           tp->t_timer[TCPT_KEEP] = tcp_keepintvl;
-        else
-           tp->t_timer[TCPT_KEEP] = tcp_keepidle;
-
-        /*
-         * Process options if not in LISTEN state,
-         * else do it below (after getting remote address).
-         */
-        if (optp && tp->t_state != TCPS_LISTEN)
-                tcp_dooptions(pData, tp, (u_char *)optp, optlen, ti);
+    tiwin = ti->ti_win;
+
+    /*
+     * Segment received on connection.
+     * Reset idle time and keep-alive timer.
+     */
+    tp->t_idle = 0;
+    if (so_options)
+        tp->t_timer[TCPT_KEEP] = tcp_keepintvl;
+    else
+        tp->t_timer[TCPT_KEEP] = tcp_keepidle;
+
+    /*
+     * Process options if not in LISTEN state,
+     * else do it below (after getting remote address).
+     */
+    if (optp && tp->t_state != TCPS_LISTEN)
+        tcp_dooptions(pData, tp, (u_char *)optp, optlen, ti);
 /* , */
 /*                      &ts_present, &ts_val, &ts_ecr); */
 
+    /*
+     * Header prediction: check for the two common cases
+     * of a uni-directional data xfer.  If the packet has
+     * no control flags, is in-sequence, the window didn't
+     * change and we're not retransmitting, it's a
+     * candidate.  If the length is zero and the ack moved
+     * forward, we're the sender side of the xfer.  Just
+     * free the data acked & wake any higher level process
+     * that was blocked waiting for space.  If the length
+     * is non-zero and the ack didn't move, we're the
+     * receiver side.  If we're getting packets in-order
+     * (the reassembly queue is empty), add the data to
+     * the socket buffer and note that we need a delayed ack.
+     *
+     * XXX Some of these tests are not needed
+     * eg: the tiwin == tp->snd_wnd prevents many more
+     * predictions.. with no *real* advantage..
+     */
+    if (    tp->t_state == TCPS_ESTABLISHED
+         && (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK
+/*       && (!ts_present || TSTMP_GEQ(ts_val, tp->ts_recent)) */
+         &&  ti->ti_seq == tp->rcv_nxt
+         &&  tiwin && tiwin == tp->snd_wnd
+         &&  tp->snd_nxt == tp->snd_max)
+    {
         /*
-         * Header prediction: check for the two common cases
-         * of a uni-directional data xfer.  If the packet has
-         * no control flags, is in-sequence, the window didn't
-         * change and we're not retransmitting, it's a
-         * candidate.  If the length is zero and the ack moved
-         * forward, we're the sender side of the xfer.  Just
-         * free the data acked & wake any higher level process
-         * that was blocked waiting for space.  If the length
-         * is non-zero and the ack didn't move, we're the
-         * receiver side.  If we're getting packets in-order
-         * (the reassembly queue is empty), add the data to
-         * the socket buffer and note that we need a delayed ack.
-         *
-         * XXX Some of these tests are not needed
-         * eg: the tiwin == tp->snd_wnd prevents many more
-         * predictions.. with no *real* advantage..
+         * If last ACK falls within this segment's sequence numbers,
+         *  record the timestamp.
          */
-        if (tp->t_state == TCPS_ESTABLISHED &&
-            (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK &&
-/*          (!ts_present || TSTMP_GEQ(ts_val, tp->ts_recent)) && */
-            ti->ti_seq == tp->rcv_nxt &&
-            tiwin && tiwin == tp->snd_wnd &&
-            tp->snd_nxt == tp->snd_max) {
+#if 0
+        if (ts_present && SEQ_LEQ(ti->ti_seq, tp->last_ack_sent) &&
+                SEQ_LT(tp->last_ack_sent, ti->ti_seq + ti->ti_len)) {
+            tp->ts_recent_age = tcp_now;
+            tp->ts_recent = ts_val;
+        }
+#endif
+
+        if (ti->ti_len == 0)
+        {
+            if (   SEQ_GT(ti->ti_ack, tp->snd_una)
+                && SEQ_LEQ(ti->ti_ack, tp->snd_max)
+                && tp->snd_cwnd >= tp->snd_wnd)
+            {
                 /*
-                 * If last ACK falls within this segment's sequence numbers,
-                 *  record the timestamp.
+                 * this is a pure ack for outstanding data.
                  */
-/*              if (ts_present && SEQ_LEQ(ti->ti_seq, tp->last_ack_sent) &&
- *                 SEQ_LT(tp->last_ack_sent, ti->ti_seq + ti->ti_len)) {
- *                      tp->ts_recent_age = tcp_now;
- *                      tp->ts_recent = ts_val;
- *              }
- */
-                if (ti->ti_len == 0) {
-                        if (SEQ_GT(ti->ti_ack, tp->snd_una) &&
-                            SEQ_LEQ(ti->ti_ack, tp->snd_max) &&
-                            tp->snd_cwnd >= tp->snd_wnd) {
-                                /*
-                                 * this is a pure ack for outstanding data.
-                                 */
-                                ++tcpstat.tcps_predack;
-/*                              if (ts_present)
- *                                      tcp_xmit_timer(tp, tcp_now-ts_ecr+1);
- *                              else
- */                                  if (tp->t_rtt &&
-                                            SEQ_GT(ti->ti_ack, tp->t_rtseq))
-                                        tcp_xmit_timer(pData, tp, tp->t_rtt);
-                                acked = ti->ti_ack - tp->snd_una;
-                                tcpstat.tcps_rcvackpack++;
-                                tcpstat.tcps_rcvackbyte += acked;
-                                sbdrop(&so->so_snd, acked);
-                                tp->snd_una = ti->ti_ack;
-                                m_freem(pData, m);
-
-                                /*
-                                 * If all outstanding data are acked, stop
-                                 * retransmit timer, otherwise restart timer
-                                 * using current (possibly backed-off) value.
-                                 * If process is waiting for space,
-                                 * wakeup/selwakeup/signal.  If data
-                                 * are ready to send, let tcp_output
-                                 * decide between more output or persist.
-                                 */
-                                if (tp->snd_una == tp->snd_max)
-                                        tp->t_timer[TCPT_REXMT] = 0;
-                                else if (tp->t_timer[TCPT_PERSIST] == 0)
-                                        tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
-
-                                /*
-                                 * There's room in so_snd, sowwakup will read()
-                                 * from the socket if we can
-                                 */
-/*                              if (so->so_snd.sb_flags & SB_NOTIFY)
- *                                      sowwakeup(so);
- */
-                                /*
-                                 * This is called because sowwakeup might have
-                                 * put data into so_snd.  Since we don't so sowwakeup,
-                                 * we don't need this.. XXX???
-                                 */
-                                if (so->so_snd.sb_cc)
-                                        (void) tcp_output(pData, tp);
-
-                                return;
-                        }
-                } else if (ti->ti_ack == tp->snd_una &&
-                    LIST_FIRST(&tp->t_segq) &&
-                    ti->ti_len <= sbspace(&so->so_rcv)) {
-                        /*
-                         * this is a pure, in-sequence data packet
-                         * with nothing on the reassembly queue and
-                         * we have enough buffer space to take it.
-                         */
-                        ++tcpstat.tcps_preddat;
-                        tp->rcv_nxt += ti->ti_len;
-                        tcpstat.tcps_rcvpack++;
-                        tcpstat.tcps_rcvbyte += ti->ti_len;
-                        /*
-                         * Add data to socket buffer.
-                         */
-                        if (so->so_emu) {
-                                if (tcp_emu(pData, so,m)) sbappend(pData, so, m);
-                        } else
-                                sbappend(pData, so, m);
-
-                        /*
-                         * XXX This is called when data arrives.  Later, check
-                         * if we can actually write() to the socket
-                         * XXX Need to check? It's be NON_BLOCKING
-                         */
-/*                      sorwakeup(so); */
-
-                        /*
-                         * If this is a short packet, then ACK now - with Nagel
-                         *      congestion avoidance sender won't send more until
-                         *      he gets an ACK.
-                         *
-                         * It is better to not delay acks at all to maximize
-                         * TCP throughput.  See RFC 2581.
-                         */
-                        tp->t_flags |= TF_ACKNOW;
-                        tcp_output(pData, tp);
-                        return;
-                }
-        } /* header prediction */
-        /*
-         * Calculate amount of space in receive window,
-         * and then do TCP input processing.
-         * Receive window is amount of space in rcv queue,
-         * but not less than advertised window.
-         */
-        { int win;
-          win = sbspace(&so->so_rcv);
-          if (win < 0)
+                ++tcpstat.tcps_predack;
+#if 0
+              if (ts_present)
+                  tcp_xmit_timer(tp, tcp_now-ts_ecr+1);
+              else
+#endif
+                  if (   tp->t_rtt
+                      && SEQ_GT(ti->ti_ack, tp->t_rtseq))
+                      tcp_xmit_timer(pData, tp, tp->t_rtt);
+              acked = ti->ti_ack - tp->snd_una;
+              tcpstat.tcps_rcvackpack++;
+              tcpstat.tcps_rcvackbyte += acked;
+              sbdrop(&so->so_snd, acked);
+              tp->snd_una = ti->ti_ack;
+              m_freem(pData, m);
+
+              /*
+               * If all outstanding data are acked, stop
+               * retransmit timer, otherwise restart timer
+               * using current (possibly backed-off) value.
+               * If process is waiting for space,
+               * wakeup/selwakeup/signal.  If data
+               * are ready to send, let tcp_output
+               * decide between more output or persist.
+               */
+              if (tp->snd_una == tp->snd_max)
+                  tp->t_timer[TCPT_REXMT] = 0;
+              else if (tp->t_timer[TCPT_PERSIST] == 0)
+                  tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
+
+              /*
+               * There's room in so_snd, sowwakup will read()
+               * from the socket if we can
+               */
+#if 0
+              if (so->so_snd.sb_flags & SB_NOTIFY)
+                  sowwakeup(so);
+#endif
+              /*
+               * This is called because sowwakeup might have
+               * put data into so_snd.  Since we don't so sowwakeup,
+               * we don't need this.. XXX???
+               */
+              if (so->so_snd.sb_cc)
+                  (void) tcp_output(pData, tp);
+
+              return;
+            }
+        }
+        else if (   ti->ti_ack == tp->snd_una
+                 && LIST_FIRST(&tp->t_segq)
+                 && ti->ti_len <= sbspace(&so->so_rcv))
+        {
+            /*
+             * this is a pure, in-sequence data packet
+             * with nothing on the reassembly queue and
+             * we have enough buffer space to take it.
+             */
+            ++tcpstat.tcps_preddat;
+            tp->rcv_nxt += ti->ti_len;
+            tcpstat.tcps_rcvpack++;
+            tcpstat.tcps_rcvbyte += ti->ti_len;
+            /*
+             * Add data to socket buffer.
+             */
+            if (so->so_emu)
+            {
+                if (tcp_emu(pData, so,m)) sbappend(pData, so, m);
+            }
+            else
+                sbappend(pData, so, m);
+
+            /*
+             * XXX This is called when data arrives.  Later, check
+             * if we can actually write() to the socket
+             * XXX Need to check? It's be NON_BLOCKING
+             */
+/*          sorwakeup(so); */
+
+            /*
+             * If this is a short packet, then ACK now - with Nagel
+             *      congestion avoidance sender won't send more until
+             *      he gets an ACK.
+             *
+             * It is better to not delay acks at all to maximize
+             * TCP throughput.  See RFC 2581.
+             */
+            tp->t_flags |= TF_ACKNOW;
+            tcp_output(pData, tp);
+            return;
+        }
+    } /* header prediction */
+    /*
+     * Calculate amount of space in receive window,
+     * and then do TCP input processing.
+     * Receive window is amount of space in rcv queue,
+     * but not less than advertised window.
+     */
+    {
+        int win;
+        win = sbspace(&so->so_rcv);
+        if (win < 0)
             win = 0;
-          tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt));
-        }
-
-        switch (tp->t_state) {
-
+        tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt));
+    }
+
+    switch (tp->t_state)
+    {
         /*
          * If the state is LISTEN then ignore segment if it contains an RST.
@@ -614,87 +651,96 @@
          * segment in this state.
          */
-        case TCPS_LISTEN: {
-
-          if (tiflags & TH_RST)
-            goto drop;
-          if (tiflags & TH_ACK)
-            goto dropwithreset;
-          if ((tiflags & TH_SYN) == 0)
-            goto drop;
-
-          /*
-           * This has way too many gotos...
-           * But a bit of spaghetti code never hurt anybody :)
-           */
-
-          if (so->so_emu & EMU_NOCONNECT) {
-            so->so_emu &= ~EMU_NOCONNECT;
-            goto cont_input;
-          }
-
-          if((tcp_fconnect(pData, so) == -1) && (errno != EINPROGRESS) && (errno != EWOULDBLOCK)) {
-            u_char code=ICMP_UNREACH_NET;
-            DEBUG_MISC((dfd," tcp fconnect errno = %d-%s\n",
-                        errno,strerror(errno)));
-            if(errno == ECONNREFUSED) {
-              /* ACK the SYN, send RST to refuse the connection */
-              tcp_respond(pData, tp, ti, m, ti->ti_seq+1, (tcp_seq)0,
-                          TH_RST|TH_ACK);
-            } else {
-              if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST;
-              HTONL(ti->ti_seq);             /* restore tcp header */
-              HTONL(ti->ti_ack);
-              HTONS(ti->ti_win);
-              HTONS(ti->ti_urp);
-              m->m_data -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
-              m->m_len  += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
-              *ip=save_ip;
-              icmp_error(pData, m, ICMP_UNREACH,code, 0,strerror(errno));
-            }
-            tp = tcp_close(pData, tp);
-            m_free(pData, m);
-          } else {
-            /*
-             * Haven't connected yet, save the current mbuf
-             * and ti, and return
-             * XXX Some OS's don't tell us whether the connect()
-             * succeeded or not.  So we must time it out.
-             */
-            so->so_m = m;
-            so->so_ti = ti;
+        case TCPS_LISTEN:
+        {
+            if (tiflags & TH_RST)
+                goto drop;
+            if (tiflags & TH_ACK)
+                goto dropwithreset;
+            if ((tiflags & TH_SYN) == 0)
+                goto drop;
+
+            /*
+             * This has way too many gotos...
+             * But a bit of spaghetti code never hurt anybody :)
+             */
+
+            if (so->so_emu & EMU_NOCONNECT)
+            {
+                so->so_emu &= ~EMU_NOCONNECT;
+                goto cont_input;
+            }
+
+            if (   (tcp_fconnect(pData, so) == -1)
+                && errno != EINPROGRESS
+                && errno != EWOULDBLOCK)
+            {
+                u_char code = ICMP_UNREACH_NET;
+                DEBUG_MISC((dfd," tcp fconnect errno = %d-%s\n",
+                            errno,strerror(errno)));
+                if (errno == ECONNREFUSED)
+                {
+                    /* ACK the SYN, send RST to refuse the connection */
+                    tcp_respond(pData, tp, ti, m, ti->ti_seq+1, (tcp_seq)0,
+                               TH_RST|TH_ACK);
+                }
+                else
+                {
+                    if (errno == EHOSTUNREACH)
+                        code = ICMP_UNREACH_HOST;
+                    HTONL(ti->ti_seq);             /* restore tcp header */
+                    HTONL(ti->ti_ack);
+                    HTONS(ti->ti_win);
+                    HTONS(ti->ti_urp);
+                    m->m_data -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
+                    m->m_len  += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
+                    *ip = save_ip;
+                    icmp_error(pData, m, ICMP_UNREACH,code, 0,strerror(errno));
+                }
+                tp = tcp_close(pData, tp);
+                m_free(pData, m);
+            }
+            else
+            {
+                /*
+                 * Haven't connected yet, save the current mbuf
+                 * and ti, and return
+                 * XXX Some OS's don't tell us whether the connect()
+                 * succeeded or not.  So we must time it out.
+                 */
+                so->so_m = m;
+                so->so_ti = ti;
+                tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
+                tp->t_state = TCPS_SYN_RECEIVED;
+            }
+            return;
+
+cont_conn:
+            /* m==NULL
+             * Check if the connect succeeded
+             */
+            if (so->so_state & SS_NOFDREF)
+            {
+                tp = tcp_close(pData, tp);
+                goto dropwithreset;
+            }
+cont_input:
+            tcp_template(tp);
+
+            if (optp)
+                tcp_dooptions(pData, tp, (u_char *)optp, optlen, ti);
+
+            if (iss)
+                tp->iss = iss;
+            else
+                tp->iss = tcp_iss;
+            tcp_iss += TCP_ISSINCR/2;
+            tp->irs = ti->ti_seq;
+            tcp_sendseqinit(tp);
+            tcp_rcvseqinit(tp);
+            tp->t_flags |= TF_ACKNOW;
+            tp->t_state = TCPS_SYN_RECEIVED;
             tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
-            tp->t_state = TCPS_SYN_RECEIVED;
-          }
-          return;
-
-        cont_conn:
-          /* m==NULL
-           * Check if the connect succeeded
-           */
-          if (so->so_state & SS_NOFDREF) {
-            tp = tcp_close(pData, tp);
-            goto dropwithreset;
-          }
-        cont_input:
-          tcp_template(tp);
-
-          if (optp)
-            tcp_dooptions(pData, tp, (u_char *)optp, optlen, ti);
-          /* , */
-          /*                            &ts_present, &ts_val, &ts_ecr); */
-
-          if (iss)
-            tp->iss = iss;
-          else
-            tp->iss = tcp_iss;
-          tcp_iss += TCP_ISSINCR/2;
-          tp->irs = ti->ti_seq;
-          tcp_sendseqinit(tp);
-          tcp_rcvseqinit(tp);
-          tp->t_flags |= TF_ACKNOW;
-          tp->t_state = TCPS_SYN_RECEIVED;
-          tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
-          tcpstat.tcps_accepts++;
-          goto trimthenstep6;
+            tcpstat.tcps_accepts++;
+            goto trimthenstep6;
         } /* case TCPS_LISTEN */
 
@@ -712,235 +758,265 @@
          */
         case TCPS_SYN_SENT:
-                if ((tiflags & TH_ACK) &&
-                    (SEQ_LEQ(ti->ti_ack, tp->iss) ||
-                     SEQ_GT(ti->ti_ack, tp->snd_max)))
-                        goto dropwithreset;
-
-                if (tiflags & TH_RST) {
-                        if (tiflags & TH_ACK)
-                                tp = tcp_drop(pData, tp,0); /* XXX Check t_softerror! */
-                        goto drop;
+            if (   (tiflags & TH_ACK)
+                && (   SEQ_LEQ(ti->ti_ack, tp->iss)
+                    || SEQ_GT(ti->ti_ack, tp->snd_max)))
+                goto dropwithreset;
+
+            if (tiflags & TH_RST)
+            {
+                if (tiflags & TH_ACK)
+                    tp = tcp_drop(pData, tp,0); /* XXX Check t_softerror! */
+                goto drop;
+            }
+
+            if ((tiflags & TH_SYN) == 0)
+                goto drop;
+            if (tiflags & TH_ACK)
+            {
+                tp->snd_una = ti->ti_ack;
+                if (SEQ_LT(tp->snd_nxt, tp->snd_una))
+                    tp->snd_nxt = tp->snd_una;
+            }
+
+            tp->t_timer[TCPT_REXMT] = 0;
+            tp->irs = ti->ti_seq;
+            tcp_rcvseqinit(tp);
+            tp->t_flags |= TF_ACKNOW;
+            if (tiflags & TH_ACK && SEQ_GT(tp->snd_una, tp->iss))
+            {
+                tcpstat.tcps_connects++;
+                soisfconnected(so);
+                tp->t_state = TCPS_ESTABLISHED;
+
+                /* Do window scaling on this connection? */
+#if 0
+                if ((  tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE))
+                     == (TF_RCVD_SCALE|TF_REQ_SCALE))
+                {
+                    tp->snd_scale = tp->requested_s_scale;
+                    tp->rcv_scale = tp->request_r_scale;
                 }
-
-                if ((tiflags & TH_SYN) == 0)
-                        goto drop;
-                if (tiflags & TH_ACK) {
-                        tp->snd_una = ti->ti_ack;
-                        if (SEQ_LT(tp->snd_nxt, tp->snd_una))
-                                tp->snd_nxt = tp->snd_una;
-                }
-
-                tp->t_timer[TCPT_REXMT] = 0;
-                tp->irs = ti->ti_seq;
-                tcp_rcvseqinit(tp);
+#endif
+                (void) tcp_reass(pData, tp, (struct tcphdr *)0, NULL, (struct mbuf *)0);
+                /*
+                 * if we didn't have to retransmit the SYN,
+                 * use its rtt as our initial srtt & rtt var.
+                 */
+                if (tp->t_rtt)
+                    tcp_xmit_timer(pData, tp, tp->t_rtt);
+            }
+            else
+                tp->t_state = TCPS_SYN_RECEIVED;
+
+trimthenstep6:
+            /*
+             * Advance ti->ti_seq to correspond to first data byte.
+             * If data, trim to stay within window,
+             * dropping FIN if necessary.
+             */
+            ti->ti_seq++;
+            if (ti->ti_len > tp->rcv_wnd)
+            {
+                todrop = ti->ti_len - tp->rcv_wnd;
+                m_adj(m, -todrop);
+                ti->ti_len = tp->rcv_wnd;
+                tiflags &= ~TH_FIN;
+                tcpstat.tcps_rcvpackafterwin++;
+                tcpstat.tcps_rcvbyteafterwin += todrop;
+            }
+            tp->snd_wl1 = ti->ti_seq - 1;
+            tp->rcv_up = ti->ti_seq;
+            goto step6;
+    } /* switch tp->t_state */
+    /*
+     * States other than LISTEN or SYN_SENT.
+     * First check timestamp, if present.
+     * Then check that at least some bytes of segment are within
+     * receive window.  If segment begins before rcv_nxt,
+     * drop leading data (and SYN); if nothing left, just ack.
+     *
+     * RFC 1323 PAWS: If we have a timestamp reply on this segment
+     * and it's less than ts_recent, drop it.
+     */
+#if 0
+    if (   ts_present
+        && (tiflags & TH_RST) == 0
+        && tp->ts_recent
+        && TSTMP_LT(ts_val, tp->ts_recent))
+    {
+        /* Check to see if ts_recent is over 24 days old.  */
+        if ((int)(tcp_now - tp->ts_recent_age) > TCP_PAWS_IDLE)
+        {
+            /*
+             * Invalidate ts_recent.  If this segment updates
+             * ts_recent, the age will be reset later and ts_recent
+             * will get a valid value.  If it does not, setting
+             * ts_recent to zero will at least satisfy the
+             * requirement that zero be placed in the timestamp
+             * echo reply when ts_recent isn't valid.  The
+             * age isn't reset until we get a valid ts_recent
+             * because we don't want out-of-order segments to be
+             * dropped when ts_recent is old.
+             */
+            tp->ts_recent = 0;
+        }
+        else
+        {
+            tcpstat.tcps_rcvduppack++;
+            tcpstat.tcps_rcvdupbyte += ti->ti_len;
+            tcpstat.tcps_pawsdrop++;
+            goto dropafterack;
+        }
+     }
+#endif
+
+    todrop = tp->rcv_nxt - ti->ti_seq;
+    if (todrop > 0)
+    {
+        if (tiflags & TH_SYN)
+        {
+            tiflags &= ~TH_SYN;
+            ti->ti_seq++;
+            if (ti->ti_urp > 1)
+                ti->ti_urp--;
+            else
+                tiflags &= ~TH_URG;
+            todrop--;
+        }
+        /*
+         * Following if statement from Stevens, vol. 2, p. 960.
+         */
+        if (   todrop > ti->ti_len
+            || (   todrop == ti->ti_len
+                && (tiflags & TH_FIN) == 0))
+        {
+            /*
+             * Any valid FIN must be to the left of the window.
+             * At this point the FIN must be a duplicate or out
+             * of sequence; drop it.
+             */
+            tiflags &= ~TH_FIN;
+
+            /*
+             * Send an ACK to resynchronize and drop any data.
+             * But keep on processing for RST or ACK.
+             */
+            tp->t_flags |= TF_ACKNOW;
+            todrop = ti->ti_len;
+            tcpstat.tcps_rcvduppack++;
+            tcpstat.tcps_rcvdupbyte += todrop;
+        }
+        else
+        {
+            tcpstat.tcps_rcvpartduppack++;
+            tcpstat.tcps_rcvpartdupbyte += todrop;
+        }
+        m_adj(m, todrop);
+        ti->ti_seq += todrop;
+        ti->ti_len -= todrop;
+        if (ti->ti_urp > todrop)
+            ti->ti_urp -= todrop;
+        else
+        {
+            tiflags &= ~TH_URG;
+            ti->ti_urp = 0;
+        }
+    }
+    /*
+     * If new data are received on a connection after the
+     * user processes are gone, then RST the other end.
+     */
+    if (   (so->so_state & SS_NOFDREF)
+        && tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len)
+    {
+        tp = tcp_close(pData, tp);
+        tcpstat.tcps_rcvafterclose++;
+        goto dropwithreset;
+    }
+
+    /*
+     * If segment ends after window, drop trailing data
+     * (and PUSH and FIN); if nothing left, just ACK.
+     */
+    todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd);
+    if (todrop > 0)
+    {
+        tcpstat.tcps_rcvpackafterwin++;
+        if (todrop >= ti->ti_len)
+        {
+            tcpstat.tcps_rcvbyteafterwin += ti->ti_len;
+            /*
+             * If a new connection request is received
+             * while in TIME_WAIT, drop the old connection
+             * and start over if the sequence numbers
+             * are above the previous ones.
+             */
+            if (   tiflags & TH_SYN
+                && tp->t_state == TCPS_TIME_WAIT
+                && SEQ_GT(ti->ti_seq, tp->rcv_nxt))
+            {
+                iss = tp->rcv_nxt + TCP_ISSINCR;
+                tp = tcp_close(pData, tp);
+                goto findso;
+            }
+            /*
+             * If window is closed can only take segments at
+             * window edge, and have to drop data and PUSH from
+             * incoming segments.  Continue processing, but
+             * remember to ack.  Otherwise, drop segment
+             * and ack.
+             */
+            if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt)
+            {
                 tp->t_flags |= TF_ACKNOW;
-                if (tiflags & TH_ACK && SEQ_GT(tp->snd_una, tp->iss)) {
-                        tcpstat.tcps_connects++;
-                        soisfconnected(so);
-                        tp->t_state = TCPS_ESTABLISHED;
-
-                        /* Do window scaling on this connection? */
-/*                      if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
- *                              (TF_RCVD_SCALE|TF_REQ_SCALE)) {
- *                              tp->snd_scale = tp->requested_s_scale;
- *                              tp->rcv_scale = tp->request_r_scale;
- *                      }
- */
-                        (void) tcp_reass(pData, tp, (struct tcphdr *)0, NULL, (struct mbuf *)0);
-                        /*
-                         * if we didn't have to retransmit the SYN,
-                         * use its rtt as our initial srtt & rtt var.
-                         */
-                        if (tp->t_rtt)
-                                tcp_xmit_timer(pData, tp, tp->t_rtt);
-                } else
-                        tp->t_state = TCPS_SYN_RECEIVED;
-
-trimthenstep6:
-                /*
-                 * Advance ti->ti_seq to correspond to first data byte.
-                 * If data, trim to stay within window,
-                 * dropping FIN if necessary.
-                 */
-                ti->ti_seq++;
-                if (ti->ti_len > tp->rcv_wnd) {
-                        todrop = ti->ti_len - tp->rcv_wnd;
-                        m_adj(m, -todrop);
-                        ti->ti_len = tp->rcv_wnd;
-                        tiflags &= ~TH_FIN;
-                        tcpstat.tcps_rcvpackafterwin++;
-                        tcpstat.tcps_rcvbyteafterwin += todrop;
-                }
-                tp->snd_wl1 = ti->ti_seq - 1;
-                tp->rcv_up = ti->ti_seq;
-                goto step6;
-        } /* switch tp->t_state */
-        /*
-         * States other than LISTEN or SYN_SENT.
-         * First check timestamp, if present.
-         * Then check that at least some bytes of segment are within
-         * receive window.  If segment begins before rcv_nxt,
-         * drop leading data (and SYN); if nothing left, just ack.
-         *
-         * RFC 1323 PAWS: If we have a timestamp reply on this segment
-         * and it's less than ts_recent, drop it.
-         */
-/*      if (ts_present && (tiflags & TH_RST) == 0 && tp->ts_recent &&
- *          TSTMP_LT(ts_val, tp->ts_recent)) {
- *
- */             /* Check to see if ts_recent is over 24 days old.  */
-/*              if ((int)(tcp_now - tp->ts_recent_age) > TCP_PAWS_IDLE) {
- */                     /*
- *                       * Invalidate ts_recent.  If this segment updates
- *                       * ts_recent, the age will be reset later and ts_recent
- *                       * will get a valid value.  If it does not, setting
- *                       * ts_recent to zero will at least satisfy the
- *                       * requirement that zero be placed in the timestamp
- *                       * echo reply when ts_recent isn't valid.  The
- *                       * age isn't reset until we get a valid ts_recent
- *                       * because we don't want out-of-order segments to be
- *                       * dropped when ts_recent is old.
- *                       */
-/*                      tp->ts_recent = 0;
- *              } else {
- *                      tcpstat.tcps_rcvduppack++;
- *                      tcpstat.tcps_rcvdupbyte += ti->ti_len;
- *                      tcpstat.tcps_pawsdrop++;
- *                      goto dropafterack;
- *              }
- *      }
- */
-
-        todrop = tp->rcv_nxt - ti->ti_seq;
-        if (todrop > 0) {
-                if (tiflags & TH_SYN) {
-                        tiflags &= ~TH_SYN;
-                        ti->ti_seq++;
-                        if (ti->ti_urp > 1)
-                                ti->ti_urp--;
-                        else
-                                tiflags &= ~TH_URG;
-                        todrop--;
-                }
-                /*
-                 * Following if statement from Stevens, vol. 2, p. 960.
-                 */
-                if (todrop > ti->ti_len
-                    || (todrop == ti->ti_len && (tiflags & TH_FIN) == 0)) {
-                        /*
-                         * Any valid FIN must be to the left of the window.
-                         * At this point the FIN must be a duplicate or out
-                         * of sequence; drop it.
-                         */
-                        tiflags &= ~TH_FIN;
-
-                        /*
-                         * Send an ACK to resynchronize and drop any data.
-                         * But keep on processing for RST or ACK.
-                         */
-                        tp->t_flags |= TF_ACKNOW;
-                        todrop = ti->ti_len;
-                        tcpstat.tcps_rcvduppack++;
-                        tcpstat.tcps_rcvdupbyte += todrop;
-                } else {
-                        tcpstat.tcps_rcvpartduppack++;
-                        tcpstat.tcps_rcvpartdupbyte += todrop;
-                }
-                m_adj(m, todrop);
-                ti->ti_seq += todrop;
-                ti->ti_len -= todrop;
-                if (ti->ti_urp > todrop)
-                        ti->ti_urp -= todrop;
-                else {
-                        tiflags &= ~TH_URG;
-                        ti->ti_urp = 0;
-                }
-        }
-        /*
-         * If new data are received on a connection after the
-         * user processes are gone, then RST the other end.
-         */
-        if ((so->so_state & SS_NOFDREF) &&
-            tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) {
-                tp = tcp_close(pData, tp);
-                tcpstat.tcps_rcvafterclose++;
-                goto dropwithreset;
-        }
-
-        /*
-         * If segment ends after window, drop trailing data
-         * (and PUSH and FIN); if nothing left, just ACK.
-         */
-        todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd);
-        if (todrop > 0) {
-                tcpstat.tcps_rcvpackafterwin++;
-                if (todrop >= ti->ti_len) {
-                        tcpstat.tcps_rcvbyteafterwin += ti->ti_len;
-                        /*
-                         * If a new connection request is received
-                         * while in TIME_WAIT, drop the old connection
-                         * and start over if the sequence numbers
-                         * are above the previous ones.
-                         */
-                        if (tiflags & TH_SYN &&
-                            tp->t_state == TCPS_TIME_WAIT &&
-                            SEQ_GT(ti->ti_seq, tp->rcv_nxt)) {
-                                iss = tp->rcv_nxt + TCP_ISSINCR;
-                                tp = tcp_close(pData, tp);
-                                goto findso;
-                        }
-                        /*
-                         * If window is closed can only take segments at
-                         * window edge, and have to drop data and PUSH from
-                         * incoming segments.  Continue processing, but
-                         * remember to ack.  Otherwise, drop segment
-                         * and ack.
-                         */
-                        if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) {
-                                tp->t_flags |= TF_ACKNOW;
-                                tcpstat.tcps_rcvwinprobe++;
-                        } else
-                                goto dropafterack;
-                } else
-                        tcpstat.tcps_rcvbyteafterwin += todrop;
-                m_adj(m, -todrop);
-                ti->ti_len -= todrop;
-                tiflags &= ~(TH_PUSH|TH_FIN);
-        }
-
-        /*
-         * If last ACK falls within this segment's sequence numbers,
-         * record its timestamp.
-         */
-/*      if (ts_present && SEQ_LEQ(ti->ti_seq, tp->last_ack_sent) &&
- *          SEQ_LT(tp->last_ack_sent, ti->ti_seq + ti->ti_len +
- *                 ((tiflags & (TH_SYN|TH_FIN)) != 0))) {
- *              tp->ts_recent_age = tcp_now;
- *              tp->ts_recent = ts_val;
- *      }
- */
-
-        /*
-         * If the RST bit is set examine the state:
-         *    SYN_RECEIVED STATE:
-         *      If passive open, return to LISTEN state.
-         *      If active open, inform user that connection was refused.
-         *    ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES:
-         *      Inform user that connection was reset, and close tcb.
-         *    CLOSING, LAST_ACK, TIME_WAIT STATES
-         *      Close the tcb.
-         */
-        if (tiflags&TH_RST) switch (tp->t_state) {
-
-        case TCPS_SYN_RECEIVED:
+                tcpstat.tcps_rcvwinprobe++;
+            }
+            else
+                goto dropafterack;
+        }
+        else
+            tcpstat.tcps_rcvbyteafterwin += todrop;
+        m_adj(m, -todrop);
+        ti->ti_len -= todrop;
+        tiflags &= ~(TH_PUSH|TH_FIN);
+    }
+
+    /*
+     * If last ACK falls within this segment's sequence numbers,
+     * record its timestamp.
+     */
+#if 0
+    if (   ts_present
+        && SEQ_LEQ(ti->ti_seq, tp->last_ack_sent)
+        && SEQ_LT(tp->last_ack_sent, ti->ti_seq + ti->ti_len + ((tiflags & (TH_SYN|TH_FIN)) != 0))) 
+    {
+        tp->ts_recent_age = tcp_now;
+        tp->ts_recent = ts_val;
+    }
+#endif
+
+    /*
+     * If the RST bit is set examine the state:
+     *    SYN_RECEIVED STATE:
+     *      If passive open, return to LISTEN state.
+     *      If active open, inform user that connection was refused.
+     *    ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES:
+     *      Inform user that connection was reset, and close tcb.
+     *    CLOSING, LAST_ACK, TIME_WAIT STATES
+     *      Close the tcb.
+     */
+    if (tiflags&TH_RST)
+        switch (tp->t_state)
+        {
+            case TCPS_SYN_RECEIVED:
 /*              so->so_error = ECONNREFUSED; */
                 goto close;
 
-        case TCPS_ESTABLISHED:
-        case TCPS_FIN_WAIT_1:
-        case TCPS_FIN_WAIT_2:
-        case TCPS_CLOSE_WAIT:
+            case TCPS_ESTABLISHED:
+            case TCPS_FIN_WAIT_1:
+            case TCPS_FIN_WAIT_2:
+            case TCPS_CLOSE_WAIT:
 /*              so->so_error = ECONNRESET; */
-        close:
+close:
                 tp->t_state = TCPS_CLOSED;
                 tcpstat.tcps_drops++;
@@ -948,29 +1024,32 @@
                 goto drop;
 
-        case TCPS_CLOSING:
-        case TCPS_LAST_ACK:
-        case TCPS_TIME_WAIT:
+            case TCPS_CLOSING:
+            case TCPS_LAST_ACK:
+            case TCPS_TIME_WAIT:
                 tp = tcp_close(pData, tp);
                 goto drop;
         }
 
-        /*
-         * If a SYN is in the window, then this is an
-         * error and we send an RST and drop the connection.
-         */
-        if (tiflags & TH_SYN) {
-                tp = tcp_drop(pData, tp,0);
-                goto dropwithreset;
-        }
-
-        /*
-         * If the ACK bit is off we drop the segment and return.
-         */
-        if ((tiflags & TH_ACK) == 0) goto drop;
-
-        /*
-         * Ack processing.
-         */
-        switch (tp->t_state) {
+    /*
+     * If a SYN is in the window, then this is an
+     * error and we send an RST and drop the connection.
+     */
+    if (tiflags & TH_SYN)
+    {
+        tp = tcp_drop(pData, tp,0);
+        goto dropwithreset;
+    }
+
+    /*
+     * If the ACK bit is off we drop the segment and return.
+     */
+    if ((tiflags & TH_ACK) == 0)
+        goto drop;
+
+    /*
+     * Ack processing.
+     */
+    switch (tp->t_state)
+    {
         /*
          * In SYN_RECEIVED state if the ack ACKs our SYN then enter
@@ -979,41 +1058,42 @@
          */
         case TCPS_SYN_RECEIVED:
-
-                if (SEQ_GT(tp->snd_una, ti->ti_ack) ||
-                    SEQ_GT(ti->ti_ack, tp->snd_max))
-                        goto dropwithreset;
-                tcpstat.tcps_connects++;
-                tp->t_state = TCPS_ESTABLISHED;
-                /*
-                 * The sent SYN is ack'ed with our sequence number +1
-                 * The first data byte already in the buffer will get
-                 * lost if no correction is made.  This is only needed for
-                 * SS_CTL since the buffer is empty otherwise.
-                 * tp->snd_una++; or:
-                 */
-                tp->snd_una=ti->ti_ack;
-                soisfconnected(so);
-
-                /* Do window scaling? */
-/*              if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
- *                      (TF_RCVD_SCALE|TF_REQ_SCALE)) {
- *                      tp->snd_scale = tp->requested_s_scale;
- *                      tp->rcv_scale = tp->request_r_scale;
- *              }
- */
-                (void) tcp_reass(pData, tp, (struct tcphdr *)0, (int *)0, (struct mbuf *)0);
-                tp->snd_wl1 = ti->ti_seq - 1;
-                /* Avoid ack processing; snd_una==ti_ack  =>  dup ack */
-                goto synrx_to_est;
-                /* fall into ... */
-
-        /*
-         * In ESTABLISHED state: drop duplicate ACKs; ACK out of range
-         * ACKs.  If the ack is in the range
-         *      tp->snd_una < ti->ti_ack <= tp->snd_max
-         * then advance tp->snd_una to ti->ti_ack and drop
-         * data from the retransmission queue.  If this ACK reflects
-         * more up to date window information we update our window information.
-         */
+            if (   SEQ_GT(tp->snd_una, ti->ti_ack)
+                || SEQ_GT(ti->ti_ack, tp->snd_max))
+                goto dropwithreset;
+            tcpstat.tcps_connects++;
+            tp->t_state = TCPS_ESTABLISHED;
+            /*
+             * The sent SYN is ack'ed with our sequence number +1
+             * The first data byte already in the buffer will get
+             * lost if no correction is made.  This is only needed for
+             * SS_CTL since the buffer is empty otherwise.
+             * tp->snd_una++; or:
+             */
+            tp->snd_una = ti->ti_ack;
+            soisfconnected(so);
+
+            /* Do window scaling? */
+#if 0
+            if (   (tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE))
+                == (TF_RCVD_SCALE|TF_REQ_SCALE))
+            {
+                tp->snd_scale = tp->requested_s_scale;
+                tp->rcv_scale = tp->request_r_scale;
+            }
+#endif
+            (void) tcp_reass(pData, tp, (struct tcphdr *)0, (int *)0, (struct mbuf *)0);
+            tp->snd_wl1 = ti->ti_seq - 1;
+            /* Avoid ack processing; snd_una==ti_ack  =>  dup ack */
+            goto synrx_to_est;
+            /* fall into ... */
+
+            /*
+             * In ESTABLISHED state: drop duplicate ACKs; ACK out of range
+             * ACKs.  If the ack is in the range
+             *      tp->snd_una < ti->ti_ack <= tp->snd_max
+             * then advance tp->snd_una to ti->ti_ack and drop
+             * data from the retransmission queue.  If this ACK reflects
+             * more up to date window information we update our window information.
+             */
         case TCPS_ESTABLISHED:
         case TCPS_FIN_WAIT_1:
@@ -1023,146 +1103,156 @@
         case TCPS_LAST_ACK:
         case TCPS_TIME_WAIT:
-
-                if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) {
-                        if (ti->ti_len == 0 && tiwin == tp->snd_wnd) {
-                          tcpstat.tcps_rcvdupack++;
-                          DEBUG_MISC((dfd," dup ack  m = %lx  so = %lx \n",
-                                      (long )m, (long )so));
-                                /*
-                                 * If we have outstanding data (other than
-                                 * a window probe), this is a completely
-                                 * duplicate ack (ie, window info didn't
-                                 * change), the ack is the biggest we've
-                                 * seen and we've seen exactly our rexmt
-                                 * threshold of them, assume a packet
-                                 * has been dropped and retransmit it.
-                                 * Kludge snd_nxt & the congestion
-                                 * window so we send only this one
-                                 * packet.
-                                 *
-                                 * We know we're losing at the current
-                                 * window size so do congestion avoidance
-                                 * (set ssthresh to half the current window
-                                 * and pull our congestion window back to
-                                 * the new ssthresh).
-                                 *
-                                 * Dup acks mean that packets have left the
-                                 * network (they're now cached at the receiver)
-                                 * so bump cwnd by the amount in the receiver
-                                 * to keep a constant cwnd packets in the
-                                 * network.
-                                 */
-                                if (tp->t_timer[TCPT_REXMT] == 0 ||
-                                    ti->ti_ack != tp->snd_una)
-                                        tp->t_dupacks = 0;
-                                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;
-
-                                        if (win < 2)
-                                                win = 2;
-                                        tp->snd_ssthresh = win * tp->t_maxseg;
-                                        tp->t_timer[TCPT_REXMT] = 0;
-                                        tp->t_rtt = 0;
-                                        tp->snd_nxt = ti->ti_ack;
-                                        tp->snd_cwnd = tp->t_maxseg;
-                                        (void) tcp_output(pData, tp);
-                                        tp->snd_cwnd = tp->snd_ssthresh +
-                                               tp->t_maxseg * tp->t_dupacks;
-                                        if (SEQ_GT(onxt, tp->snd_nxt))
-                                                tp->snd_nxt = onxt;
-                                        goto drop;
-                                } else if (tp->t_dupacks > tcprexmtthresh) {
-                                        tp->snd_cwnd += tp->t_maxseg;
-                                        (void) tcp_output(pData, tp);
-                                        goto drop;
-                                }
-                        } else
-                                tp->t_dupacks = 0;
-                        break;
+            if (SEQ_LEQ(ti->ti_ack, tp->snd_una))
+            {
+                if (ti->ti_len == 0 && tiwin == tp->snd_wnd)
+                {
+                    tcpstat.tcps_rcvdupack++;
+                    DEBUG_MISC((dfd," dup ack  m = %lx  so = %lx \n",
+                                (long )m, (long )so));
+                    /*
+                     * If we have outstanding data (other than
+                     * a window probe), this is a completely
+                     * duplicate ack (ie, window info didn't
+                     * change), the ack is the biggest we've
+                     * seen and we've seen exactly our rexmt
+                     * threshold of them, assume a packet
+                     * has been dropped and retransmit it.
+                     * Kludge snd_nxt & the congestion
+                     * window so we send only this one
+                     * packet.
+                     *
+                     * We know we're losing at the current
+                     * window size so do congestion avoidance
+                     * (set ssthresh to half the current window
+                     * and pull our congestion window back to
+                     * the new ssthresh).
+                     *
+                     * Dup acks mean that packets have left the
+                     * network (they're now cached at the receiver)
+                     * so bump cwnd by the amount in the receiver
+                     * to keep a constant cwnd packets in the
+                     * network.
+                     */
+                    if (   tp->t_timer[TCPT_REXMT] == 0
+                        || ti->ti_ack != tp->snd_una)
+                        tp->t_dupacks = 0;
+                    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;
+                        if (win < 2)
+                            win = 2;
+                        tp->snd_ssthresh = win * tp->t_maxseg;
+                        tp->t_timer[TCPT_REXMT] = 0;
+                        tp->t_rtt = 0;
+                        tp->snd_nxt = ti->ti_ack;
+                        tp->snd_cwnd = tp->t_maxseg;
+                        (void) tcp_output(pData, tp);
+                        tp->snd_cwnd = tp->snd_ssthresh +
+                            tp->t_maxseg * tp->t_dupacks;
+                        if (SEQ_GT(onxt, tp->snd_nxt))
+                            tp->snd_nxt = onxt;
+                        goto drop;
+                    }
+                    else if (tp->t_dupacks > tcprexmtthresh)
+                    {
+                        tp->snd_cwnd += tp->t_maxseg;
+                        (void) tcp_output(pData, tp);
+                        goto drop;
+                    }
                 }
-        synrx_to_est:
-                /*
-                 * If the congestion window was inflated to account
-                 * for the other side's cached packets, retract it.
-                 */
-                if (tp->t_dupacks > tcprexmtthresh &&
-                    tp->snd_cwnd > tp->snd_ssthresh)
-                        tp->snd_cwnd = tp->snd_ssthresh;
-                tp->t_dupacks = 0;
-                if (SEQ_GT(ti->ti_ack, tp->snd_max)) {
-                        tcpstat.tcps_rcvacktoomuch++;
-                        goto dropafterack;
-                }
-                acked = ti->ti_ack - tp->snd_una;
-                tcpstat.tcps_rcvackpack++;
-                tcpstat.tcps_rcvackbyte += acked;
-
-                /*
-                 * If we have a timestamp reply, update smoothed
-                 * round trip time.  If no timestamp is present but
-                 * transmit timer is running and timed sequence
-                 * number was acked, update smoothed round trip time.
-                 * Since we now have an rtt measurement, cancel the
-                 * timer backoff (cf., Phil Karn's retransmit alg.).
-                 * Recompute the initial retransmit timer.
-                 */
-/*              if (ts_present)
- *                      tcp_xmit_timer(tp, tcp_now-ts_ecr+1);
- *              else
- */
-                     if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq))
-                        tcp_xmit_timer(pData, tp,tp->t_rtt);
-
-                /*
-                 * If all outstanding data is acked, stop retransmit
-                 * timer and remember to restart (more output or persist).
-                 * If there is more data to be acked, restart retransmit
-                 * timer, using current (possibly backed-off) value.
-                 */
-                if (ti->ti_ack == tp->snd_max) {
-                        tp->t_timer[TCPT_REXMT] = 0;
-                        needoutput = 1;
-                } else if (tp->t_timer[TCPT_PERSIST] == 0)
-                        tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
-                /*
-                 * When new data is acked, open the congestion window.
-                 * If the window gives us less than ssthresh packets
-                 * in flight, open exponentially (maxseg per packet).
-                 * Otherwise open linearly: maxseg per window
-                 * (maxseg^2 / cwnd per packet).
-                 */
-                {
-                  register u_int cw = tp->snd_cwnd;
-                  register u_int incr = tp->t_maxseg;
-
-                  if (cw > tp->snd_ssthresh)
+                else
+                    tp->t_dupacks = 0;
+                break;
+            }
+synrx_to_est:
+            /*
+             * If the congestion window was inflated to account
+             * for the other side's cached packets, retract it.
+             */
+            if (   tp->t_dupacks > tcprexmtthresh
+                && tp->snd_cwnd > tp->snd_ssthresh)
+                tp->snd_cwnd = tp->snd_ssthresh;
+            tp->t_dupacks = 0;
+            if (SEQ_GT(ti->ti_ack, tp->snd_max))
+            {
+                tcpstat.tcps_rcvacktoomuch++;
+                goto dropafterack;
+            }
+            acked = ti->ti_ack - tp->snd_una;
+            tcpstat.tcps_rcvackpack++;
+            tcpstat.tcps_rcvackbyte += acked;
+
+            /*
+             * If we have a timestamp reply, update smoothed
+             * round trip time.  If no timestamp is present but
+             * transmit timer is running and timed sequence
+             * number was acked, update smoothed round trip time.
+             * Since we now have an rtt measurement, cancel the
+             * timer backoff (cf., Phil Karn's retransmit alg.).
+             * Recompute the initial retransmit timer.
+             */
+#if 0
+            if (ts_present)
+                tcp_xmit_timer(tp, tcp_now-ts_ecr+1);
+            else
+#endif
+                if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq))
+                    tcp_xmit_timer(pData, tp,tp->t_rtt);
+
+            /*
+             * If all outstanding data is acked, stop retransmit
+             * timer and remember to restart (more output or persist).
+             * If there is more data to be acked, restart retransmit
+             * timer, using current (possibly backed-off) value.
+             */
+            if (ti->ti_ack == tp->snd_max)
+            {
+                tp->t_timer[TCPT_REXMT] = 0;
+                needoutput = 1;
+            }
+            else if (tp->t_timer[TCPT_PERSIST] == 0)
+                tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;
+            /*
+             * When new data is acked, open the congestion window.
+             * If the window gives us less than ssthresh packets
+             * in flight, open exponentially (maxseg per packet).
+             * Otherwise open linearly: maxseg per window
+             * (maxseg^2 / cwnd per packet).
+             */
+            {
+                register u_int cw = tp->snd_cwnd;
+                register u_int incr = tp->t_maxseg;
+
+                if (cw > tp->snd_ssthresh)
                     incr = incr * incr / cw;
-                  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;
-                        sbdrop(&so->so_snd, (int )so->so_snd.sb_cc);
-                        ourfinisacked = 1;
-                } else {
-                        sbdrop(&so->so_snd, acked);
-                        tp->snd_wnd -= acked;
-                        ourfinisacked = 0;
-                }
-                /*
-                 * XXX sowwakup is called when data is acked and there's room for
-                 * for more data... it should read() the socket
-                 */
-/*              if (so->so_snd.sb_flags & SB_NOTIFY)
- *                      sowwakeup(so);
- */
-                tp->snd_una = ti->ti_ack;
-                if (SEQ_LT(tp->snd_nxt, tp->snd_una))
-                        tp->snd_nxt = tp->snd_una;
-
-                switch (tp->t_state) {
-
+                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;
+                sbdrop(&so->so_snd, (int )so->so_snd.sb_cc);
+                ourfinisacked = 1;
+            }
+            else
+            {
+                sbdrop(&so->so_snd, acked);
+                tp->snd_wnd -= acked;
+                ourfinisacked = 0;
+            }
+            /*
+             * XXX sowwakup is called when data is acked and there's room for
+             * for more data... it should read() the socket
+             */
+#if 0
+            if (so->so_snd.sb_flags & SB_NOTIFY)
+                sowwakeup(so);
+#endif
+            tp->snd_una = ti->ti_ack;
+            if (SEQ_LT(tp->snd_nxt, tp->snd_una))
+                tp->snd_nxt = tp->snd_una;
+
+            switch (tp->t_state)
+            {
                 /*
                  * In FIN_WAIT_1 STATE in addition to the processing
@@ -1171,19 +1261,21 @@
                  */
                 case TCPS_FIN_WAIT_1:
-                        if (ourfinisacked) {
-                                /*
-                                 * If we can't receive any more
-                                 * data, then closing user can proceed.
-                                 * Starting the timer is contrary to the
-                                 * specification, but if we don't get a FIN
-                                 * we'll hang forever.
-                                 */
-                                if (so->so_state & SS_FCANTRCVMORE) {
-                                        soisfdisconnected(so);
-                                        tp->t_timer[TCPT_2MSL] = tcp_maxidle;
-                                }
-                                tp->t_state = TCPS_FIN_WAIT_2;
+                    if (ourfinisacked)
+                    {
+                        /*
+                         * If we can't receive any more
+                         * data, then closing user can proceed.
+                         * Starting the timer is contrary to the
+                         * specification, but if we don't get a FIN
+                         * we'll hang forever.
+                         */
+                        if (so->so_state & SS_FCANTRCVMORE)
+                        {
+                            soisfdisconnected(so);
+                            tp->t_timer[TCPT_2MSL] = tcp_maxidle;
                         }
-                        break;
+                        tp->t_state = TCPS_FIN_WAIT_2;
+                    }
+                    break;
 
                 /*
@@ -1194,11 +1286,12 @@
                  */
                 case TCPS_CLOSING:
-                        if (ourfinisacked) {
-                                tp->t_state = TCPS_TIME_WAIT;
-                                tcp_canceltimers(tp);
-                                tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
-                                soisfdisconnected(so);
-                        }
-                        break;
+                    if (ourfinisacked)
+                    {
+                        tp->t_state = TCPS_TIME_WAIT;
+                        tcp_canceltimers(tp);
+                        tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
+                        soisfdisconnected(so);
+                    }
+                    break;
 
                 /*
@@ -1209,9 +1302,10 @@
                  */
                 case TCPS_LAST_ACK:
-                        if (ourfinisacked) {
-                                tp = tcp_close(pData, tp);
-                                goto drop;
-                        }
-                        break;
+                    if (ourfinisacked)
+                    {
+                        tp = tcp_close(pData, tp);
+                        goto drop;
+                    }
+                    break;
 
                 /*
@@ -1221,299 +1315,317 @@
                  */
                 case TCPS_TIME_WAIT:
-                        tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
-                        goto dropafterack;
-                }
-        } /* switch(tp->t_state) */
+                    tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
+                    goto dropafterack;
+            }
+    } /* switch(tp->t_state) */
 
 step6:
+    /*
+     * Update window information.
+     * Don't look at window if no ACK: TAC's send garbage on first SYN.
+     */
+    if (   (tiflags & TH_ACK)
+        && (   SEQ_LT(tp->snd_wl1, ti->ti_seq)
+            || (   tp->snd_wl1 == ti->ti_seq
+                && (   SEQ_LT(tp->snd_wl2, ti->ti_ack)
+                    || (   tp->snd_wl2 == ti->ti_ack
+                        && tiwin > tp->snd_wnd)))))
+    {
+        /* keep track of pure window updates */
+        if (   ti->ti_len == 0
+            && tp->snd_wl2 == ti->ti_ack
+            && tiwin > tp->snd_wnd)
+            tcpstat.tcps_rcvwinupd++;
+        tp->snd_wnd = tiwin;
+        tp->snd_wl1 = ti->ti_seq;
+        tp->snd_wl2 = ti->ti_ack;
+        if (tp->snd_wnd > tp->max_sndwnd)
+            tp->max_sndwnd = tp->snd_wnd;
+        needoutput = 1;
+    }
+
+    /*
+     * Process segments with URG.
+     */
+    if ((tiflags & TH_URG) && ti->ti_urp &&
+            TCPS_HAVERCVDFIN(tp->t_state) == 0)
+    {
         /*
-         * Update window information.
-         * Don't look at window if no ACK: TAC's send garbage on first SYN.
+         * This is a kludge, but if we receive and accept
+         * random urgent pointers, we'll crash in
+         * soreceive.  It's hard to imagine someone
+         * actually wanting to send this much urgent data.
          */
-        if ((tiflags & TH_ACK) &&
-            (SEQ_LT(tp->snd_wl1, ti->ti_seq) ||
-            (tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) ||
-            (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))))) {
-                /* keep track of pure window updates */
-                if (ti->ti_len == 0 &&
-                    tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd)
-                        tcpstat.tcps_rcvwinupd++;
-                tp->snd_wnd = tiwin;
-                tp->snd_wl1 = ti->ti_seq;
-                tp->snd_wl2 = ti->ti_ack;
-                if (tp->snd_wnd > tp->max_sndwnd)
-                        tp->max_sndwnd = tp->snd_wnd;
-                needoutput = 1;
-        }
-
+        if (ti->ti_urp + so->so_rcv.sb_cc > so->so_rcv.sb_datalen)
+        {
+            ti->ti_urp = 0;
+            tiflags &= ~TH_URG;
+            goto dodata;
+        }
         /*
-         * Process segments with URG.
+         * If this segment advances the known urgent pointer,
+         * then mark the data stream.  This should not happen
+         * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since
+         * a FIN has been received from the remote side.
+         * In these states we ignore the URG.
+         *
+         * According to RFC961 (Assigned Protocols),
+         * the urgent pointer points to the last octet
+         * of urgent data.  We continue, however,
+         * to consider it to indicate the first octet
+         * of data past the urgent section as the original
+         * spec states (in one of two places).
          */
-        if ((tiflags & TH_URG) && ti->ti_urp &&
-            TCPS_HAVERCVDFIN(tp->t_state) == 0) {
-                /*
-                 * This is a kludge, but if we receive and accept
-                 * random urgent pointers, we'll crash in
-                 * soreceive.  It's hard to imagine someone
-                 * actually wanting to send this much urgent data.
-                 */
-                if (ti->ti_urp + so->so_rcv.sb_cc > so->so_rcv.sb_datalen) {
-                        ti->ti_urp = 0;
-                        tiflags &= ~TH_URG;
-                        goto dodata;
-                }
-                /*
-                 * If this segment advances the known urgent pointer,
-                 * then mark the data stream.  This should not happen
-                 * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since
-                 * a FIN has been received from the remote side.
-                 * In these states we ignore the URG.
-                 *
-                 * According to RFC961 (Assigned Protocols),
-                 * the urgent pointer points to the last octet
-                 * of urgent data.  We continue, however,
-                 * to consider it to indicate the first octet
-                 * of data past the urgent section as the original
-                 * spec states (in one of two places).
-                 */
-                if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) {
-                        tp->rcv_up = ti->ti_seq + ti->ti_urp;
-                        so->so_urgc =  so->so_rcv.sb_cc +
-                                (tp->rcv_up - tp->rcv_nxt); /* -1; */
-                        tp->rcv_up = ti->ti_seq + ti->ti_urp;
-
-                }
-        } else
-                /*
-                 * If no out of band data is expected,
-                 * pull receive urgent pointer along
-                 * with the receive window.
-                 */
-                if (SEQ_GT(tp->rcv_nxt, tp->rcv_up))
-                        tp->rcv_up = tp->rcv_nxt;
+        if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up))
+        {
+            tp->rcv_up = ti->ti_seq + ti->ti_urp;
+            so->so_urgc =  so->so_rcv.sb_cc +
+                (tp->rcv_up - tp->rcv_nxt); /* -1; */
+            tp->rcv_up = ti->ti_seq + ti->ti_urp;
+        }
+    }
+    else
+        /*
+         * If no out of band data is expected,
+         * pull receive urgent pointer along
+         * with the receive window.
+         */
+        if (SEQ_GT(tp->rcv_nxt, tp->rcv_up))
+            tp->rcv_up = tp->rcv_nxt;
 dodata:
 
+    /*
+     * If this is a small packet, then ACK now - with Nagel
+     *      congestion avoidance sender won't send more until
+     *      he gets an ACK.
+     *
+     * See above.
+     */
+    if (   ti->ti_len
+        && (unsigned)ti->ti_len <= 5
+        && ((struct tcpiphdr_2 *)ti)->first_char == (char)27)
+    {
+        tp->t_flags |= TF_ACKNOW;
+    }
+
+    /*
+     * Process the segment text, merging it into the TCP sequencing queue,
+     * and arranging for acknowledgment of receipt if necessary.
+     * This process logically involves adjusting tp->rcv_wnd as data
+     * is presented to the user (this happens in tcp_usrreq.c,
+     * case PRU_RCVD).  If a FIN has already been received on this
+     * connection then we just ignore the text.
+     */
+    if (   (ti->ti_len || (tiflags&TH_FIN))
+        && TCPS_HAVERCVDFIN(tp->t_state) == 0)
+    {
+        if (   ti->ti_seq == tp->rcv_nxt
+            && LIST_EMPTY(&tp->t_segq)
+            && tp->t_state == TCPS_ESTABLISHED)
+        {
+            DELAY_ACK(tp, ti); /* little bit different from BSD declaration see netinet/tcp_input.c */
+            tp->rcv_nxt += tlen;
+            tiflags = ti->ti_t.th_flags & TH_FIN;
+            tcpstat.tcps_rcvpack++;
+            tcpstat.tcps_rcvbyte += tlen;
+            if (so->so_state & SS_FCANTRCVMORE)
+                m_freem(pData, m);
+            else
+                sbappend(pData, so, m);
+        }
+        else
+        {
+            tiflags = tcp_reass(pData, tp, &ti->ti_t, &tlen, m);
+            tiflags |= TF_ACKNOW;
+        }
         /*
-         * If this is a small packet, then ACK now - with Nagel
-         *      congestion avoidance sender won't send more until
-         *      he gets an ACK.
-         *
-         * See above.
+         * Note the amount of data that peer has sent into
+         * our window, in order to estimate the sender's
+         * buffer size.
          */
-        if (ti->ti_len && (unsigned)ti->ti_len <= 5 &&
-            ((struct tcpiphdr_2 *)ti)->first_char == (char)27) {
-                tp->t_flags |= TF_ACKNOW;
-        }
-
-        /*
-         * Process the segment text, merging it into the TCP sequencing queue,
-         * and arranging for acknowledgment of receipt if necessary.
-         * This process logically involves adjusting tp->rcv_wnd as data
-         * is presented to the user (this happens in tcp_usrreq.c,
-         * case PRU_RCVD).  If a FIN has already been received on this
-         * connection then we just ignore the text.
-         */
-        if ((ti->ti_len || (tiflags&TH_FIN)) &&
-            TCPS_HAVERCVDFIN(tp->t_state) == 0) {
-                if (ti->ti_seq == tp->rcv_nxt
-                && LIST_EMPTY(&tp->t_segq)
-                && tp->t_state == TCPS_ESTABLISHED) {
-                    DELAY_ACK(tp, ti); /* little bit different from BSD declaration see netinet/tcp_input.c */
-                    tp->rcv_nxt += tlen;
-                    tiflags = ti->ti_t.th_flags & TH_FIN;
-                    tcpstat.tcps_rcvpack++;
-                    tcpstat.tcps_rcvbyte += tlen;
-                    if (so->so_state & SS_FCANTRCVMORE)
-                        m_freem(pData, m);
-                    else
-                        sbappend(pData, so, m);
-                }
-                else {
-                    tiflags = tcp_reass(pData, tp, &ti->ti_t, &tlen, m);
-                    tiflags |= TF_ACKNOW;
-                }
-                /*
-                 * Note the amount of data that peer has sent into
-                 * our window, in order to estimate the sender's
-                 * buffer size.
-                 */
-                len = so->so_rcv.sb_datalen - (tp->rcv_adv - tp->rcv_nxt);
-        } else {
-                m_free(pData, m);
-                tiflags &= ~TH_FIN;
-        }
-
-        /*
-         * If FIN is received ACK the FIN and let the user know
-         * that the connection is closing.
-         */
-        if (tiflags & TH_FIN) {
-                if (TCPS_HAVERCVDFIN(tp->t_state) == 0) {
-                        /*
-                         * If we receive a FIN we can't send more data,
-                         * set it SS_FDRAIN
-                         * Shutdown the socket if there is no rx data in the
-                         * buffer.
-                         * soread() is called on completion of shutdown() and
-                         * will got to TCPS_LAST_ACK, and use tcp_output()
-                         * to send the FIN.
-                         */
-/*                      sofcantrcvmore(so); */
-                        sofwdrain(so);
-
-                        tp->t_flags |= TF_ACKNOW;
-                        tp->rcv_nxt++;
-                }
-                switch (tp->t_state) {
-
-                /*
-                 * In SYN_RECEIVED and ESTABLISHED STATES
-                 * enter the CLOSE_WAIT state.
-                 */
-                case TCPS_SYN_RECEIVED:
-                case TCPS_ESTABLISHED:
-                  if(so->so_emu == EMU_CTL)        /* no shutdown on socket */
+        len = so->so_rcv.sb_datalen - (tp->rcv_adv - tp->rcv_nxt);
+    }
+    else
+    {
+        m_free(pData, m);
+        tiflags &= ~TH_FIN;
+    }
+
+    /*
+     * If FIN is received ACK the FIN and let the user know
+     * that the connection is closing.
+     */
+    if (tiflags & TH_FIN)
+    {
+        if (TCPS_HAVERCVDFIN(tp->t_state) == 0)
+        {
+            /*
+             * If we receive a FIN we can't send more data,
+             * set it SS_FDRAIN
+             * Shutdown the socket if there is no rx data in the
+             * buffer.
+             * soread() is called on completion of shutdown() and
+             * will got to TCPS_LAST_ACK, and use tcp_output()
+             * to send the FIN.
+             */
+/*          sofcantrcvmore(so); */
+            sofwdrain(so);
+
+            tp->t_flags |= TF_ACKNOW;
+            tp->rcv_nxt++;
+        }
+        switch (tp->t_state)
+        {
+            /*
+             * In SYN_RECEIVED and ESTABLISHED STATES
+             * enter the CLOSE_WAIT state.
+             */
+            case TCPS_SYN_RECEIVED:
+            case TCPS_ESTABLISHED:
+                if(so->so_emu == EMU_CTL)        /* no shutdown on socket */
                     tp->t_state = TCPS_LAST_ACK;
-                  else
+                else
                     tp->t_state = TCPS_CLOSE_WAIT;
-                  break;
-
-                /*
-                 * If still in FIN_WAIT_1 STATE FIN has not been acked so
-                 * enter the CLOSING state.
-                 */
-                case TCPS_FIN_WAIT_1:
-                        tp->t_state = TCPS_CLOSING;
-                        break;
-
-                /*
-                 * In FIN_WAIT_2 state enter the TIME_WAIT state,
-                 * starting the time-wait timer, turning off the other
-                 * standard timers.
-                 */
-                case TCPS_FIN_WAIT_2:
-                        tp->t_state = TCPS_TIME_WAIT;
-                        tcp_canceltimers(tp);
-                        tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
-                        soisfdisconnected(so);
-                        break;
-
-                /*
-                 * In TIME_WAIT state restart the 2 MSL time_wait timer.
-                 */
-                case TCPS_TIME_WAIT:
-                        tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
-                        break;
-                }
-        }
-
-        /*
-         * Return any desired output.
-         */
-        if (needoutput || (tp->t_flags & TF_ACKNOW)) {
-                (void) tcp_output(pData, tp);
-        }
-        return;
+                break;
+
+            /*
+             * If still in FIN_WAIT_1 STATE FIN has not been acked so
+             * enter the CLOSING state.
+             */
+            case TCPS_FIN_WAIT_1:
+                tp->t_state = TCPS_CLOSING;
+                break;
+
+            /*
+             * In FIN_WAIT_2 state enter the TIME_WAIT state,
+             * starting the time-wait timer, turning off the other
+             * standard timers.
+             */
+            case TCPS_FIN_WAIT_2:
+                tp->t_state = TCPS_TIME_WAIT;
+                tcp_canceltimers(tp);
+                tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
+                soisfdisconnected(so);
+                break;
+
+            /*
+             * In TIME_WAIT state restart the 2 MSL time_wait timer.
+             */
+            case TCPS_TIME_WAIT:
+                tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
+                break;
+        }
+    }
+
+    /*
+     * Return any desired output.
+     */
+    if (needoutput || (tp->t_flags & TF_ACKNOW))
+        tcp_output(pData, tp);
+
+    return;
 
 dropafterack:
-        /*
-         * Generate an ACK dropping incoming segment if it occupies
-         * sequence space, where the ACK reflects our state.
-         */
-        if (tiflags & TH_RST)
-                goto drop;
-        m_freem(pData, m);
-        tp->t_flags |= TF_ACKNOW;
-        (void) tcp_output(pData, tp);
-        return;
+    /*
+     * Generate an ACK dropping incoming segment if it occupies
+     * sequence space, where the ACK reflects our state.
+     */
+    if (tiflags & TH_RST)
+        goto drop;
+    m_freem(pData, m);
+    tp->t_flags |= TF_ACKNOW;
+    (void) tcp_output(pData, tp);
+    return;
 
 dropwithreset:
-        /* reuses m if m!=NULL, m_free() unnecessary */
-        if (tiflags & TH_ACK)
-                tcp_respond(pData, tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST);
-        else {
-                if (tiflags & TH_SYN) ti->ti_len++;
-                tcp_respond(pData, tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0,
+    /* reuses m if m!=NULL, m_free() unnecessary */
+    if (tiflags & TH_ACK)
+        tcp_respond(pData, tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST);
+    else
+    {
+        if (tiflags & TH_SYN) ti->ti_len++;
+        tcp_respond(pData, tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0,
                     TH_RST|TH_ACK);
-        }
-
-        return;
+    }
+
+    return;
 
 drop:
-        /*
-         * Drop space held by incoming segment and return.
-         */
-        m_free(pData, m);
-
-        return;
+    /*
+     * Drop space held by incoming segment and return.
+     */
+    m_free(pData, m);
+
+    return;
 }
 
- /* , ts_present, ts_val, ts_ecr) */
-/*      int *ts_present;
- *      u_int32_t *ts_val, *ts_ecr;
- */
 void
 tcp_dooptions(PNATState pData, struct tcpcb *tp, u_char *cp, int cnt, struct tcpiphdr *ti)
 {
-        u_int16_t mss;
-        int opt, optlen;
-
-        DEBUG_CALL("tcp_dooptions");
-        DEBUG_ARGS((dfd," tp = %lx  cnt=%i \n", (long )tp, cnt));
-
-        for (; cnt > 0; cnt -= optlen, cp += optlen) {
-                opt = cp[0];
-                if (opt == TCPOPT_EOL)
-                        break;
-                if (opt == TCPOPT_NOP)
-                        optlen = 1;
-                else {
-                        optlen = cp[1];
-                        if (optlen <= 0)
-                                break;
+    u_int16_t mss;
+    int opt, optlen;
+
+    DEBUG_CALL("tcp_dooptions");
+    DEBUG_ARGS((dfd," tp = %lx  cnt=%i \n", (long )tp, cnt));
+
+    for (; cnt > 0; cnt -= optlen, cp += optlen)
+    {
+        opt = cp[0];
+        if (opt == TCPOPT_EOL)
+            break;
+        if (opt == TCPOPT_NOP)
+            optlen = 1;
+        else
+        {
+            optlen = cp[1];
+            if (optlen <= 0)
+                break;
+        }
+        switch (opt)
+        {
+            default:
+                continue;
+
+            case TCPOPT_MAXSEG:
+                if (optlen != TCPOLEN_MAXSEG)
+                    continue;
+                if (!(ti->ti_flags & TH_SYN))
+                    continue;
+                memcpy((char *) &mss, (char *) cp + 2, sizeof(mss));
+                NTOHS(mss);
+                (void) tcp_mss(pData, tp, mss); /* sets t_maxseg */
+                break;
+
+#if 0
+            case TCPOPT_WINDOW:
+                if (optlen != TCPOLEN_WINDOW)
+                    continue;
+                if (!(ti->ti_flags & TH_SYN))
+                    continue;
+                tp->t_flags |= TF_RCVD_SCALE;
+                tp->requested_s_scale = min(cp[2], TCP_MAX_WINSHIFT);
+                break;
+
+            case TCPOPT_TIMESTAMP:
+                if (optlen != TCPOLEN_TIMESTAMP)
+                    continue;
+                *ts_present = 1;
+                memcpy((char *) ts_val, (char *)cp + 2, sizeof(*ts_val));
+                NTOHL(*ts_val);
+                memcpy((char *) ts_ecr, (char *)cp + 6, sizeof(*ts_ecr));
+                NTOHL(*ts_ecr);
+
+                /*
+                 * A timestamp received in a SYN makes
+                 * it ok to send timestamp requests and replies.
+                 */
+                if (ti->ti_flags & TH_SYN)
+                {
+                    tp->t_flags |= TF_RCVD_TSTMP;
+                    tp->ts_recent = *ts_val;
+                    tp->ts_recent_age = tcp_now;
                 }
-                switch (opt) {
-
-                default:
-                        continue;
-
-                case TCPOPT_MAXSEG:
-                        if (optlen != TCPOLEN_MAXSEG)
-                                continue;
-                        if (!(ti->ti_flags & TH_SYN))
-                                continue;
-                        memcpy((char *) &mss, (char *) cp + 2, sizeof(mss));
-                        NTOHS(mss);
-                        (void) tcp_mss(pData, tp, mss); /* sets t_maxseg */
-                        break;
-
-/*              case TCPOPT_WINDOW:
- *                      if (optlen != TCPOLEN_WINDOW)
- *                              continue;
- *                      if (!(ti->ti_flags & TH_SYN))
- *                              continue;
- *                      tp->t_flags |= TF_RCVD_SCALE;
- *                      tp->requested_s_scale = min(cp[2], TCP_MAX_WINSHIFT);
- *                      break;
- */
-/*              case TCPOPT_TIMESTAMP:
- *                      if (optlen != TCPOLEN_TIMESTAMP)
- *                              continue;
- *                      *ts_present = 1;
- *                      memcpy((char *) ts_val, (char *)cp + 2, sizeof(*ts_val));
- *                      NTOHL(*ts_val);
- *                      memcpy((char *) ts_ecr, (char *)cp + 6, sizeof(*ts_ecr));
- *                      NTOHL(*ts_ecr);
- *
- */                     /*
- *                       * A timestamp received in a SYN makes
- *                       * it ok to send timestamp requests and replies.
- *                       */
-/*                      if (ti->ti_flags & TH_SYN) {
- *                              tp->t_flags |= TF_RCVD_TSTMP;
- *                              tp->ts_recent = *ts_val;
- *                              tp->ts_recent_age = tcp_now;
- *                      }
- */                     break;
+                break;
+#endif
                 }
         }
@@ -1528,34 +1640,31 @@
  */
 
-#ifdef notdef
-
+#if 0
 void
-tcp_pulloutofband(so, ti, m)
-        struct socket *so;
-        struct tcpiphdr *ti;
-        register struct mbuf *m;
+tcp_pulloutofband(struct socket *so, struct tcpiphdr *ti, struct mbuf *m)
 {
-        int cnt = ti->ti_urp - 1;
-
-        while (cnt >= 0) {
-                if (m->m_len > cnt) {
-                        char *cp = mtod(m, caddr_t) + cnt;
-                        struct tcpcb *tp = sototcpcb(so);
-
-                        tp->t_iobc = *cp;
-                        tp->t_oobflags |= TCPOOB_HAVEDATA;
-                        memcpy(sp, cp+1, (unsigned)(m->m_len - cnt - 1));
-                        m->m_len--;
-                        return;
-                }
-                cnt -= m->m_len;
-                m = m->m_next; /* XXX WRONG! Fix it! */
-                if (m == 0)
-                        break;
-        }
-        panic("tcp_pulloutofband");
+    int cnt = ti->ti_urp - 1;
+
+    while (cnt >= 0)
+    {
+        if (m->m_len > cnt)
+        {
+            char *cp = mtod(m, caddr_t) + cnt;
+            struct tcpcb *tp = sototcpcb(so);
+
+            tp->t_iobc = *cp;
+            tp->t_oobflags |= TCPOOB_HAVEDATA;
+            memcpy(sp, cp+1, (unsigned)(m->m_len - cnt - 1));
+            m->m_len--;
+            return;
+        }
+        cnt -= m->m_len;
+        m = m->m_next; /* XXX WRONG! Fix it! */
+        if (m == 0)
+            break;
+    }
+    panic("tcp_pulloutofband");
 }
-
-#endif /* notdef */
+#endif
 
 /*
@@ -1567,71 +1676,74 @@
 tcp_xmit_timer(PNATState pData, register struct tcpcb *tp, int rtt)
 {
-        register short delta;
-
-        DEBUG_CALL("tcp_xmit_timer");
-        DEBUG_ARG("tp = %lx", (long)tp);
-        DEBUG_ARG("rtt = %d", rtt);
-
-        tcpstat.tcps_rttupdated++;
-        if (tp->t_srtt != 0) {
-                /*
-                 * srtt is stored as fixed point with 3 bits after the
-                 * binary point (i.e., scaled by 8).  The following magic
-                 * is equivalent to the smoothing algorithm in rfc793 with
-                 * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed
-                 * point).  Adjust rtt to origin 0.
-                 */
-                delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT);
-                if ((tp->t_srtt += delta) <= 0)
-                        tp->t_srtt = 1;
-                /*
-                 * We accumulate a smoothed rtt variance (actually, a
-                 * smoothed mean difference), then set the retransmit
-                 * timer to smoothed rtt + 4 times the smoothed variance.
-                 * rttvar is stored as fixed point with 2 bits after the
-                 * binary point (scaled by 4).  The following is
-                 * equivalent to rfc793 smoothing with an alpha of .75
-                 * (rttvar = rttvar*3/4 + |delta| / 4).  This replaces
-                 * rfc793's wired-in beta.
-                 */
-                if (delta < 0)
-                        delta = -delta;
-                delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT);
-                if ((tp->t_rttvar += delta) <= 0)
-                        tp->t_rttvar = 1;
-        } else {
-                /*
-                 * No rtt measurement yet - use the unsmoothed rtt.
-                 * Set the variance to half the rtt (so our first
-                 * retransmit happens at 3*rtt).
-                 */
-                tp->t_srtt = rtt << TCP_RTT_SHIFT;
-                tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1);
-        }
-        tp->t_rtt = 0;
-        tp->t_rxtshift = 0;
-
+    register short delta;
+
+    DEBUG_CALL("tcp_xmit_timer");
+    DEBUG_ARG("tp = %lx", (long)tp);
+    DEBUG_ARG("rtt = %d", rtt);
+
+    tcpstat.tcps_rttupdated++;
+    if (tp->t_srtt != 0)
+    {
         /*
-         * the retransmit should happen at rtt + 4 * rttvar.
-         * Because of the way we do the smoothing, srtt and rttvar
-         * will each average +1/2 tick of bias.  When we compute
-         * the retransmit timer, we want 1/2 tick of rounding and
-         * 1 extra tick because of +-1/2 tick uncertainty in the
-         * firing of the timer.  The bias will give us exactly the
-         * 1.5 tick we need.  But, because the bias is
-         * statistical, we have to test that we don't drop below
-         * the minimum feasible timer (which is 2 ticks).
+         * srtt is stored as fixed point with 3 bits after the
+         * binary point (i.e., scaled by 8).  The following magic
+         * is equivalent to the smoothing algorithm in rfc793 with
+         * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed
+         * point).  Adjust rtt to origin 0.
          */
-        TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp),
-            (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */
-
+        delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT);
+        if ((tp->t_srtt += delta) <= 0)
+            tp->t_srtt = 1;
         /*
-         * We received an ack for a packet that wasn't retransmitted;
-         * it is probably safe to discard any error indications we've
-         * received recently.  This isn't quite right, but close enough
-         * for now (a route might have failed after we sent a segment,
-         * and the return path might not be symmetrical).
+         * We accumulate a smoothed rtt variance (actually, a
+         * smoothed mean difference), then set the retransmit
+         * timer to smoothed rtt + 4 times the smoothed variance.
+         * rttvar is stored as fixed point with 2 bits after the
+         * binary point (scaled by 4).  The following is
+         * equivalent to rfc793 smoothing with an alpha of .75
+         * (rttvar = rttvar*3/4 + |delta| / 4).  This replaces
+         * rfc793's wired-in beta.
          */
-        tp->t_softerror = 0;
+        if (delta < 0)
+            delta = -delta;
+        delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT);
+        if ((tp->t_rttvar += delta) <= 0)
+            tp->t_rttvar = 1;
+    }
+    else
+    {
+        /*
+         * No rtt measurement yet - use the unsmoothed rtt.
+         * Set the variance to half the rtt (so our first
+         * retransmit happens at 3*rtt).
+         */
+        tp->t_srtt = rtt << TCP_RTT_SHIFT;
+        tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1);
+    }
+    tp->t_rtt = 0;
+    tp->t_rxtshift = 0;
+
+    /*
+     * the retransmit should happen at rtt + 4 * rttvar.
+     * Because of the way we do the smoothing, srtt and rttvar
+     * will each average +1/2 tick of bias.  When we compute
+     * the retransmit timer, we want 1/2 tick of rounding and
+     * 1 extra tick because of +-1/2 tick uncertainty in the
+     * firing of the timer.  The bias will give us exactly the
+     * 1.5 tick we need.  But, because the bias is
+     * statistical, we have to test that we don't drop below
+     * the minimum feasible timer (which is 2 ticks).
+     */
+    TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp),
+                  (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */
+
+    /*
+     * We received an ack for a packet that wasn't retransmitted;
+     * it is probably safe to discard any error indications we've
+     * received recently.  This isn't quite right, but close enough
+     * for now (a route might have failed after we sent a segment,
+     * and the return path might not be symmetrical).
+     */
+    tp->t_softerror = 0;
 }
 
@@ -1655,25 +1767,25 @@
 tcp_mss(PNATState pData, register struct tcpcb *tp, u_int offer)
 {
-        struct socket *so = tp->t_socket;
-        int mss;
-
-        DEBUG_CALL("tcp_mss");
-        DEBUG_ARG("tp = %lx", (long)tp);
-        DEBUG_ARG("offer = %d", offer);
-
-        mss = min(if_mtu, if_mru) - sizeof(struct tcpiphdr);
-        if (offer)
-                mss = min(mss, offer);
-        mss = max(mss, 32);
-        if (mss < tp->t_maxseg || offer != 0)
-           tp->t_maxseg = mss;
-
-        tp->snd_cwnd = mss;
-
-        sbreserve(&so->so_snd, tcp_sndspace+((tcp_sndspace%mss)?(mss-(tcp_sndspace%mss)):0));
-        sbreserve(&so->so_rcv, tcp_rcvspace+((tcp_rcvspace%mss)?(mss-(tcp_rcvspace%mss)):0));
-
-        DEBUG_MISC((dfd, " returning mss = %d\n", mss));
-
-        return mss;
+    struct socket *so = tp->t_socket;
+    int mss;
+
+    DEBUG_CALL("tcp_mss");
+    DEBUG_ARG("tp = %lx", (long)tp);
+    DEBUG_ARG("offer = %d", offer);
+
+    mss = min(if_mtu, if_mru) - sizeof(struct tcpiphdr);
+    if (offer)
+        mss = min(mss, offer);
+    mss = max(mss, 32);
+    if (mss < tp->t_maxseg || offer != 0)
+        tp->t_maxseg = mss;
+
+    tp->snd_cwnd = mss;
+
+    sbreserve(&so->so_snd, tcp_sndspace+((tcp_sndspace%mss)?(mss-(tcp_sndspace%mss)):0));
+    sbreserve(&so->so_rcv, tcp_rcvspace+((tcp_rcvspace%mss)?(mss-(tcp_rcvspace%mss)):0));
+
+    DEBUG_MISC((dfd, " returning mss = %d\n", mss));
+
+    return mss;
 }
Index: trunk/src/VBox/Devices/Network/slirp/udp.c
===================================================================
--- trunk/src/VBox/Devices/Network/slirp/udp.c	(revision 15471)
+++ trunk/src/VBox/Devices/Network/slirp/udp.c	(revision 15472)
@@ -246,11 +246,11 @@
     }
 #endif
-    if(sosendto(pData, so,m) == -1)
+    if (sosendto(pData, so, m) == -1)
     {
         m->m_len += iphlen;
         m->m_data -= iphlen;
         *ip = save_ip;
-        DEBUG_MISC((dfd,"udp tx errno = %d-%s\n",errno,strerror(errno)));
-        icmp_error(pData, m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno));
+        DEBUG_MISC((dfd,"udp tx errno = %d-%s\n", errno, strerror(errno)));
+        icmp_error(pData, m, ICMP_UNREACH,ICMP_UNREACH_NET, 0, strerror(errno));
     }
 
