cleanup
[unix-history] / usr / src / sys / netinet / tcp_input.c
index 46a8b38..3cebf0b 100644 (file)
@@ -1,30 +1,29 @@
-/* tcp_input.c 1.6 81/10/29 */
+/* tcp_input.c 1.12 81/10/30 */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
-#include "../bbnnet/net.h"
-#include "../bbnnet/mbuf.h"
-#include "../bbnnet/host.h"
-#include "../bbnnet/imp.h"
-#include "../bbnnet/ucb.h"
-#include "../bbnnet/tcp.h"
-#include "../bbnnet/ip.h"
-#include "../h/dir.h"
-#include "../h/user.h"
-#include "../h/inode.h"
-#include "../bbnnet/fsm.h"
-
-extern int nosum;
+#include "../h/mbuf.h"
+#include "../h/socket.h"
+#include "../inet/inet.h"
+#include "../inet/inet_systm.h"
+#include "../inet/imp.h"
+#include "../inet/inet_host.h"
+#include "../inet/ip.h"
+#include "../inet/tcp.h"
+#include "../inet/tcp_fsm.h"
+
+int    tcpcksum = 1;
 
 tcp_input(mp)
        register struct mbuf *mp;
 {
 
 tcp_input(mp)
        register struct mbuf *mp;
 {
+       register struct th *n;          /* known to be r10 */
+       register int j;                 /* known to be r9 */
        register struct tcb *tp;
        register struct tcb *tp;
-       register struct th *n;
        int nstate;
        struct mbuf *m;
        struct ucb *up;
        int nstate;
        struct mbuf *m;
        struct ucb *up;
-       int hlen, tlen, j;
+       int hlen, tlen;
        u_short lport, fport;
 #ifdef TCPDEBUG
        struct tcp_debug tdb;
        u_short lport, fport;
 #ifdef TCPDEBUG
        struct tcp_debug tdb;
@@ -47,13 +46,24 @@ COUNT(TCP_INPUT);
        if ((hlen = n->t_off << 2) > mp->m_len)
                { printf("tcp header overflow\n"); m_freem(mp); return; }
 
        if ((hlen = n->t_off << 2) > mp->m_len)
                { printf("tcp header overflow\n"); m_freem(mp); return; }
 
-       /*
-        * Checksum extended header and data
-        */
-       j = n->t_sum; n->t_sum = 0;
-       if (j != cksum(mp, sizeof (struct ip) + tlen)) {
-               netstat.t_badsum++;
-               if (nosum == 0) {
+       if (tcpcksum) {
+               /*
+                * Checksum extended header and data
+                */
+               j = n->t_sum; n->t_sum = 0;
+#ifdef vax
+               if (tlen == 20) {
+                       asm("addl3 $8,r10,r0; movl (r0)+,r1; addl2 (r0)+,r1");
+                       asm("adwc (r0)+,r1; adwc (r0)+,r1; adwc (r0)+,r1");
+                       asm("adwc (r0)+,r1; adwc (r0)+,r1; adwc (r0)+,r1");
+                       asm("adwc $0,r1; ashl $-16,r1,r0; addw2 r0,r1");
+                       asm("adwc $0,r1");              /* ### */
+                       asm("mcoml r1,r1; movzwl r1,r1; subl2 r1,r9");
+               } else
+#endif
+                       j -= cksum(mp, sizeof (struct ip) + tlen);
+               if (j != 0) {
+                       netstat.t_badsum++;
                        m_freem(mp);
                        return;
                }
                        m_freem(mp);
                        return;
                }
@@ -62,11 +72,11 @@ COUNT(TCP_INPUT);
        /*
         * Find tcb for message (SHOULDN'T USE LINEAR SEARCH!)
         */
        /*
         * Find tcb for message (SHOULDN'T USE LINEAR SEARCH!)
         */
-       for (tp = netcb.n_tcb_head; tp != 0; tp = tp->t_tcb_next)
+       for (tp = tcb_head; tp != 0; tp = tp->t_tcb_next)
                if (tp->t_lport == lport && tp->t_fport == fport &&
                    tp->t_ucb->uc_host->h_addr.s_addr == n->t_s.s_addr)
                        goto found;
                if (tp->t_lport == lport && tp->t_fport == fport &&
                    tp->t_ucb->uc_host->h_addr.s_addr == n->t_s.s_addr)
                        goto found;
-       for (tp = netcb.n_tcb_head; tp != 0; tp = tp->t_tcb_next)
+       for (tp = tcb_head; tp != 0; tp = tp->t_tcb_next)
                if (tp->t_lport == lport &&
                    (tp->t_fport==fport || tp->t_fport==0) &&
                    (tp->t_ucb->uc_host->h_addr.s_addr == n->t_s.s_addr ||
                if (tp->t_lport == lport &&
                    (tp->t_fport==fport || tp->t_fport==0) &&
                    (tp->t_ucb->uc_host->h_addr.s_addr == n->t_s.s_addr ||
@@ -93,7 +103,7 @@ found:
 
        case LISTEN:
                if ((n->th_flags&TH_ACK) || !syn_ok(tp, n)) {
 
        case LISTEN:
                if ((n->th_flags&TH_ACK) || !syn_ok(tp, n)) {
-                       send_rst(tp, n);
+                       tcp_sndrst(tp, n);
                        goto badseg;
                }
                if (n->th_flags&TH_RST)
                        goto badseg;
                }
                if (n->th_flags&TH_RST)
@@ -102,11 +112,11 @@ found:
 
        case SYN_SENT:
                if (!ack_ok(tp, n) || !syn_ok(tp, n)) {
 
        case SYN_SENT:
                if (!ack_ok(tp, n) || !syn_ok(tp, n)) {
-                       send_rst(tp, n);                        /* 71,72,75 */
+                       tcp_sndrst(tp, n);                      /* 71,72,75 */
                        goto badseg;
                }
                if (n->th_flags&TH_RST) {
                        goto badseg;
                }
                if (n->th_flags&TH_RST) {
-                       t_close(tp, URESET);                    /* 70 */
+                       tcp_close(tp, URESET);                  /* 70 */
                        tp->t_state = CLOSED;
                        goto badseg;
                }
                        tp->t_state = CLOSED;
                        goto badseg;
                }
@@ -130,7 +140,7 @@ found:
                        goto badseg;
 
                default:
                        goto badseg;
 
                default:
-                       t_close(tp, URESET);                    /* 66 */
+                       tcp_close(tp, URESET);                  /* 66 */
                        tp->t_state = CLOSED;
                        goto badseg;
                }
                        tp->t_state = CLOSED;
                        goto badseg;
                }
@@ -139,11 +149,11 @@ found:
        case SYN_RCVD:
 common:
                if (ack_ok(tp, n) == 0) {
        case SYN_RCVD:
 common:
                if (ack_ok(tp, n) == 0) {
-                       send_rst(tp, n);                        /* 74 */
+                       tcp_sndrst(tp, n);                      /* 74 */
                        goto badseg;
                }
                if (syn_ok(tp, n) && n->t_seq != tp->irs) {
                        goto badseg;
                }
                if (syn_ok(tp, n) && n->t_seq != tp->irs) {
-                       send_null(tp);                          /* 74 */
+                       tcp_sndnull(tp);                        /* 74 */
                        goto badseg;
                }
                goto goodseg;
                        goto badseg;
                }
                goto goodseg;
@@ -154,12 +164,13 @@ badseg:
 
 goodseg:
 #ifdef notdef
 
 goodseg:
 #ifdef notdef
+       /* DO SOMETHING ABOUT UNACK!!! */
        /*
         * Defer processing if no buffer space for this connection.
         */
        up = tp->t_ucb;
        if (up->uc_rcc > up->uc_rhiwat && 
        /*
         * Defer processing if no buffer space for this connection.
         */
        up = tp->t_ucb;
        if (up->uc_rcc > up->uc_rhiwat && 
-            && n->t_len != 0 && netcb.n_bufs < netcb.n_lowat) {
+            && n->t_len != 0 && mbstat.m_bufs < mbstat.m_lowat) {
                mp->m_act = (struct mbuf *)0;
                if ((m = tp->t_rcv_unack) != NULL) {
                        while (m->m_act != NULL)
                mp->m_act = (struct mbuf *)0;
                if ((m = tp->t_rcv_unack) != NULL) {
                        while (m->m_act != NULL)
@@ -196,7 +207,7 @@ goodseg:
                }
                tp->t_fport = n->t_src;
                tp->t_ucb->uc_template = tcp_template(tp);
                }
                tp->t_fport = n->t_src;
                tp->t_ucb->uc_template = tcp_template(tp);
-               rcv_ctldat(tp, n, 1);
+               tcp_ctldat(tp, n, 1);
                if (tp->tc_flags&TC_FIN_RCVD) {
                        tp->t_finack = T_2ML;                   /* 3 */
                        tp->tc_flags &= ~TC_WAITED_2_ML;
                if (tp->tc_flags&TC_FIN_RCVD) {
                        tp->t_finack = T_2ML;                   /* 3 */
                        tp->tc_flags &= ~TC_WAITED_2_ML;
@@ -212,7 +223,7 @@ goodseg:
                        nstate = EFAILEC;
                        goto done;
                }
                        nstate = EFAILEC;
                        goto done;
                }
-               rcv_ctldat(tp, n, 1);
+               tcp_ctldat(tp, n, 1);
                if (tp->tc_flags&TC_FIN_RCVD) {
                        if (n->th_flags&TH_ACK) {
                                if (n->t_ackno > tp->iss)
                if (tp->tc_flags&TC_FIN_RCVD) {
                        if (n->th_flags&TH_ACK) {
                                if (n->t_ackno > tp->iss)
@@ -245,7 +256,7 @@ goodseg:
        case FIN_W2:
        case TIME_WAIT:
 input:
        case FIN_W2:
        case TIME_WAIT:
 input:
-               rcv_ctldat(tp, n, 1);                           /* 39 */
+               tcp_ctldat(tp, n, 1);                           /* 39 */
                present_data(tp);
                switch (tp->t_state) {
 
                present_data(tp);
                switch (tp->t_state) {
 
@@ -287,11 +298,11 @@ input:
                if (n->th_flags&TH_FIN) {
                        if ((n->th_flags&TH_ACK) &&
                            n->t_ackno <= tp->seq_fin) {
                if (n->th_flags&TH_FIN) {
                        if ((n->th_flags&TH_ACK) &&
                            n->t_ackno <= tp->seq_fin) {
-                               rcv_ctldat(tp, n, 0);           /* 30 */
+                               tcp_ctldat(tp, n, 0);           /* 30 */
                                tp->t_finack = T_2ML;
                                tp->tc_flags &= ~TC_WAITED_2_ML;
                        } else
                                tp->t_finack = T_2ML;
                                tp->tc_flags &= ~TC_WAITED_2_ML;
                        } else
-                               send_ctl(tp);                   /* 31 */
+                               tcp_sndctl(tp);                 /* 31 */
                        goto done;
                }
                goto input;
                        goto done;
                }
                goto input;
@@ -299,7 +310,7 @@ input:
        case CLOSING1:
                j = ack_fin(tp, n);
                if (n->th_flags&TH_FIN) {
        case CLOSING1:
                j = ack_fin(tp, n);
                if (n->th_flags&TH_FIN) {
-                       rcv_ctldat(tp, n, 0);
+                       tcp_ctldat(tp, n, 0);
                        tp->t_finack = T_2ML;
                        tp->tc_flags &= ~TC_WAITED_2_ML;
                        if (j)
                        tp->t_finack = T_2ML;
                        tp->tc_flags &= ~TC_WAITED_2_ML;
                        if (j)
@@ -309,7 +320,7 @@ input:
                if (j) {
                        if (tp->tc_flags&TC_WAITED_2_ML)
                                if (rcv_empty(tp)) {
                if (j) {
                        if (tp->tc_flags&TC_WAITED_2_ML)
                                if (rcv_empty(tp)) {
-                                       t_close(tp, UCLOSED);   /* 15 */
+                                       tcp_close(tp, UCLOSED); /* 15 */
                                        nstate = CLOSED;
                                } else
                                        nstate = RCV_WAIT;      /* 18 */
                                        nstate = CLOSED;
                                } else
                                        nstate = RCV_WAIT;      /* 18 */
@@ -322,14 +333,14 @@ input:
        case CLOSING2:
                if (ack_fin(tp, n)) {
                        if (rcv_empty(tp)) {                    /* 16 */
        case CLOSING2:
                if (ack_fin(tp, n)) {
                        if (rcv_empty(tp)) {                    /* 16 */
-                               t_close(tp, UCLOSED);
+                               tcp_close(tp, UCLOSED);
                                nstate = CLOSED;
                        } else
                                nstate = RCV_WAIT;              /* 19 */
                        goto done;
                }
                if (n->th_flags&TH_FIN) {
                                nstate = CLOSED;
                        } else
                                nstate = RCV_WAIT;              /* 19 */
                        goto done;
                }
                if (n->th_flags&TH_FIN) {
-                       send_ctl(tp);                           /* 31 */
+                       tcp_sndctl(tp);                         /* 31 */
                        goto done;
                }
                goto input;
                        goto done;
                }
                goto input;
@@ -337,7 +348,7 @@ input:
        case RCV_WAIT:
                if ((n->th_flags&TH_FIN) && (n->th_flags&TH_ACK) &&
                    n->t_ackno <= tp->seq_fin) {
        case RCV_WAIT:
                if ((n->th_flags&TH_FIN) && (n->th_flags&TH_ACK) &&
                    n->t_ackno <= tp->seq_fin) {
-                       rcv_ctldat(tp, n, 0);
+                       tcp_ctldat(tp, n, 0);
                        tp->t_finack = T_2ML;
                        tp->tc_flags &= ~TC_WAITED_2_ML;        /* 30 */
                }
                        tp->t_finack = T_2ML;
                        tp->tc_flags &= ~TC_WAITED_2_ML;        /* 30 */
                }
@@ -400,15 +411,13 @@ notwanted:
        netstat.t_badsegs++;
 }
 
        netstat.t_badsegs++;
 }
 
-rcv_ctldat(tp, n, dataok)
+tcp_ctldat(tp, n, dataok)
        register struct tcb *tp;
        register struct th *n;
 {
        register struct tcb *tp;
        register struct th *n;
 {
-       register sent;
-       register struct ucb *up;
-       register struct mbuf *m, *mn;
-       register len;
-COUNT(RCV_CTLDAT);
+       register struct mbuf *m;
+       int sent;
+COUNT(TCP_CTLDAT);
 
        tp->tc_flags &= ~(TC_DROPPED_TXT|TC_ACK_DUE|TC_NEW_WINDOW);
 /* syn */
 
        tp->tc_flags &= ~(TC_DROPPED_TXT|TC_ACK_DUE|TC_NEW_WINDOW);
 /* syn */
@@ -421,6 +430,10 @@ COUNT(RCV_CTLDAT);
 /* ack */
        if ((n->th_flags&TH_ACK) && (tp->tc_flags&TC_SYN_RCVD) &&
            n->t_ackno > tp->snd_una) {
 /* ack */
        if ((n->th_flags&TH_ACK) && (tp->tc_flags&TC_SYN_RCVD) &&
            n->t_ackno > tp->snd_una) {
+               register struct mbuf *mn;
+               register struct ucb *up;
+               register int len;
+
                up = tp->t_ucb;
 
                /* update snd_una and snd_nxt */
                up = tp->t_ucb;
 
                /* update snd_una and snd_nxt */
@@ -473,83 +486,15 @@ COUNT(RCV_CTLDAT);
                tp->tc_flags |= TC_NEW_WINDOW;
                tp->t_persist = 0;
        }
                tp->tc_flags |= TC_NEW_WINDOW;
                tp->t_persist = 0;
        }
-       if (dataok) {
+       if (dataok == 0)
+               goto ctlonly;
 /* text */
 /* text */
-               if (n->t_len != 0)
-                       rcv_text(tp, n);
-/* urg */
-               if (n->th_flags&TH_URG) {
-                       unsigned urgent;
-
-                       urgent = n->t_urp + n->t_seq;
-                       if (tp->rcv_nxt < urgent) {
-                               if (tp->rcv_urp <= tp->rcv_nxt)
-                                       to_user(tp->t_ucb, UURGENT);
-                               tp->rcv_urp = urgent;
-                       }
-               }
-/* eol */
-               if ((n->th_flags&TH_EOL) &&
-                   (tp->tc_flags&TC_DROPPED_TXT) == 0 &&
-                   tp->t_rcv_prev != (struct th *)tp) {
-                       /* mark last mbuf */
-                       m = dtom(tp->t_rcv_prev);
-                       if (m != NULL) {
-                               while (m->m_next != NULL)
-                                       m = m->m_next;
-                               m->m_act =
-                                   (struct mbuf *)(m->m_off + m->m_len - 1);
-                       }
-               }
-       }
-/* fin */
-       if ((n->th_flags&TH_FIN) && (tp->tc_flags&TC_DROPPED_TXT) == 0) {
-               int last;
-
-               if ((tp->tc_flags&TC_FIN_RCVD) == 0) {
-                       /* do we really have fin ? */
-                       last = firstempty(tp);
-                       if (tp->t_rcv_prev == (struct th *)tp ||
-                           last == t_end(tp->t_rcv_prev)) {
-                               tp->tc_flags |= TC_FIN_RCVD;
-                               netwakeup(tp->t_ucb);           /* poke */
-                       }
-                       if ((tp->tc_flags&TC_FIN_RCVD) &&
-                           tp->rcv_nxt >= last) {
-                               tp->rcv_nxt = last + 1;         /* fin seq */
-                               tp->tc_flags |= TC_ACK_DUE;
-                       }
-               } else
-                       tp->tc_flags |= TC_ACK_DUE;
-       }
-
-/* respond */
-       if (tp->tc_flags&TC_ACK_DUE)
-               sent = send_ctl(tp);
-       else if (tp->tc_flags&TC_NEW_WINDOW)
-               sent = send(tp);
-       else
-               sent = 0;
-
-/* set for retrans */
-       if (!sent && tp->snd_una < tp->snd_nxt &&
-           (tp->tc_flags&TC_CANCELLED)) {
-               tp->t_rexmt = tp->t_xmtime;
-               tp->t_rexmttl = T_REXMTTL;
-               tp->t_rexmt_val = tp->t_rtl_val = tp->snd_lst;
-               tp->tc_flags &= ~TC_CANCELLED;
-       }
-}
-
-rcv_text(tp, n)
-       register struct tcb *tp;
-       register struct th *n;
-{
-       register int i;
-       register struct th *p, *q;
-       register struct mbuf *m;
-       int overage;
-COUNT(RCV_TEXT);
+       if (n->t_len == 0)
+               goto notext;
+       { register int i;
+         register struct th *p, *q;
+         register struct mbuf *m;
+         int overage;
 
        /*
         * Discard duplicate data already passed to user.
 
        /*
         * Discard duplicate data already passed to user.
@@ -557,7 +502,7 @@ COUNT(RCV_TEXT);
        if (SEQ_LT(n->t_seq, tp->rcv_nxt)) {
                i = tp->rcv_nxt - n->t_seq;
                if (i >= n->t_len)
        if (SEQ_LT(n->t_seq, tp->rcv_nxt)) {
                i = tp->rcv_nxt - n->t_seq;
                if (i >= n->t_len)
-                       goto dropseg;
+                       goto notext;
                n->t_seq += i;
                n->t_len -= i;
                m_adj(dtom(n), i);
                n->t_seq += i;
                n->t_len -= i;
                m_adj(dtom(n), i);
@@ -580,7 +525,7 @@ COUNT(RCV_TEXT);
                i = q->t_prev->t_seq + q->t_prev->t_len - n->t_seq;
                if (i > 0) {
                        if (i >= n->t_len)
                i = q->t_prev->t_seq + q->t_prev->t_len - n->t_seq;
                if (i > 0) {
                        if (i >= n->t_len)
-                               goto dropseg;
+                               goto notext;    /* w/o setting TC_NET_KEEP */
                        m_adj(dtom(tp), i);
                        n->t_len -= i;
                        n->t_seq += i;
                        m_adj(dtom(tp), i);
                        n->t_len -= i;
                        n->t_seq += i;
@@ -616,7 +561,7 @@ COUNT(RCV_TEXT);
         */
        q = tp->t_rcv_prev;
        overage = 
         */
        q = tp->t_rcv_prev;
        overage = 
-           (tp->t_socket->uc_rcc + tp->rcv_seqcnt) - tp->t_socket->uc_rhiwat;
+           (tp->t_ucb->uc_rcc + tp->rcv_seqcnt) - tp->t_ucb->uc_rhiwat;
        if (overage > 0)
                for (;;) {
                        i = MIN(q->t_len, overage);
        if (overage > 0)
                for (;;) {
                        i = MIN(q->t_len, overage);
@@ -647,21 +592,81 @@ COUNT(RCV_TEXT);
                        break;
        }
        tp->tc_flags |= (TC_ACK_DUE|TC_NET_KEEP);
                        break;
        }
        tp->tc_flags |= (TC_ACK_DUE|TC_NET_KEEP);
-       return;
+       }
+notext:
+/* urg */
+       if (n->th_flags&TH_URG) {
+               unsigned urgent;
+
+               urgent = n->t_urp + n->t_seq;
+               if (tp->rcv_nxt < urgent) {
+                       if (tp->rcv_urp <= tp->rcv_nxt)
+                               to_user(tp->t_ucb, UURGENT);
+                       tp->rcv_urp = urgent;
+               }
+       }
+/* eol */
+       if ((n->th_flags&TH_EOL) &&
+           (tp->tc_flags&TC_DROPPED_TXT) == 0 &&
+           tp->t_rcv_prev != (struct th *)tp) {
+               /* mark last mbuf */
+               m = dtom(tp->t_rcv_prev);
+               if (m != NULL) {
+                       while (m->m_next != NULL)
+                               m = m->m_next;
+                       m->m_act =
+                           (struct mbuf *)(m->m_off + m->m_len - 1);
+               }
+       }
+ctlonly:
+/* fin */
+       if ((n->th_flags&TH_FIN) && (tp->tc_flags&TC_DROPPED_TXT) == 0) {
+               seq_t last;
 
 
-dropseg:
-       /* don't set TC_NET_KEEP, so that mbuf's will get dropped */
-       return;
-}
+               if ((tp->tc_flags&TC_FIN_RCVD) == 0) {
+                       /* do we really have fin ? */
+                       last = firstempty(tp);
+                       if (tp->t_rcv_prev == (struct th *)tp ||
+                           last == t_end(tp->t_rcv_prev)) {
+                               tp->tc_flags |= TC_FIN_RCVD;
+                               netwakeup(tp->t_ucb);           /* poke */
+                       }
+                       if ((tp->tc_flags&TC_FIN_RCVD) &&
+                           tp->rcv_nxt >= last) {
+                               tp->rcv_nxt = last + 1;         /* fin seq */
+                               tp->tc_flags |= TC_ACK_DUE;
+                       }
+               } else
+                       tp->tc_flags |= TC_ACK_DUE;
+       }
 
 
-#define        socket          ucb                     /* ### */
-#define        t_socket        t_ucb                   /* ### */
+/* respond */
+       sent = 0;
+       if (tp->tc_flags&TC_ACK_DUE)
+               sent = tcp_sndctl(tp);
+       else if (tp->tc_flags&TC_NEW_WINDOW) {
+               seq_t last = tp->snd_off;
+               for (m = tp->t_ucb->uc_sbuf; m != NULL; m = m->m_next)  /*###*/
+                       last += m->m_len;                               /*###*/
+               if (tp->snd_nxt <= last || (tp->tc_flags&TC_SND_FIN))
+                       sent = tcp_send(tp);
+       }
+
+/* set for retrans */
+       if (!sent && tp->snd_una < tp->snd_nxt &&
+           (tp->tc_flags&TC_CANCELLED)) {
+               tp->t_rexmt = tp->t_xmtime;
+               tp->t_rexmttl = T_REXMTTL;
+               tp->t_rexmt_val = tp->t_rtl_val = tp->snd_lst;
+               tp->tc_flags &= ~TC_CANCELLED;
+       }
+}
 
 present_data(tp)
        register struct tcb *tp;
 {
        register struct th *t;
 
 present_data(tp)
        register struct tcb *tp;
 {
        register struct th *t;
-       register struct socket *up;
+       register struct ucb *up;
        register struct mbuf *m, **mp;
        seq_t ready;
 COUNT(PRESENT_DATA);
        register struct mbuf *m, **mp;
        seq_t ready;
 COUNT(PRESENT_DATA);
@@ -669,7 +674,7 @@ COUNT(PRESENT_DATA);
        /* connection must be synced and data available for user */
        if ((tp->tc_flags&TC_SYN_ACKED) == 0)
                return;
        /* connection must be synced and data available for user */
        if ((tp->tc_flags&TC_SYN_ACKED) == 0)
                return;
-       up = tp->t_socket;
+       up = tp->t_ucb;
        mp = &up->uc_rbuf;
        while (*mp)
                mp = &(*mp)->m_next;
        mp = &up->uc_rbuf;
        while (*mp)
                mp = &(*mp)->m_next;