As a proof of concept, I made if_input2(), which does if_input() except
bpf_mtap_ether(), and made bridge_ifinput() call if_input2().  This way
incoming broadcast frames are tapped only once at if_input().  I see pppoe(4)
works again with this change.  But ether_input() still receives 2 copies.

I'm wondering if bridge_ifinput() just before bridgeintr_frame() in
bridge_process() is superfluous.

On Mon, Jun 06, 2016 at 01:04:06PM +0900, Masao Uebayashi wrote:
> Broadcast frame, coming into a bridge'ed interface, passes if_input() 3 times,
> and actually input (ether_input()) twice.
> 
> - A frame enters an interface (e.g. pair(4)), the interface calls if_input()
>   on it.  The frame is queued in if_input_queue.
> 
> - A task running if_input_process() is triggered.  It takes the frame and
>   calls bridge_input().  Frame is queued in bridgeintrq.
> 
> - bridge_process() dispatches frame as multicast/broadcast (if
>   (ETHER_IS_MULTICAST())) and calls bridge_ifinput() on it, then passes the
>   frame to bridgeintr_frame().
> 
> - bridgeintr_frame() calls bridge_broadcast() on it.
> 
> - bridge_broadcast() calls bridge_localbroadcast(), which again calls
>   bridge_ifinput().
> 
> bridge_ifinput() is called twice for each broadcast frames.  bridge_ifinput()
> calls if_input().  Thus 3 if_input() for each.
> 
> These duplicate frames confuse pppoe(4), that's why it stops working.
> 
> On Fri, Jun 03, 2016 at 08:29:50PM +0900, Masao Uebayashi wrote:
> > Moving bpf_mtap_ether() from if_input() to (the top of) ether_input() makes
> > PPPoE session successfully get established.
> > 
> > On Thu, Jun 02, 2016 at 02:25:39PM +0900, Masao Uebayashi wrote:
> > > I spoke too early; I thought frames were broken but actually it was not.
> > > What was happening, according to tcpdump(8), was that frames, both 
> > > broadcast
> > > and unicast, are flooded for some reason, and pppoe(4) fails to receive
> > > necessary frames in order.
> > > 
> > > OTOH, assigning IP addresses and pinging between pair(4)'s doesn't flood
> > > frames.
> > > 
> > > bridge(4) and bpf(4) interacting badly?
> > > 
> > > On Thu, Jun 02, 2016 at 10:34:10AM +0900, Masao Uebayashi wrote:
> > > > I'm playing with PPPoE and it (npppd(8) + ppppoe(4)) works fine with 
> > > > patched
> > > > pair(4) interfaces, that's good.
> > > > 
> > > >        patch
> > > >   pair0 --- pair1
> > > >   pppoe     npppd
> > > > 
> > > > To try more wierd things, I added one pair(4), to which npppd(8) was 
> > > > listening
> > > > on, to a bridge(4).  This stops pppoe(4) from working.  Seems PPPoE 
> > > > Discovery
> > > > frames sent to pppoe(4) get broken.
> > > > 
> > > >        patch     bridge0
> > > >   pair0 --- pair1 =====
> > > >   pppoe     npppd
> > > > 
> > > > If I add another interface, e.g. vether(4), to the bridge and let 
> > > > npppd(8)
> > > > listen on vether(4), things work.
> > > > 
> > > >        patch     bridge0
> > > >   pair0 --- pair1 ===== vether0
> > > >   pppoe                 npppd
> > > > 
> > > > I thought adding an interface (pair1) to a bridge does not change what 
> > > > pair1
> > > > sees logically, or am I wrong?
> > > > 
> > > > Masao

Reply via email to