Lines Matching +full:rpc +full:- +full:if

2  * Copyright (c) 2004-2009 Voltaire Inc.  All rights reserved.
16 * - Redistributions of source code must retain the above
20 * - Redistributions in binary form must reproduce the above
36 #if HAVE_CONFIG_H
64 #define DEBUG if (ibdebug) IBWARN
66 if (iberrs || ibdebug) \
85 if (retries > 0) in madrpc_set_retries()
98 port->retries = retries; in mad_rpc_set_retries()
103 port->timeout = timeout; in mad_rpc_set_timeout()
113 return ibmp->port_id; in madrpc_portid()
118 return srcport->port_id; in mad_rpc_portid()
123 if (class < 1 || class >= MAX_CLASS) in mad_rpc_class_agent()
124 return -1; in mad_rpc_class_agent()
125 return port->class_agents[class]; in mad_rpc_class_agent()
132 uint32_t trid; /* only low 32 bits - see mad_trid() */ in _do_madrpc()
136 if (ibdebug > 1) { in _do_madrpc()
141 if (save_mad) { in _do_madrpc()
147 if (max_retries <= 0) { in _do_madrpc()
151 return -1; in _do_madrpc()
158 if (retries) in _do_madrpc()
162 if (umad_send(port_id, agentid, sndbuf, length, timeout, 0) < 0) { in _do_madrpc()
164 return -1; in _do_madrpc()
171 if (umad_recv(port_id, rcvbuf, &length, timeout) < 0) { in _do_madrpc()
173 return -1; in _do_madrpc()
176 if (ibdebug > 2) in _do_madrpc()
178 if (ibdebug > 1) { in _do_madrpc()
188 if (!status) in _do_madrpc()
190 if (status == ENOMEM) in _do_madrpc()
197 return -1; in _do_madrpc()
202 port->lid = mad_get_field(mad, 64, IB_CPI_REDIRECT_LID_F); in redirect_port()
203 if (!port->lid) { in redirect_port()
204 IBWARN("GID-based redirection is not supported"); in redirect_port()
205 return -1; in redirect_port()
208 port->qp = mad_get_field(mad, 64, IB_CPI_REDIRECT_QP_F); in redirect_port()
209 port->qkey = mad_get_field(mad, 64, IB_CPI_REDIRECT_QKEY_F); in redirect_port()
210 port->sl = (uint8_t) mad_get_field(mad, 64, IB_CPI_REDIRECT_SL_F); in redirect_port()
214 if (ibdebug) in redirect_port()
216 port->lid, port->qp, port->qkey, port->sl); in redirect_port()
221 void *mad_rpc(const struct ibmad_port *port, ib_rpc_t * rpc, in mad_rpc() argument
226 ib_rpc_v1_t *rpcv1 = (ib_rpc_v1_t *)rpc; in mad_rpc()
229 if ((rpc->mgtclass & IB_MAD_RPC_VERSION_MASK) == IB_MAD_RPC_VERSION1) in mad_rpc()
230 rpcv1->error = 0; in mad_rpc()
235 if ((len = mad_build_pkt(sndbuf, rpc, dport, 0, payload)) < 0) in mad_rpc()
238 if ((len = _do_madrpc(port->port_id, sndbuf, rcvbuf, in mad_rpc()
239 port->class_agents[rpc->mgtclass & 0xff], in mad_rpc()
240 len, mad_get_timeout(port, rpc->timeout), in mad_rpc()
242 if ((rpc->mgtclass & IB_MAD_RPC_VERSION_MASK) == in mad_rpc()
244 rpcv1->error = error; in mad_rpc()
255 if (status == IB_MAD_STS_REDIRECT) { in mad_rpc()
257 /* bail if redirection fails */ in mad_rpc()
258 if (redirect_port(dport, mad)) in mad_rpc()
264 if ((rpc->mgtclass & IB_MAD_RPC_VERSION_MASK) == IB_MAD_RPC_VERSION1) in mad_rpc()
265 rpcv1->error = error; in mad_rpc()
266 rpc->rstatus = status; in mad_rpc()
268 if (status != 0) { in mad_rpc()
275 if (ibdebug) { in mad_rpc()
276 IBWARN("data offs %d sz %d", rpc->dataoffs, rpc->datasz); in mad_rpc()
277 xdump(stderr, "mad data\n", mad + rpc->dataoffs, rpc->datasz); in mad_rpc()
280 if (rcvdata) in mad_rpc()
281 memcpy(rcvdata, mad + rpc->dataoffs, rpc->datasz); in mad_rpc()
286 void *mad_rpc_rmpp(const struct ibmad_port *port, ib_rpc_t * rpc, in mad_rpc_rmpp() argument
291 ib_rpc_v1_t *rpcv1 = (ib_rpc_v1_t *)rpc; in mad_rpc_rmpp()
298 if ((rpc->mgtclass & IB_MAD_RPC_VERSION_MASK) == IB_MAD_RPC_VERSION1) in mad_rpc_rmpp()
299 rpcv1->error = 0; in mad_rpc_rmpp()
300 if ((len = mad_build_pkt(sndbuf, rpc, dport, rmpp, data)) < 0) in mad_rpc_rmpp()
303 if ((len = _do_madrpc(port->port_id, sndbuf, rcvbuf, in mad_rpc_rmpp()
304 port->class_agents[rpc->mgtclass & 0xff], in mad_rpc_rmpp()
305 len, mad_get_timeout(port, rpc->timeout), in mad_rpc_rmpp()
307 if ((rpc->mgtclass & IB_MAD_RPC_VERSION_MASK) == IB_MAD_RPC_VERSION1) in mad_rpc_rmpp()
308 rpcv1->error = error; in mad_rpc_rmpp()
313 if ((rpc->mgtclass & IB_MAD_RPC_VERSION_MASK) == IB_MAD_RPC_VERSION1) in mad_rpc_rmpp()
314 rpcv1->error = error; in mad_rpc_rmpp()
318 if ((status = mad_get_field(mad, 0, IB_MAD_STATUS_F)) != 0) { in mad_rpc_rmpp()
325 if (ibdebug) { in mad_rpc_rmpp()
326 IBWARN("data offs %d sz %d", rpc->dataoffs, rpc->datasz); in mad_rpc_rmpp()
327 xdump(stderr, "rmpp mad data\n", mad + rpc->dataoffs, in mad_rpc_rmpp()
328 rpc->datasz); in mad_rpc_rmpp()
331 if (rmpp) { in mad_rpc_rmpp()
332 rmpp->flags = mad_get_field(mad, 0, IB_SA_RMPP_FLAGS_F); in mad_rpc_rmpp()
333 if ((rmpp->flags & 0x3) && in mad_rpc_rmpp()
338 rmpp->type = mad_get_field(mad, 0, IB_SA_RMPP_TYPE_F); in mad_rpc_rmpp()
339 rmpp->status = mad_get_field(mad, 0, IB_SA_RMPP_STATUS_F); in mad_rpc_rmpp()
340 DEBUG("rmpp type %d status %d", rmpp->type, rmpp->status); in mad_rpc_rmpp()
341 rmpp->d1.u = mad_get_field(mad, 0, IB_SA_RMPP_D1_F); in mad_rpc_rmpp()
342 rmpp->d2.u = mad_get_field(mad, 0, IB_SA_RMPP_D2_F); in mad_rpc_rmpp()
345 if (data) in mad_rpc_rmpp()
346 memcpy(data, mad + rpc->dataoffs, rpc->datasz); in mad_rpc_rmpp()
348 rpc->recsz = mad_get_field(mad, 0, IB_SA_ATTROFFS_F); in mad_rpc_rmpp()
353 void *madrpc(ib_rpc_t * rpc, ib_portid_t * dport, void *payload, void *rcvdata) in madrpc() argument
355 return mad_rpc(ibmp, rpc, dport, payload, rcvdata); in madrpc()
358 void *madrpc_rmpp(ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp, in madrpc_rmpp() argument
361 return mad_rpc_rmpp(ibmp, rpc, dport, rmpp, data); in madrpc_rmpp()
369 if (umad_init() < 0) in madrpc_init()
372 if ((fd = umad_open_port(dev_name, dev_port)) < 0) in madrpc_init()
376 if (num_classes >= MAX_CLASS) in madrpc_init()
379 ibmp->port_id = fd; in madrpc_init()
380 memset(ibmp->class_agents, 0xff, sizeof ibmp->class_agents); in madrpc_init()
381 while (num_classes--) { in madrpc_init()
385 if (mgmt == IB_SA_CLASS) in madrpc_init()
387 if (mad_register_client_via(mgmt, rmpp_version, ibmp) < 0) in madrpc_init()
399 if (num_classes >= MAX_CLASS) { in mad_rpc_open_port()
405 if (umad_init() < 0) { in mad_rpc_open_port()
412 if (!p) { in mad_rpc_open_port()
418 if ((port_id = umad_open_port(dev_name, dev_port)) < 0) { in mad_rpc_open_port()
420 if (!errno) in mad_rpc_open_port()
426 p->port_id = port_id; in mad_rpc_open_port()
427 if (dev_name) in mad_rpc_open_port()
428 strncpy(p->ca_name, dev_name, sizeof p->ca_name - 1); in mad_rpc_open_port()
429 p->portnum = dev_port; in mad_rpc_open_port()
431 memset(p->class_agents, 0xff, sizeof p->class_agents); in mad_rpc_open_port()
432 while (num_classes--) { in mad_rpc_open_port()
436 if (mgmt == IB_SA_CLASS) in mad_rpc_open_port()
438 if (mgmt < 0 || mgmt >= MAX_CLASS || in mad_rpc_open_port()
441 if (!errno) in mad_rpc_open_port()
454 umad_close_port(port->port_id); in mad_rpc_close_port()