void *cc_config_status_via(void *payload, void *rcvbuf, ib_portid_t * portid, unsigned attrid, unsigned mod, unsigned timeout, int *rstatus, const struct ibmad_port * srcport, uint64_t cckey) { ib_rpc_cc_t rpc = { 0 }; void *res; DEBUG("attr 0x%x mod 0x%x route %s", attrid, mod, portid2str(portid)); rpc.method = IB_MAD_METHOD_SET; rpc.attr.id = attrid; rpc.attr.mod = mod; rpc.timeout = timeout; if (attrid == IB_CC_ATTR_CONGESTION_LOG) { rpc.datasz = IB_CC_LOG_DATA_SZ; rpc.dataoffs = IB_CC_LOG_DATA_OFFS; } else { rpc.datasz = IB_CC_DATA_SZ; rpc.dataoffs = IB_CC_DATA_OFFS; } rpc.mgtclass = IB_CC_CLASS; rpc.cckey = cckey; portid->qp = 1; if (!portid->qkey) portid->qkey = IB_DEFAULT_QP1_QKEY; res = mad_rpc(srcport, (ib_rpc_t *)&rpc, portid, payload, rcvbuf); if (rstatus) *rstatus = rpc.rstatus; return res; }
uint8_t *smp_set_status_via(void *data, ib_portid_t * portid, unsigned attrid, unsigned mod, unsigned timeout, int *rstatus, const struct ibmad_port *srcport) { ib_rpc_t rpc = { 0 }; uint8_t *res; DEBUG("attr 0x%x mod 0x%x route %s", attrid, mod, portid2str(portid)); if ((portid->lid <= 0) || (portid->drpath.drslid == 0xffff) || (portid->drpath.drdlid == 0xffff)) rpc.mgtclass = IB_SMI_DIRECT_CLASS; /* direct SMI */ else rpc.mgtclass = IB_SMI_CLASS; /* Lid routed SMI */ rpc.method = IB_MAD_METHOD_SET; rpc.attr.id = attrid; rpc.attr.mod = mod; rpc.timeout = timeout; rpc.datasz = IB_SMP_DATA_SIZE; rpc.dataoffs = IB_SMP_DATA_OFFS; rpc.mkey = srcport->smp_mkey; portid->sl = 0; portid->qp = 0; res = mad_rpc(srcport, &rpc, portid, data, data); if (rstatus) *rstatus = rpc.rstatus; return res; }
static uint8_t * pma_query_via(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout, unsigned id, const void *srcport) { ib_rpc_t rpc = {0}; int lid = dest->lid; DEBUG("lid %d port %d", lid, port); if (lid == -1) { IBWARN("only lid routed is supported"); return 0; } rpc.mgtclass = IB_PERFORMANCE_CLASS; rpc.method = IB_MAD_METHOD_GET; rpc.attr.id = id; /* Same for attribute IDs */ mad_set_field(rcvbuf, 0, IB_PC_PORT_SELECT_F, port); rpc.attr.mod = 0; rpc.timeout = timeout; rpc.datasz = IB_PC_DATA_SZ; rpc.dataoffs = IB_PC_DATA_OFFS; dest->qp = 1; if (!dest->qkey) dest->qkey = IB_DEFAULT_QP1_QKEY; if (srcport) { return mad_rpc(srcport, &rpc, dest, rcvbuf, rcvbuf); } else { return madrpc(&rpc, dest, rcvbuf, rcvbuf); } }
void * madrpc(ib_rpc_t *rpc, ib_portid_t *dport, void *payload, void *rcvdata) { struct ibmad_port port; port.port_id = mad_portid; port.class_agents[rpc->mgtclass] = mad_class_agent(rpc->mgtclass); return mad_rpc(&port, rpc, dport, payload, rcvdata); }
uint8_t *reset_pc_ext(void *rcvbuf, ib_portid_t * dest, int port, unsigned mask, unsigned timeout, const struct ibmad_port * srcport) { ib_rpc_t rpc = { 0 }; int lid = dest->lid; DEBUG("lid %u port %d mask 0x%x", lid, port, mask); if (lid == -1) { IBWARN("only lid routed is supported"); return NULL; } if (!mask) mask = ~0; rpc.mgtclass = IB_PERFORMANCE_CLASS; rpc.method = IB_MAD_METHOD_SET; rpc.attr.id = IB_GSI_PORT_COUNTERS_EXT; memset(rcvbuf, 0, IB_MAD_SIZE); /* Same for attribute IDs */ mad_set_field(rcvbuf, 0, IB_PC_EXT_PORT_SELECT_F, port); mad_set_field(rcvbuf, 0, IB_PC_EXT_COUNTER_SELECT_F, mask); rpc.attr.mod = 0; rpc.timeout = timeout; rpc.datasz = IB_PC_DATA_SZ; rpc.dataoffs = IB_PC_DATA_OFFS; if (!dest->qp) dest->qp = 1; if (!dest->qkey) dest->qkey = IB_DEFAULT_QP1_QKEY; return mad_rpc(srcport, &rpc, dest, rcvbuf, rcvbuf); }