Hi,

you can find herejoined an uptodate patch for multicast support working with current revision 1155.
Please feel free to comment. The patch is based upon the old amine one.

I'm still working on it and testing it ...

Bruno.
Index: tools/rtifconfig.c
===================================================================
--- tools/rtifconfig.c	(révision 1155)
+++ tools/rtifconfig.c	(copie de travail)
@@ -105,10 +105,11 @@
     }
 
     flags = cmd.args.info.flags &
-        (IFF_UP | IFF_BROADCAST | IFF_LOOPBACK | IFF_RUNNING | IFF_PROMISC);
+        (IFF_UP | IFF_BROADCAST | IFF_MULTICAST | IFF_LOOPBACK | IFF_RUNNING | IFF_PROMISC);
     printf("          %s%s%s%s%s%s MTU: %d\n\n",
            ((flags & IFF_UP) != 0) ? "UP " : "",
            ((flags & IFF_BROADCAST) != 0) ? "BROADCAST " : "",
+           ((flags & IFF_MULTICAST) != 0) ? "MULTICAST " : "",
            ((flags & IFF_LOOPBACK) != 0) ? "LOOPBACK " : "",
            ((flags & IFF_RUNNING) != 0) ? "RUNNING " : "",
            ((flags & IFF_PROMISC) != 0) ? "PROMISC " : "",
Index: configure.ac
===================================================================
--- configure.ac	(révision 1155)
+++ configure.ac	(copie de travail)
@@ -1076,6 +1076,24 @@
 
 
 dnl ======================================================================
+dnl             multicast
+dnl ======================================================================
+
+AC_MSG_CHECKING([whether to build multicast])
+AC_ARG_ENABLE(multicast,
+AS_HELP_STRING([--enable-multicast], [build IP protocol multicast driver (legacy) @<:@default=no@:>@]),
+	       [case "$enableval" in
+      		 y | yes) CONFIG_RTNET_MULTICAST=y ;;
+		*) CONFIG_RTNET_MULTICAST=n ;;
+	        esac])
+AC_MSG_RESULT([${CONFIG_RTNET_MULTICAST:-n}])
+AM_CONDITIONAL(CONFIG_RTNET_MULTICAST,[test "$CONFIG_RTNET_MULTICAST" = "y"])
+if test "$CONFIG_RTNET_MULTICAST" = "y"; then
+ AC_DEFINE(CONFIG_RTNET_MULTICAST,1,[multicast support])
+fi
+
+
+dnl ======================================================================
 dnl             RTcfg
 dnl ======================================================================
 
Index: stack/ipv4/Kconfig
===================================================================
--- stack/ipv4/Kconfig	(révision 1155)
+++ stack/ipv4/Kconfig	(copie de travail)
@@ -41,3 +41,10 @@
     combination with CONFIG_RTNET_RTIPV4_NETROUTING.
 
     See Documentation/README.routing for further information.
+
+config RTNET_MULTICAST
+    bool "Multicast"
+    depends on RTNET_RTIPV4
+    ---help---
+    Enables multicast basic support.
+
Index: stack/ipv4/GNUmakefile.am
===================================================================
--- stack/ipv4/GNUmakefile.am	(révision 1155)
+++ stack/ipv4/GNUmakefile.am	(copie de travail)
@@ -17,6 +17,7 @@
 	ip_sock.c \
 	udp.c \
 	icmp.c \
+	igmp.c \
 	ip_output.c \
 	ip_fragment.c
 
Index: stack/ipv4/arp.c
===================================================================
--- stack/ipv4/arp.c	(révision 1155)
+++ stack/ipv4/arp.c	(copie de travail)
@@ -22,6 +22,8 @@
  */
 
 #include <rtdev.h>
+#include <net/ip.h>
+#include <linux/if_arp.h>
 #include <stack_mgr.h>
 #include <ipv4/arp.h>
 
@@ -178,8 +180,29 @@
     return 0;
 }
 
+/* Multicast mapping */
+#ifdef CONFIG_RTNET_MULTICAST
+int rt_arp_mc_map(u32 addr, u8 *haddr, struct rtnet_device *dev, int dir)
+{
+    switch (dev->type) {
+      case ARPHRD_ETHER:
+      case ARPHRD_FDDI:
+      case ARPHRD_IEEE802:
+        ip_eth_mc_map(addr, haddr);
+        return 0;
+      case ARPHRD_IEEE802_TR:
+        ip_tr_mc_map(addr, haddr);
+        return 0;
+      default:
+        if (dir) {
+            memcpy(haddr, dev->broadcast, dev->addr_len);
+            return 0;
+        }
+    }
+    return -EINVAL;
+}
+#endif
 
-
 static struct rtpacket_type arp_packet_type = {
     type:       __constant_htons(ETH_P_ARP),
     handler:    &rt_arp_rcv
Index: stack/ipv4/af_inet.c
===================================================================
--- stack/ipv4/af_inet.c	(révision 1155)
+++ stack/ipv4/af_inet.c	(copie de travail)
@@ -31,6 +31,7 @@
 #include <rtnet_rtpc.h>
 #include <ipv4/arp.h>
 #include <ipv4/icmp.h>
+#include <ipv4/igmp.h>
 #include <ipv4/ip_output.h>
 #include <ipv4/protocol.h>
 #include <ipv4/route.h>
@@ -248,6 +249,12 @@
         if (rtdev->flags & IFF_BROADCAST)
             rt_ip_route_add_host(up_cmd->args.up.broadcast_ip,
                                  rtdev->broadcast, rtdev);
+
+#ifdef CONFIG_RTNET_MULTICAST
+        if (!(rtdev->flags & IFF_LOOPBACK) && (rtdev->flags & IFF_MULTICAST))
+            rt_ip_mc_up(rtdev);
+#endif
+
     }
 }
 
@@ -256,6 +263,10 @@
 static void rt_ip_ifdown(struct rtnet_device *rtdev)
 {
     rt_ip_route_del_all(rtdev);
+#ifdef CONFIG_RTNET_MULTICAST
+    if (!(rtdev->flags & IFF_LOOPBACK) && (rtdev->flags & IFF_MULTICAST))
+            rt_ip_mc_down(rtdev);
+#endif
 }
 
 
@@ -327,6 +338,9 @@
         rt_inet_protocols[i]=NULL;
 
     rt_icmp_init();
+#ifdef CONFIG_RTNET_MULTICAST
+    rt_igmp_init();
+#endif 
     rt_udp_init();
 
 #ifdef CONFIG_PROC_FS
@@ -360,6 +374,9 @@
 #endif /* CONFIG_PROC_FS */
 
     rt_udp_release();
+#ifdef CONFIG_RTNET_MULTICAST
+    rt_igmp_release();
+#endif
     rt_icmp_release();
     rt_arp_release();
     rt_ip_release();
@@ -381,6 +398,9 @@
 
     /* Transport-Layer */
     rt_udp_release();
+#ifdef CONFIG_RTNET_MULTICAST
+    rt_igmp_release();
+#endif
     rt_icmp_release();
 
     /* Network-Layer */
Index: stack/ipv4/ip_sock.c
===================================================================
--- stack/ipv4/ip_sock.c	(révision 1155)
+++ stack/ipv4/ip_sock.c	(copie de travail)
@@ -26,8 +26,8 @@
 #include <linux/in.h>
 
 #include <rtnet_socket.h>
+#include <ipv4/igmp.h>
 
-
 int rt_ip_setsockopt(struct rtsocket *s, int level, int optname,
                      const void *optval, socklen_t optlen)
 {
@@ -44,6 +44,28 @@
         case IP_TOS:
             s->prot.inet.tos = *(unsigned int *)optval;
             break;
+#ifdef CONFIG_RTNET_MULTICAST
+        case RT_IP_ADD_MEMBERSHIP:
+        case RT_IP_DROP_MEMBERSHIP:
+        {
+            struct ip_mreq *mreq=(struct ip_mreq*)optval;
+            if (optname == RT_IP_ADD_MEMBERSHIP){
+                err = rt_ip_mc_join_group(s,mreq);
+            }
+            else
+                err = rt_ip_mc_leave_group(s,mreq);
+            break;
+        }
+	case IP_MULTICAST_IF:
+	    rtdm_printk("Option IP_MULTICAST_IF not implemented.\n");
+	    break;
+        case IP_MULTICAST_TTL:
+            rtdm_printk("Option IP_MULTICAST_TTL not implemented.\n");
+            break;
+        case IP_MULTICAST_LOOP:
+            rtdm_printk("Option IP_MULTICAST_LOOP not implemented.\n");
+            break;
+#endif
 
         default:
             err = -ENOPROTOOPT;
Index: stack/ipv4/ip_output.c
===================================================================
--- stack/ipv4/ip_output.c	(révision 1155)
+++ stack/ipv4/ip_output.c	(copie de travail)
@@ -114,6 +114,10 @@
         iph->id       = htons(msg_rt_ip_id);
         iph->frag_off = htons(frag_off);
         iph->ttl      = 255;
+#ifdef CONFIG_RTNET_MULTICAST
+        if(MULTICAST(rt->ip))
+            iph->ttl      = 1;
+#endif
         iph->protocol = sk->protocol;
         iph->saddr    = rtdev->local_ip;
         iph->daddr    = rt->ip;
@@ -217,6 +221,10 @@
     iph->id       = htons(msg_rt_ip_id);
     iph->frag_off = htons(IP_DF);
     iph->ttl      = 255;
+#ifdef CONFIG_RTNET_MULTICAST
+    if(MULTICAST(rt->ip))
+        iph->ttl      = 1;
+#endif
     iph->protocol = sk->protocol;
     iph->saddr    = rtdev->local_ip;
     iph->daddr    = rt->ip;
Index: stack/ipv4/udp.c
===================================================================
--- stack/ipv4/udp.c	(révision 1155)
+++ stack/ipv4/udp.c	(copie de travail)
@@ -37,6 +37,7 @@
 #include <ipv4/ip_fragment.h>
 #include <ipv4/ip_output.h>
 #include <ipv4/ip_sock.h>
+#include <ipv4/arp.h>
 #include <ipv4/protocol.h>
 #include <ipv4/route.h>
 #include <ipv4/udp.h>
@@ -534,8 +535,10 @@
     u16                 dport;
     int                 err;
     rtdm_lockctx_t      context;
+#ifdef CONFIG_RTNET_MULTICAST 
+    char buf[MAX_ADDR_LEN];
+#endif
 
-
     if ((len < 0) || (len > 0xFFFF-sizeof(struct iphdr)-sizeof(struct udphdr)))
         return -EMSGSIZE;
 
@@ -572,11 +575,41 @@
     if ((daddr | dport) == 0)
         return -EINVAL;
 
+#ifdef CONFIG_RTNET_MULTICAST
+    if(MULTICAST(daddr)){
+        if(saddr != INADDR_ANY){
+            rt.rtdev=(struct rtnet_device*)rt_ip_dev_find(saddr);
+            if(rt.rtdev){
+                if (rt_arp_mc_map(daddr, buf,rt.rtdev, 0) == 0){
+                    memcpy(rt.dev_addr,buf,sizeof(buf));
+                    rt.ip=daddr;
+
+                }
+                else {
+                    // Can't map multicast adress
+                    return -EHOSTUNREACH;
+                }
+            }
+            else {
+                    //Can't locate rtdev
+                    return -EHOSTUNREACH;
+            }
+        }
+        else
+            return -EHOSTUNREACH;
+    }
+    else {     /*if daddr is not a multicast @ we use routing  */
+#endif
+
     /* get output route */
     err = rt_ip_route_output(&rt, daddr, saddr);
     if (err)
         return err;
 
+#ifdef CONFIG_RTNET_MULTICAST
+    }
+#endif
+
     /* check if specified source address fits */
     if ((saddr != INADDR_ANY) && (saddr != rt.rtdev->local_ip)) {
         rtdev_dereference(rt.rtdev);
@@ -710,7 +743,11 @@
         skb->csum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0);
 
     /* patch broadcast daddr */
-    if (daddr == rtdev->broadcast_ip)
+    if ((daddr == rtdev->broadcast_ip)
+#ifdef CONFIG_RTNET_MULTICAST
+	|| (MULTICAST(daddr))
+#endif
+	    )
         daddr = rtdev->local_ip;
 
     /* find the destination socket */
Index: stack/rtnet_module.c
===================================================================
--- stack/rtnet_module.c	(révision 1155)
+++ stack/rtnet_module.c	(copie de travail)
@@ -72,10 +72,11 @@
     for (i = 1; i <= MAX_RT_DEVICES; i++) {
         rtdev = rtdev_get_by_index(i);
         if (rtdev != NULL) {
-            res = RTNET_PROC_PRINT("%d\t%-15s %s%s%s%s\n",
+            res = RTNET_PROC_PRINT("%d\t%-15s %s%s%s%s%s\n",
                             rtdev->ifindex, rtdev->name,
                             (rtdev->flags & IFF_UP) ? "UP" : "DOWN",
                             (rtdev->flags & IFF_BROADCAST) ? " BROADCAST" : "",
+                            (rtdev->flags & IFF_MULTICAST) ? " MULTICAST" : "",
                             (rtdev->flags & IFF_LOOPBACK) ? " LOOPBACK" : "",
                             (rtdev->flags & IFF_PROMISC) ? " PROMISC" : "");
             rtdev_dereference(rtdev);
Index: stack/include/ipv4/arp.h
===================================================================
--- stack/include/ipv4/arp.h	(révision 1155)
+++ stack/include/ipv4/arp.h	(copie de travail)
@@ -50,5 +50,8 @@
 void __init rt_arp_init(void);
 void rt_arp_release(void);
 
+#ifdef CONFIG_RTNET_MULTICAST
+int rt_arp_mc_map(u32 addr, u8 *haddr, struct rtnet_device *dev, int dir);
+#endif
 
 #endif  /* __RTNET_ARP_H_ */
Index: stack/include/rtnet.h
===================================================================
--- stack/include/rtnet.h	(révision 1155)
+++ stack/include/rtnet.h	(copie de travail)
@@ -70,6 +70,10 @@
 #define RTNET_RTIOC_EXTPOOL     _IOW(RTIOC_TYPE_NETWORK, 0x14, unsigned int)
 #define RTNET_RTIOC_SHRPOOL     _IOW(RTIOC_TYPE_NETWORK, 0x15, unsigned int)
 
+/* ioctl for multicast */
+#define RT_IP_ADD_MEMBERSHIP    _IOW(RTIOC_TYPE_NETWORK, 0x35, unsigned int)
+#define RT_IP_DROP_MEMBERSHIP   _IOW(RTIOC_TYPE_NETWORK, 0x36, unsigned int)
+
 /* socket transmission priorities */
 #define SOCK_MAX_PRIO           0
 #define SOCK_DEF_PRIO           SOCK_MAX_PRIO + \
Index: stack/include/GNUmakefile.am
===================================================================
--- stack/include/GNUmakefile.am	(révision 1155)
+++ stack/include/GNUmakefile.am	(copie de travail)
@@ -31,6 +31,7 @@
 	ipv4/af_inet.h \
 	ipv4/arp.h \
 	ipv4/icmp.h \
+	ipv4/igmp.h \
 	ipv4/ip_fragment.h \
 	ipv4/ip_input.h \
 	ipv4/ip_output.h \
Index: stack/include/rtdev.h
===================================================================
--- stack/include/rtdev.h	(révision 1155)
+++ stack/include/rtdev.h	(copie de travail)
@@ -141,6 +141,12 @@
 
     int                 (*do_ioctl)(struct rtnet_device *rtdev, 
 				    unsigned int request, void * cmd);
+
+    /* Added for multicast support */
+#ifdef CONFIG_RTNET_MULTICAST
+    void                (*set_multicast_list) (struct rtnet_device *rtdev);
+#endif
+
 };
 
 
@@ -183,6 +189,15 @@
 int rtdev_xmit_proxy(struct rtskb *skb);
 #endif
 
+/* Functions used for multicast support */
+#ifdef CONFIG_RTNET_MULTICAST
+struct rtnet_device *rt_ip_dev_find(u32 addr);
+void     rtdev_mc_upload(struct rtnet_device *dev);
+int      rtdev_mc_delete(struct rtnet_device *dev, void *addr, int alen, int all);
+int      rtdev_mc_add(struct rtnet_device *dev, void *addr, int alen, int newonly);
+void     rtdev_set_allmulti(struct rtnet_device *dev, int inc);
+#endif
+
 unsigned int rt_hard_mtu(struct rtnet_device *rtdev, unsigned int priority);
 
 int rtdev_open(struct rtnet_device *rtdev);
Index: stack/include/rtskb.h
===================================================================
--- stack/include/rtskb.h	(révision 1155)
+++ stack/include/rtskb.h	(copie de travail)
@@ -183,6 +183,10 @@
         struct tcphdr   *th;
         struct udphdr   *uh;
         struct icmphdr  *icmph;
+#ifdef CONFIG_RTNET_MULTICAST
+        /* add igmp header for multicast support */
+        struct igmphdr  *igmph;
+#endif
         struct iphdr    *ipihdr;
         unsigned char   *raw;
     } h;
Index: stack/rtdev.c
===================================================================
--- stack/rtdev.c	(révision 1155)
+++ stack/rtdev.c	(copie de travail)
@@ -306,7 +306,10 @@
     rtdev->hard_header_len = ETH_HLEN;
     rtdev->mtu             = 1500; /* eth_mtu */
     rtdev->addr_len        = ETH_ALEN;
-    rtdev->flags           = IFF_BROADCAST; /* TODO: IFF_MULTICAST; */
+    rtdev->flags           = IFF_BROADCAST;
+#ifdef CONFIG_MULTICAST_SUPPORT
+    rtdev->flags           |= IFF_MULTICAST;
+#endif
     rtdev->get_mtu         = rt_hard_mtu;
 
     memset(rtdev->broadcast, 0xFF, ETH_ALEN);
@@ -499,8 +502,8 @@
     if ( !ret )  {
         rtdev->flags |= (IFF_UP | IFF_RUNNING);
         set_bit(__LINK_STATE_START, &rtdev->state);
-#if 0
-        dev_mc_upload(dev);                 /* Initialize multicasting status   */
+#ifdef CONFIG_RTNET_MULTICAST
+        rtdev_mc_upload(rtdev);                 /* Initialize multicasting status   */
 #endif
     }
 
@@ -615,7 +618,198 @@
     return rtdev->mtu;
 }
 
+#ifdef CONFIG_RTNET_MULTICAST
+/* Find rtnet device by its local_ip adress */
+static inline struct rtnet_device * __rt_ip_dev_find(u32 addr){
+    int i;
+    struct rtnet_device *rtdev;
 
+    for (i = 0; i < MAX_RT_DEVICES; i++) {
+        rtdev = rtnet_devices[i];
+        if ((rtdev != NULL) && (rtdev->local_ip == addr)) {
+            return rtdev;
+        }
+    }
+    return NULL;
+}
+
+/***
+ *  rtdev_get_by_hwaddr - find and lock a rtnetdevice by its local ip adress
+ *  @addr:         Local  IP Adress
+  */
+struct rtnet_device *rt_ip_dev_find(u32 addr)
+{
+    struct rtnet_device * rtdev;
+    rtdm_lockctx_t context;
+
+
+    rtdm_lock_get_irqsave(&rtnet_devices_rt_lock, context);
+
+    rtdev = __rt_ip_dev_find(addr);
+/*    if (rtdev != NULL)
+        atomic_inc(&rtdev->refcount);
+*/
+    rtdm_lock_put_irqrestore(&rtnet_devices_rt_lock, context);
+
+    return rtdev;
+}
+
+/*
+ *  Update the multicast list into the physical NIC controller.
+ */
+static void __rtdev_mc_upload(struct rtnet_device *dev)
+{
+    /* Don't do anything till we up the interface
+     * [dev_open will call this function so the list will
+     * stay sane]
+     */
+
+    if (!(dev->flags&IFF_UP))
+        return;
+
+    /*
+     *  Devices with no set multicast or which have been
+     *  detached don't get set.
+     */
+
+    if (dev->set_multicast_list == NULL){
+     	printk(" Driver for %s not support multicast\n", dev->name);  
+        return;
+    }
+    dev->set_multicast_list(dev);
+}
+
+void rtdev_mc_upload(struct rtnet_device *dev)
+{
+   rtdm_mutex_lock(&dev->xmit_mutex);
+    __rtdev_mc_upload(dev);
+   rtdm_mutex_unlock(&dev->xmit_mutex);
+}
+
+/*
+ *  Delete a device level multicast
+ */
+ 
+int rtdev_mc_delete(struct rtnet_device *dev, void *addr, int alen, int glbl)
+{
+    int err = 0;
+    struct dev_mc_list *dmi, **dmip;
+
+    rtdm_mutex_lock(&dev->xmit_mutex);
+
+    for (dmip = &dev->mc_list; (dmi = *dmip) != NULL; dmip = &dmi->next) {
+        /*
+         *  Find the entry we want to delete. The device could
+         *  have variable length entries so check these too.
+         */
+        if (memcmp(dmi->dmi_addr, addr, dmi->dmi_addrlen) == 0 &&
+            alen == dmi->dmi_addrlen) {
+            if (glbl) {
+                int old_glbl = dmi->dmi_gusers;
+                dmi->dmi_gusers = 0;
+                if (old_glbl == 0)
+                    break;
+            }
+            if (--dmi->dmi_users)
+                goto done;
+
+            /*
+             *  Last user. So delete the entry.
+             */
+            *dmip = dmi->next;
+            dev->mc_count--;
+
+            kfree(dmi);
+
+            /*
+             *  We have altered the list, so the card
+             *  loaded filter is now wrong. Fix it
+             */
+            __rtdev_mc_upload(dev);
+
+            rtdm_mutex_unlock(&dev->xmit_mutex);
+            return 0;
+        }
+    }
+    err = -ENOENT;
+done:
+    rtdm_mutex_unlock(&dev->xmit_mutex);
+    return err;
+}
+
+/*
+ *  Add a device level multicast
+ */
+
+
+int rtdev_mc_add(struct rtnet_device *dev, void *addr, int alen, int glbl)
+{
+    int err = 0;
+    struct dev_mc_list *dmi, *dmi1;
+
+    dmi1 = (struct dev_mc_list *)kmalloc(sizeof(*dmi), GFP_ATOMIC);
+
+    rtdm_mutex_lock(&dev->xmit_mutex);
+    for (dmi = dev->mc_list; dmi != NULL; dmi = dmi->next) {
+        if (memcmp(dmi->dmi_addr, addr, dmi->dmi_addrlen) == 0 &&
+            dmi->dmi_addrlen == alen) {
+            if (glbl) {
+                int old_glbl = dmi->dmi_gusers;
+                dmi->dmi_gusers = 1;
+                if (old_glbl)
+                    goto done;
+            }
+            dmi->dmi_users++;
+            goto done;
+        }
+    }
+
+    if ((dmi = dmi1) == NULL) {
+        rtdm_mutex_unlock(&dev->xmit_mutex);
+        return -ENOMEM;
+    }
+    memcpy(dmi->dmi_addr, addr, alen);
+    dmi->dmi_addrlen = alen;
+    dmi->next = dev->mc_list;
+    dmi->dmi_users = 1;
+    dmi->dmi_gusers = glbl ? 1 : 0;
+    dev->mc_list = dmi;
+    dev->mc_count++;
+
+    __rtdev_mc_upload(dev);
+
+    rtdm_mutex_unlock(&dev->xmit_mutex);
+    return 0;
+
+done:
+    rtdm_mutex_unlock(&dev->xmit_mutex);
+    if (dmi1)
+        kfree(dmi1);
+    return err;
+}
+
+/*
+ *  Discard multicast list when a device is downed
+ */
+
+void rtdev_mc_discard(struct rtnet_device *dev)
+{
+    rtdm_mutex_lock(&dev->xmit_mutex);
+
+    while (dev->mc_list != NULL) {
+        struct dev_mc_list *tmp = dev->mc_list;
+        dev->mc_list = tmp->next;
+        if (tmp->dmi_users > tmp->dmi_gusers)
+            rtdm_printk("dev_mc_discard: multicast leakage! dmi_users=%d\n", tmp->dmi_users);
+        kfree(tmp);
+    }
+    dev->mc_count = 0;
+
+    rtdm_mutex_lock(&dev->xmit_mutex);
+}
+
+#endif
+
 EXPORT_SYMBOL(rt_alloc_etherdev);
 EXPORT_SYMBOL(rtdev_free);
 
@@ -638,4 +832,10 @@
 EXPORT_SYMBOL(rtdev_xmit_proxy);
 #endif
 
+#ifdef CONFIG_RTNET_MULTICAST
+EXPORT_SYMBOL(rtdev_mc_add);
+EXPORT_SYMBOL(rtdev_mc_delete);
+EXPORT_SYMBOL(rt_ip_dev_find);
+#endif
+
 EXPORT_SYMBOL(rt_hard_mtu);
Index: drivers/e1000/e1000_main.c
===================================================================
--- drivers/e1000/e1000_main.c	(révision 1155)
+++ drivers/e1000/e1000_main.c	(copie de travail)
@@ -771,7 +771,9 @@
 	netdev->stop = &e1000_close;
 	netdev->hard_start_xmit = &e1000_xmit_frame;
 	// netdev->get_stats = &e1000_get_stats;
-	// netdev->set_multicast_list = &e1000_set_multi;
+#ifdef CONFIG_RTNET_MULTICAST
+	netdev->set_multicast_list = &e1000_set_multi;
+#endif
 	// netdev->set_mac_address = &e1000_set_mac;
 	// netdev->change_mtu = &e1000_change_mtu;
 	// netdev->do_ioctl = &e1000_ioctl;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
RTnet-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rtnet-developers

Reply via email to