uint8_t *sa_rpc_call(const struct ibmad_port *ibmad_port, void *rcvbuf, ib_portid_t * portid, ib_sa_call_t * sa, unsigned timeout) { ib_rpc_t rpc = { 0 }; uint8_t *p; DEBUG("attr 0x%x mod 0x%x route %s", sa->attrid, sa->mod, portid2str(portid)); if (portid->lid <= 0) { IBWARN("only lid routes are supported"); return NULL; } rpc.mgtclass = IB_SA_CLASS; rpc.method = sa->method; rpc.attr.id = sa->attrid; rpc.attr.mod = sa->mod; rpc.mask = sa->mask; rpc.timeout = timeout; rpc.datasz = IB_SA_DATA_SIZE; rpc.dataoffs = IB_SA_DATA_OFFS; rpc.trid = sa->trid; portid->qp = 1; if (!portid->qkey) portid->qkey = IB_DEFAULT_QP1_QKEY; p = mad_rpc_rmpp(ibmad_port, &rpc, portid, 0 /*&sa->rmpp */ , rcvbuf); /* TODO: RMPP */ sa->recsz = rpc.recsz; return p; }
void * madrpc_rmpp(ib_rpc_t *rpc, ib_portid_t *dport, ib_rmpp_hdr_t *rmpp, void *data) { struct ibmad_port port; port.port_id = mad_portid; port.class_agents[rpc->mgtclass] = mad_class_agent(rpc->mgtclass); return mad_rpc_rmpp(&port, rpc, dport, rmpp, data); }
uint8_t *ib_vendor_call_via(void *data, ib_portid_t * portid, ib_vendor_call_t * call, struct ibmad_port * srcport) { ib_rpc_v1_t rpc = { 0 }; ib_rpc_t *rpcold = (ib_rpc_t *)(void *)&rpc; int range1 = 0, resp_expected; void *p_ret; DEBUG("route %s data %p", portid2str(portid), data); if (portid->lid <= 0) return NULL; /* no direct SMI */ if (!(range1 = mad_is_vendor_range1(call->mgmt_class)) && !(mad_is_vendor_range2(call->mgmt_class))) return NULL; resp_expected = response_expected(call->method); rpc.mgtclass = call->mgmt_class | IB_MAD_RPC_VERSION1; rpc.method = call->method; rpc.attr.id = call->attrid; rpc.attr.mod = call->mod; rpc.timeout = resp_expected ? call->timeout : 0; rpc.datasz = range1 ? IB_VENDOR_RANGE1_DATA_SIZE : IB_VENDOR_RANGE2_DATA_SIZE; rpc.dataoffs = range1 ? IB_VENDOR_RANGE1_DATA_OFFS : IB_VENDOR_RANGE2_DATA_OFFS; if (!range1) rpc.oui = call->oui; DEBUG ("class 0x%x method 0x%x attr 0x%x mod 0x%x datasz %d off %d res_ex %d", rpc.mgtclass, rpc.method, rpc.attr.id, rpc.attr.mod, rpc.datasz, rpc.dataoffs, resp_expected); portid->qp = 1; if (!portid->qkey) portid->qkey = IB_DEFAULT_QP1_QKEY; if (resp_expected) { p_ret = mad_rpc_rmpp(srcport, rpcold, portid, 0, data); /* FIXME: no RMPP for now */ errno = rpc.error; return p_ret; } return mad_send_via(rpcold, portid, 0, data, srcport) < 0 ? 0 : data; /* FIXME: no RMPP for now */ }