• Jamal Hadi Salim's avatar
    [NET] ethernet: Fix first packet goes out with MAC 00:00:00:00:00:00 · f8d0e3f1
    Jamal Hadi Salim authored
    When you turn off ARP on a netdevice then the first packet always goes
    out with a dstMAC of all zeroes. This is because the first packet is
    used to resolve ARP entries. Even though the ARP entry may be resolved
    (I tried by setting a static ARP entry for a host i was pinging from),
    it gets overwritten by virtue of having the netdevice disabling ARP.
    
    Subsequent packets go out fine with correct dstMAC address (which may
    be why people have ignored reporting this issue).
    
    To cut the story short: 
    
    the culprit code is in net/ethernet/eth.c::eth_header()
    
    ----
            /*
             *      Anyway, the loopback-device should never use this
    function...
             */
    
            if (dev->flags & (IFF_LOOPBACK|IFF_NOARP))
            {
                    memset(eth->h_dest, 0, dev->addr_len);
                    return ETH_HLEN;
            }
    
    	if(daddr)
            {
                    memcpy(eth->h_dest,daddr,dev->addr_len);
                    return ETH_HLEN;
            }
    
    ----
    
    Note how the h_dest is being reset when device has IFF_NOARP.
    
    As a note:
    All devices including loopback pass a daddr. loopback in fact passes
    a 0 all the time ;-> 
    This means i can delete the check totaly or i can remove the IFF_NOARP
    
    Alexey says:
    --------------------
    I think, it was me who did this crap. It was so long ago I do not remember
    why it was made.
    
    I remember some troubles with dummy device. It tried to resolve
    addresses, apparently, without success and generated errors instead of
    blackholing. I think the problem was eventually solved at neighbour
    level.
    
    After some thinking I suspect the deletion of this chunk could change
    behaviour of some parts which do not use neighbour cache f.e. packet
    socket.
    
    I think safer approach would be to move this chunk after if (daddr).
    And the possibility to remove this completely could be analyzed later.
    --------------------
    
    Patch updated with Alexey's safer suggestions.
    Signed-off-by: default avatarJamal Hadi Salim <hadi@cyberus.ca>
    Acked-by: default avatarAlexey Kuznetsov <kuznet@ms2.inr.ac.ru>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f8d0e3f1
eth.c 7.96 KB