handle broadcast packets
authorBill Joy <root@ucbvax.Berkeley.EDU>
Wed, 10 Mar 1982 09:39:41 +0000 (01:39 -0800)
committerBill Joy <root@ucbvax.Berkeley.EDU>
Wed, 10 Mar 1982 09:39:41 +0000 (01:39 -0800)
SCCS-vsn: sys/net/if.h 4.8
SCCS-vsn: sys/net/if.c 4.9
SCCS-vsn: sys/vax/if/if_en.c 4.37
SCCS-vsn: sys/netinet/ip_input.c 1.31

usr/src/sys/net/if.c
usr/src/sys/net/if.h
usr/src/sys/netinet/ip_input.c
usr/src/sys/vax/if/if_en.c

index 7b7df75..d728cc9 100644 (file)
@@ -1,4 +1,4 @@
-/*     if.c    4.8     82/02/03        */
+/*     if.c    4.9     82/03/09        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -45,7 +45,9 @@ if_ifwithaddr(in)
 
 COUNT(IF_IFWITHADDR);
        for (ifp = ifnet; ifp; ifp = ifp->if_next)
 
 COUNT(IF_IFWITHADDR);
        for (ifp = ifnet; ifp; ifp = ifp->if_next)
-               if (ifp->if_addr.s_addr == in.s_addr)
+               if (in.s_addr == ifp->if_addr.s_addr ||
+                   (ifp->if_broadaddr.s_addr != 0 &&
+                    in.s_addr == ifp->if_broadaddr.s_addr))
                        break;
        return (ifp);
 }
                        break;
        return (ifp);
 }
index 2de24b7..eb73d03 100644 (file)
@@ -1,4 +1,4 @@
-/*     if.h    4.7     82/01/24        */
+/*     if.h    4.8     82/03/09        */
 
 /*
  * Structures defining a network interface, providing a packet
 
 /*
  * Structures defining a network interface, providing a packet
@@ -38,6 +38,7 @@ struct ifnet {
        short   if_net;                 /* network number of interface */
        int     if_host[2];             /* local net host number */
        struct  in_addr if_addr;        /* internet address of interface */
        short   if_net;                 /* network number of interface */
        int     if_host[2];             /* local net host number */
        struct  in_addr if_addr;        /* internet address of interface */
+       struct  in_addr if_broadaddr;   /* broadcast address of interface */
        struct  ifqueue {
                struct  mbuf *ifq_head;
                struct  mbuf *ifq_tail;
        struct  ifqueue {
                struct  mbuf *ifq_head;
                struct  mbuf *ifq_tail;
@@ -72,6 +73,8 @@ struct ifnet {
 }
 #define        IF_PREPEND(ifq, m) { \
        (m)->m_act = (ifq)->ifq_head; \
 }
 #define        IF_PREPEND(ifq, m) { \
        (m)->m_act = (ifq)->ifq_head; \
+       if ((ifq)->ifq_tail == 0) \
+               (ifq)->ifq_tail = (m); \
        (ifq)->ifq_head = (m); \
 }
 #define        IF_DEQUEUE(ifq, m) { \
        (ifq)->ifq_head = (m); \
 }
 #define        IF_DEQUEUE(ifq, m) { \
index f0e6057..b9daeac 100644 (file)
@@ -1,4 +1,4 @@
-/*     ip_input.c      1.30    82/02/15        */
+/*     ip_input.c      1.31    82/03/09        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -100,8 +100,10 @@ next:
         */
        i = 0;
        m0 = m;
         */
        i = 0;
        m0 = m;
-       for (; m != NULL; m = m->m_next)
+       for (; m != NULL; m = m->m_next) {
+               if (m->m_free) panic("ipinput already free");
                i += m->m_len;
                i += m->m_len;
+       }
        m = m0;
        if (i != ip->ip_len) {
                if (i < ip->ip_len) {
        m = m0;
        if (i != ip->ip_len) {
                if (i < ip->ip_len) {
@@ -118,8 +120,11 @@ next:
        if (hlen > sizeof (struct ip))
                ip_dooptions(ip);
        if (ifnet && ip->ip_dst.s_addr != ifnet->if_addr.s_addr &&
        if (hlen > sizeof (struct ip))
                ip_dooptions(ip);
        if (ifnet && ip->ip_dst.s_addr != ifnet->if_addr.s_addr &&
+           ip->ip_dst.s_addr != ifnet->if_broadaddr.s_addr &&
            if_ifwithaddr(ip->ip_dst) == 0) {
 printf("ip->ip_dst %x ip->ip_ttl %x\n", ip->ip_dst, ip->ip_ttl);
            if_ifwithaddr(ip->ip_dst) == 0) {
 printf("ip->ip_dst %x ip->ip_ttl %x\n", ip->ip_dst, ip->ip_ttl);
+               if (1)
+                       goto bad;
                if (--ip->ip_ttl == 0) {
                        icmp_error(ip, ICMP_TIMXCEED, 0);
                        goto next;
                if (--ip->ip_ttl == 0) {
                        icmp_error(ip, ICMP_TIMXCEED, 0);
                        goto next;
index ebc57e7..7fa716c 100644 (file)
@@ -1,4 +1,4 @@
-/*     if_en.c 4.36    82/03/03        */
+/*     if_en.c 4.37    82/03/09        */
 
 #include "en.h"
 
 
 #include "en.h"
 
@@ -110,6 +110,8 @@ COUNT(ENATTACH);
 #endif
        es->es_if.if_addr =
            if_makeaddr(es->es_if.if_net, es->es_if.if_host[0]);
 #endif
        es->es_if.if_addr =
            if_makeaddr(es->es_if.if_net, es->es_if.if_host[0]);
+       es->es_if.if_broadaddr =
+           if_makeaddr(es->es_if.if_net, 0);
        es->es_if.if_init = eninit;
        es->es_if.if_output = enoutput;
        es->es_if.if_ubareset = enreset;
        es->es_if.if_init = eninit;
        es->es_if.if_output = enoutput;
        es->es_if.if_ubareset = enreset;