diff options
| author | Michael Brown | 2016-03-08 18:02:24 +0100 |
|---|---|---|
| committer | Michael Brown | 2016-03-08 18:43:26 +0100 |
| commit | b5aa51ac62bd36294e1f312d0ac1d742f28fe7b0 (patch) | |
| tree | a032cabf893c63d02aed83d24e3d4969a254f1b7 /src | |
| parent | [infiniband] Retrieve GID flag from cached path entries (diff) | |
| download | ipxe-b5aa51ac62bd36294e1f312d0ac1d742f28fe7b0.tar.gz ipxe-b5aa51ac62bd36294e1f312d0ac1d742f28fe7b0.tar.xz ipxe-b5aa51ac62bd36294e1f312d0ac1d742f28fe7b0.zip | |
[ipoib] Resimplify test for received broadcast packets
Commit e62e52b ("[ipoib] Simplify test for received broadcast
packets") relies upon the multicast LID being present in the
destination address vector as passed to ipoib_complete_recv().
Unfortunately, this information is not present in many Infiniband
devices' completion queue entries.
Fix by testing instead for the presence of a multicast GID.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/net/ipoib.c | 4 | ||||
| -rw-r--r-- | src/include/ipxe/ib_packet.h | 3 |
2 files changed, 5 insertions, 2 deletions
diff --git a/src/drivers/net/ipoib.c b/src/drivers/net/ipoib.c index b52ccb194..4b85eda31 100644 --- a/src/drivers/net/ipoib.c +++ b/src/drivers/net/ipoib.c @@ -671,8 +671,8 @@ static void ipoib_complete_recv ( struct ib_device *ibdev __unused, ethhdr->h_protocol = net_proto; /* Construct destination address */ - if ( IB_LID_MULTICAST ( dest->lid ) ) { - /* Multicast LID; use the Ethernet broadcast address */ + if ( dest->gid_present && IB_GID_MULTICAST ( &dest->gid ) ) { + /* Multicast GID: use the Ethernet broadcast address */ memcpy ( ðhdr->h_dest, eth_broadcast, sizeof ( ethhdr->h_dest ) ); } else { diff --git a/src/include/ipxe/ib_packet.h b/src/include/ipxe/ib_packet.h index 2cea016bd..747f96399 100644 --- a/src/include/ipxe/ib_packet.h +++ b/src/include/ipxe/ib_packet.h @@ -48,6 +48,9 @@ union ib_gid { #define IB_GID_ARGS( gid ) \ IB_GUID_ARGS ( &(gid)->s.prefix ), IB_GUID_ARGS ( &(gid)->s.guid ) +/** Test for multicast GID */ +#define IB_GID_MULTICAST( gid ) ( (gid)->bytes[0] == 0xff ) + /** An Infiniband Local Route Header */ struct ib_local_route_header { /** Virtual lane and link version */ |
