tech-net archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: bridge(4) unicast behaviour
Actually, I have thought about it and I do think this is an issue, but
possibly for other reasons. I don't think its losing your unicast
packets there. Could it be something else?
On Sun, Mar 29, 2009 at 4:02 PM, Peter <necedemalis%gmail.com@localhost> wrote:
> Hi,
> I wrote all this stuff to put the bridge on a soft interrupt queue,
> so that BRIDGE_IPF doesn't cause lock errors. But I've been having
> some other weird issues and this might be one of them.
>
> But, just thinking outloud, is it really the case that we wouldn't
> want to just ignore any packets that we sent out? In particular note
> that bridge_input() is, as far as I know, not called unless the packet
> is from outside the machine. So if this code finds a packet with the
> our source MAC address, why would we want to do anything with it at
> all?
>
> - Peter
>
>
> On 3/29/09, Masao Uebayashi <uebayasi%gmail.com@localhost> wrote:
>> I'm trying to use bridge(4) with tap(4) for emulator's network driver
>> backend.
>> Multicast packets going from within emulator can reach addresses in the
>> bridge, but unicast packets "disappear" misteriously. I've tracked this and
>> found a suspicious code fragment in sys/net/if_bridge.c:bridge_input():
>>
>> 1494 /*
>> 1495 * Unicast. Make sure it's not for us.
>> 1496 */
>> 1497 LIST_FOREACH(bif, &sc->sc_iflist, bif_next) {
>> 1498 /* It is destined for us. */
>> 1499 if (memcmp(CLLADDR(bif->bif_ifp->if_sadl),
>> eh->ether_dhost,
>> 1500 ETHER_ADDR_LEN) == 0
>> 1501 #if NCARP > 0
>> 1502 || (bif->bif_ifp->if_carp &&
>> carp_ourether(bif->bif_ifp->if_carp,
>> 1503 eh, IFT_ETHER, 0) != NULL)
>> 1504 #endif /* NCARP > 0 */
>> 1505 ) {
>> 1506 if (bif->bif_flags & IFBIF_LEARNING)
>> 1507 (void) bridge_rtupdate(sc,
>> 1508 eh->ether_shost, ifp, 0,
>> IFBAF_DYNAMIC);
>> 1509 m->m_pkthdr.rcvif = bif->bif_ifp;
>> 1510 return (m);
>> 1511 }
>> 1512
>> 1513 /* We just received a packet that we sent out. */
>> 1514 if (memcmp(CLLADDR(bif->bif_ifp->if_sadl),
>> eh->ether_shost,
>> 1515 ETHER_ADDR_LEN) == 0
>> 1516 #if NCARP > 0
>> 1517 || (bif->bif_ifp->if_carp &&
>> carp_ourether(bif->bif_ifp->if_carp,
>> 1518 eh, IFT_ETHER, 1) != NULL)
>> 1519 #endif /* NCARP > 0 */
>> 1520 ) {
>> 1521 m_freem(m);
>> 1522 return (NULL);
>> 1523 }
>> 1524 }
>>
>> This is a loop looking for a destination interface in a given bridge. The
>> first if () is to compare if_sadl with packet's eh->ether_dhost, which is
>> OK. But the 2nd if (), which is comparing a given interface's address with
>> packet's source address (eh->ether_shost), happens to match, the packet just
>> "disappears". I don't think that this is intended behaviour.
>>
>> (Think of the case that if the next interface (bif) in the list is the
>> inteface
>> which has the matching destination address. This LIST_FOREACH() behaviour
>> depends on the order of interfaces in the list.)
>>
>> Masao
>>
>
Home |
Main Index |
Thread Index |
Old Index