[ofa-general] ***SPAM*** [PATCH] ibsim/sim_mad.c: Add trap/trap repress handling in simulated SMA

Hal Rosenstock hnrose at comcast.net
Thu Mar 5 04:23:18 PST 2009


Add notice attribute support
Also, changes to decode_sim_MAD and reply_MAD for trap/trap repress methods

Signed-off-by: Hal Rosenstock <hal.rosenstock at gmail.com>

---
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;



More information about the general mailing list