On 28/05/15(Thu) 11:23, Martin Pieuchot wrote:
> Let's use if_input() rather than ether_input_mbuf().  This simplifies
> the bpf(4) bits and removes some duplicate "rcvif" assignments.
> 
> Once ether_input_mbuf() is no more my plan is to start merging various
> ifp counters and put an interface index in the packet header.
> 
> ok?

Anybody?

> 
> Index: net/if_bridge.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_bridge.c,v
> retrieving revision 1.239
> diff -u -p -r1.239 if_bridge.c
> --- net/if_bridge.c   18 May 2015 11:43:57 -0000      1.239
> +++ net/if_bridge.c   22 May 2015 13:39:16 -0000
> @@ -1364,6 +1364,7 @@ bridge_dispatch(struct bridge_iflist *if
>       struct bridge_iflist *srcifl;
>       struct ether_header *eh;
>       struct arpcom *ac;
> +     struct mbuf_list ml = MBUF_LIST_INITIALIZER();
>       struct mbuf *mc;
>       int s;
>  
> @@ -1411,21 +1412,14 @@ bridge_dispatch(struct bridge_iflist *if
>               schednetisr(NETISR_BRIDGE);
>               if (ifp->if_type == IFT_GIF) {
>                       TAILQ_FOREACH(ifl, &sc->sc_iflist, next) {
> -                             if (ifl->ifp->if_type == IFT_ETHER)
> -                                     break;
> -                     }
> -                     if (ifl != NULL) {
> -                             m->m_pkthdr.rcvif = ifl->ifp;
> -                             m->m_pkthdr.ph_rtableid = ifl->ifp->if_rdomain;
> -#if NBPFILTER > 0
> -                             if (ifl->ifp->if_bpf)
> -                                     bpf_mtap_ether(ifl->ifp->if_bpf, m,
> -                                         BPF_DIRECTION_IN);
> -#endif
> +                             if (ifl->ifp->if_type != IFT_ETHER)
> +                                     continue;
> +
>                               m->m_flags |= M_PROTO1;
> -                             ether_input_mbuf(ifl->ifp, m);
> +                             ml_enqueue(&ml, m);
> +                             if_input(ifl->ifp, &ml);
>                               ifl->ifp->if_ipackets++;
> -                             m = NULL;
> +                             return (NULL);
>                       }
>               }
>               return (m);
> @@ -1462,24 +1456,14 @@ bridge_dispatch(struct bridge_iflist *if
>                               return (NULL);
>                       }
>  
> -                     /* Make sure the real incoming interface
> -                      * is aware */
> -#if NBPFILTER > 0
> -                     if (ifl->ifp->if_bpf)
> -                             bpf_mtap_ether(ifl->ifp->if_bpf, m,
> -                                 BPF_DIRECTION_IN);
> -#endif
> -                     /* Count for the interface we are going to */
> -                     ifl->ifp->if_ipackets++;
> -
>                       /* Count for the bridge */
>                       sc->sc_if.if_ipackets++;
>                       sc->sc_if.if_ibytes += m->m_pkthdr.len;
>  
> -                     m->m_pkthdr.rcvif = ifl->ifp;
> -                     m->m_pkthdr.ph_rtableid = ifl->ifp->if_rdomain;
>                       m->m_flags |= M_PROTO1;
> -                     ether_input_mbuf(ifl->ifp, m);
> +                     ml_enqueue(&ml, m);
> +                     if_input(ifl->ifp, &ml);
> +                     ifl->ifp->if_ipackets++;
>                       return (NULL);
>               }
>               if (bcmp(ac->ac_enaddr, eh->ether_shost, ETHER_ADDR_LEN) == 0
> @@ -1615,8 +1599,10 @@ void
>  bridge_localbroadcast(struct bridge_softc *sc, struct ifnet *ifp,
>      struct ether_header *eh, struct mbuf *m)
>  {
> +     struct mbuf_list ml = MBUF_LIST_INITIALIZER();
>       struct mbuf *m1;
>       u_int16_t etype;
> +     int s;
>  
>       /*
>        * quick optimisation, don't send packets up the stack if no
> @@ -1638,18 +1624,11 @@ bridge_localbroadcast(struct bridge_soft
>               sc->sc_if.if_oerrors++;
>               return;
>       }
> -     /* fixup header a bit */
> -     m1->m_pkthdr.rcvif = ifp;
> -     m1->m_pkthdr.ph_rtableid = ifp->if_rdomain;
>       m1->m_flags |= M_PROTO1;
> -
> -#if NBPFILTER > 0
> -     if (ifp->if_bpf)
> -             bpf_mtap(ifp->if_bpf, m1,
> -                 BPF_DIRECTION_IN);
> -#endif
> -
> -     ether_input_mbuf(ifp, m1);
> +     ml_enqueue(&ml, m1);
> +     s = splnet();
> +     if_input(ifp, &ml);
> +     splx(s);
>       ifp->if_ipackets++;
>  }
>  
> 

Reply via email to