From: Sean Hefty Date: Wed, 16 Jun 2010 23:45:32 +0000 (-0700) Subject: Refresh of umad-dbg X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=336d2b7f0b6e712d7243839473fe71430cb6965e;p=~shefty%2Frdma-win.git Refresh of umad-dbg --- diff --git a/trunk/ulp/libibumad/include/infiniband/umad.h b/trunk/ulp/libibumad/include/infiniband/umad.h index 712d0213..f6b41ace 100644 --- a/trunk/ulp/libibumad/include/infiniband/umad.h +++ b/trunk/ulp/libibumad/include/infiniband/umad.h @@ -63,13 +63,13 @@ typedef struct ib_mad_addr uint8_t gid_index; uint8_t gid[16]; - uint8_t grh_present; + uint8_t traffic_class; uint8_t reserved_grh; uint16_t lid; uint8_t sl; uint8_t path_bits; uint8_t reserved_rate; - uint8_t traffic_class; + uint8_t grh_present; } ib_mad_addr_t; diff --git a/trunk/ulp/libibumad/src/umad.cpp b/trunk/ulp/libibumad/src/umad.cpp index 31b71178..752af1d9 100644 --- a/trunk/ulp/libibumad/src/umad.cpp +++ b/trunk/ulp/libibumad/src/umad.cpp @@ -548,6 +548,23 @@ size_t umad_size(void) return sizeof(struct ib_user_mad); } +static void umad_convert_addr(struct ib_mad_addr *addr, WM_MAD_AV *av) +{ + av->VersionClassFlow = htonl((6 << 28) | (((uint32_t) addr->traffic_class) << 20) | + (addr->flow_label & 0x000FFFFF)); + av->Reserved = 0; + av->StaticRate = 0; +} + +static void umad_convert_av(WM_MAD_AV *av, struct ib_mad_addr *addr) +{ + uint32_t ver_class_flow; + + ver_class_flow = ntohl(av->VersionClassFlow); + addr->flow_label = ver_class_flow & 0x000FFFFF; + addr->traffic_class = (uint8_t) (ver_class_flow >> 20); +} + __declspec(dllexport) int umad_send(int portid, int agentid, void *umad, int length, int timeout_ms, int retries) @@ -562,8 +579,11 @@ int umad_send(int portid, int agentid, void *umad, int length, mad->retries = (uint32_t) retries; mad->length = (uint32_t) length; + umad_convert_addr(&mad->addr, &((WM_MAD *) mad)->Address); hr = ports[portid].prov->Send((WM_MAD *) mad, NULL); + umad_convert_av(&((WM_MAD *) mad)->Address, &mad->addr); if (FAILED(hr)) { + _set_errno(EIO); return GetLastError(); } @@ -594,12 +614,14 @@ int umad_recv(int portid, void *umad, int *length, int timeout_ms) } if (FAILED(hr)) { + _set_errno(EIO); return -EIO; } if (mad->Length <= (UINT32) *length) { port->pending = FALSE; hr = (HRESULT) mad->Id; + umad_convert_av(&mad->Address, &((struct ib_user_mad *) mad)->addr); } else { _set_errno(ENOSPC); hr = -ENOSPC;