return sizeof(struct ib_user_mad);\r
}\r
\r
+static void umad_convert_addr(struct ib_mad_addr *addr, WM_MAD_AV *av)\r
+{\r
+ av->VersionClassFlow = htonl((6 << 28) | (((uint32_t) addr->traffic_class) << 20) |\r
+ (addr->flow_label & 0x000FFFFF));\r
+ av->Reserved = 0;\r
+ av->StaticRate = 0;\r
+}\r
+\r
+static void umad_convert_av(WM_MAD_AV *av, struct ib_mad_addr *addr)\r
+{\r
+ uint32_t ver_class_flow;\r
+\r
+ ver_class_flow = ntohl(av->VersionClassFlow);\r
+ addr->flow_label = ver_class_flow & 0x000FFFFF;\r
+ addr->traffic_class = (uint8_t) (ver_class_flow >> 20);\r
+}\r
+\r
__declspec(dllexport)\r
int umad_send(int portid, int agentid, void *umad, int length,\r
int timeout_ms, int retries)\r
mad->retries = (uint32_t) retries;\r
mad->length = (uint32_t) length;\r
\r
+ umad_convert_addr(&mad->addr, &((WM_MAD *) mad)->Address);\r
hr = ports[portid].prov->Send((WM_MAD *) mad, NULL);\r
+ umad_convert_av(&((WM_MAD *) mad)->Address, &mad->addr);\r
if (FAILED(hr)) {\r
+ _set_errno(EIO);\r
return GetLastError();\r
}\r
\r
}\r
\r
if (FAILED(hr)) {\r
+ _set_errno(EIO);\r
return -EIO;\r
}\r
\r
if (mad->Length <= (UINT32) *length) {\r
port->pending = FALSE;\r
hr = (HRESULT) mad->Id;\r
+ umad_convert_av(&mad->Address, &((struct ib_user_mad *) mad)->addr);\r
} else {\r
_set_errno(ENOSPC);\r
hr = -ENOSPC;\r