[openib-general] [PATCH] mthca: Implement snoop_mad]

Hal Rosenstock halr at voltaire.com
Wed Oct 13 11:36:42 PDT 2004


mthca: Implement snoop_mad

Index: include/ib_verbs.h
===================================================================
--- include/ib_verbs.h  (revision 970)
+++ include/ib_verbs.h  (working copy)
@@ -654,10 +654,14 @@
 enum ib_mad_result {
        IB_MAD_RESULT_FAILURE  = 0,      /* (!SUCCESS is the important
flag) */
        IB_MAD_RESULT_SUCCESS  = 1 << 0, /* MAD was successfully
processed   */
-       IB_MAD_RESULT_REPLY    = 1 << 1, /* Reply packet needs to be
sent    */
-       IB_MAD_RESULT_CONSUMED = 1 << 2  /* Packet consumed: stop
processing */
+       IB_MAD_RESULT_REPLY    = 1 << 1  /* Reply packet needs to be
sent    */
 };
 
+enum ib_snoop_mad_result {
+       IB_SNOOP_MAD_IGNORED,
+       IB_SNOOP_MAD_CONSUMED         
+};
+
 #define IB_DEVICE_NAME_MAX 64
 
 struct ib_device {
@@ -771,6 +775,10 @@
                                                  u16 source_lid,
                                                  struct ib_mad *in_mad,
                                                  struct ib_mad
*out_mad);
+        int                       (*snoop_mad)(struct ib_device
*device,
+                                               u8 port_num,
+                                               u16 source_lid,
+                                               struct ib_mad *mad);
 
        struct class_device          class_dev;
        struct kobject               ports_parent;
Index: hw/mthca/mthca_dev.h
===================================================================
--- hw/mthca/mthca_dev.h        (revision 970)
+++ hw/mthca/mthca_dev.h        (working copy)
@@ -352,6 +352,10 @@
 int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16
lid);
 int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16
lid);
 
+int mthca_snoop_mad(struct ib_device *ibdev,
+                   u8 port_num,
+                   u16 slid,
+                   struct ib_mad *mad);
 int mthca_process_mad(struct ib_device *ibdev,
                      int mad_flags,
                      u8 port_num,
Index: hw/mthca/mthca_provider.c
===================================================================
--- hw/mthca/mthca_provider.c   (revision 970)
+++ hw/mthca/mthca_provider.c   (working copy)
@@ -581,6 +581,7 @@
        dev->ib_dev.attach_mcast         = mthca_multicast_attach;
        dev->ib_dev.detach_mcast         = mthca_multicast_detach;
        dev->ib_dev.process_mad          = mthca_process_mad;
+       dev->ib_dev.snoop_mad            = mthca_snoop_mad;
 
        ret = ib_register_device(&dev->ib_dev);
        if (ret)
Index: hw/mthca/mthca_mad.c
===================================================================
--- hw/mthca/mthca_mad.c        (revision 970)
+++ hw/mthca/mthca_mad.c        (working copy)
@@ -69,33 +69,44 @@
        }
 }
 
-int mthca_process_mad(struct ib_device *ibdev,
-                     int mad_flags,
-                     u8 port_num,
-                     u16 slid,
-                     struct ib_mad *in_mad,
-                     struct ib_mad *out_mad)
+int mthca_snoop_mad(struct ib_device *ibdev,
+                   u8 port_num,
+                   u16 slid,
+                   struct ib_mad *mad)
 {
-       int err;
-       u8 status;
-
        /* Forward locally generated traps to the SM */
-       if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED
&&
-           in_mad->mad_hdr.method   == IB_MGMT_METHOD_TRAP           &&
+       if (mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED &&
+           mad->mad_hdr.method   == IB_MGMT_METHOD_TRAP           &&
            slid               == 0) {
                struct ib_sm_path sm_path;
 
                ib_cached_sm_path_get(ibdev, port_num, &sm_path);
                if (sm_path.sm_lid) {
-                       in_mad->sqpn            = 0;
-                       in_mad->dlid            = sm_path.sm_lid;
-                       in_mad->completion_func = NULL;
-                       ib_mad_send(in_mad);
+                       mad->sqpn            = 0;
+                       mad->dlid            = sm_path.sm_lid;
+                       mad->completion_func = NULL;
+#if 0
+                       ib_mad_send(mad);
+#else
+                       printk(KERN_ERR "mthca_snoop_mad:
ib_mad_send\n");
+#endif
                }
 
-               return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED;
+               return IB_SNOOP_MAD_CONSUMED;
        }
+       return IB_SNOOP_MAD_IGNORED;
+}
 
+int mthca_process_mad(struct ib_device *ibdev,
+                     int mad_flags,
+                     u8 port_num,
+                     u16 slid,
+                     struct ib_mad *in_mad,
+                     struct ib_mad *out_mad)
+{
+       int err;
+       u8 status;
+
        /*
         * Only handle SM gets, sets and trap represses for SM class
         *





More information about the general mailing list