The problem is that bridge_broadcast() only puts broadcast packets onto the output queue of the interfaces it is broadcasting the packet to and doesn't put a copy onto their input queues. I just added a small lump of code to copy the packet appropriately and I used M_LINK2 to avoid broadcasting packets that have already been broadcast. The NetBSD bridge(4) code for handling unicast packets has a short circuit in it that allows an input packet to be switched onto another interface as ether_input() passes it up the protocol stack, but this can't be done for broadcasts because each interface needs its own copy of the packet. Do you think the underlying problem affects v4/v6 equally, and it's a simple case of missing broadcasts? Do you think multicast is handled correctly with your fix? There's something uncomfortable about sending the packet in as well as out every bridged interface, but I think that's just wrong intuition on my part - if there were an external bridge, the packet would simply appear on every network (v6 link). So your change really does seem to replicate the behavior of an external bridge.
Attachment:
pgpf0raRrID29.pgp
Description: PGP signature