wildcard addresses
authorBill Joy <root@ucbvax.Berkeley.EDU>
Thu, 4 Mar 1982 03:07:23 +0000 (19:07 -0800)
committerBill Joy <root@ucbvax.Berkeley.EDU>
Thu, 4 Mar 1982 03:07:23 +0000 (19:07 -0800)
SCCS-vsn: sys/netinet/in_pcb.h 4.3
SCCS-vsn: sys/netinet/in_pcb.c 4.18
SCCS-vsn: sys/netinet/tcp_input.c 1.56
SCCS-vsn: sys/netinet/udp_usrreq.c 4.21

usr/src/sys/netinet/in_pcb.c
usr/src/sys/netinet/in_pcb.h
usr/src/sys/netinet/tcp_input.c
usr/src/sys/netinet/udp_usrreq.c

index 81e2b5d..1646308 100644 (file)
@@ -1,4 +1,4 @@
-/*     in_pcb.c        4.17    82/02/27        */
+/*     in_pcb.c        4.18    82/03/03        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -130,11 +130,12 @@ COUNT(IN_PCBCONNECT);
                ifp = if_ifonnetof(sin->sin_addr.s_addr);
                if (ifp == 0)
                        ifp = ifnet;
                ifp = if_ifonnetof(sin->sin_addr.s_addr);
                if (ifp == 0)
                        ifp = ifnet;
-               inp->inp_laddr = ifp->if_addr;
        }
        if (in_pcblookup(inp->inp_head,
            sin->sin_addr, sin->sin_port, inp->inp_laddr, inp->inp_lport, 0))
                return (EADDRINUSE);
        }
        if (in_pcblookup(inp->inp_head,
            sin->sin_addr, sin->sin_port, inp->inp_laddr, inp->inp_lport, 0))
                return (EADDRINUSE);
+       if (inp->inp_laddr.s_addr == 0)
+               inp->inp_laddr = ifp->if_addr;
        inp->inp_faddr = sin->sin_addr;
        inp->inp_fport = sin->sin_port;
        return (0);
        inp->inp_faddr = sin->sin_addr;
        inp->inp_fport = sin->sin_port;
        return (0);
@@ -157,6 +158,7 @@ in_pcbdisconnect(inp)
 
 COUNT(IN_PCBDISCONNECT);
        inp->inp_faddr.s_addr = 0;
 
 COUNT(IN_PCBDISCONNECT);
        inp->inp_faddr.s_addr = 0;
+       inp->inp_fport = 0;
        if (inp->inp_socket->so_state & SS_USERGONE)
                in_pcbdetach(inp);
 }
        if (inp->inp_socket->so_state & SS_USERGONE)
                in_pcbdetach(inp);
 }
@@ -181,11 +183,11 @@ in_pcbdetach(inp)
  * SHOULD ALLOW MATCH ON MULTI-HOMING ONLY
  */
 struct inpcb *
  * SHOULD ALLOW MATCH ON MULTI-HOMING ONLY
  */
 struct inpcb *
-in_pcblookup(head, faddr, fport, laddr, lport, enter)
+in_pcblookup(head, faddr, fport, laddr, lport, flags)
        struct inpcb *head;
        struct in_addr faddr, laddr;
        u_short fport, lport;
        struct inpcb *head;
        struct in_addr faddr, laddr;
        u_short fport, lport;
-       int enter;
+       int flags;
 {
        register struct inpcb *inp, *match = 0;
        int matchwild = 3, wildcard;
 {
        register struct inpcb *inp, *match = 0;
        int matchwild = 3, wildcard;
@@ -202,13 +204,14 @@ in_pcblookup(head, faddr, fport, laddr, lport, enter)
                                wildcard++;
                }
                if (inp->inp_faddr.s_addr != 0) {
                                wildcard++;
                }
                if (inp->inp_faddr.s_addr != 0) {
-                       if (inp->inp_faddr.s_addr != faddr.s_addr)
+                       if (inp->inp_faddr.s_addr != faddr.s_addr ||
+                           inp->inp_fport != fport)
                                continue;
                } else {
                        if (faddr.s_addr != 0)
                                wildcard++;
                }
                                continue;
                } else {
                        if (faddr.s_addr != 0)
                                wildcard++;
                }
-               if (enter == 0 && wildcard)
+               if (wildcard && (flags & INPLOOKUP_WILDCARD) == 0)
                        continue;
                if (wildcard < matchwild) {
                        match = inp;
                        continue;
                if (wildcard < matchwild) {
                        match = inp;
@@ -217,9 +220,5 @@ in_pcblookup(head, faddr, fport, laddr, lport, enter)
                                break;
                }
        }
                                break;
                }
        }
-       if (match && enter) {
-               match->inp_laddr = laddr;
-               in_setsockaddr(match);
-       }
        return (match);
 }
        return (match);
 }
index 7438972..449d792 100644 (file)
@@ -1,4 +1,4 @@
-/*     in_pcb.h        4.2     81/12/03        */
+/*     in_pcb.h        4.3     82/03/03        */
 
 /*
  * Common structure pcb for internet protocol implementation.
 
 /*
  * Common structure pcb for internet protocol implementation.
@@ -20,6 +20,9 @@ struct inpcb {
        caddr_t inp_ppcb;               /* pointer to per-protocol pcb */
 };
 
        caddr_t inp_ppcb;               /* pointer to per-protocol pcb */
 };
 
+#define        INPLOOKUP_WILDCARD      1
+#define        INPLOOKUP_SETLOCAL      2
+
 #define        sotoinpcb(so)   ((struct inpcb *)(so)->so_pcb)
 
 #ifdef KERNEL
 #define        sotoinpcb(so)   ((struct inpcb *)(so)->so_pcb)
 
 #ifdef KERNEL
index 1ad4f2e..f20dad6 100644 (file)
@@ -1,4 +1,4 @@
-/*     tcp_input.c     1.55    82/02/27        */
+/*     tcp_input.c     1.56    82/03/03        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -45,6 +45,7 @@ tcp_input(m0)
        struct socket *so;
        int todrop, acked;
        short ostate;
        struct socket *so;
        int todrop, acked;
        short ostate;
+       struct in_addr laddr;
 
 COUNT(TCP_INPUT);
        /*
 
 COUNT(TCP_INPUT);
        /*
@@ -126,7 +127,8 @@ COUNT(TCP_INPUT);
         * address stored in the block to reflect anchoring.
         */
        inp = in_pcblookup
         * address stored in the block to reflect anchoring.
         */
        inp = in_pcblookup
-               (&tcb, ti->ti_src, ti->ti_sport, ti->ti_dst, ti->ti_dport, 1);
+               (&tcb, ti->ti_src, ti->ti_sport, ti->ti_dst, ti->ti_dport,
+               INPLOOKUP_WILDCARD);
 
        /*
         * If the state is CLOSED (i.e., TCB does not exist) then
 
        /*
         * If the state is CLOSED (i.e., TCB does not exist) then
@@ -189,13 +191,20 @@ COUNT(TCP_INPUT);
                        goto drop;
                tcp_in.sin_addr = ti->ti_src;
                tcp_in.sin_port = ti->ti_sport;
                        goto drop;
                tcp_in.sin_addr = ti->ti_src;
                tcp_in.sin_port = ti->ti_sport;
-               if (in_pcbconnect(inp, (struct sockaddr *)&tcp_in))
+               laddr = inp->inp_laddr;
+               if (inp->inp_laddr.s_addr == 0)
+                       inp->inp_laddr = ti->ti_dst;
+               if (in_pcbconnect(inp, (struct sockaddr *)&tcp_in)) {
+                       inp->inp_laddr = laddr;
                        goto drop;
                        goto drop;
+               }
                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);
+                       inp->inp_laddr = laddr;
                        goto drop;
                }
                        goto drop;
                }
+               in_setsockaddr(inp);
                tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2;
                tp->irs = ti->ti_seq;
                tcp_sendseqinit(tp);
                tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2;
                tp->irs = ti->ti_seq;
                tcp_sendseqinit(tp);
@@ -354,6 +363,9 @@ trimthenstep6:
                        inp->inp_ppcb = 0;
                        tp = tcp_newtcpcb(inp);
                        tp->t_state = TCPS_LISTEN;
                        inp->inp_ppcb = 0;
                        tp = tcp_newtcpcb(inp);
                        tp->t_state = TCPS_LISTEN;
+                       inp->inp_faddr.s_addr = 0;
+                       inp->inp_fport = 0;
+                       inp->inp_laddr.s_addr = 0;      /* not quite right */
                        goto drop;
                }
                tcp_drop(tp, ECONNREFUSED);
                        goto drop;
                }
                tcp_drop(tp, ECONNREFUSED);
index 5be15f6..0a95375 100644 (file)
@@ -1,4 +1,4 @@
-/*     udp_usrreq.c    4.20    82/02/27        */
+/*     udp_usrreq.c    4.21    82/03/03        */
 
 #include "../h/param.h"
 #include "../h/dir.h"
 
 #include "../h/param.h"
 #include "../h/dir.h"
@@ -86,7 +86,8 @@ COUNT(UDP_INPUT);
         * control block to anchor network and host address.
         */
        inp = in_pcblookup(&udb,
         * control block to anchor network and host address.
         */
        inp = in_pcblookup(&udb,
-           ui->ui_src, ui->ui_sport, ui->ui_dst, ui->ui_dport, 1);
+           ui->ui_src, ui->ui_sport, ui->ui_dst, ui->ui_dport,
+               INPLOOKUP_WILDCARD);
        if (inp == 0)
                goto bad;
 
        if (inp == 0)
                goto bad;
 
@@ -233,6 +234,7 @@ COUNT(UDP_USRREQ);
                if (addr) {
                        in_pcbdisconnect(inp);
                        inp->inp_laddr = laddr;
                if (addr) {
                        in_pcbdisconnect(inp);
                        inp->inp_laddr = laddr;
+                       in_setsockaddr(inp);
                }
                }
                break;
                }
                }
                break;