[PATCH] introducing new net device feature NETIF_F_MC_ALL

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,
I introduced a new net device feature flag NETIF_F_MC_ALL.
Setting this flag network devices drivers will be triggered on every 
multicast join and drop
regardless of already existing dev_mc_list entry . 
The reason is that s390 device drivers lcs and qeth need to be informed 
for every new Multicast IP
address being joined or dropped to register them at the hardware to get 
multicast traffic running for
the specific Multicast group.
As LCS and OSA Express hardware  are able to virtualize network devices 
and so to get a lot of systems 
running concurrently with the same physical hardware it is not enough for 
both device drivers to just get triggered 
when a new dev_mc_list entry is allocated.
For example in case of Token Ring this would happen only once as the 
hardware multicast address is hardcoded in 
ip_tr_mc_map. Thus every further join of a new Multicast group p on a 
Token Ring device would never trigger 
the drivers again. As this multicast IP address has not been registered 
yet on the card multicast packets for this group
will be dropped  by the hardware. Similar applies to Ethernet .


diff -urN linux-2.6/drivers/s390/net/lcs.c 
linux-2.6-s390/drivers/s390/net/lcs.c
--- linux-2.6/drivers/s390/net/lcs.c    Thu Aug 26 11:23:33 2004
+++ linux-2.6-s390/drivers/s390/net/lcs.c       Thu Aug 26 11:23:45 2004
@@ -11,7 +11,7 @@
  *                       Frank Pavlic (pavlic@de.ibm.com) and
  *                       Martin Schwidefsky <schwidefsky@de.ibm.com>
  *
- *    $Revision: 1.89 $         $Date: 2004/08/24 10:49:27 $
+ *    $Revision: 1.90 $         $Date: 2004/08/26 03:29:44 $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -59,7 +59,7 @@
 /**
  * initialization string for output
  */
-#define VERSION_LCS_C  "$Revision: 1.89 $"
+#define VERSION_LCS_C  "$Revision: 1.90 $"

 static char version[] __initdata = "LCS driver ("VERSION_LCS_C "/" 
VERSION_LCS_H ")";
 static char debug_buffer[255];
@@ -101,9 +101,9 @@
                return -ENOMEM;
        }
        debug_register_view(lcs_dbf_setup, &debug_hex_ascii_view);
-       debug_set_level(lcs_dbf_setup, 4);
+       debug_set_level(lcs_dbf_setup, 2);
        debug_register_view(lcs_dbf_trace, &debug_hex_ascii_view);
-       debug_set_level(lcs_dbf_trace, 4);
+       debug_set_level(lcs_dbf_trace, 2);
        return 0;
 }

@@ -1276,9 +1276,8 @@
         LCS_DBF_TEXT(4, trace, "setmulti");
         card = (struct lcs_card *) dev->priv;

-        if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD)) {
+        if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD))
                schedule_work(&card->kernel_thread_starter);
-       }
 }

 #endif /* CONFIG_IP_MULTICAST */
@@ -2181,8 +2180,10 @@
                goto out;
        memcpy(card->dev->dev_addr, card->mac, LCS_MAC_LENGTH);
 #ifdef CONFIG_IP_MULTICAST
-       if (!lcs_check_multicast_support(card))
+       if (!lcs_check_multicast_support(card)) {
                card->dev->set_multicast_list = lcs_set_multicast_list;
+               card->dev->features |= NETIF_F_MC_ALL;
+       }
 #endif
        netif_stop_queue(card->dev);
        lcs_set_allowed_threads(card,0xffffffff);
@@ -2294,7 +2295,6 @@
                PRINT_ERR("Initialization failed\n");
                return rc;
        }
-
        return 0;
 }

diff -urN linux-2.6/drivers/s390/net/qeth_main.c 
linux-2.6-s390/drivers/s390/net/qeth_main.c
--- linux-2.6/drivers/s390/net/qeth_main.c      Thu Aug 26 11:23:42 2004
+++ linux-2.6-s390/drivers/s390/net/qeth_main.c Thu Aug 26 11:23:45 2004
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_main.c ($Revision: 1.132 $)
+ * linux/drivers/s390/net/qeth_main.c ($Revision: 1.133 $)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_main.c ($Revision: 1.132 $)
+ * linux/drivers/s390/net/qeth_main.c ($Revision: 1.133 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  *
@@ -12,7 +12,7 @@
  *                       Frank Pavlic (pavlic@de.ibm.com) and
  *                       Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.132 $        $Date: 2004/08/19 12:39:43 $
+ *    $Revision: 1.133 $        $Date: 2004/08/26 03:29:44 $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -78,7 +78,7 @@
 #include "qeth_mpc.h"
 #include "qeth_fs.h"

-#define VERSION_QETH_C "$Revision: 1.132 $"
+#define VERSION_QETH_C "$Revision: 1.133 $"
 static const char *version = "qeth S/390 OSA-Express driver";

 /**
@@ -6263,6 +6263,7 @@
        } else {
                PRINT_INFO("Multicast enabled\n");
                card->dev->flags |= IFF_MULTICAST;
+               card->dev->features |= NETIF_F_MC_ALL;
        }
        return rc;
 }
diff -urN linux-2.6/include/linux/netdevice.h 
linux-2.6-s390/include/linux/netdevice.h
--- linux-2.6/include/linux/netdevice.h Thu Aug 26 11:23:43 2004
+++ linux-2.6-s390/include/linux/netdevice.h    Thu Aug 26 11:23:45 2004
@@ -408,7 +408,10 @@
 #define NETIF_F_VLAN_CHALLENGED        1024    /* Device cannot handle 
VLAN packets */
 #define NETIF_F_TSO            2048    /* Can offload TCP/IP segmentation 
*/
 #define NETIF_F_LLTX           4096    /* LockLess TX */
-
+#define NETIF_F_MC_ALL         8192    /* trigger driver on every 
multicast
+                                        * address been added/deleted
+                                        */
+
        /* Called after device is detached from network. */
        void                    (*uninit)(struct net_device *dev);
        /* Called after last user reference disappears. */
diff -urN linux-2.6/net/core/dev_mcast.c 
linux-2.6-s390/net/core/dev_mcast.c
--- linux-2.6/net/core/dev_mcast.c      Sat Aug 14 12:55:10 2004
+++ linux-2.6-s390/net/core/dev_mcast.c Thu Aug 26 11:23:45 2004
@@ -145,6 +145,8 @@
        }
        err = -ENOENT;
 done:
+       if (dev->features & NETIF_F_MC_ALL)
+               __dev_mc_upload(dev);
        spin_unlock_bh(&dev->xmit_lock);
        return err;
 }
@@ -193,6 +195,9 @@
        return 0;

 done:
+       if (dev->features & NETIF_F_MC_ALL)
+               __dev_mc_upload(dev);
+
        spin_unlock_bh(&dev->xmit_lock);
        if (dmi1)
                kfree(dmi1);
diff -urN linux-2.6/net/ipv4/igmp.c linux-2.6-s390/net/ipv4/igmp.c
--- linux-2.6/net/ipv4/igmp.c   Thu Aug 26 11:23:21 2004
+++ linux-2.6-s390/net/ipv4/igmp.c      Thu Aug 26 11:23:45 2004
@@ -1202,7 +1202,6 @@

                                if (!in_dev->dead)
                                        ip_rt_multicast_event(in_dev);
-
                                ip_ma_put(i);
                                return;
                        }
diff -urN linux-2.6/net/ipv6/mcast.c linux-2.6-s390/net/ipv6/mcast.c
--- linux-2.6/net/ipv6/mcast.c  Sat Aug 14 12:56:01 2004
+++ linux-2.6-s390/net/ipv6/mcast.c     Thu Aug 26 11:23:45 2004
@@ -882,7 +882,6 @@
                                write_unlock_bh(&idev->lock);

                                igmp6_group_dropped(ma);
-
                                ma_put(ma);
                                return 0;
                        }


Mit  freundlichen Grüssen / Best regards
Frank Pavlic
 
Linux for eServer Development
Schoenaicher Str. 220, 71032 Boeblingen
Phone:  ext. +49-(0)7031/16-2463, int. *120-2463
mailto:   pavlic@de.ibm.com



-
: send the line "unsubscribe linux-net" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux