[ofa-general] [PATCH] opensm: osm_send_trap144() function

Sasha Khapyorsky sashak at voltaire.com
Sat Oct 25 10:52:01 PDT 2008


Add ability to send trap 144 - osm_send_trap144() function. This can be
useful when SMA doesn't support trap sending on some events, such as
CapabilityMask change (ConnectX), OtherLocalChanges (no one supports
this AFAIK).

Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
 opensm/include/opensm/osm_sm.h |   23 +++++++++++++
 opensm/opensm/osm_req.c        |   68 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/opensm/include/opensm/osm_sm.h b/opensm/include/opensm/osm_sm.h
index 5d46246..bc87ea6 100644
--- a/opensm/include/opensm/osm_sm.h
+++ b/opensm/include/opensm/osm_sm.h
@@ -769,5 +769,28 @@ ib_api_status_t osm_sm_state_mgr_check_legality(IN osm_sm_t *sm,
 
 void osm_report_sm_state(osm_sm_t *sm);
 
+/****f* OpenSM: SM State Manager/osm_send_trap144
+* NAME
+*	osm_send_trap144
+*
+* DESCRIPTION
+*	Send trap 144 to the master SM.
+*
+* SYNOPSIS
+*/
+int osm_send_trap144(osm_sm_t *sm, ib_net16_t local);
+/*
+* PARAMETERS
+*	sm
+*		[in] Pointer to an osm_sm_t object.
+*
+*	local
+*		[in] OtherLocalChanges mask in network byte order.
+*
+* RETURN VALUES
+*	0 on success, non-zero value otherwise.
+*
+*********/
+
 END_C_DECLS
 #endif				/* _OSM_SM_H_ */
diff --git a/opensm/opensm/osm_req.c b/opensm/opensm/osm_req.c
index 5f93551..0865ce5 100644
--- a/opensm/opensm/osm_req.c
+++ b/opensm/opensm/osm_req.c
@@ -210,3 +210,71 @@ Exit:
 	OSM_LOG_EXIT(sm->p_log);
 	return (status);
 }
+
+int osm_send_trap144(osm_sm_t *sm, ib_net16_t local)
+{
+	osm_madw_t *madw;
+	ib_smp_t *smp;
+	ib_mad_notice_attr_t *ntc;
+	osm_port_t *port;
+	ib_port_info_t *pi;
+
+	port = osm_get_port_by_guid(sm->p_subn, sm->p_subn->sm_port_guid);
+	if (!port) {
+		OSM_LOG(sm->p_log, OSM_LOG_ERROR,
+			"ERR 1104: cannot find SM port by guid 0x%" PRIx64 "\n",
+			cl_ntoh64(sm->p_subn->sm_port_guid));
+		return -1;
+	}
+
+	pi = &port->p_physp->port_info;
+
+	/* don't bother with sending trap when SMA supports this */
+	if (!local &&
+	    pi->capability_mask&(IB_PORT_CAP_HAS_TRAP|IB_PORT_CAP_HAS_CAP_NTC))
+		return 0;
+
+	madw = osm_mad_pool_get(sm->p_mad_pool,
+				osm_sm_mad_ctrl_get_bind_handle(&sm->mad_ctrl),
+				MAD_BLOCK_SIZE, NULL);
+	if (madw == NULL) {
+		OSM_LOG(sm->p_log, OSM_LOG_ERROR,
+			"ERR 1105: Unable to acquire MAD\n");
+		return -1;
+	}
+
+	madw->mad_addr.dest_lid = pi->master_sm_base_lid;
+	madw->mad_addr.addr_type.smi.source_lid = pi->base_lid;
+	madw->fail_msg = CL_DISP_MSGID_NONE;
+
+	smp = osm_madw_get_smp_ptr(madw);
+	memset(smp, 0, sizeof(*smp));
+
+	smp->base_ver = 1;
+	smp->mgmt_class = IB_MCLASS_SUBN_LID;
+	smp->class_ver = 1;
+	smp->method = IB_MAD_METHOD_TRAP;
+	smp->trans_id = cl_hton64((uint64_t)cl_atomic_inc(&sm->sm_trans_id));
+	smp->attr_id = IB_MAD_ATTR_NOTICE;
+	smp->m_key = sm->p_subn->opt.m_key;
+
+	ntc = (ib_mad_notice_attr_t *)smp->data;
+
+	ntc->generic_type = 0x80 | IB_NOTICE_TYPE_INFO;
+	ib_notice_set_prod_type_ho(ntc, IB_NODE_TYPE_CA);
+	ntc->g_or_v.generic.trap_num = cl_hton16(144);
+	ntc->issuer_lid = pi->base_lid;
+	ntc->data_details.ntc_144.lid = pi->base_lid;
+	ntc->data_details.ntc_144.local_changes = local ?
+		TRAP_144_MASK_OTHER_LOCAL_CHANGES : 0;
+	ntc->data_details.ntc_144.new_cap_mask = pi->capability_mask;
+	ntc->data_details.ntc_144.change_flgs = local;
+
+	OSM_LOG(sm->p_log, OSM_LOG_DEBUG,
+		"Sending Trap 144, TID 0x%" PRIx64 " to SM lid %u\n",
+		cl_ntoh64(smp->trans_id), cl_ntoh16(pi->master_sm_base_lid));
+
+	osm_vl15_post(sm->p_vl15, madw);
+
+	return 0;
+}
-- 
1.6.0.3.517.g759a




More information about the general mailing list