clean up some stuff; fix problem with lost mbufs
[unix-history] / usr / src / sys / netinet / tcp_input.c
index 64c1e62..c85c244 100644 (file)
@@ -1,4 +1,4 @@
-/*     tcp_input.c     1.76    82/10/09        */
+/*     tcp_input.c     1.85    83/01/04        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -24,7 +24,6 @@
 
 int    tcpprintfs = 0;
 int    tcpcksum = 1;
 
 int    tcpprintfs = 0;
 int    tcpcksum = 1;
-struct mbuf tcp_mb;
 struct tcpiphdr tcp_saveti;
 extern tcpnodelack;
 
 struct tcpiphdr tcp_saveti;
 extern tcpnodelack;
 
@@ -73,9 +72,7 @@ tcp_input(m0)
                ti->ti_next = ti->ti_prev = 0;
                ti->ti_x1 = 0;
                ti->ti_len = (u_short)tlen;
                ti->ti_next = ti->ti_prev = 0;
                ti->ti_x1 = 0;
                ti->ti_len = (u_short)tlen;
-#if vax || pdp11
                ti->ti_len = htons((u_short)ti->ti_len);
                ti->ti_len = htons((u_short)ti->ti_len);
-#endif
                if (ti->ti_sum = in_cksum(m, len)) {
                        tcpstat.tcps_badsum++;
                        if (tcpprintfs)
                if (ti->ti_sum = in_cksum(m, len)) {
                        tcpstat.tcps_badsum++;
                        if (tcpprintfs)
@@ -101,7 +98,7 @@ tcp_input(m0)
                        goto drop;
                }
                ti = mtod(m, struct tcpiphdr *);
                        goto drop;
                }
                ti = mtod(m, struct tcpiphdr *);
-               om = m_get(M_DONTWAIT);
+               om = m_get(M_DONTWAIT, MT_DATA);
                if (om == 0)
                        goto drop;
                om->m_len = off - sizeof (struct tcphdr);
                if (om == 0)
                        goto drop;
                om->m_len = off - sizeof (struct tcphdr);
@@ -121,7 +118,6 @@ tcp_input(m0)
        m->m_off += off;
        m->m_len -= off;
 
        m->m_off += off;
        m->m_len -= off;
 
-#if vax || pdp11
        /*
         * Convert TCP protocol specific fields to host format.
         */
        /*
         * Convert TCP protocol specific fields to host format.
         */
@@ -129,7 +125,6 @@ tcp_input(m0)
        ti->ti_ack = ntohl(ti->ti_ack);
        ti->ti_win = ntohs(ti->ti_win);
        ti->ti_urp = ntohs(ti->ti_urp);
        ti->ti_ack = ntohl(ti->ti_ack);
        ti->ti_win = ntohs(ti->ti_win);
        ti->ti_urp = ntohs(ti->ti_urp);
-#endif
 
        /*
         * Locate pcb for segment.
 
        /*
         * Locate pcb for segment.
@@ -201,31 +196,32 @@ tcp_input(m0)
         * segment in this state.
         */
        case TCPS_LISTEN: {
         * segment in this state.
         */
        case TCPS_LISTEN: {
-               struct mbuf *m = m_get(M_DONTWAIT);
+               struct mbuf *am;
                register struct sockaddr_in *sin;
 
                register struct sockaddr_in *sin;
 
-               if (m == 0)
-                       goto drop;
-               m->m_len = sizeof (struct sockaddr_in);
                if (tiflags & TH_RST)
                        goto drop;
                if (tiflags & TH_ACK)
                        goto dropwithreset;
                if ((tiflags & TH_SYN) == 0)
                        goto drop;
                if (tiflags & TH_RST)
                        goto drop;
                if (tiflags & TH_ACK)
                        goto dropwithreset;
                if ((tiflags & TH_SYN) == 0)
                        goto drop;
-               sin = mtod(m, struct sockaddr_in *);
+               am = m_get(M_DONTWAIT, MT_SONAME);
+               if (am == NULL)
+                       goto drop;
+               am->m_len = sizeof (struct sockaddr_in);
+               sin = mtod(am, struct sockaddr_in *);
                sin->sin_family = AF_INET;
                sin->sin_addr = ti->ti_src;
                sin->sin_port = ti->ti_sport;
                laddr = inp->inp_laddr;
                sin->sin_family = AF_INET;
                sin->sin_addr = ti->ti_src;
                sin->sin_port = ti->ti_sport;
                laddr = inp->inp_laddr;
-               if (inp->inp_laddr.s_addr == 0)
+               if (inp->inp_laddr.s_addr == INADDR_ANY)
                        inp->inp_laddr = ti->ti_dst;
                        inp->inp_laddr = ti->ti_dst;
-               if (in_pcbconnect(inp, m)) {
+               if (in_pcbconnect(inp, am)) {
                        inp->inp_laddr = laddr;
                        inp->inp_laddr = laddr;
-                       m_free(m);
+                       (void) m_free(am);
                        goto drop;
                }
                        goto drop;
                }
-               m_free(m);
+               (void) m_free(am);
                tp->t_template = tcp_template(tp);
                if (tp->t_template == 0) {
                        in_pcbdisconnect(inp);
                tp->t_template = tcp_template(tp);
                if (tp->t_template == 0) {
                        in_pcbdisconnect(inp);
@@ -365,10 +361,10 @@ trimthenstep6:
        }
 
        /*
        }
 
        /*
-        * If a segment is received on a connection after the
+        * If data is received on a connection after the
         * user processes are gone, then RST the other end.
         */
         * user processes are gone, then RST the other end.
         */
-       if (so->so_state & SS_NOFDREF) {
+       if ((so->so_state & SS_NOFDREF) && ti->ti_len) {
                tcp_close(tp);
                tp = 0;
                goto dropwithreset;
                tcp_close(tp);
                tp = 0;
                goto dropwithreset;
@@ -481,7 +477,6 @@ trimthenstep6:
                                tp->t_srtt =
                                    tcp_alpha * tp->t_srtt +
                                    (1 - tcp_alpha) * tp->t_rtt;
                                tp->t_srtt =
                                    tcp_alpha * tp->t_srtt +
                                    (1 - tcp_alpha) * tp->t_rtt;
-/* printf("rtt %d srtt*100 now %d\n", tp->t_rtt, (int)(tp->t_srtt*100)); */
                        tp->t_rtt = 0;
                }
 
                        tp->t_rtt = 0;
                }
 
@@ -576,7 +571,7 @@ step6:
                tp->snd_wnd = ti->ti_win;
                tp->snd_wl1 = ti->ti_seq;
                tp->snd_wl2 = ti->ti_ack;
                tp->snd_wnd = ti->ti_win;
                tp->snd_wl1 = ti->ti_seq;
                tp->snd_wl2 = ti->ti_ack;
-               if (tp->snd_wnd > 0)
+               if (tp->snd_wnd != 0)
                        tp->t_timer[TCPT_PERSIST] = 0;
        }
 
                        tp->t_timer[TCPT_PERSIST] = 0;
        }
 
@@ -757,9 +752,7 @@ tcp_dooptions(tp, om)
                        if (optlen != 4)
                                continue;
                        tp->t_maxseg = *(u_short *)(cp + 2);
                        if (optlen != 4)
                                continue;
                        tp->t_maxseg = *(u_short *)(cp + 2);
-#if vax || pdp11
                        tp->t_maxseg = ntohs((u_short)tp->t_maxseg);
                        tp->t_maxseg = ntohs((u_short)tp->t_maxseg);
-#endif
                        break;
                }
        }
                        break;
                }
        }