On 15/07/19(Mon) 15:29, Todd C. Miller wrote:
> On Mon, 15 Jul 2019 18:21:28 -0300, Martin Pieuchot wrote:
> 
> > We have many home brewed ways to check Ethernet addresses.  This diff
> > introduces two macros similar to ETHER_IS_MULTICAST() and make use of
> > them in bridge(4) and generic Ethernet layer.
> 
> I think you can also replace the ether_isbcast, ether_isequal and
> ether_cmp macros in net/if_gre.c as well.

Updated diff:

- Introduce ETHER_IS() and convert the various ether_is_* in bpe(4) and
  gre(4) as pointed by millert@

- Use ETHER_IS_BROADCAST() for compatibility with FreeBSD as pointed by
  emaste@

Ok?

Index: net/if_bpe.c
===================================================================
RCS file: /cvs/src/sys/net/if_bpe.c,v
retrieving revision 1.7
diff -u -p -r1.7 if_bpe.c
--- net/if_bpe.c        21 May 2019 10:11:10 -0000      1.7
+++ net/if_bpe.c        16 Jul 2019 23:37:52 -0000
@@ -144,10 +144,6 @@ static struct bpe_tree bpe_interfaces = 
 static struct rwlock bpe_lock = RWLOCK_INITIALIZER("bpeifs");
 static struct pool bpe_entry_pool;
 
-#define ether_cmp(_a, _b)      memcmp((_a), (_b), ETHER_ADDR_LEN)
-#define ether_is_eq(_a, _b)    (ether_cmp((_a), (_b)) == 0)
-#define ether_is_bcast(_a)     ether_is_eq((_a), etherbroadcastaddr)
-
 void
 bpeattach(int count)
 {
@@ -290,7 +286,7 @@ bpe_start(struct ifnet *ifp)
 
                beh = mtod(m, struct ether_header *);
 
-               if (ether_is_bcast(ceh->ether_dhost)) {
+               if (ETHER_IS_BROADCAST(ceh->ether_dhost)) {
                        memcpy(beh->ether_dhost, sc->sc_group,
                            sizeof(beh->ether_dhost));
                } else {
@@ -839,7 +835,7 @@ bpe_input_map(struct bpe_softc *sc, cons
                be->be_age = time_uptime; /* only a little bit racy */
 
                if (be->be_type != BPE_ENTRY_DYNAMIC ||
-                   ether_is_eq(ba, &be->be_b_da))
+                   ETHER_IS_EQ(ba, &be->be_b_da))
                        be = NULL;
                else
                        refcnt_take(&be->be_refs);
Index: net/if_bridge.c
===================================================================
RCS file: /cvs/src/sys/net/if_bridge.c,v
retrieving revision 1.335
diff -u -p -r1.335 if_bridge.c
--- net/if_bridge.c     9 Jun 2019 17:42:16 -0000       1.335
+++ net/if_bridge.c     16 Jul 2019 23:28:59 -0000
@@ -944,10 +944,8 @@ bridgeintr_frame(struct ifnet *brifp, st
         * is not broadcast or multicast, record its address.
         */
        if ((bif->bif_flags & IFBIF_LEARNING) &&
-           (eh.ether_shost[0] & 1) == 0 &&
-           !(eh.ether_shost[0] == 0 && eh.ether_shost[1] == 0 &&
-           eh.ether_shost[2] == 0 && eh.ether_shost[3] == 0 &&
-           eh.ether_shost[4] == 0 && eh.ether_shost[5] == 0))
+           !ETHER_IS_MULTICAST(eh.ether_shost) &&
+           !ETHER_IS_ANYADDR(eh.ether_shost))
                bridge_rtupdate(sc, src, src_if, 0, IFBAF_DYNAMIC, m);
 
        if ((bif->bif_flags & IFBIF_STP) &&
@@ -972,8 +970,7 @@ bridgeintr_frame(struct ifnet *brifp, st
                        return;
                }
        } else {
-               if (memcmp(etherbroadcastaddr, eh.ether_dhost,
-                   sizeof(etherbroadcastaddr)) == 0)
+               if (ETHER_IS_BROADCAST(eh.ether_dhost))
                        m->m_flags |= M_BCAST;
                else
                        m->m_flags |= M_MCAST;
Index: net/if_ethersubr.c
===================================================================
RCS file: /cvs/src/sys/net/if_ethersubr.c,v
retrieving revision 1.259
diff -u -p -r1.259 if_ethersubr.c
--- net/if_ethersubr.c  20 Feb 2019 00:03:15 -0000      1.259
+++ net/if_ethersubr.c  16 Jul 2019 23:29:14 -0000
@@ -377,8 +377,7 @@ ether_input(struct ifnet *ifp, struct mb
                                goto dropanyway;
                }
 
-               if (memcmp(etherbroadcastaddr, eh->ether_dhost,
-                   ETHER_ADDR_LEN) == 0)
+               if (ETHER_IS_BROADCAST(eh->ether_dhost))
                        m->m_flags |= M_BCAST;
                else
                        m->m_flags |= M_MCAST;
Index: net/if_gre.c
===================================================================
RCS file: /cvs/src/sys/net/if_gre.c,v
retrieving revision 1.150
diff -u -p -r1.150 if_gre.c
--- net/if_gre.c        23 Apr 2019 11:48:55 -0000      1.150
+++ net/if_gre.c        16 Jul 2019 23:33:25 -0000
@@ -353,9 +353,6 @@ struct mgre_tree mgre_tree = RBT_INITIAL
 /*
  * Ethernet GRE tunnels
  */
-#define ether_cmp(_a, _b)      memcmp((_a), (_b), ETHER_ADDR_LEN)
-#define ether_isequal(_a, _b)  (ether_cmp((_a), (_b)) == 0)
-#define ether_isbcast(_e)      ether_isequal((_e), etherbroadcastaddr)
 
 static struct mbuf *
                gre_ether_align(struct mbuf *, int);
@@ -1455,7 +1452,7 @@ nvgre_input_map(struct nvgre_softc *sc, 
        struct nvgre_entry *nv, nkey;
        int new = 0;
 
-       if (ether_isbcast(eh->ether_shost) ||
+       if (ETHER_IS_BROADCAST(eh->ether_shost) ||
            ETHER_IS_MULTICAST(eh->ether_shost))
                return;
 
@@ -3863,7 +3860,7 @@ nvgre_start(struct ifnet *ifp)
 #endif
 
                eh = mtod(m0, struct ether_header *);
-               if (ether_isbcast(eh->ether_dhost))
+               if (ETHER_IS_BROADCAST(eh->ether_dhost))
                        gateway = tunnel->t_dst;
                else {
                        memcpy(&key.nv_dst, eh->ether_dhost,
Index: netinet/if_ether.c
===================================================================
RCS file: /cvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.239
diff -u -p -r1.239 if_ether.c
--- netinet/if_ether.c  13 Jun 2019 08:15:26 -0000      1.239
+++ netinet/if_ether.c  16 Jul 2019 23:29:21 -0000
@@ -516,8 +516,8 @@ in_arpinput(struct ifnet *ifp, struct mb
        sin.sin_len = sizeof(sin);
        sin.sin_family = AF_INET;
 
-       if (ETHER_IS_MULTICAST(&ea->arp_sha[0]) &&
-           !memcmp(ea->arp_sha, etherbroadcastaddr, sizeof(ea->arp_sha))) {
+       if (ETHER_IS_MULTICAST(ea->arp_sha) &&
+           ETHER_IS_BROADCAST(ea->arp_sha)) {
                inet_ntop(AF_INET, &isaddr, addr, sizeof(addr));
                log(LOG_ERR, "arp: ether address is broadcast for IP address "
                    "%s!\n", addr);
Index: netinet/if_ether.h
===================================================================
RCS file: /cvs/src/sys/netinet/if_ether.h,v
retrieving revision 1.75
diff -u -p -r1.75 if_ether.h
--- netinet/if_ether.h  5 Jul 2019 01:23:22 -0000       1.75
+++ netinet/if_ether.h  16 Jul 2019 23:40:35 -0000
@@ -108,6 +108,13 @@ struct  ether_vlan_header {
 #include <net/ethertypes.h>
 
 #define        ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address 
mcast/bcast? */
+#define        ETHER_IS_BROADCAST(addr) \
+       (((addr)[0] & (addr)[1] & (addr)[2] & \
+         (addr)[3] & (addr)[4] & (addr)[5]) == 0xff)
+#define        ETHER_IS_ANYADDR(addr)          \
+       (((addr)[0] | (addr)[1] | (addr)[2] | \
+         (addr)[3] | (addr)[4] | (addr)[5]) == 0x00)
+#define        ETHER_IS_EQ(a1, a2)     (memcmp((a1), (a2), ETHER_ADDR_LEN) == 
0)
 
 #define        ETHERMTU        (ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
 #define        ETHERMIN        (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)

Reply via email to