Skip to content

Commit

Permalink
net: group address list and its count
Browse files Browse the repository at this point in the history
This patch is inspired by patch recently posted by Johannes Berg. Basically what
my patch does is to group list and a count of addresses into newly introduced
structure netdev_hw_addr_list. This brings us two benefits:
1) struct net_device becames a bit nicer.
2) in the future there will be a possibility to operate with lists independently
   on netdevices (with exporting right functions).
I wanted to introduce this patch before I'll post a multicast lists conversion.

Signed-off-by: Jiri Pirko <jpirko@redhat.com>

 drivers/net/bnx2.c              |    4 +-
 drivers/net/e1000/e1000_main.c  |    4 +-
 drivers/net/ixgbe/ixgbe_main.c  |    6 +-
 drivers/net/mv643xx_eth.c       |    2 +-
 drivers/net/niu.c               |    4 +-
 drivers/net/virtio_net.c        |   10 ++--
 drivers/s390/net/qeth_l2_main.c |    2 +-
 include/linux/netdevice.h       |   17 +++--
 net/core/dev.c                  |  130 ++++++++++++++++++--------------------
 9 files changed, 89 insertions(+), 90 deletions(-)
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jiri Pirko authored and David S. Miller committed Jun 18, 2009
1 parent 7b85576 commit 31278e7
Show file tree
Hide file tree
Showing 9 changed files with 89 additions and 90 deletions.
4 changes: 2 additions & 2 deletions drivers/net/bnx2.c
Original file line number Diff line number Diff line change
Expand Up @@ -3552,14 +3552,14 @@ bnx2_set_rx_mode(struct net_device *dev)
sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN;
}

if (dev->uc_count > BNX2_MAX_UNICAST_ADDRESSES) {
if (dev->uc.count > BNX2_MAX_UNICAST_ADDRESSES) {
rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN |
BNX2_RPM_SORT_USER0_PROM_VLAN;
} else if (!(dev->flags & IFF_PROMISC)) {
/* Add all entries into to the match filter list */
i = 0;
list_for_each_entry(ha, &dev->uc_list, list) {
list_for_each_entry(ha, &dev->uc.list, list) {
bnx2_set_mac_addr(bp, ha->addr,
i + BNX2_START_UNICAST_ADDRESS_INDEX);
sort_mode |= (1 <<
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/e1000/e1000_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2370,7 +2370,7 @@ static void e1000_set_rx_mode(struct net_device *netdev)
rctl |= E1000_RCTL_VFE;
}

if (netdev->uc_count > rar_entries - 1) {
if (netdev->uc.count > rar_entries - 1) {
rctl |= E1000_RCTL_UPE;
} else if (!(netdev->flags & IFF_PROMISC)) {
rctl &= ~E1000_RCTL_UPE;
Expand All @@ -2394,7 +2394,7 @@ static void e1000_set_rx_mode(struct net_device *netdev)
*/
i = 1;
if (use_uc)
list_for_each_entry(ha, &netdev->uc_list, list) {
list_for_each_entry(ha, &netdev->uc.list, list) {
if (i == rar_entries)
break;
e1000_rar_set(hw, ha->addr, i++);
Expand Down
6 changes: 3 additions & 3 deletions drivers/net/ixgbe/ixgbe_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2321,7 +2321,7 @@ static void ixgbe_set_rx_mode(struct net_device *netdev)
IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl);

/* reprogram secondary unicast list */
hw->mac.ops.update_uc_addr_list(hw, &netdev->uc_list);
hw->mac.ops.update_uc_addr_list(hw, &netdev->uc.list);

/* reprogram multicast list */
addr_count = netdev->mc_count;
Expand Down Expand Up @@ -5261,7 +5261,7 @@ static int ixgbe_ioctl(struct net_device *netdev, struct ifreq *req, int cmd)

/**
* ixgbe_add_sanmac_netdev - Add the SAN MAC address to the corresponding
* netdev->dev_addr_list
* netdev->dev_addrs
* @netdev: network interface device structure
*
* Returns non-zero on failure
Expand All @@ -5282,7 +5282,7 @@ static int ixgbe_add_sanmac_netdev(struct net_device *dev)

/**
* ixgbe_del_sanmac_netdev - Removes the SAN MAC address to the corresponding
* netdev->dev_addr_list
* netdev->dev_addrs
* @netdev: network interface device structure
*
* Returns non-zero on failure
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/mv643xx_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -1729,7 +1729,7 @@ static u32 uc_addr_filter_mask(struct net_device *dev)
return 0;

nibbles = 1 << (dev->dev_addr[5] & 0x0f);
list_for_each_entry(ha, &dev->uc_list, list) {
list_for_each_entry(ha, &dev->uc.list, list) {
if (memcmp(dev->dev_addr, ha->addr, 5))
return 0;
if ((dev->dev_addr[5] ^ ha->addr[5]) & 0xf0)
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/niu.c
Original file line number Diff line number Diff line change
Expand Up @@ -6376,7 +6376,7 @@ static void niu_set_rx_mode(struct net_device *dev)
if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 0))
np->flags |= NIU_FLAGS_MCAST;

alt_cnt = dev->uc_count;
alt_cnt = dev->uc.count;
if (alt_cnt > niu_num_alt_addr(np)) {
alt_cnt = 0;
np->flags |= NIU_FLAGS_PROMISC;
Expand All @@ -6385,7 +6385,7 @@ static void niu_set_rx_mode(struct net_device *dev)
if (alt_cnt) {
int index = 0;

list_for_each_entry(ha, &dev->uc_list, list) {
list_for_each_entry(ha, &dev->uc.list, list) {
err = niu_set_alt_mac(np, index, ha->addr);
if (err)
printk(KERN_WARNING PFX "%s: Error %d "
Expand Down
10 changes: 5 additions & 5 deletions drivers/net/virtio_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -709,7 +709,7 @@ static void virtnet_set_rx_mode(struct net_device *dev)
allmulti ? "en" : "dis");

/* MAC filter - use one buffer for both lists */
mac_data = buf = kzalloc(((dev->uc_count + dev->mc_count) * ETH_ALEN) +
mac_data = buf = kzalloc(((dev->uc.count + dev->mc_count) * ETH_ALEN) +
(2 * sizeof(mac_data->entries)), GFP_ATOMIC);
if (!buf) {
dev_warn(&dev->dev, "No memory for MAC address buffer\n");
Expand All @@ -719,16 +719,16 @@ static void virtnet_set_rx_mode(struct net_device *dev)
sg_init_table(sg, 2);

/* Store the unicast list and count in the front of the buffer */
mac_data->entries = dev->uc_count;
mac_data->entries = dev->uc.count;
i = 0;
list_for_each_entry(ha, &dev->uc_list, list)
list_for_each_entry(ha, &dev->uc.list, list)
memcpy(&mac_data->macs[i++][0], ha->addr, ETH_ALEN);

sg_set_buf(&sg[0], mac_data,
sizeof(mac_data->entries) + (dev->uc_count * ETH_ALEN));
sizeof(mac_data->entries) + (dev->uc.count * ETH_ALEN));

/* multicast list and count fill the end */
mac_data = (void *)&mac_data->macs[dev->uc_count][0];
mac_data = (void *)&mac_data->macs[dev->uc.count][0];

mac_data->entries = dev->mc_count;
addr = dev->mc_list;
Expand Down
2 changes: 1 addition & 1 deletion drivers/s390/net/qeth_l2_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -655,7 +655,7 @@ static void qeth_l2_set_multicast_list(struct net_device *dev)
for (dm = dev->mc_list; dm; dm = dm->next)
qeth_l2_add_mc(card, dm->da_addr, 0);

list_for_each_entry(ha, &dev->uc_list, list)
list_for_each_entry(ha, &dev->uc.list, list)
qeth_l2_add_mc(card, ha->addr, 1);

spin_unlock_bh(&card->mclock);
Expand Down
17 changes: 11 additions & 6 deletions include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,11 @@ struct netdev_hw_addr {
struct rcu_head rcu_head;
};

struct netdev_hw_addr_list {
struct list_head list;
int count;
};

struct hh_cache
{
struct hh_cache *hh_next; /* Next entry */
Expand Down Expand Up @@ -776,9 +781,8 @@ struct net_device
unsigned char addr_len; /* hardware address length */
unsigned short dev_id; /* for shared network cards */

struct list_head uc_list; /* Secondary unicast mac
addresses */
int uc_count; /* Number of installed ucasts */
struct netdev_hw_addr_list uc; /* Secondary unicast
mac addresses */
int uc_promisc;
spinlock_t addr_list_lock;
struct dev_addr_list *mc_list; /* Multicast mac addresses */
Expand Down Expand Up @@ -810,7 +814,8 @@ struct net_device
because most packets are
unicast) */

struct list_head dev_addr_list; /* list of device hw addresses */
struct netdev_hw_addr_list dev_addrs; /* list of device
hw addresses */

unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */

Expand Down Expand Up @@ -1806,11 +1811,11 @@ static inline void netif_addr_unlock_bh(struct net_device *dev)
}

/*
* dev_addr_list walker. Should be used only for read access. Call with
* dev_addrs walker. Should be used only for read access. Call with
* rcu_read_lock held.
*/
#define for_each_dev_addr(dev, ha) \
list_for_each_entry_rcu(ha, &dev->dev_addr_list, list)
list_for_each_entry_rcu(ha, &dev->dev_addrs.list, list)

/* These functions live elsewhere (drivers/net/net_init.c, but related) */

Expand Down
Loading

0 comments on commit 31278e7

Please sign in to comment.