date and time created 81/11/29 22:19:36 by wnj
[unix-history] / usr / src / sys / netinet / in_pcb.c
index f0ecb11..f41c868 100644 (file)
@@ -1,4 +1,4 @@
-/* in_pcb.c 4.6 81/11/20 */
+/* in_pcb.c 4.10 81/11/29 */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -7,10 +7,10 @@
 #include "../h/mbuf.h"
 #include "../h/socket.h"
 #include "../h/socketvar.h"
 #include "../h/mbuf.h"
 #include "../h/socket.h"
 #include "../h/socketvar.h"
-#include "../net/inet.h"
-#include "../net/inet_systm.h"
+#include "../net/in.h"
+#include "../net/in_systm.h"
 #include "../net/if.h"
 #include "../net/if.h"
-#include "../net/inet_pcb.h"
+#include "../net/in_pcb.h"
 
 /*
  * Allocate a protocol control block, space
 
 /*
  * Allocate a protocol control block, space
@@ -24,7 +24,7 @@ in_pcballoc(so, head, sndcc, rcvcc, sin)
        struct sockaddr_in *sin;
 {
        struct mbuf *m;
        struct sockaddr_in *sin;
 {
        struct mbuf *m;
-       register struct inpcb *inp;
+       register struct inpcb *inp, *xp;
        struct ifnet *ifp;
        u_long lport;
 
        struct ifnet *ifp;
        u_long lport;
 
@@ -36,12 +36,12 @@ in_pcballoc(so, head, sndcc, rcvcc, sin)
                        return (EADDRNOTAVAIL);
                lport = sin->sin_port;
                if (lport) {
                        return (EADDRNOTAVAIL);
                lport = sin->sin_port;
                if (lport) {
-                       inp = head->inp_next;
-                       for (; inp != head; inp = inp->inp_next) 
-                               if (inp->inp_laddr.s_addr ==
+                       xp = head->inp_next;
+                       for (; xp != head; xp = xp->inp_next) 
+                               if (xp->inp_laddr.s_addr ==
                                    sin->sin_addr.s_addr &&
                                    sin->sin_addr.s_addr &&
-                                   inp->inp_lport == lport &&
-                                   inp->inp_faddr.s_addr == 0)
+                                   xp->inp_lport == lport &&
+                                   xp->inp_faddr.s_addr == 0)
                                        return (EADDRINUSE);
                }
        } else {
                                        return (EADDRINUSE);
                }
        } else {
@@ -50,7 +50,7 @@ in_pcballoc(so, head, sndcc, rcvcc, sin)
        }
        m = m_getclr(M_WAIT);
        if (m == 0)
        }
        m = m_getclr(M_WAIT);
        if (m == 0)
-               return (0);
+               return (ENOBUFS);
        if (sbreserve(&so->so_snd, sndcc) == 0)
                goto bad;
        if (sbreserve(&so->so_rcv, rcvcc) == 0)
        if (sbreserve(&so->so_snd, sndcc) == 0)
                goto bad;
        if (sbreserve(&so->so_rcv, rcvcc) == 0)
@@ -62,13 +62,14 @@ in_pcballoc(so, head, sndcc, rcvcc, sin)
 again:
        if (head->inp_lport++ < 1024)
                head->inp_lport = 1024;
 again:
        if (head->inp_lport++ < 1024)
                head->inp_lport = 1024;
-       for (inp = head->inp_next; inp != head; inp = inp->inp_next)
-               if (inp->inp_lport == head->inp_lport)
+       for (xp = head->inp_next; xp != head; xp = xp->inp_next)
+               if (xp->inp_lport == head->inp_lport)
                        goto again;
        lport = head->inp_lport;
 gotport:
                        goto again;
        lport = head->inp_lport;
 gotport:
+       inp->inp_socket = so;
        inp->inp_lport = lport;
        inp->inp_lport = lport;
-       insque(head, inp);
+       insque(inp, head);
        so->so_pcb = (caddr_t)inp;
        sin = (struct sockaddr_in *)&so->so_addr;
        sin->sin_family = AF_INET;
        so->so_pcb = (caddr_t)inp;
        sin = (struct sockaddr_in *)&so->so_addr;
        sin->sin_family = AF_INET;
@@ -102,10 +103,9 @@ in_pcbfree(inp)
 {
        struct socket *so = inp->inp_socket;
 
 {
        struct socket *so = inp->inp_socket;
 
-       if (so->so_state & SS_USERGONE)
-               sofree(so);
-       else
-               so->so_pcb = 0;
+       so->so_pcb = 0;
+       sofree(so);
+       remque(inp);
        (void) m_free(dtom(inp));
 }
 
        (void) m_free(dtom(inp));
 }