On Thu, Mar 04, 2021 at 10:06:24PM +1000, David Gwynne wrote:
> 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?

Fine with me. Surprised about the preformance difference. 
I would assume that one memcmp() is about the same as one
ether_addr_to_e64() call.
 
> 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++;
>       }
>  
> 

-- 
:wq Claudio

Reply via email to