summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/ipoib.c
diff options
context:
space:
mode:
authorMichael Brown2011-11-15 04:57:09 +0100
committerMichael Brown2011-11-15 04:59:09 +0100
commit8ccaec5adf51c7fa3b026db7b7811e7320f71cb0 (patch)
treeda8ffae7ba430463ee8c40448250064c8243a04a /src/drivers/net/ipoib.c
parent[rtl8139] Perform only 8-bit ioport access on the ChipCmd register (diff)
downloadipxe-8ccaec5adf51c7fa3b026db7b7811e7320f71cb0.tar.gz
ipxe-8ccaec5adf51c7fa3b026db7b7811e7320f71cb0.tar.xz
ipxe-8ccaec5adf51c7fa3b026db7b7811e7320f71cb0.zip
[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/net/ipoib.c')
-rw-r--r--src/drivers/net/ipoib.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c
index bc71a456..30ba10c7 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;
}