Re: Posting mad frame on ib_recv_wr

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>    I checked archives and sources as well, but couldn't get a convincing answer. We have a RDMA NIC, and our nic presents whole rocev2(ipv4) mad frame on
> the hw receive queue. I am trying to copy(instead of dma, due to some limitation on hw side) this to ib_recv_wr sglist addr, but I am not sure how this should be done exactly.
> I tried copying from (frame_start + ETH_HLEN) to sglist[0].addr, but this resulted in "MAD received with unsupported base version" error in core/mad.c.
> The only scheme I figured by looking into source is to copy iphr from the frame at (sglist[0].addr + 20) and then skip udph, bth, deth, and
> copy rest of the frame(mad) at sglist[0].addr + 20 + sizeof(iph). But I am not sure if this is correct.
>
> Also in the poll what should be the flags on wc? Should I set both IB_WC_GRH and IB_WC_WITH_NETWORK_HDR_TYPE? And set network_hdr_type to IPv4?

For a MAD or any incoming UD message on RoCEv2, the first 40 bytes of
the receive buffer should contain the IP header.  See the IB spec
annex defining RoCEv2:

The first 40 bytes of user posted UD Receive Buffers are reserved for
the L3 header of the incoming packet (as per the InfiniBand Spec
Section 11.4.1.2). In RoCEv2, this area is filled up with the IP
header. IPv6 header uses the entire 40 bytes.  IPv4 headers use the 20
bytes in the second half of the reserved 40 bytes area (i.e. offset 20
from the beginning of the receive buffer). In this case, the content
of the first 20 bytes is undefined.

So yes, for a RoCEv2 packet sent in UDPv4, you should copy the iphdr
from the frame to an offset of 20 bytes from the beginning of the user
supplied buffer, and then copy the payload of the UD message to the
user supplied buffer at offset 40.  Note that you need to be careful
about assuming you start with sglist[0] - although the Linux stack
currently doesn't do it, it would be completely valid to post a bunch
of very small scatterlist entries that you would have to skip to reach
offset 20 and offset 40.  And the iphdr and/or the payload might span
multiple sglist entries.  You should set IB_WC_GRH even for an IPv4
header.

I'm assuming you set the network_hdr_type field in the ib_wc structure
to IPv4 or IPv6 as appropriate.  You should therefore set
IB_WC_WITH_NETWORK_HDR_TYPE as well.

  - R.



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux