diff -urN driverloader-2.50-cpp/modules/GPL/netndis.c driverloader-2.50-multicast/modules/GPL/netndis.c --- driverloader-2.50-cpp/modules/GPL/netndis.c 2009-10-21 20:03:12.000000000 -0400 +++ driverloader-2.50-multicast/modules/GPL/netndis.c 2010-09-02 14:53:22.490960344 -0400 @@ -1675,12 +1675,13 @@ //printk("%s: dev=%p\n", __FUNCTION__, dev); - if((dev->flags & IFF_ALLMULTI) || (dev->mc_count > priv->max_multicast)) { + mc_count = netdev_mc_count(dev); + + if((dev->flags & IFF_ALLMULTI) || (mc_count > priv->max_multicast)) { priv->allmulti = 1; mc_count = 0; } else { priv->allmulti = 0; - mc_count = dev->mc_count; } if (dev->flags & IFF_PROMISC) { @@ -1690,7 +1691,7 @@ } if (mc_count) { - struct dev_mc_list *p = dev->mc_list; + struct dev_mc_list *p; unsigned char *mclist; int i; @@ -1700,19 +1701,24 @@ err = -ENOMEM; mc_count = 0; } else { - for (i = 0; i < mc_count; i++) { + i = 0; + netdev_for_each_mc_addr(p, dev) { /* Paranoia: */ - if (!p) - BUG(); /* Multicast list shorter than mc_count */ - if (p->dmi_addrlen != ETH_ALEN) + if (i == mc_count) + break; + if (netndis_mc_list_get_addrlen(p) != ETH_ALEN) BUG(); /* Bad address size in multicast list */ - memcpy(mclist + (i*ETH_ALEN), p->dmi_addr, ETH_ALEN); - p = p->next; + memcpy(mclist + (i*ETH_ALEN), netndis_mc_list_get_addr(p), ETH_ALEN); + i++; } - if (p) - printk(KERN_WARNING "Multicast list is longer than mc_count\n"); + if (i != mc_count) { + if (i > mc_count) + printk(KERN_WARNING "Multicast list is longer than mc_count\n"); + if (i < mc_count) + BUG(); /* Multicast list shorter than mc_count */ + } err = NdisWrapStatusToErrno( NdisWrapSetMulticastList(priv->miniportAdapter, mclist, mc_count * ETH_ALEN)); diff -urN driverloader-2.50-cpp/modules/GPL/oscompat.h driverloader-2.50-multicast/modules/GPL/oscompat.h --- driverloader-2.50-cpp/modules/GPL/oscompat.h 2009-04-23 10:50:30.000000000 -0400 +++ driverloader-2.50-multicast/modules/GPL/oscompat.h 2010-09-02 15:10:04.602952819 -0400 @@ -679,4 +679,29 @@ #define FOUND_REGPARM #endif +/* -------------------- Multicast newer API -------------------- */ +#ifndef netdev_mc_count +#define netdev_mc_count(dev) ((dev)->mc_count) +#endif + +#ifndef netdev_mc_empty +#define netdev_mc_empty(dev) (netdev_mc_count(dev) == 0) +#endif + +#ifndef netdev_for_each_mc_addr +#define netdev_for_each_mc_addr(mclist, dev) \ + for (mclist = dev->mc_list; mclist; mclist = mclist->next) +#endif + +#ifdef netdev_hw_addr_list_count +# define dev_mc_list netdev_hw_addr +# define netndis_mc_list_get_addr(mclist) (mclist)->addr +/* XXX: We don't have addrlen with the new API? */ +# define netndis_mc_list_get_addrlen(mclist) (ETH_ALEN) +#else +# define netndis_mc_list_get_addr(mclist) (mclist)->dmi_addr +# define netndis_mc_list_get_addrlen(mclist) (mclist)->dmi_addrlen +#endif /* dev_mc_list */ +/* ------------------------------------------------------------- */ + #endif /* __OSCOMPAT_H */