Add notice attribute support Also, changes to decode_sim_MAD and reply_MAD for trap/trap repress methods
Signed-off-by: Hal Rosenstock <[email protected]> --- diff --git a/ibsim/sim_mad.c b/ibsim/sim_mad.c index 32a667e..1a929c5 100644 --- a/ibsim/sim_mad.c +++ b/ibsim/sim_mad.c @@ -57,7 +57,7 @@ typedef int (Smpfn) (Port * port, unsigned op, uint32_t mod, uint8_t * data); typedef int (EncodeTrapfn) (Port * port, char *data); -static Smpfn do_nodeinfo, do_nodedesc, do_switchinfo, do_portinfo, +static Smpfn do_notice, do_nodeinfo, do_nodedesc, do_switchinfo, do_portinfo, do_linearforwtbl, do_multicastforwtbl, do_portcounters, do_extcounters, do_pkeytbl, do_sl2vl, do_vlarb, do_guidinfo, do_cpi; @@ -65,7 +65,8 @@ static EncodeTrapfn encode_trap128; static EncodeTrapfn encode_trap144; static Smpfn *attrs[IB_PERFORMANCE_CLASS + 1][0xff] = { - [IB_SMI_CLASS] {[IB_ATTR_NODE_DESC] do_nodedesc, + [IB_SMI_CLASS] {[NOTICE] do_notice, + [IB_ATTR_NODE_DESC] do_nodedesc, [IB_ATTR_NODE_INFO] do_nodeinfo, [IB_ATTR_SWITCH_INFO] do_switchinfo, [IB_ATTR_PORT_INFO] do_portinfo, @@ -118,15 +119,22 @@ static int decode_sim_MAD(Client * cl, struct sim_request * r, ib_rpc_t * rpc, { void *buf = r->mad; int response; + uint8_t method; - // first word - response = mad_get_field(buf, 0, IB_MAD_RESPONSE_F); + method = mad_get_field(buf, 0, IB_MAD_METHOD_F); + if (method == IB_MAD_METHOD_TRAP_REPRESS) + response = 1; + else if (method == IB_MAD_METHOD_TRAP) + response = 0; + else + // first word + response = mad_get_field(buf, 0, IB_MAD_RESPONSE_F); if (mad_get_field(buf, 0, IB_MAD_CLASSVER_F) > 2 || // sma ver is 1, sa is 2 mad_get_field(buf, 0, IB_MAD_BASEVER_F) != 1) { IBWARN("bad smp headers (1st word)"); return -1; } - rpc->method = mad_get_field(buf, 0, IB_MAD_METHOD_F); + rpc->method = method; rpc->mgtclass = mad_get_field(buf, 0, IB_MAD_MGMTCLASS_F); // second word: @@ -189,11 +197,17 @@ static int forward_MAD(void *buf, ib_rpc_t * rpc, ib_dr_path_t * path) static int reply_MAD(void *buf, ib_rpc_t * rpc, ib_dr_path_t * path, int status, void *data) { - // first word - mad_set_field(buf, 0, IB_MAD_RESPONSE_F, 1); - mad_set_field(buf, 0, IB_MAD_METHOD_F, 0x81); // SUBN_GETRESP - - // second word: + uint8_t method; + + method = mad_get_field(buf, 0, IB_MAD_METHOD_F); + if (method == IB_MAD_METHOD_TRAP) + mad_set_field(buf, 0, IB_MAD_METHOD_F, IB_MAD_METHOD_TRAP_REPRESS); + else if (method != IB_MAD_METHOD_TRAP_REPRESS) { + // first word + mad_set_field(buf, 0, IB_MAD_RESPONSE_F, 1); + mad_set_field(buf, 0, IB_MAD_METHOD_F, 0x81); // SUBN_GETRESP + } + // second word if (rpc->mgtclass == 0x81) { // direct route mad_set_field(buf, 0, IB_DRSMP_STATUS_F, status); mad_set_field(buf, 0, IB_DRSMP_DIRECTION_F, 1); @@ -218,6 +232,16 @@ static int reply_MAD(void *buf, ib_rpc_t * rpc, ib_dr_path_t * path, return 0; } +static int do_notice(Port * port, unsigned op, uint32_t mod, uint8_t * data) +{ + int status = 0; + + if (op != IB_MAD_METHOD_TRAP && op != IB_MAD_METHOD_TRAP_REPRESS) + status = ERR_METHOD_UNSUPPORTED; + + return status; +} + static int do_cpi(Port * port, unsigned op, uint32_t mod, uint8_t * data) { int status = 0; _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
