diff options
author | Michael Brown <mcb30@ipxe.org> | 2011-11-15 03:57:09 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2011-11-15 03:59:09 +0000 |
commit | 8ccaec5adf51c7fa3b026db7b7811e7320f71cb0 (patch) | |
tree | da8ffae7ba430463ee8c40448250064c8243a04a /src/drivers | |
parent | 91dd64ad25baa27954a7518e73df4fca8a2d0c93 (diff) | |
download | ipxe-8ccaec5adf51c7fa3b026db7b7811e7320f71cb0.tar.gz |
[ipoib] Report packets as broadcast when ambiguous
Avoid spurious matches for peer key 0 against empty peer cache
entries, and set the LL_MULTICAST flag in addition to LL_BROADCAST.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers')
-rw-r--r-- | src/drivers/net/ipoib.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c index bc71a4561..30ba10c76 100644 --- a/src/drivers/net/ipoib.c +++ b/src/drivers/net/ipoib.c @@ -120,7 +120,10 @@ struct ipoib_peer { static struct ipoib_peer ipoib_peer_cache[IPOIB_NUM_CACHED_PEERS]; /** Oldest IPoIB peer cache entry index */ -static unsigned int ipoib_peer_cache_idx = 1; +static unsigned int ipoib_peer_cache_idx = 0; + +/** IPoIB peer cache entry validity flag */ +#define IPOIB_PEER_KEY_VALID 0x80 /** * Look up cached peer by key @@ -132,16 +135,17 @@ static struct ipoib_peer * ipoib_lookup_peer_by_key ( unsigned int key ) { struct ipoib_peer *peer; unsigned int i; + if ( ! key ) + return NULL; + for ( i = 0 ; i < IPOIB_NUM_CACHED_PEERS ; i++ ) { peer = &ipoib_peer_cache[i]; if ( peer->key == key ) return peer; } - if ( key != 0 ) { - DBG ( "IPoIB warning: peer cache lost track of key %x while " - "still in use\n", key ); - } + DBG ( "IPoIB warning: peer cache lost track of key %x while still in " + "use\n", key ); return NULL; } @@ -153,7 +157,7 @@ static struct ipoib_peer * ipoib_lookup_peer_by_key ( unsigned int key ) { */ static struct ipoib_peer * ipoib_cache_peer ( const struct ipoib_mac *mac ) { struct ipoib_peer *peer; - unsigned int key; + uint8_t key; unsigned int i; /* Look for existing cache entry */ @@ -164,7 +168,7 @@ static struct ipoib_peer * ipoib_cache_peer ( const struct ipoib_mac *mac ) { } /* No entry found: create a new one */ - key = ipoib_peer_cache_idx++; + key = ( ipoib_peer_cache_idx++ | IPOIB_PEER_KEY_VALID ); peer = &ipoib_peer_cache[ key % IPOIB_NUM_CACHED_PEERS ]; if ( peer->key ) DBG ( "IPoIB peer %x evicted from cache\n", peer->key ); @@ -257,7 +261,8 @@ static int ipoib_pull ( struct net_device *netdev, *ll_dest = ( dest ? &dest->mac : &ipoib->broadcast ); *ll_source = ( source ? &source->mac : &ipoib->broadcast ); *net_proto = ipoib_hdr->proto; - *flags = ( ( *ll_dest == &ipoib->broadcast ) ? LL_BROADCAST : 0 ); + *flags = ( ( *ll_dest == &ipoib->broadcast ) ? + ( LL_MULTICAST | LL_BROADCAST ) : 0 ); return 0; } |