This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[PATCH 2/6] New Infiniband (OFED) tapset
- From: "David J. Wilder" <dwilder at us dot ibm dot com>
- To: systemtap at sourceware dot org, xma at us dot ibm dot com, pradeep at us dot ibm dot com, prasad at linux dot vnet dot ibm dot com
- Date: Thu, 05 Feb 2009 16:29:16 -0800
- Subject: [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
+ );
+}