ソースを参照

[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>
tags/v1.20.1
Michael Brown 12年前
コミット
8ccaec5adf
1個のファイルの変更13行の追加8行の削除
  1. 13
    8
      src/drivers/net/ipoib.c

+ 13
- 8
src/drivers/net/ipoib.c ファイルの表示

120
 static struct ipoib_peer ipoib_peer_cache[IPOIB_NUM_CACHED_PEERS];
120
 static struct ipoib_peer ipoib_peer_cache[IPOIB_NUM_CACHED_PEERS];
121
 
121
 
122
 /** Oldest IPoIB peer cache entry index */
122
 /** Oldest IPoIB peer cache entry index */
123
-static unsigned int ipoib_peer_cache_idx = 1;
123
+static unsigned int ipoib_peer_cache_idx = 0;
124
+
125
+/** IPoIB peer cache entry validity flag */
126
+#define IPOIB_PEER_KEY_VALID 0x80
124
 
127
 
125
 /**
128
 /**
126
  * Look up cached peer by key
129
  * Look up cached peer by key
132
 	struct ipoib_peer *peer;
135
 	struct ipoib_peer *peer;
133
 	unsigned int i;
136
 	unsigned int i;
134
 
137
 
138
+	if ( ! key )
139
+		return NULL;
140
+
135
 	for ( i = 0 ; i < IPOIB_NUM_CACHED_PEERS ; i++ ) {
141
 	for ( i = 0 ; i < IPOIB_NUM_CACHED_PEERS ; i++ ) {
136
 		peer = &ipoib_peer_cache[i];
142
 		peer = &ipoib_peer_cache[i];
137
 		if ( peer->key == key )
143
 		if ( peer->key == key )
138
 			return peer;
144
 			return peer;
139
 	}
145
 	}
140
 
146
 
141
-	if ( key != 0 ) {
142
-		DBG ( "IPoIB warning: peer cache lost track of key %x while "
143
-		      "still in use\n", key );
144
-	}
147
+	DBG ( "IPoIB warning: peer cache lost track of key %x while still in "
148
+	      "use\n", key );
145
 	return NULL;
149
 	return NULL;
146
 }
150
 }
147
 
151
 
153
  */
157
  */
154
 static struct ipoib_peer * ipoib_cache_peer ( const struct ipoib_mac *mac ) {
158
 static struct ipoib_peer * ipoib_cache_peer ( const struct ipoib_mac *mac ) {
155
 	struct ipoib_peer *peer;
159
 	struct ipoib_peer *peer;
156
-	unsigned int key;
160
+	uint8_t key;
157
 	unsigned int i;
161
 	unsigned int i;
158
 
162
 
159
 	/* Look for existing cache entry */
163
 	/* Look for existing cache entry */
164
 	}
168
 	}
165
 
169
 
166
 	/* No entry found: create a new one */
170
 	/* No entry found: create a new one */
167
-	key = ipoib_peer_cache_idx++;
171
+	key = ( ipoib_peer_cache_idx++ | IPOIB_PEER_KEY_VALID );
168
 	peer = &ipoib_peer_cache[ key % IPOIB_NUM_CACHED_PEERS ];
172
 	peer = &ipoib_peer_cache[ key % IPOIB_NUM_CACHED_PEERS ];
169
 	if ( peer->key )
173
 	if ( peer->key )
170
 		DBG ( "IPoIB peer %x evicted from cache\n", peer->key );
174
 		DBG ( "IPoIB peer %x evicted from cache\n", peer->key );
257
 	*ll_dest = ( dest ? &dest->mac : &ipoib->broadcast );
261
 	*ll_dest = ( dest ? &dest->mac : &ipoib->broadcast );
258
 	*ll_source = ( source ? &source->mac : &ipoib->broadcast );
262
 	*ll_source = ( source ? &source->mac : &ipoib->broadcast );
259
 	*net_proto = ipoib_hdr->proto;
263
 	*net_proto = ipoib_hdr->proto;
260
-	*flags = ( ( *ll_dest == &ipoib->broadcast ) ? LL_BROADCAST : 0 );
264
+	*flags = ( ( *ll_dest == &ipoib->broadcast ) ?
265
+		   ( LL_MULTICAST | LL_BROADCAST ) : 0 );
261
 
266
 
262
 	return 0;
267
 	return 0;
263
 }
268
 }

読み込み中…
キャンセル
保存