[ofw] incorrect SID generation in WvGetServiceId
Hefty, Sean
sean.hefty at intel.com
Fri Feb 11 10:39:55 PST 2011
> WvGetServiceId swaps the port number in the sockaddr but shouldn't. The
> port number in a sockaddr structure is already in network order. See
> http://msdn.microsoft.com/en-us/library/ff570823(VS.85).aspx, the remarks
> section:
> " All of the data in the SOCKADDR_IN structure, except for the address
> family, must be specified in network-byte-order (big-endian)."
Here's WvGetServiceId:
static UINT64 WvGetServiceId(UINT16 EpType, WV_IO_SOCKADDR_DATA *pAddress)
{
return RtlUlonglongByteSwap(((UINT64)EpType << 16) +
RtlUshortByteSwap(pAddress->SockAddr.In.SinPort));
}
It swaps the port to host order, forms the SID in host order, then swaps the SID back to network order. This matches the Linux implementation:
static __be64 cma_get_service_id(enum rdma_port_space ps, struct sockaddr *addr)
{
return cpu_to_be64(((u64)ps << 16) + be16_to_cpu(cma_port(addr)));
}
>From the RDMA CM Annex to the IB spec:
"The last two bytes of the Service ID are the ULP port for the IP protocol number. For
example, for SCTP NFSv4-RDMA default port the Service ID is 0x0000000001840801 (port 2049)"
Based on the example, the port is stored in the service ID in host order (2049 = 0x0801), not network order.
- Sean
More information about the ofw
mailing list