[hermon] Allocate space for GRH on UD queue pairs
authorMichael Brown <mcb30@ipxe.org>
Mon, 21 Mar 2016 08:18:15 +0000 (08:18 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 21 Mar 2016 08:18:15 +0000 (08:18 +0000)
commite84c917f39cc33894aeddbce727fe5430378fe7d
tree2bedfd10e807b668f629a5a7774f882b97cf9a3d
parent0141ea3a773aea7a2f4e81b2b2143c85683cc21c
[hermon] Allocate space for GRH on UD queue pairs

The Infiniband specification (volume 1, section 11.4.1.2 "Post Receive
Request") notes that for UD QPs, the GRH will be placed in the first
40 bytes of the receive buffer if present.  (If no GRH is present,
which is normal, then the first 40 bytes of the receive buffer will be
unused.)

Mellanox hardware performs this placement automatically: other headers
will be stripped (and their values returned via the CQE), but the
first 40 bytes of the data buffer will be consumed by the (probably
non-existent) GRH.

This does not fit neatly into iPXE's internal abstraction, which
expects the data buffer to represent just the data payload with the
addresses from the GRH (if present) passed as additional parameters to
ib_complete_recv().

The end result of this discrepancy is that attempts to receive
full-sized 2048-byte IPoIB packets on Mellanox hardware will fail.

Fix by allocating a separate ring buffer to hold the received GRHs.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/infiniband/hermon.c
src/drivers/infiniband/hermon.h