This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 2/6] New Infiniband (OFED) tapset


This tapset is used to probe the connection manager layer of the ofed
infiniband stack (ib_cm.ko). Probe point are included to monitor calls
to the connection manager services and call-backs from the ib mad layer.

Signed-off-by: David Wilder <dwilder@us.ibm.com>

------------------------------------------------------
 tapset/ofed_ib_cm.stp |  944 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 944 insertions(+), 0 deletions(-)

diff --git a/tapset/ofed_ib_cm.stp b/tapset/ofed_ib_cm.stp
new file mode 100644
index 0000000..9308483
--- /dev/null
+++ b/tapset/ofed_ib_cm.stp
@@ -0,0 +1,944 @@
+/*
+ *	OFED ib_cm tapset
+/*
+ *	Copyright (C) 2009 IBM Corp.
+ *	This file is part of systemtap, and is free software.  You can
+ *	redistribute it and/or modify it under the terms of the GNU General
+ *	Public License (GPL); either version 2, or (at your option) any
+ *	later version.
+ *	
+ *	Version 1.0     wilder@us.ibm.com       2009/01/19
+ */
+%{
+#include <rdma/ib_mad.h>
+#include <rdma/ib_cm.h>
+%}
+
+/*
+ * Event and state helper functions
+ */
+global _ib_cm_rej_reason_num2str[34]
+global _ib_cm_rej_reason_str2num[34]
+global _ib_cm_event_type_num2str[18]
+global _ib_cm_event_type_str2num[18]
+global _ib_cm_state_num2str[16]
+global _ib_cm_state_str2num[16]
+global _ib_cm_lap_state_num2str[22]
+global _ib_cm_lap_state_str2num[22]
+
+/**
+ * sfunction ib_cm_event_type_num2str - String representation of an ib_cm_event.
+ *
+ * Given an ib_cm_event_type, return a string representation.
+ */
+function ib_cm_event_type_num2str:string (event:long)
+{
+	return (event in _ib_cm_event_type_num2str ? _ib_cm_event_type_num2str[event] : "UNDEF")
+}
+
+/**
+ * sfunction ib_cm_event_type_str2num - Numeric value for an ib_cm_event_type.
+ *
+ * Given a ib_cm_event_type (string), return the corresponding event number.
+ */
+function ib_cm_event_type_str2num:long (event:string)
+{
+	return (event in _ib_cm_event_type_str2num ? _ib_cm_event_type_str2num[event] : -1)
+}
+
+
+/**
+ * sfunction ib_cm_state_num2str - String representation of an ib_cm_state.
+ *
+ * Given an ib_cm_state, return a string representation.
+ */
+function ib_cm_state_num2str:string (state:long)
+{
+	return (state in _ib_cm_state_num2str ? _ib_cm_state_num2str[state] : "UNDEF")
+}
+
+/**
+ * sfunction ib_cm_state_str2num - The numeric value of an ib_cm_state.
+ *
+ * Given an ib_cm_state (string), return the corresponding state number.
+ */
+function ib_cm_state_str2num:long (state:string)
+{
+	return (state in _ib_cm_state_str2num ? _ib_cm_state_str2num[state] : -1)
+}
+
+/**
+ * sfunction ib_cm_lap_state_num2str - String representation of ib_cm_lap_state.
+ *
+ * Given an ib_cm_lap_state, return a string representation.
+ */
+function ib_cm_lap_state_num2str:string (state:long)
+{
+	return (state in _ib_cm_lap_state_num2str ? _ib_cm_lap_state_num2str[state] : "UNDEF")
+}
+
+/**
+ * sfunction ib_cm_lap_state_str2num - The numeric value of an ib_cm_lap_state.
+ *
+ * Given an ib_cm_lap_state (string), return the corresponding state number.
+ */
+function ib_cm_lap_state_str2num:long (state:string)
+{
+	return (state in _ib_cm_lap_state_str2num ? _ib_cm_lap_state_str2num[state] : -1)
+}
+
+/**
+ * sfunction ib_cm_rej_reason_num2str - String representation of a rej_reason.
+ *
+ * Given an ib_cm_rej_reason, return a string representation.
+ */
+function ib_cm_rej_reason_num2str:string (reason:long)
+{
+        return (reason in _ib_cm_rej_reason_num2str ? _ib_cm_rej_reason_num2str[reason] : "UNDEF")
+}
+
+/**
+ * sfunction ib_cm_rej_reason_str2num - Numeric value of an ib_cm_rej_reason.
+ * Given an ib_cm_rej_reason (string), return the corresponding event number.
+ */
+function ib_cm_rej_reason_str2num:long (reason:string)
+{
+         return (reason in _ib_cm_rej_reason_str2num ? _ib_cm_rej_reason_str2num[reason] : -1)
+}
+
+/* 	
+ * Initialize the state and event tables.
+ */
+
+probe begin(-1001)
+{
+	init_ib_cm_event_types()
+	init_ib_cm_states()
+	init_ib_cm_lap_states()
+	init_ib_cm_rej_reasons()
+}
+
+function init_ib_cm_event_types()
+{
+	/* From rdma/ib_cm.h 
+	 * Mapping of ib_cm_event_type enumeration
+	 */
+	_ib_cm_event_type_num2str[0] = "IB_CM_REQ_ERROR"
+	_ib_cm_event_type_num2str[1] = "IB_CM_REQ_RECEIVED"
+	_ib_cm_event_type_num2str[2] = "IB_CM_REP_ERROR"
+	_ib_cm_event_type_num2str[3] = "IB_CM_REP_RECEIVED"
+	_ib_cm_event_type_num2str[4] = "IB_CM_RTU_RECEIVED"
+	_ib_cm_event_type_num2str[5] = "IB_CM_USER_ESTABLISHED"
+	_ib_cm_event_type_num2str[6] = "IB_CM_DREQ_ERROR"
+	_ib_cm_event_type_num2str[7] = "IB_CM_DREQ_RECEIVED"
+	_ib_cm_event_type_num2str[8] = "IB_CM_DREP_RECEIVED"
+	_ib_cm_event_type_num2str[9] = "IB_CM_TIMEWAIT_EXIT"
+	_ib_cm_event_type_num2str[10] = "IB_CM_MRA_RECEIVED"
+	_ib_cm_event_type_num2str[11] = "IB_CM_REJ_RECEIVED"
+	_ib_cm_event_type_num2str[12] = "IB_CM_LAP_ERROR"
+	_ib_cm_event_type_num2str[13] = "IB_CM_LAP_RECEIVED"
+	_ib_cm_event_type_num2str[14] = "IB_CM_APR_RECEIVED"
+	_ib_cm_event_type_num2str[15] = "IB_CM_SIDR_REQ_ERROR"
+	_ib_cm_event_type_num2str[16] = "IB_CM_SIDR_REQ_RECEIVED"
+	_ib_cm_event_type_num2str[17] = "IB_CM_SIDR_REP_RECEIVED"
+		
+	_ib_cm_event_type_str2num["IB_CM_REQ_ERROR"]		= 0
+	_ib_cm_event_type_str2num["IB_CM_REQ_RECEIVED"]		= 1
+	_ib_cm_event_type_str2num["IB_CM_REP_ERROR"]		= 2
+	_ib_cm_event_type_str2num["IB_CM_REP_RECEIVED"]		= 3
+	_ib_cm_event_type_str2num["IB_CM_RTU_RECEIVED"]		= 4
+	_ib_cm_event_type_str2num["IB_CM_USER_ESTABLISHED"]	= 5
+	_ib_cm_event_type_str2num["IB_CM_DREQ_ERROR"]		= 6
+	_ib_cm_event_type_str2num["IB_CM_DREQ_RECEIVED"]	= 7
+	_ib_cm_event_type_str2num["IB_CM_DREP_RECEIVED"]	= 8
+	_ib_cm_event_type_str2num["IB_CM_TIMEWAIT_EXIT"]	= 9
+	_ib_cm_event_type_str2num["IB_CM_MRA_RECEIVED"]		= 10
+	_ib_cm_event_type_str2num["IB_CM_REJ_RECEIVED"]		= 11
+	_ib_cm_event_type_str2num["IB_CM_LAP_ERROR"]		= 12
+	_ib_cm_event_type_str2num["IB_CM_LAP_RECEIVED"]		= 13
+	_ib_cm_event_type_str2num["IB_CM_APR_RECEIVED"]		= 14
+	_ib_cm_event_type_str2num["IB_CM_SIDR_REQ_ERROR"]	= 15
+	_ib_cm_event_type_str2num["IB_CM_SIDR_REQ_RECEIVED"]	= 16
+	_ib_cm_event_type_str2num["IB_CM_SIDR_REP_RECEIVED"]	= 17
+}
+
+function init_ib_cm_states()
+{
+	/* from ib_cm.h */
+	_ib_cm_state_num2str[0] = "IB_CM_IDLE"
+	_ib_cm_state_num2str[1] = "IB_CM_LISTEN"
+	_ib_cm_state_num2str[2] = "IB_CM_REQ_SENT"
+	_ib_cm_state_num2str[3] = "IB_CM_REQ_RCVD"
+	_ib_cm_state_num2str[4] = "IB_CM_MRA_REQ_SENT"
+	_ib_cm_state_num2str[5] = "IB_CM_MRA_REQ_RCVD"
+	_ib_cm_state_num2str[6] = "IB_CM_REP_SENT"
+	_ib_cm_state_num2str[7] = "IB_CM_REP_RCVD"
+	_ib_cm_state_num2str[8] = "IB_CM_MRA_REP_SENT"
+	_ib_cm_state_num2str[9] = "IB_CM_MRA_REP_RCVD"
+	_ib_cm_state_num2str[10] = "IB_CM_ESTABLISHED"
+	_ib_cm_state_num2str[11] = "IB_CM_DREQ_SENT"
+	_ib_cm_state_num2str[12] = "IB_CM_DREQ_RCVD"
+	_ib_cm_state_num2str[13] = "IB_CM_TIMEWAIT"
+	_ib_cm_state_num2str[14] = "IB_CM_SIDR_REQ_SENT"
+	_ib_cm_state_num2str[15] = "IB_CM_SIDR_REQ_RCVD"
+	
+	_ib_cm_state_str2num["IB_CM_IDLE"]			= 0
+	_ib_cm_state_str2num["IB_CM_LISTEN"]			= 1
+	_ib_cm_state_str2num["IB_CM_REQ_SENT"]			= 2
+	_ib_cm_state_str2num["IB_CM_REQ_RCVD"]			= 3
+	_ib_cm_state_str2num["IB_CM_MRA_REQ_SENT"]		= 4
+	_ib_cm_state_str2num["IB_CM_MRA_REQ_RCVD"]		= 5
+	_ib_cm_state_str2num["IB_CM_REP_SENT"]			= 6
+	_ib_cm_state_str2num["IB_CM_REP_RCVD"]			= 7
+	_ib_cm_state_str2num["IB_CM_MRA_REP_SENT"]		= 8
+	_ib_cm_state_str2num["IB_CM_MRA_REP_RCVD"]		= 9
+	_ib_cm_state_str2num["IB_CM_ESTABLISHED"]		= 10
+	_ib_cm_state_str2num["IB_CM_DREQ_SENT"]			= 11
+	_ib_cm_state_str2num["IB_CM_DREQ_RCVD"]			= 12
+	_ib_cm_state_str2num["IB_CM_TIMEWAIT"]			= 13
+	_ib_cm_state_str2num["IB_CM_SIDR_REQ_SENT"]		= 14
+	_ib_cm_state_str2num["IB_CM_SIDR_REQ_RCVD"]		= 15
+}
+
+function init_ib_cm_lap_states()
+{
+	/* from ib_cm.h */
+	_ib_cm_lap_state_num2str[0] = "IB_CM_LAP_UNINIT"
+	_ib_cm_lap_state_num2str[1] = "IB_CM_LAP_IDLE"
+	_ib_cm_lap_state_num2str[2] = "IB_CM_LAP_SENT"
+	_ib_cm_lap_state_num2str[3] = "IB_CM_LAP_RCVD"
+	_ib_cm_lap_state_num2str[4] = "IB_CM_MRA_LAP_SENT"
+	_ib_cm_lap_state_num2str[5] = "IB_CM_MRA_LAP_RCVD"
+	
+	_ib_cm_lap_state_str2num["IB_CM_LAP_UNINIT"]		= 0
+	_ib_cm_lap_state_str2num["IB_CM_LAP_IDLE"]		= 1
+	_ib_cm_lap_state_str2num["IB_CM_LAP_SENT"]		= 2
+	_ib_cm_lap_state_str2num["IB_CM_LAP_RCVD"]		= 3
+	_ib_cm_lap_state_str2num["IB_CM_MRA_LAP_SENT"]		= 4
+	_ib_cm_lap_state_str2num["IB_CM_MRA_LAP_RCVD"]		= 5
+}
+
+function init_ib_cm_rej_reasons()
+{
+	_ib_cm_rej_reason_num2str[0] = "UNDEF"
+	_ib_cm_rej_reason_num2str[1] = "IB_CM_REJ_NO_QP"
+	_ib_cm_rej_reason_num2str[2] = "IB_CM_REJ_NO_EEC"
+	_ib_cm_rej_reason_num2str[3] = "IB_CM_REJ_NO_RESOURCES"
+	_ib_cm_rej_reason_num2str[4] = "IB_CM_REJ_TIMEOUT"
+	_ib_cm_rej_reason_num2str[5] = "IB_CM_REJ_UNSUPPORTED"
+	_ib_cm_rej_reason_num2str[6] = "IB_CM_REJ_INVALID_COMM_ID"
+	_ib_cm_rej_reason_num2str[7] = "IB_CM_REJ_INVALID_COMM_INSTANCE"
+	_ib_cm_rej_reason_num2str[8] = "IB_CM_REJ_INVALID_SERVICE_ID"
+	_ib_cm_rej_reason_num2str[9] = "IB_CM_REJ_INVALID_TRANSPORT_TYPE"
+	_ib_cm_rej_reason_num2str[10] = "IB_CM_REJ_STALE_CONN"
+	_ib_cm_rej_reason_num2str[11] = "IB_CM_REJ_RDC_NOT_EXIST"
+	_ib_cm_rej_reason_num2str[12] = "IB_CM_REJ_INVALID_GID"
+	_ib_cm_rej_reason_num2str[13] = "IB_CM_REJ_INVALID_LID"
+	_ib_cm_rej_reason_num2str[14] = "IB_CM_REJ_INVALID_SL"
+	_ib_cm_rej_reason_num2str[15] = "IB_CM_REJ_INVALID_TRAFFIC_CLASS"
+	_ib_cm_rej_reason_num2str[16] = "IB_CM_REJ_INVALID_HOP_LIMIT"
+	_ib_cm_rej_reason_num2str[17] = "IB_CM_REJ_INVALID_PACKET_RATE"
+	_ib_cm_rej_reason_num2str[18] = "IB_CM_REJ_INVALID_ALT_GID"
+	_ib_cm_rej_reason_num2str[19] = "IB_CM_REJ_INVALID_ALT_LID"
+	_ib_cm_rej_reason_num2str[20] = "IB_CM_REJ_INVALID_ALT_SL"
+	_ib_cm_rej_reason_num2str[21] = "IB_CM_REJ_INVALID_ALT_TRAFFIC_CLASS"
+	_ib_cm_rej_reason_num2str[22] = "IB_CM_REJ_INVALID_ALT_HOP_LIMIT"
+	_ib_cm_rej_reason_num2str[23] = "IB_CM_REJ_INVALID_ALT_PACKET_RATE"
+	_ib_cm_rej_reason_num2str[24] = "IB_CM_REJ_PORT_CM_REDIRECT"
+	_ib_cm_rej_reason_num2str[25] = "IB_CM_REJ_PORT_REDIRECT"
+	_ib_cm_rej_reason_num2str[26] = "IB_CM_REJ_INVALID_MTU"
+	_ib_cm_rej_reason_num2str[27] = "IB_CM_REJ_INSUFFICIENT_RESP_RESOURCES"
+	_ib_cm_rej_reason_num2str[28] = "IB_CM_REJ_CONSUMER_DEFINED"
+	_ib_cm_rej_reason_num2str[29] = "IB_CM_REJ_INVALID_RNR_RETRY"
+	_ib_cm_rej_reason_num2str[30] = "IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID"
+	_ib_cm_rej_reason_num2str[31] = "IB_CM_REJ_INVALID_CLASS_VERSION"
+	_ib_cm_rej_reason_num2str[32] = "IB_CM_REJ_INVALID_FLOW_LABEL"
+	_ib_cm_rej_reason_num2str[33] = "IB_CM_REJ_INVALID_ALT_FLOW_LABEL"
+
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_NO_QP"]			= 1
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_NO_EEC"]			= 2
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_NO_RESOURCES"]		= 3
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_TIMEOUT"]			= 4
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_UNSUPPORTED"]		= 5
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_COMM_ID"]		= 6
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_COMM_INSTANCE"]	= 7
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_SERVICE_ID"]	= 8
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_TRANSPORT_TYPE"]	= 9
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_STALE_CONN"]		= 10
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_RDC_NOT_EXIST"]		= 11
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_GID"]		= 12
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_LID"]		= 13
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_SL"]		= 14
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_TRAFFIC_CLASS"]	= 15
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_HOP_LIMIT"]	= 16
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_PACKET_RATE"]	= 17
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_ALT_GID"]		= 18
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_ALT_LID"]		= 19
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_ALT_SL"]		= 20
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_ALT_TRAFFIC_CLASS"]= 21
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_ALT_HOP_LIMIT"]	= 22
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_ALT_PACKET_RATE"]	= 23
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_PORT_CM_REDIRECT"]		= 24
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_PORT_REDIRECT"]		= 25
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INVALID_MTU"]		= 26
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_INSUFFICIENT_RESP_RESOURCES"]= 27
+	_ib_cm_rej_reason_str2num["IB_CM_REJ_CONSUMER_DEFINED"]		= 28
+}
+
+/*
+ *	These functions return the value of each member
+ *	of a struct cm_id. kread() is used for all de-references.
+ *
+ *	struct ib_cm_id {
+ *		ib_cm_handler           cm_handler;
+ *		void                    *context;
+ *		struct ib_device        *device;
+ *		__be64                  service_id;
+ *		__be64                  service_mask;
+ *		enum ib_cm_state        state;
+ *		enum ib_cm_lap_state    lap_state;
+ *		__be32                  local_id;
+ *		__be32                  remote_id;
+ *		u32                     remote_cm_qpn;
+ *	};
+ */
+function ib_cm_id__cm_handler:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, cm_handler, void *) %}
+
+function ib_cm_id__device:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, device, void *) %}
+
+function ib_cm_id__service_id:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, service_id, __be64) %}
+
+function ib_cm_id__service_mask:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, service_mask, __be64) %}
+
+function ib_cm_id__state:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, state, __be32) %}
+
+function ib_cm_id__lap_state:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, lap_state, __be32) %}
+
+function ib_cm_id__local_id:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, local_id, __be32) %}
+
+function ib_cm_id__remote_id:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, remote_id, __be32) %}
+
+function ib_cm_id__remote_cm_qpn:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_id, remote_cm_qpn, __be32) %}
+
+/*
+ *      These functions return the value of some members
+ *      of a struct cm_work. kread() is used for all de-references.
+ * 
+ *	struct cm_work {
+ *		struct delayed_work work;
+ *		struct list_head list;
+ *		struct cm_port *port;
+ *		struct ib_mad_recv_wc *mad_recv_wc;
+ *		__be32 local_id;	
+ *		__be32 remote_id;
+ *		struct ib_cm_event cm_event;
+ *		struct ib_sa_path_rec path[0];
+ *	};
+ */
+function work__cm_work:long (work:long)
+%{ THIS->__retvalue = (long) container_of((struct work_struct *)THIS->work, struct cm_work, work.work); %}
+
+function cm_work__local_id:long (A:long)
+%{ THIS->__retvalue  =  get_member(cm_work, local_id, __be32); %}
+
+function cm_work__remote_id:long (A:long)
+%{ THIS->__retvalue  =  get_member(cm_work, remote_id, __be32); %}
+
+function cm_work__mad_recv_wc:long (A:long)
+%{ THIS->__retvalue  =  get_member(cm_work, mad_recv_wc, void *) %}
+
+/* returns a pointer to the ib_cm_event */
+function cm_work__cm_event:long (P:long)
+%{
+	struct ib_cm_event *cmevent;
+        struct cm_work *work  = (struct cm_work *)THIS->P;
+	cmevent = (struct ib_cm_event *) &(work->cm_event);
+        THIS->__retvalue  =  (long)cmevent;
+%}
+
+/*
+ *      These functions return the value of some members
+ *      of a struct ib_cm_event. kread() is used for all de-references.
+ *
+ *	struct ib_cm_event {
+ *		enum ib_cm_event_type   event;
+ *		union {
+ *			struct ib_cm_req_event_param    req_rcvd;
+ *			struct ib_cm_rep_event_param    rep_rcvd;
+ *			No data for RTU received events.
+ *			struct ib_cm_rej_event_param    rej_rcvd;
+ *			struct ib_cm_mra_event_param    mra_rcvd;
+ *			struct ib_cm_lap_event_param    lap_rcvd;
+ *			struct ib_cm_apr_event_param    apr_rcvd;
+ *			No data for DREQ/DREP received events. 
+ *			struct ib_cm_sidr_req_event_param sidr_req_rcvd;
+ *			struct ib_cm_sidr_rep_event_param sidr_rep_rcvd;
+ *			enum ib_wc_status               send_status;
+ *		} param;
+ */
+function ib_cm_event__event:long (A:long)
+%{ THIS->__retvalue  =  get_member(ib_cm_event, event, int) %}
+
+%{
+/* From drivers/infiniband/core/cm_msgs.h */
+#define IB_CM_CLASS_VERSION     2 /* IB specification 1.2 */
+#define CM_REQ_ATTR_ID      __constant_htons(0x0010)
+#define CM_MRA_ATTR_ID      __constant_htons(0x0011)
+#define CM_REJ_ATTR_ID      __constant_htons(0x0012)
+#define CM_REP_ATTR_ID      __constant_htons(0x0013)
+#define CM_RTU_ATTR_ID      __constant_htons(0x0014)
+#define CM_DREQ_ATTR_ID     __constant_htons(0x0015)
+#define CM_DREP_ATTR_ID     __constant_htons(0x0016)
+#define CM_SIDR_REQ_ATTR_ID __constant_htons(0x0017)
+#define CM_SIDR_REP_ATTR_ID __constant_htons(0x0018)
+#define CM_LAP_ATTR_ID      __constant_htons(0x0019)
+#define CM_APR_ATTR_ID      __constant_htons(0x001A)
+%}
+
+/*
+ * 	get_mad(struct ib_mad_recv_wc *)
+ *	Returns a pointer to struct ib_mad_recv_buf.
+ */
+function get_mad:long (mad_rec_wc:long)
+%{
+	struct ib_mad_recv_wc *wc = (struct ib_mad_recv_wc *) THIS->mad_rec_wc;
+	THIS->__retvalue = (long)wc->recv_buf.mad; 
+%}
+
+/*
+ *	ib_get_cm_event_from_mad(struct ib_mad *)
+ *	Map. cm attr id to cm event type.
+ */
+function ib_get_cm_event_from_mad:long (mad:long)
+%{
+	int event;
+	struct ib_mad *mad = (struct ib_mad *) THIS->mad;
+
+	switch (mad->mad_hdr.attr_id) {
+	case CM_REQ_ATTR_ID:
+		event = IB_CM_REQ_RECEIVED;
+		break;
+	case CM_MRA_ATTR_ID:
+		event = IB_CM_MRA_RECEIVED;
+		break;
+	case CM_REJ_ATTR_ID:
+		event = IB_CM_REJ_RECEIVED;
+		break;
+	case CM_REP_ATTR_ID:
+		event = IB_CM_REP_RECEIVED;
+		break;
+	case CM_RTU_ATTR_ID:
+		event = IB_CM_RTU_RECEIVED;
+		break;
+	case CM_DREQ_ATTR_ID:
+		event = IB_CM_DREQ_RECEIVED;
+		break;
+	case CM_DREP_ATTR_ID:
+		event = IB_CM_DREP_RECEIVED;
+		break;
+	case CM_SIDR_REQ_ATTR_ID:
+		event = IB_CM_SIDR_REQ_RECEIVED;
+		break;
+	case CM_SIDR_REP_ATTR_ID:
+		event = IB_CM_SIDR_REP_RECEIVED;
+		break;
+	case CM_LAP_ATTR_ID:
+		event = IB_CM_LAP_RECEIVED;
+		break;
+	case CM_APR_ATTR_ID:
+		event = IB_CM_APR_RECEIVED;
+		break;
+	default:
+		event = -1;
+	}
+	THIS->__retvalue = (long)event;
+	return;
+%}
+
+/*
+ * cm_rej_reason(struct cm_rej_msg *)
+ * Returns reject reason.
+ */
+function cm_rej_reason:long (mad:long)
+%{
+	struct cm_rej_msg {
+		struct ib_mad_hdr hdr;
+		__be32 local_comm_id;
+		__be32 remote_comm_id;
+		/* message REJected:2, rsvd:6 */
+		u8 offset8;
+		/* reject info length:7, rsvd:1. */
+		u8 offset9;
+		__be16 reason;
+		u8 ari[IB_CM_REJ_ARI_LENGTH];
+       		u8 private_data[IB_CM_REJ_PRIVATE_DATA_SIZE];
+	} __attribute__ ((packed)) *rej;
+
+	rej = (struct cm_rej_msg *)THIS->mad;
+	THIS->__retvalue = (long)__be16_to_cpu(rej->reason);
+%}
+
+function dev_str_from_cm_id:long (cmid:long)
+%{
+	struct ib_cm_id *cm_id = (struct ib_cm_id *) THIS->cmid;
+	struct ipoib_cm_tx *tx = cm_id->context;
+	struct ipoib_dev_priv *priv = netdev_priv(tx->dev);
+	struct net_device *dev = priv->dev;
+	THIS->__retvalue = (long) &(dev->name);
+%}
+
+/*
+ *	Data printing function for ib_cm.
+ */
+function ib_cm_dprint (	name:string,
+			device:string,
+			event:string,
+			cm_id:long,
+			cm_state:long,
+			qpn:long,
+			cm_rej_reason:long)
+{
+	if ( !ib_use_dprint )
+		return 0;
+
+	module = probemod();
+	if (module != "ib_cm") {
+		printf("%s: module %s is not supported by ib_cm_dprint\n",
+		name, module)
+		return 0
+	}
+	//printf("%-58s(%3s):%5s  ",name,device,event);
+	printf("%-38s%-20s(%3s): ",name,event,device);
+
+
+	if (cm_id)
+		printf("cm_id=%p ",cm_id);
+
+	if (cm_state)
+		printf("cm_state=%s ",ib_cm_state_num2str(cm_state));
+
+	if (qpn)
+		printf("qp_num=%d ",qpn);
+
+	if (cm_rej_reason)
+		printf("cm_rej_reason=%s ",
+			ib_cm_rej_reason_num2str(cm_rej_reason));
+	
+	printf("\n");
+}
+
+/*
+ *	Start of probe definitions for module ib_cm
+ */
+#
+# static void cm_send_handler(struct ib_mad_agent *mad_agent,
+#			struct ib_mad_send_wc *mad_send_wc)
+#
+/**
+ * probe cm_send_handler - Callback from MAD.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when a send request is completed by the MAD layer.
+ */
+probe ib_cm.cm_send_handler =  module("ib_cm").function("cm_send_handler")
+{
+	ib_cm_dprint (proper_name(""),		//name:string,
+		"   ",				//device:string,
+		ib_wc_status_num2str($mad_send_wc->status),//event:string,
+		$mad_send_wc->send_buf->context[0],//cm_id:long,
+		$mad_send_wc->send_buf->context[1],//cm_state:long,
+		0,				//qpn:long,
+		0				//cm_rej_reason:long
+	);
+}
+
+#
+# static void cm_recv_handler(struct ib_mad_agent *mad_agent,
+#                            struct ib_mad_recv_wc *mad_recv_wc)
+#
+/**
+ * probe cm_recv_handler - Callback from MAD.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when a receive request is completed by the MAD layer.
+ */
+probe ib_cm.cm_recv_handler = module("ib_cm").function("cm_recv_handler")
+{
+	mad = get_mad($mad_recv_wc)
+	event = ib_cm_event_type_num2str(ib_get_cm_event_from_mad(mad))
+	if (event == "IB_CM_REJ_RECEIVED")
+		rej_msg = cm_rej_reason(mad) 
+
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		event,			//event:string
+		0,			//cm_id:long,
+		0,			//cm_state:long,
+		0,			//qpn:long,
+		rej_msg			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_rep(struct ib_cm_id *cm_id,
+#		struct ib_cm_rep_param *param)
+#
+/**
+ * probe ib_send_cm_rep - Send a REP.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send a reply to a connection request.
+ */
+probe ib_cm.ib_send_cm_rep = module("ib_cm").function("ib_send_cm_rep")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_REP",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		qpn = $param->qp_num,	//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+
+#
+# int ib_send_cm_req(struct ib_cm_id *cm_id,
+#			struct ib_cm_req_param *param)
+#
+/**
+ * probe ib_send_cm_req - Send a REQ.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send an REQ.
+ */
+probe ib_cm.ib_send_cm_req = module("ib_cm").function("ib_send_cm_req")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_REQ",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		$param->qp_num,		//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_rtu(struct ib_cm_id *cm_id,
+#			const void *private_data,
+#			u8 private_data_len)
+#
+/**
+ * probe ib_send_cm_rtu - Send an RTU.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send a RTU.
+ */
+probe ib_cm.ib_send_cm_rtu = module("ib_cm").function("ib_send_cm_rtu")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_RTU",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_dreq(struct ib_cm_id *cm_id,
+#			const void *private_data,
+#			u8 private_data_len)
+#
+/**
+ * probe ib_send_cm_dreq - Send a DREQ.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send an DERQ.
+ */
+probe ib_cm.ib_send_cm_dreq = module("ib_cm").function("ib_send_cm_dreq")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_DREQ",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_drep(struct ib_cm_id *cm_id,
+#			const void *private_data,
+#			u8 private_data_len)
+#
+/**
+ * probe ib_send_cm_drep - Send a DREP.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send a DREP.
+ */
+probe ib_cm.ib_send_cm_drep = module("ib_cm").function("ib_send_cm_drep")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_DREP",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_mra(struct ib_cm_id *cm_id,
+#			u8 service_timeout,
+#			const void *private_data,
+#			u8 private_data_len)
+/**
+ * probe ib_send_cm_mra - Send a MRA.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send a MRA.
+ */
+probe ib_cm.ib_send_cm_mra = module("ib_cm").function("ib_send_cm_mra")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_MRA",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_lap(struct ib_cm_id *cm_id,
+#			struct ib_sa_path_rec *alternate_path,
+#			const void *private_data,
+#			u8 private_data_len)
+#
+/**
+ * probe ib_send_cm_lap - Send a LAP.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send an LAP.
+ */
+probe ib_cm.ib_send_cm_lap = module("ib_cm").function("ib_send_cm_lap")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_LAP",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_apr(struct ib_cm_id *cm_id,
+#			enum ib_cm_apr_status status,
+#			void *info,
+#			u8 info_length,
+#			const void *private_data,
+#			u8 private_data_len)
+#
+/**
+ * probe ib_send_cm_apr - Send an APR.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send an APR.
+ */
+probe ib_cm.ib_send_cm_apr = module("ib_cm").function("ib_send_cm_apr")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_APR",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_sidr_req(struct ib_cm_id *cm_id,
+#			struct ib_cm_sidr_req_param *param)
+#
+/**
+ * probe ib_send_cm_sidr_req - Send a SIDR.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send an SIDR.
+ */
+probe ib_cm.ib_send_cm_sidr_req = module("ib_cm").function("ib_send_cm_sidr_req")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_SIDR_REQ",	//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id,
+#			struct ib_cm_sidr_rep_param *param)
+#
+/**
+ * probe ib_send_cm_sidr_rep - Send a reply to an SIDR.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to reply to a SIDR.
+ */
+probe ib_cm.ib_send_cm_sidr_rep=module("ib_cm").function("ib_send_cm_sidr_rep")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_SIDR_REP",	//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		$param->qp_num,		//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+#	ib_send_cm_rej(struct ib_cm_id *cm_id,
+#			enum ib_cm_rej_reason reason,
+#			void *ari,
+#			u8 ari_length,
+#			const void *private_data,
+#			u8 private_data_len)
+#
+/**
+ * probe ib_send_cm_rej - Send a reject.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to send an REJ.
+ */
+probe ib_cm.ib_send_cm_rej = module("ib_cm").function("ib_send_cm_rej")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"SEND_REJECT",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+# struct ib_cm_id *ib_create_cm_id(struct ib_device *device,
+#				ib_cm_handler cm_handler,
+#				void *context)
+#
+/**
+ * probe ib_create_cm_id - Create a new cm_id.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to create a cm_id.
+ */
+probe ib_cm.ib_create_cm_id = module("ib_cm").function("ib_create_cm_id").return
+{
+	ib_cm_dprint (proper_name(""),		//name:string,
+		kernel_string($device->name),	//device:string,
+		"CREATE_CM_ID",			//event:string,
+		$return,			//cm_id:long,
+		0,				//cm_state:long,
+		0,				//qpn:long,
+		0				//cm_rej_reason:long
+	);
+}
+
+#
+#	void ib_destroy_cm_id(struct ib_cm_id *cm_id)
+#
+/**
+ * probe ib_cm_destroy_cm_id - Destroy a cm_id.
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to destroy a cm_id.
+ */
+probe ib_cm.ib_cm_destroy_cm_id = module("ib_cm").function("ib_destroy_cm_id")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"DESTROY_CM_ID",	//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}
+
+#
+#	int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id,
+#	 __be64 service_mask, struct ib_cm_compare_data *compare_data)
+#
+/**
+ * probe ib_cm.ib_cm_listen - Listen for connect requests
+ *
+ * Context:
+ *  Kernel
+ *
+ * Fires when ib_cm is requested to listen for incoming connect requests.
+ */
+probe ib_cm.ib_cm_listen = module("ib_cm").function("ib_cm_listen")
+{
+	ib_cm_dprint (proper_name(""),	//name:string,
+		"   ",			//device:string,
+		"LISTEN",		//event:string,
+		$cm_id,			//cm_id:long,
+		$cm_id->state,		//cm_state:long,
+		0,			//qpn:long,
+		0			//cm_rej_reason:long
+	);
+}



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]