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

Reply via email to