aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding/bond_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r--drivers/net/bonding/bond_main.c157
1 files changed, 51 insertions, 106 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index d6ae63b2cf00..22682f1c8473 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -762,32 +762,6 @@ static int bond_check_dev_link(struct bonding *bond,
762/*----------------------------- Multicast list ------------------------------*/ 762/*----------------------------- Multicast list ------------------------------*/
763 763
764/* 764/*
765 * Returns 0 if dmi1 and dmi2 are the same, non-0 otherwise
766 */
767static inline int bond_is_dmi_same(const struct dev_mc_list *dmi1,
768 const struct dev_mc_list *dmi2)
769{
770 return memcmp(dmi1->dmi_addr, dmi2->dmi_addr, dmi1->dmi_addrlen) == 0 &&
771 dmi1->dmi_addrlen == dmi2->dmi_addrlen;
772}
773
774/*
775 * returns dmi entry if found, NULL otherwise
776 */
777static struct dev_mc_list *bond_mc_list_find_dmi(struct dev_mc_list *dmi,
778 struct dev_mc_list *mc_list)
779{
780 struct dev_mc_list *idmi;
781
782 for (idmi = mc_list; idmi; idmi = idmi->next) {
783 if (bond_is_dmi_same(dmi, idmi))
784 return idmi;
785 }
786
787 return NULL;
788}
789
790/*
791 * Push the promiscuity flag down to appropriate slaves 765 * Push the promiscuity flag down to appropriate slaves
792 */ 766 */
793static int bond_set_promiscuity(struct bonding *bond, int inc) 767static int bond_set_promiscuity(struct bonding *bond, int inc)
@@ -839,18 +813,18 @@ static int bond_set_allmulti(struct bonding *bond, int inc)
839 * Add a Multicast address to slaves 813 * Add a Multicast address to slaves
840 * according to mode 814 * according to mode
841 */ 815 */
842static void bond_mc_add(struct bonding *bond, void *addr, int alen) 816static void bond_mc_add(struct bonding *bond, void *addr)
843{ 817{
844 if (USES_PRIMARY(bond->params.mode)) { 818 if (USES_PRIMARY(bond->params.mode)) {
845 /* write lock already acquired */ 819 /* write lock already acquired */
846 if (bond->curr_active_slave) 820 if (bond->curr_active_slave)
847 dev_mc_add(bond->curr_active_slave->dev, addr, alen, 0); 821 dev_mc_add(bond->curr_active_slave->dev, addr);
848 } else { 822 } else {
849 struct slave *slave; 823 struct slave *slave;
850 int i; 824 int i;
851 825
852 bond_for_each_slave(bond, slave, i) 826 bond_for_each_slave(bond, slave, i)
853 dev_mc_add(slave->dev, addr, alen, 0); 827 dev_mc_add(slave->dev, addr);
854 } 828 }
855} 829}
856 830
@@ -858,18 +832,17 @@ static void bond_mc_add(struct bonding *bond, void *addr, int alen)
858 * Remove a multicast address from slave 832 * Remove a multicast address from slave
859 * according to mode 833 * according to mode
860 */ 834 */
861static void bond_mc_delete(struct bonding *bond, void *addr, int alen) 835static void bond_mc_del(struct bonding *bond, void *addr)
862{ 836{
863 if (USES_PRIMARY(bond->params.mode)) { 837 if (USES_PRIMARY(bond->params.mode)) {
864 /* write lock already acquired */ 838 /* write lock already acquired */
865 if (bond->curr_active_slave) 839 if (bond->curr_active_slave)
866 dev_mc_delete(bond->curr_active_slave->dev, addr, 840 dev_mc_del(bond->curr_active_slave->dev, addr);
867 alen, 0);
868 } else { 841 } else {
869 struct slave *slave; 842 struct slave *slave;
870 int i; 843 int i;
871 bond_for_each_slave(bond, slave, i) { 844 bond_for_each_slave(bond, slave, i) {
872 dev_mc_delete(slave->dev, addr, alen, 0); 845 dev_mc_del(slave->dev, addr);
873 } 846 }
874 } 847 }
875} 848}
@@ -896,66 +869,22 @@ static void bond_resend_igmp_join_requests(struct bonding *bond)
896} 869}
897 870
898/* 871/*
899 * Totally destroys the mc_list in bond
900 */
901static void bond_mc_list_destroy(struct bonding *bond)
902{
903 struct dev_mc_list *dmi;
904
905 dmi = bond->mc_list;
906 while (dmi) {
907 bond->mc_list = dmi->next;
908 kfree(dmi);
909 dmi = bond->mc_list;
910 }
911
912 bond->mc_list = NULL;
913}
914
915/*
916 * Copy all the Multicast addresses from src to the bonding device dst
917 */
918static int bond_mc_list_copy(struct dev_mc_list *mc_list, struct bonding *bond,
919 gfp_t gfp_flag)
920{
921 struct dev_mc_list *dmi, *new_dmi;
922
923 for (dmi = mc_list; dmi; dmi = dmi->next) {
924 new_dmi = kmalloc(sizeof(struct dev_mc_list), gfp_flag);
925
926 if (!new_dmi) {
927 /* FIXME: Potential memory leak !!! */
928 return -ENOMEM;
929 }
930
931 new_dmi->next = bond->mc_list;
932 bond->mc_list = new_dmi;
933 new_dmi->dmi_addrlen = dmi->dmi_addrlen;
934 memcpy(new_dmi->dmi_addr, dmi->dmi_addr, dmi->dmi_addrlen);
935 new_dmi->dmi_users = dmi->dmi_users;
936 new_dmi->dmi_gusers = dmi->dmi_gusers;
937 }
938
939 return 0;
940}
941
942/*
943 * flush all members of flush->mc_list from device dev->mc_list 872 * flush all members of flush->mc_list from device dev->mc_list
944 */ 873 */
945static void bond_mc_list_flush(struct net_device *bond_dev, 874static void bond_mc_list_flush(struct net_device *bond_dev,
946 struct net_device *slave_dev) 875 struct net_device *slave_dev)
947{ 876{
948 struct bonding *bond = netdev_priv(bond_dev); 877 struct bonding *bond = netdev_priv(bond_dev);
949 struct dev_mc_list *dmi; 878 struct netdev_hw_addr *ha;
950 879
951 for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) 880 netdev_for_each_mc_addr(ha, bond_dev)
952 dev_mc_delete(slave_dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); 881 dev_mc_del(slave_dev, ha->addr);
953 882
954 if (bond->params.mode == BOND_MODE_8023AD) { 883 if (bond->params.mode == BOND_MODE_8023AD) {
955 /* del lacpdu mc addr from mc list */ 884 /* del lacpdu mc addr from mc list */
956 u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR; 885 u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
957 886
958 dev_mc_delete(slave_dev, lacpdu_multicast, ETH_ALEN, 0); 887 dev_mc_del(slave_dev, lacpdu_multicast);
959 } 888 }
960} 889}
961 890
@@ -969,7 +898,7 @@ static void bond_mc_list_flush(struct net_device *bond_dev,
969static void bond_mc_swap(struct bonding *bond, struct slave *new_active, 898static void bond_mc_swap(struct bonding *bond, struct slave *new_active,
970 struct slave *old_active) 899 struct slave *old_active)
971{ 900{
972 struct dev_mc_list *dmi; 901 struct netdev_hw_addr *ha;
973 902
974 if (!USES_PRIMARY(bond->params.mode)) 903 if (!USES_PRIMARY(bond->params.mode))
975 /* nothing to do - mc list is already up-to-date on 904 /* nothing to do - mc list is already up-to-date on
@@ -984,9 +913,8 @@ static void bond_mc_swap(struct bonding *bond, struct slave *new_active,
984 if (bond->dev->flags & IFF_ALLMULTI) 913 if (bond->dev->flags & IFF_ALLMULTI)
985 dev_set_allmulti(old_active->dev, -1); 914 dev_set_allmulti(old_active->dev, -1);
986 915
987 for (dmi = bond->dev->mc_list; dmi; dmi = dmi->next) 916 netdev_for_each_mc_addr(ha, bond->dev)
988 dev_mc_delete(old_active->dev, dmi->dmi_addr, 917 dev_mc_del(old_active->dev, ha->addr);
989 dmi->dmi_addrlen, 0);
990 } 918 }
991 919
992 if (new_active) { 920 if (new_active) {
@@ -997,9 +925,8 @@ static void bond_mc_swap(struct bonding *bond, struct slave *new_active,
997 if (bond->dev->flags & IFF_ALLMULTI) 925 if (bond->dev->flags & IFF_ALLMULTI)
998 dev_set_allmulti(new_active->dev, 1); 926 dev_set_allmulti(new_active->dev, 1);
999 927
1000 for (dmi = bond->dev->mc_list; dmi; dmi = dmi->next) 928 netdev_for_each_mc_addr(ha, bond->dev)
1001 dev_mc_add(new_active->dev, dmi->dmi_addr, 929 dev_mc_add(new_active->dev, ha->addr);
1002 dmi->dmi_addrlen, 0);
1003 bond_resend_igmp_join_requests(bond); 930 bond_resend_igmp_join_requests(bond);
1004 } 931 }
1005} 932}
@@ -1406,7 +1333,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1406 struct bonding *bond = netdev_priv(bond_dev); 1333 struct bonding *bond = netdev_priv(bond_dev);
1407 const struct net_device_ops *slave_ops = slave_dev->netdev_ops; 1334 const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
1408 struct slave *new_slave = NULL; 1335 struct slave *new_slave = NULL;
1409 struct dev_mc_list *dmi; 1336 struct netdev_hw_addr *ha;
1410 struct sockaddr addr; 1337 struct sockaddr addr;
1411 int link_reporting; 1338 int link_reporting;
1412 int old_features = bond_dev->features; 1339 int old_features = bond_dev->features;
@@ -1492,7 +1419,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1492 1419
1493 /* Flush unicast and multicast addresses */ 1420 /* Flush unicast and multicast addresses */
1494 dev_uc_flush(bond_dev); 1421 dev_uc_flush(bond_dev);
1495 dev_addr_discard(bond_dev); 1422 dev_mc_flush(bond_dev);
1496 1423
1497 if (slave_dev->type != ARPHRD_ETHER) 1424 if (slave_dev->type != ARPHRD_ETHER)
1498 bond_setup_by_slave(bond_dev, slave_dev); 1425 bond_setup_by_slave(bond_dev, slave_dev);
@@ -1601,9 +1528,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1601 1528
1602 netif_addr_lock_bh(bond_dev); 1529 netif_addr_lock_bh(bond_dev);
1603 /* upload master's mc_list to new slave */ 1530 /* upload master's mc_list to new slave */
1604 for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) 1531 netdev_for_each_mc_addr(ha, bond_dev)
1605 dev_mc_add(slave_dev, dmi->dmi_addr, 1532 dev_mc_add(slave_dev, ha->addr);
1606 dmi->dmi_addrlen, 0);
1607 netif_addr_unlock_bh(bond_dev); 1533 netif_addr_unlock_bh(bond_dev);
1608 } 1534 }
1609 1535
@@ -1611,7 +1537,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1611 /* add lacpdu mc addr to mc list */ 1537 /* add lacpdu mc addr to mc list */
1612 u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR; 1538 u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
1613 1539
1614 dev_mc_add(slave_dev, lacpdu_multicast, ETH_ALEN, 0); 1540 dev_mc_add(slave_dev, lacpdu_multicast);
1615 } 1541 }
1616 1542
1617 bond_add_vlans_on_slave(bond, slave_dev); 1543 bond_add_vlans_on_slave(bond, slave_dev);
@@ -3913,10 +3839,24 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
3913 return res; 3839 return res;
3914} 3840}
3915 3841
3842static bool bond_addr_in_mc_list(unsigned char *addr,
3843 struct netdev_hw_addr_list *list,
3844 int addrlen)
3845{
3846 struct netdev_hw_addr *ha;
3847
3848 netdev_hw_addr_list_for_each(ha, list)
3849 if (!memcmp(ha->addr, addr, addrlen))
3850 return true;
3851
3852 return false;
3853}
3854
3916static void bond_set_multicast_list(struct net_device *bond_dev) 3855static void bond_set_multicast_list(struct net_device *bond_dev)
3917{ 3856{
3918 struct bonding *bond = netdev_priv(bond_dev); 3857 struct bonding *bond = netdev_priv(bond_dev);
3919 struct dev_mc_list *dmi; 3858 struct netdev_hw_addr *ha;
3859 bool found;
3920 3860
3921 /* 3861 /*
3922 * Do promisc before checking multicast_mode 3862 * Do promisc before checking multicast_mode
@@ -3951,20 +3891,25 @@ static void bond_set_multicast_list(struct net_device *bond_dev)
3951 bond->flags = bond_dev->flags; 3891 bond->flags = bond_dev->flags;
3952 3892
3953 /* looking for addresses to add to slaves' mc list */ 3893 /* looking for addresses to add to slaves' mc list */
3954 for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) { 3894 netdev_for_each_mc_addr(ha, bond_dev) {
3955 if (!bond_mc_list_find_dmi(dmi, bond->mc_list)) 3895 found = bond_addr_in_mc_list(ha->addr, &bond->mc_list,
3956 bond_mc_add(bond, dmi->dmi_addr, dmi->dmi_addrlen); 3896 bond_dev->addr_len);
3897 if (!found)
3898 bond_mc_add(bond, ha->addr);
3957 } 3899 }
3958 3900
3959 /* looking for addresses to delete from slaves' list */ 3901 /* looking for addresses to delete from slaves' list */
3960 for (dmi = bond->mc_list; dmi; dmi = dmi->next) { 3902 netdev_hw_addr_list_for_each(ha, &bond->mc_list) {
3961 if (!bond_mc_list_find_dmi(dmi, bond_dev->mc_list)) 3903 found = bond_addr_in_mc_list(ha->addr, &bond_dev->mc,
3962 bond_mc_delete(bond, dmi->dmi_addr, dmi->dmi_addrlen); 3904 bond_dev->addr_len);
3905 if (!found)
3906 bond_mc_del(bond, ha->addr);
3963 } 3907 }
3964 3908
3965 /* save master's multicast list */ 3909 /* save master's multicast list */
3966 bond_mc_list_destroy(bond); 3910 __hw_addr_flush(&bond->mc_list);
3967 bond_mc_list_copy(bond_dev->mc_list, bond, GFP_ATOMIC); 3911 __hw_addr_add_multiple(&bond->mc_list, &bond_dev->mc,
3912 bond_dev->addr_len, NETDEV_HW_ADDR_T_MULTICAST);
3968 3913
3969 read_unlock(&bond->lock); 3914 read_unlock(&bond->lock);
3970} 3915}
@@ -4534,9 +4479,7 @@ static void bond_uninit(struct net_device *bond_dev)
4534 if (bond->wq) 4479 if (bond->wq)
4535 destroy_workqueue(bond->wq); 4480 destroy_workqueue(bond->wq);
4536 4481
4537 netif_addr_lock_bh(bond_dev); 4482 __hw_addr_flush(&bond->mc_list);
4538 bond_mc_list_destroy(bond);
4539 netif_addr_unlock_bh(bond_dev);
4540} 4483}
4541 4484
4542/*------------------------- Module initialization ---------------------------*/ 4485/*------------------------- Module initialization ---------------------------*/
@@ -4908,6 +4851,8 @@ static int bond_init(struct net_device *bond_dev)
4908 list_add_tail(&bond->bond_list, &bn->dev_list); 4851 list_add_tail(&bond->bond_list, &bn->dev_list);
4909 4852
4910 bond_prepare_sysfs_group(bond); 4853 bond_prepare_sysfs_group(bond);
4854
4855 __hw_addr_init(&bond->mc_list);
4911 return 0; 4856 return 0;
4912} 4857}
4913 4858