changes from v2 - 
http://lists.openfabrics.org/pipermail/general/2007-September/040995.html

- removed the module param, as hot-plug mechanisms etc can serve for persistent 
setting
- replaced strcmp usage with simple_strtoul in the sysfs callback that sets the 
value

changes from v1 - 
http://lists.openfabrics.org/pipermail/general/2007-September/040250.html

- added module param to control the umcast bit in the device priv flags
- changed the umcast bit name to IPOIB_FLAG_ADMIN_UMCAST_ALLOWED
- the sysfs attribute has now values 0 and 1 instead of "allowed" and 
"disallowed"

please review and consider for merge to 2.6.24

-----

The kernel IB stack allows (through the RDMA CM) user space multicast 
applications
to interoperate with IP based apps optionally running at a different IP subnet.

To support this inter-op for the case where the receiving party resides at
the IB side, there is a need to handle IGMP (reports/queries) else the local
IP router would not forward multicast traffic towards the IB network.

This patch does a lookup on the database used for multicast reference counting 
and
enhances IPoIB to ignore multicast group which is already handled by user 
space, all
this under a per device policy flag. That is when the policy flag allows it, 
IPoIB
will not join and attach its QP to a multicast group which has an entry on the 
database.

For each IPoIB device, the /sys/class/net/$dev/umcast attribute controls the
policy flag where the default value is being off (zero). The flag can be read
and set/unset through sysfs.

Signed-off-by: Or Gerlitz <[EMAIL PROTECTED]>

Index: linux-2.6.23-rc5/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
--- linux-2.6.23-rc5.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c        
2007-10-07 14:34:14.000000000 +0200
+++ linux-2.6.23-rc5/drivers/infiniband/ulp/ipoib/ipoib_multicast.c     
2007-10-07 14:41:22.000000000 +0200
@@ -783,6 +783,7 @@ void ipoib_mcast_restart_task(struct wor
        struct ipoib_mcast *mcast, *tmcast;
        LIST_HEAD(remove_list);
        unsigned long flags;
+       struct ib_sa_mcmember_rec rec;

        ipoib_dbg_mcast(priv, "restarting multicast task\n");

@@ -816,6 +817,15 @@ void ipoib_mcast_restart_task(struct wor
                if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, 
&mcast->flags)) {
                        struct ipoib_mcast *nmcast;

+                       /* ignore group which is directly joined by user space 
*/
+                       if (test_bit(IPOIB_FLAG_ADMIN_UMCAST_ALLOWED, 
&priv->flags) &&
+                           !ib_sa_get_mcmember_rec(priv->ca, priv->port, 
&mgid, &rec))
+                       {
+                               ipoib_dbg_mcast(priv, "ignoring multicast entry 
for mgid "
+                                               IPOIB_GID_FMT "\n", 
IPOIB_GID_ARG(mgid));
+                               continue;
+                       }
+
                        /* Not found or send-only group, let's add a new entry 
*/
                        ipoib_dbg_mcast(priv, "adding multicast entry for mgid "
                                        IPOIB_GID_FMT "\n", 
IPOIB_GID_ARG(mgid));
Index: linux-2.6.23-rc5/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
--- linux-2.6.23-rc5.orig/drivers/infiniband/ulp/ipoib/ipoib.h  2007-10-07 
14:34:14.000000000 +0200
+++ linux-2.6.23-rc5/drivers/infiniband/ulp/ipoib/ipoib.h       2007-10-07 
14:41:22.000000000 +0200
@@ -86,6 +86,7 @@ enum {
        IPOIB_MCAST_STARTED       = 8,
        IPOIB_FLAG_NETIF_STOPPED  = 9,
        IPOIB_FLAG_ADMIN_CM       = 10,
+       IPOIB_FLAG_ADMIN_UMCAST_ALLOWED = 11,

        IPOIB_MAX_BACKOFF_SECONDS = 16,

@@ -364,6 +365,7 @@ static inline void ipoib_put_ah(struct i

 int ipoib_open(struct net_device *dev);
 int ipoib_add_pkey_attr(struct net_device *dev);
+int ipoib_add_umcast_attr(struct net_device *dev);

 void ipoib_send(struct net_device *dev, struct sk_buff *skb,
                struct ipoib_ah *address, u32 qpn);
Index: linux-2.6.23-rc5/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
--- linux-2.6.23-rc5.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c     
2007-10-07 14:34:14.000000000 +0200
+++ linux-2.6.23-rc5/drivers/infiniband/ulp/ipoib/ipoib_main.c  2007-10-07 
15:01:07.000000000 +0200
@@ -1017,6 +1017,45 @@ static ssize_t show_pkey(struct device *
 }
 static DEVICE_ATTR(pkey, S_IRUGO, show_pkey, NULL);

+static ssize_t show_umcast(struct device *dev,
+                          struct device_attribute *attr, char *buf)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(to_net_dev(dev));
+
+       if (test_bit(IPOIB_FLAG_ADMIN_UMCAST_ALLOWED, &priv->flags))
+               return sprintf(buf, "1\n");
+       else
+               return sprintf(buf, "0\n");
+}
+
+static ssize_t set_umcast(struct device *dev,
+                         struct device_attribute *attr,
+                         const char *buf, size_t count)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(to_net_dev(dev));
+       unsigned long umcast_val = simple_strtoul(buf, NULL, 0);
+
+       if (umcast_val > 0) {
+               set_bit(IPOIB_FLAG_ADMIN_UMCAST_ALLOWED, &priv->flags);
+               ipoib_warn(priv, "ignoring multicast groups joined directly "
+                               "by user space\n");
+               return count;
+       }
+
+       if (!umcast_val) {
+               clear_bit(IPOIB_FLAG_ADMIN_UMCAST_ALLOWED, &priv->flags);
+               return count;
+       }
+
+       return -EINVAL;
+}
+static DEVICE_ATTR(umcast, S_IWUSR | S_IRUGO, show_umcast, set_umcast);
+
+int ipoib_add_umcast_attr(struct net_device *dev)
+{
+       return device_create_file(&dev->dev, &dev_attr_umcast);
+}
+
 static ssize_t create_child(struct device *dev,
                            struct device_attribute *attr,
                            const char *buf, size_t count)
@@ -1134,6 +1173,8 @@ static struct net_device *ipoib_add_port
                goto sysfs_failed;
        if (ipoib_add_pkey_attr(priv->dev))
                goto sysfs_failed;
+       if (ipoib_add_umcast_attr(priv->dev))
+               goto sysfs_failed;
        if (device_create_file(&priv->dev->dev, &dev_attr_create_child))
                goto sysfs_failed;
        if (device_create_file(&priv->dev->dev, &dev_attr_delete_child))
Index: linux-2.6.23-rc5/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
===================================================================
--- linux-2.6.23-rc5.orig/drivers/infiniband/ulp/ipoib/ipoib_vlan.c     
2007-10-07 14:34:14.000000000 +0200
+++ linux-2.6.23-rc5/drivers/infiniband/ulp/ipoib/ipoib_vlan.c  2007-10-07 
14:41:22.000000000 +0200
@@ -119,6 +119,8 @@ int ipoib_vlan_add(struct net_device *pd
                goto sysfs_failed;
        if (ipoib_add_pkey_attr(priv->dev))
                goto sysfs_failed;
+       if (ipoib_add_umcast_attr(priv->dev))
+               goto sysfs_failed;

        if (device_create_file(&priv->dev->dev, &dev_attr_parent))
                goto sysfs_failed;
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to