this applies the tricks with addresses from veb and etherbridge
code to the normal ethernet input processing. it seems to make
things a bit faster. some tests have shown a 15% improvement in
forwarding performance with this diff.

ive been running with it for the last week on sparc64 and amd64
without issue.

ok?

Index: if_ethersubr.c
===================================================================
RCS file: /cvs/src/sys/net/if_ethersubr.c,v
retrieving revision 1.271
diff -u -p -r1.271 if_ethersubr.c
--- if_ethersubr.c      26 Feb 2021 01:12:37 -0000      1.271
+++ if_ethersubr.c      27 Feb 2021 01:24:44 -0000
@@ -382,6 +382,7 @@ ether_input(struct ifnet *ifp, struct mb
        struct arpcom *ac;
        const struct ether_brport *eb;
        unsigned int sdelim = 0;
+       uint64_t dst, self;
 
        /* Drop short frames */
        if (m->m_len < ETHER_HDR_LEN)
@@ -450,7 +451,9 @@ ether_input(struct ifnet *ifp, struct mb
         */
 
        eh = mtod(m, struct ether_header *);
-       if (memcmp(ac->ac_enaddr, eh->ether_dhost, ETHER_ADDR_LEN) != 0) {
+       dst = ether_addr_to_e64((struct ether_addr *)eh->ether_dhost);
+       self = ether_addr_to_e64((struct ether_addr *)ac->ac_enaddr);
+       if (dst != self) {
 #if NCARP > 0
                /*
                 * If it's not for this port, it could be for carp(4).
@@ -468,7 +471,7 @@ ether_input(struct ifnet *ifp, struct mb
                /*
                 * If not, it must be multicast or broadcast to go further.
                 */
-               if (!ETHER_IS_MULTICAST(eh->ether_dhost))
+               if (!ETH64_IS_MULTICAST(dst))
                        goto dropanyway;
 
                /*
@@ -476,15 +479,13 @@ ether_input(struct ifnet *ifp, struct mb
                 * if it came from us.
                 */
                if ((ifp->if_flags & IFF_SIMPLEX) == 0) {
-                       if (memcmp(ac->ac_enaddr, eh->ether_shost,
-                           ETHER_ADDR_LEN) == 0)
+                       uint64_t src = ether_addr_to_e64(
+                           (struct ether_addr *)eh->ether_shost);
+                       if (self == src)
                                goto dropanyway;
                }
 
-               if (ETHER_IS_BROADCAST(eh->ether_dhost))
-                       m->m_flags |= M_BCAST;
-               else
-                       m->m_flags |= M_MCAST;
+               SET(m->m_flags, ETH64_IS_BROADCAST(dst) ? M_BCAST : M_MCAST);
                ifp->if_imcasts++;
        }
 

Reply via email to