1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * net/core/dev_addr_lists.c - Functions for handling net device lists
4 * Copyright (c) 2010 Jiri Pirko <jpirko@redhat.com>
6 * This file contains functions for working with unicast, multicast and device
10 #include <linux/netdevice.h>
11 #include <linux/rtnetlink.h>
12 #include <linux/export.h>
13 #include <linux/list.h>
18 * General list handling functions
21 static int __hw_addr_insert(struct netdev_hw_addr_list
*list
,
22 struct netdev_hw_addr
*new, int addr_len
)
24 struct rb_node
**ins_point
= &list
->tree
.rb_node
, *parent
= NULL
;
25 struct netdev_hw_addr
*ha
;
30 ha
= rb_entry(*ins_point
, struct netdev_hw_addr
, node
);
31 diff
= memcmp(new->addr
, ha
->addr
, addr_len
);
33 diff
= memcmp(&new->type
, &ha
->type
, sizeof(new->type
));
37 ins_point
= &parent
->rb_left
;
39 ins_point
= &parent
->rb_right
;
44 rb_link_node_rcu(&new->node
, parent
, ins_point
);
45 rb_insert_color(&new->node
, &list
->tree
);
50 static struct netdev_hw_addr
*
51 __hw_addr_create(const unsigned char *addr
, int addr_len
,
52 unsigned char addr_type
, bool global
, bool sync
)
54 struct netdev_hw_addr
*ha
;
57 alloc_size
= sizeof(*ha
);
58 if (alloc_size
< L1_CACHE_BYTES
)
59 alloc_size
= L1_CACHE_BYTES
;
60 ha
= kmalloc(alloc_size
, GFP_ATOMIC
);
63 memcpy(ha
->addr
, addr
, addr_len
);
66 ha
->global_use
= global
;
67 ha
->synced
= sync
? 1 : 0;
73 static int __hw_addr_add_ex(struct netdev_hw_addr_list
*list
,
74 const unsigned char *addr
, int addr_len
,
75 unsigned char addr_type
, bool global
, bool sync
,
76 int sync_count
, bool exclusive
)
78 struct rb_node
**ins_point
= &list
->tree
.rb_node
, *parent
= NULL
;
79 struct netdev_hw_addr
*ha
;
81 if (addr_len
> MAX_ADDR_LEN
)
87 ha
= rb_entry(*ins_point
, struct netdev_hw_addr
, node
);
88 diff
= memcmp(addr
, ha
->addr
, addr_len
);
90 diff
= memcmp(&addr_type
, &ha
->type
, sizeof(addr_type
));
94 ins_point
= &parent
->rb_left
;
95 } else if (diff
> 0) {
96 ins_point
= &parent
->rb_right
;
101 /* check if addr is already used as global */
105 ha
->global_use
= true;
108 if (ha
->synced
&& sync_count
)
118 ha
= __hw_addr_create(addr
, addr_len
, addr_type
, global
, sync
);
122 rb_link_node(&ha
->node
, parent
, ins_point
);
123 rb_insert_color(&ha
->node
, &list
->tree
);
125 list_add_tail_rcu(&ha
->list
, &list
->list
);
131 static int __hw_addr_add(struct netdev_hw_addr_list
*list
,
132 const unsigned char *addr
, int addr_len
,
133 unsigned char addr_type
)
135 return __hw_addr_add_ex(list
, addr
, addr_len
, addr_type
, false, false,
139 static int __hw_addr_del_entry(struct netdev_hw_addr_list
*list
,
140 struct netdev_hw_addr
*ha
, bool global
,
143 if (global
&& !ha
->global_use
)
146 if (sync
&& !ha
->synced
)
150 ha
->global_use
= false;
158 rb_erase(&ha
->node
, &list
->tree
);
160 list_del_rcu(&ha
->list
);
161 kfree_rcu(ha
, rcu_head
);
166 static struct netdev_hw_addr
*__hw_addr_lookup(struct netdev_hw_addr_list
*list
,
167 const unsigned char *addr
, int addr_len
,
168 unsigned char addr_type
)
170 struct rb_node
*node
;
172 node
= list
->tree
.rb_node
;
175 struct netdev_hw_addr
*ha
= rb_entry(node
, struct netdev_hw_addr
, node
);
176 int diff
= memcmp(addr
, ha
->addr
, addr_len
);
178 if (diff
== 0 && addr_type
)
179 diff
= memcmp(&addr_type
, &ha
->type
, sizeof(addr_type
));
182 node
= node
->rb_left
;
184 node
= node
->rb_right
;
192 static int __hw_addr_del_ex(struct netdev_hw_addr_list
*list
,
193 const unsigned char *addr
, int addr_len
,
194 unsigned char addr_type
, bool global
, bool sync
)
196 struct netdev_hw_addr
*ha
= __hw_addr_lookup(list
, addr
, addr_len
, addr_type
);
200 return __hw_addr_del_entry(list
, ha
, global
, sync
);
203 static int __hw_addr_del(struct netdev_hw_addr_list
*list
,
204 const unsigned char *addr
, int addr_len
,
205 unsigned char addr_type
)
207 return __hw_addr_del_ex(list
, addr
, addr_len
, addr_type
, false, false);
210 static int __hw_addr_sync_one(struct netdev_hw_addr_list
*to_list
,
211 struct netdev_hw_addr
*ha
,
216 err
= __hw_addr_add_ex(to_list
, ha
->addr
, addr_len
, ha
->type
,
217 false, true, ha
->sync_cnt
, false);
218 if (err
&& err
!= -EEXIST
)
229 static void __hw_addr_unsync_one(struct netdev_hw_addr_list
*to_list
,
230 struct netdev_hw_addr_list
*from_list
,
231 struct netdev_hw_addr
*ha
,
236 err
= __hw_addr_del_ex(to_list
, ha
->addr
, addr_len
, ha
->type
,
241 /* address on from list is not marked synced */
242 __hw_addr_del_entry(from_list
, ha
, false, false);
245 static int __hw_addr_sync_multiple(struct netdev_hw_addr_list
*to_list
,
246 struct netdev_hw_addr_list
*from_list
,
250 struct netdev_hw_addr
*ha
, *tmp
;
252 list_for_each_entry_safe(ha
, tmp
, &from_list
->list
, list
) {
253 if (ha
->sync_cnt
== ha
->refcount
) {
254 __hw_addr_unsync_one(to_list
, from_list
, ha
, addr_len
);
256 err
= __hw_addr_sync_one(to_list
, ha
, addr_len
);
264 /* This function only works where there is a strict 1-1 relationship
265 * between source and destination of they synch. If you ever need to
266 * sync addresses to more then 1 destination, you need to use
267 * __hw_addr_sync_multiple().
269 int __hw_addr_sync(struct netdev_hw_addr_list
*to_list
,
270 struct netdev_hw_addr_list
*from_list
,
274 struct netdev_hw_addr
*ha
, *tmp
;
276 list_for_each_entry_safe(ha
, tmp
, &from_list
->list
, list
) {
278 err
= __hw_addr_sync_one(to_list
, ha
, addr_len
);
281 } else if (ha
->refcount
== 1)
282 __hw_addr_unsync_one(to_list
, from_list
, ha
, addr_len
);
286 EXPORT_SYMBOL(__hw_addr_sync
);
288 void __hw_addr_unsync(struct netdev_hw_addr_list
*to_list
,
289 struct netdev_hw_addr_list
*from_list
,
292 struct netdev_hw_addr
*ha
, *tmp
;
294 list_for_each_entry_safe(ha
, tmp
, &from_list
->list
, list
) {
296 __hw_addr_unsync_one(to_list
, from_list
, ha
, addr_len
);
299 EXPORT_SYMBOL(__hw_addr_unsync
);
302 * __hw_addr_sync_dev - Synchronize device's multicast list
303 * @list: address list to synchronize
304 * @dev: device to sync
305 * @sync: function to call if address should be added
306 * @unsync: function to call if address should be removed
308 * This function is intended to be called from the ndo_set_rx_mode
309 * function of devices that require explicit address add/remove
310 * notifications. The unsync function may be NULL in which case
311 * the addresses requiring removal will simply be removed without
312 * any notification to the device.
314 int __hw_addr_sync_dev(struct netdev_hw_addr_list
*list
,
315 struct net_device
*dev
,
316 int (*sync
)(struct net_device
*, const unsigned char *),
317 int (*unsync
)(struct net_device
*,
318 const unsigned char *))
320 struct netdev_hw_addr
*ha
, *tmp
;
323 /* first go through and flush out any stale entries */
324 list_for_each_entry_safe(ha
, tmp
, &list
->list
, list
) {
325 if (!ha
->sync_cnt
|| ha
->refcount
!= 1)
328 /* if unsync is defined and fails defer unsyncing address */
329 if (unsync
&& unsync(dev
, ha
->addr
))
333 __hw_addr_del_entry(list
, ha
, false, false);
336 /* go through and sync new entries to the list */
337 list_for_each_entry_safe(ha
, tmp
, &list
->list
, list
) {
341 err
= sync(dev
, ha
->addr
);
351 EXPORT_SYMBOL(__hw_addr_sync_dev
);
354 * __hw_addr_ref_sync_dev - Synchronize device's multicast address list taking
355 * into account references
356 * @list: address list to synchronize
357 * @dev: device to sync
358 * @sync: function to call if address or reference on it should be added
359 * @unsync: function to call if address or some reference on it should removed
361 * This function is intended to be called from the ndo_set_rx_mode
362 * function of devices that require explicit address or references on it
363 * add/remove notifications. The unsync function may be NULL in which case
364 * the addresses or references on it requiring removal will simply be
365 * removed without any notification to the device. That is responsibility of
366 * the driver to identify and distribute address or references on it between
367 * internal address tables.
369 int __hw_addr_ref_sync_dev(struct netdev_hw_addr_list
*list
,
370 struct net_device
*dev
,
371 int (*sync
)(struct net_device
*,
372 const unsigned char *, int),
373 int (*unsync
)(struct net_device
*,
374 const unsigned char *, int))
376 struct netdev_hw_addr
*ha
, *tmp
;
379 /* first go through and flush out any unsynced/stale entries */
380 list_for_each_entry_safe(ha
, tmp
, &list
->list
, list
) {
381 /* sync if address is not used */
382 if ((ha
->sync_cnt
<< 1) <= ha
->refcount
)
385 /* if fails defer unsyncing address */
386 ref_cnt
= ha
->refcount
- ha
->sync_cnt
;
387 if (unsync
&& unsync(dev
, ha
->addr
, ref_cnt
))
390 ha
->refcount
= (ref_cnt
<< 1) + 1;
391 ha
->sync_cnt
= ref_cnt
;
392 __hw_addr_del_entry(list
, ha
, false, false);
395 /* go through and sync updated/new entries to the list */
396 list_for_each_entry_safe(ha
, tmp
, &list
->list
, list
) {
397 /* sync if address added or reused */
398 if ((ha
->sync_cnt
<< 1) >= ha
->refcount
)
401 ref_cnt
= ha
->refcount
- ha
->sync_cnt
;
402 err
= sync(dev
, ha
->addr
, ref_cnt
);
406 ha
->refcount
= ref_cnt
<< 1;
407 ha
->sync_cnt
= ref_cnt
;
412 EXPORT_SYMBOL(__hw_addr_ref_sync_dev
);
415 * __hw_addr_ref_unsync_dev - Remove synchronized addresses and references on
417 * @list: address list to remove synchronized addresses (references on it) from
418 * @dev: device to sync
419 * @unsync: function to call if address and references on it should be removed
421 * Remove all addresses that were added to the device by
422 * __hw_addr_ref_sync_dev(). This function is intended to be called from the
423 * ndo_stop or ndo_open functions on devices that require explicit address (or
424 * references on it) add/remove notifications. If the unsync function pointer
425 * is NULL then this function can be used to just reset the sync_cnt for the
426 * addresses in the list.
428 void __hw_addr_ref_unsync_dev(struct netdev_hw_addr_list
*list
,
429 struct net_device
*dev
,
430 int (*unsync
)(struct net_device
*,
431 const unsigned char *, int))
433 struct netdev_hw_addr
*ha
, *tmp
;
435 list_for_each_entry_safe(ha
, tmp
, &list
->list
, list
) {
439 /* if fails defer unsyncing address */
440 if (unsync
&& unsync(dev
, ha
->addr
, ha
->sync_cnt
))
443 ha
->refcount
-= ha
->sync_cnt
- 1;
445 __hw_addr_del_entry(list
, ha
, false, false);
448 EXPORT_SYMBOL(__hw_addr_ref_unsync_dev
);
451 * __hw_addr_unsync_dev - Remove synchronized addresses from device
452 * @list: address list to remove synchronized addresses from
453 * @dev: device to sync
454 * @unsync: function to call if address should be removed
456 * Remove all addresses that were added to the device by __hw_addr_sync_dev().
457 * This function is intended to be called from the ndo_stop or ndo_open
458 * functions on devices that require explicit address add/remove
459 * notifications. If the unsync function pointer is NULL then this function
460 * can be used to just reset the sync_cnt for the addresses in the list.
462 void __hw_addr_unsync_dev(struct netdev_hw_addr_list
*list
,
463 struct net_device
*dev
,
464 int (*unsync
)(struct net_device
*,
465 const unsigned char *))
467 struct netdev_hw_addr
*ha
, *tmp
;
469 list_for_each_entry_safe(ha
, tmp
, &list
->list
, list
) {
473 /* if unsync is defined and fails defer unsyncing address */
474 if (unsync
&& unsync(dev
, ha
->addr
))
478 __hw_addr_del_entry(list
, ha
, false, false);
481 EXPORT_SYMBOL(__hw_addr_unsync_dev
);
483 static void __hw_addr_flush(struct netdev_hw_addr_list
*list
)
485 struct netdev_hw_addr
*ha
, *tmp
;
487 list
->tree
= RB_ROOT
;
488 list_for_each_entry_safe(ha
, tmp
, &list
->list
, list
) {
489 list_del_rcu(&ha
->list
);
490 kfree_rcu(ha
, rcu_head
);
495 void __hw_addr_init(struct netdev_hw_addr_list
*list
)
497 INIT_LIST_HEAD(&list
->list
);
499 list
->tree
= RB_ROOT
;
501 EXPORT_SYMBOL(__hw_addr_init
);
504 * Device addresses handling functions
507 /* Check that netdev->dev_addr is not written to directly as this would
508 * break the rbtree layout. All changes should go thru dev_addr_set() and co.
509 * Remove this check in mid-2024.
511 void dev_addr_check(struct net_device
*dev
)
513 if (!memcmp(dev
->dev_addr
, dev
->dev_addr_shadow
, MAX_ADDR_LEN
))
516 netdev_warn(dev
, "Current addr: %*ph\n", MAX_ADDR_LEN
, dev
->dev_addr
);
517 netdev_warn(dev
, "Expected addr: %*ph\n",
518 MAX_ADDR_LEN
, dev
->dev_addr_shadow
);
519 netdev_WARN(dev
, "Incorrect netdev->dev_addr\n");
523 * dev_addr_flush - Flush device address list
526 * Flush device address list and reset ->dev_addr.
528 * The caller must hold the rtnl_mutex.
530 void dev_addr_flush(struct net_device
*dev
)
532 /* rtnl_mutex must be held here */
535 __hw_addr_flush(&dev
->dev_addrs
);
536 dev
->dev_addr
= NULL
;
540 * dev_addr_init - Init device address list
543 * Init device address list and create the first element,
544 * used by ->dev_addr.
546 * The caller must hold the rtnl_mutex.
548 int dev_addr_init(struct net_device
*dev
)
550 unsigned char addr
[MAX_ADDR_LEN
];
551 struct netdev_hw_addr
*ha
;
554 /* rtnl_mutex must be held here */
556 __hw_addr_init(&dev
->dev_addrs
);
557 memset(addr
, 0, sizeof(addr
));
558 err
= __hw_addr_add(&dev
->dev_addrs
, addr
, sizeof(addr
),
559 NETDEV_HW_ADDR_T_LAN
);
562 * Get the first (previously created) address from the list
563 * and set dev_addr pointer to this location.
565 ha
= list_first_entry(&dev
->dev_addrs
.list
,
566 struct netdev_hw_addr
, list
);
567 dev
->dev_addr
= ha
->addr
;
572 void dev_addr_mod(struct net_device
*dev
, unsigned int offset
,
573 const void *addr
, size_t len
)
575 struct netdev_hw_addr
*ha
;
579 ha
= container_of(dev
->dev_addr
, struct netdev_hw_addr
, addr
[0]);
580 rb_erase(&ha
->node
, &dev
->dev_addrs
.tree
);
581 memcpy(&ha
->addr
[offset
], addr
, len
);
582 memcpy(&dev
->dev_addr_shadow
[offset
], addr
, len
);
583 WARN_ON(__hw_addr_insert(&dev
->dev_addrs
, ha
, dev
->addr_len
));
585 EXPORT_SYMBOL(dev_addr_mod
);
588 * dev_addr_add - Add a device address
590 * @addr: address to add
591 * @addr_type: address type
593 * Add a device address to the device or increase the reference count if
596 * The caller must hold the rtnl_mutex.
598 int dev_addr_add(struct net_device
*dev
, const unsigned char *addr
,
599 unsigned char addr_type
)
605 err
= dev_pre_changeaddr_notify(dev
, addr
, NULL
);
608 err
= __hw_addr_add(&dev
->dev_addrs
, addr
, dev
->addr_len
, addr_type
);
610 call_netdevice_notifiers(NETDEV_CHANGEADDR
, dev
);
613 EXPORT_SYMBOL(dev_addr_add
);
616 * dev_addr_del - Release a device address.
618 * @addr: address to delete
619 * @addr_type: address type
621 * Release reference to a device address and remove it from the device
622 * if the reference count drops to zero.
624 * The caller must hold the rtnl_mutex.
626 int dev_addr_del(struct net_device
*dev
, const unsigned char *addr
,
627 unsigned char addr_type
)
630 struct netdev_hw_addr
*ha
;
635 * We can not remove the first address from the list because
636 * dev->dev_addr points to that.
638 ha
= list_first_entry(&dev
->dev_addrs
.list
,
639 struct netdev_hw_addr
, list
);
640 if (!memcmp(ha
->addr
, addr
, dev
->addr_len
) &&
641 ha
->type
== addr_type
&& ha
->refcount
== 1)
644 err
= __hw_addr_del(&dev
->dev_addrs
, addr
, dev
->addr_len
,
647 call_netdevice_notifiers(NETDEV_CHANGEADDR
, dev
);
650 EXPORT_SYMBOL(dev_addr_del
);
653 * Unicast list handling functions
657 * dev_uc_add_excl - Add a global secondary unicast address
659 * @addr: address to add
661 int dev_uc_add_excl(struct net_device
*dev
, const unsigned char *addr
)
665 netif_addr_lock_bh(dev
);
666 err
= __hw_addr_add_ex(&dev
->uc
, addr
, dev
->addr_len
,
667 NETDEV_HW_ADDR_T_UNICAST
, true, false,
670 __dev_set_rx_mode(dev
);
671 netif_addr_unlock_bh(dev
);
674 EXPORT_SYMBOL(dev_uc_add_excl
);
677 * dev_uc_add - Add a secondary unicast address
679 * @addr: address to add
681 * Add a secondary unicast address to the device or increase
682 * the reference count if it already exists.
684 int dev_uc_add(struct net_device
*dev
, const unsigned char *addr
)
688 netif_addr_lock_bh(dev
);
689 err
= __hw_addr_add(&dev
->uc
, addr
, dev
->addr_len
,
690 NETDEV_HW_ADDR_T_UNICAST
);
692 __dev_set_rx_mode(dev
);
693 netif_addr_unlock_bh(dev
);
696 EXPORT_SYMBOL(dev_uc_add
);
699 * dev_uc_del - Release secondary unicast address.
701 * @addr: address to delete
703 * Release reference to a secondary unicast address and remove it
704 * from the device if the reference count drops to zero.
706 int dev_uc_del(struct net_device
*dev
, const unsigned char *addr
)
710 netif_addr_lock_bh(dev
);
711 err
= __hw_addr_del(&dev
->uc
, addr
, dev
->addr_len
,
712 NETDEV_HW_ADDR_T_UNICAST
);
714 __dev_set_rx_mode(dev
);
715 netif_addr_unlock_bh(dev
);
718 EXPORT_SYMBOL(dev_uc_del
);
721 * dev_uc_sync - Synchronize device's unicast list to another device
722 * @to: destination device
723 * @from: source device
725 * Add newly added addresses to the destination device and release
726 * addresses that have no users left. The source device must be
727 * locked by netif_addr_lock_bh.
729 * This function is intended to be called from the dev->set_rx_mode
730 * function of layered software devices. This function assumes that
731 * addresses will only ever be synced to the @to devices and no other.
733 int dev_uc_sync(struct net_device
*to
, struct net_device
*from
)
737 if (to
->addr_len
!= from
->addr_len
)
741 err
= __hw_addr_sync(&to
->uc
, &from
->uc
, to
->addr_len
);
743 __dev_set_rx_mode(to
);
744 netif_addr_unlock(to
);
747 EXPORT_SYMBOL(dev_uc_sync
);
750 * dev_uc_sync_multiple - Synchronize device's unicast list to another
751 * device, but allow for multiple calls to sync to multiple devices.
752 * @to: destination device
753 * @from: source device
755 * Add newly added addresses to the destination device and release
756 * addresses that have been deleted from the source. The source device
757 * must be locked by netif_addr_lock_bh.
759 * This function is intended to be called from the dev->set_rx_mode
760 * function of layered software devices. It allows for a single source
761 * device to be synced to multiple destination devices.
763 int dev_uc_sync_multiple(struct net_device
*to
, struct net_device
*from
)
767 if (to
->addr_len
!= from
->addr_len
)
771 err
= __hw_addr_sync_multiple(&to
->uc
, &from
->uc
, to
->addr_len
);
773 __dev_set_rx_mode(to
);
774 netif_addr_unlock(to
);
777 EXPORT_SYMBOL(dev_uc_sync_multiple
);
780 * dev_uc_unsync - Remove synchronized addresses from the destination device
781 * @to: destination device
782 * @from: source device
784 * Remove all addresses that were added to the destination device by
785 * dev_uc_sync(). This function is intended to be called from the
786 * dev->stop function of layered software devices.
788 void dev_uc_unsync(struct net_device
*to
, struct net_device
*from
)
790 if (to
->addr_len
!= from
->addr_len
)
793 /* netif_addr_lock_bh() uses lockdep subclass 0, this is okay for two
795 * 1) This is always called without any addr_list_lock, so as the
796 * outermost one here, it must be 0.
797 * 2) This is called by some callers after unlinking the upper device,
798 * so the dev->lower_level becomes 1 again.
799 * Therefore, the subclass for 'from' is 0, for 'to' is either 1 or
802 netif_addr_lock_bh(from
);
804 __hw_addr_unsync(&to
->uc
, &from
->uc
, to
->addr_len
);
805 __dev_set_rx_mode(to
);
806 netif_addr_unlock(to
);
807 netif_addr_unlock_bh(from
);
809 EXPORT_SYMBOL(dev_uc_unsync
);
812 * dev_uc_flush - Flush unicast addresses
815 * Flush unicast addresses.
817 void dev_uc_flush(struct net_device
*dev
)
819 netif_addr_lock_bh(dev
);
820 __hw_addr_flush(&dev
->uc
);
821 netif_addr_unlock_bh(dev
);
823 EXPORT_SYMBOL(dev_uc_flush
);
826 * dev_uc_init - Init unicast address list
829 * Init unicast address list.
831 void dev_uc_init(struct net_device
*dev
)
833 __hw_addr_init(&dev
->uc
);
835 EXPORT_SYMBOL(dev_uc_init
);
838 * Multicast list handling functions
842 * dev_mc_add_excl - Add a global secondary multicast address
844 * @addr: address to add
846 int dev_mc_add_excl(struct net_device
*dev
, const unsigned char *addr
)
850 netif_addr_lock_bh(dev
);
851 err
= __hw_addr_add_ex(&dev
->mc
, addr
, dev
->addr_len
,
852 NETDEV_HW_ADDR_T_MULTICAST
, true, false,
855 __dev_set_rx_mode(dev
);
856 netif_addr_unlock_bh(dev
);
859 EXPORT_SYMBOL(dev_mc_add_excl
);
861 static int __dev_mc_add(struct net_device
*dev
, const unsigned char *addr
,
866 netif_addr_lock_bh(dev
);
867 err
= __hw_addr_add_ex(&dev
->mc
, addr
, dev
->addr_len
,
868 NETDEV_HW_ADDR_T_MULTICAST
, global
, false,
871 __dev_set_rx_mode(dev
);
872 netif_addr_unlock_bh(dev
);
876 * dev_mc_add - Add a multicast address
878 * @addr: address to add
880 * Add a multicast address to the device or increase
881 * the reference count if it already exists.
883 int dev_mc_add(struct net_device
*dev
, const unsigned char *addr
)
885 return __dev_mc_add(dev
, addr
, false);
887 EXPORT_SYMBOL(dev_mc_add
);
890 * dev_mc_add_global - Add a global multicast address
892 * @addr: address to add
894 * Add a global multicast address to the device.
896 int dev_mc_add_global(struct net_device
*dev
, const unsigned char *addr
)
898 return __dev_mc_add(dev
, addr
, true);
900 EXPORT_SYMBOL(dev_mc_add_global
);
902 static int __dev_mc_del(struct net_device
*dev
, const unsigned char *addr
,
907 netif_addr_lock_bh(dev
);
908 err
= __hw_addr_del_ex(&dev
->mc
, addr
, dev
->addr_len
,
909 NETDEV_HW_ADDR_T_MULTICAST
, global
, false);
911 __dev_set_rx_mode(dev
);
912 netif_addr_unlock_bh(dev
);
917 * dev_mc_del - Delete a multicast address.
919 * @addr: address to delete
921 * Release reference to a multicast address and remove it
922 * from the device if the reference count drops to zero.
924 int dev_mc_del(struct net_device
*dev
, const unsigned char *addr
)
926 return __dev_mc_del(dev
, addr
, false);
928 EXPORT_SYMBOL(dev_mc_del
);
931 * dev_mc_del_global - Delete a global multicast address.
933 * @addr: address to delete
935 * Release reference to a multicast address and remove it
936 * from the device if the reference count drops to zero.
938 int dev_mc_del_global(struct net_device
*dev
, const unsigned char *addr
)
940 return __dev_mc_del(dev
, addr
, true);
942 EXPORT_SYMBOL(dev_mc_del_global
);
945 * dev_mc_sync - Synchronize device's multicast list to another device
946 * @to: destination device
947 * @from: source device
949 * Add newly added addresses to the destination device and release
950 * addresses that have no users left. The source device must be
951 * locked by netif_addr_lock_bh.
953 * This function is intended to be called from the ndo_set_rx_mode
954 * function of layered software devices.
956 int dev_mc_sync(struct net_device
*to
, struct net_device
*from
)
960 if (to
->addr_len
!= from
->addr_len
)
964 err
= __hw_addr_sync(&to
->mc
, &from
->mc
, to
->addr_len
);
966 __dev_set_rx_mode(to
);
967 netif_addr_unlock(to
);
970 EXPORT_SYMBOL(dev_mc_sync
);
973 * dev_mc_sync_multiple - Synchronize device's multicast list to another
974 * device, but allow for multiple calls to sync to multiple devices.
975 * @to: destination device
976 * @from: source device
978 * Add newly added addresses to the destination device and release
979 * addresses that have no users left. The source device must be
980 * locked by netif_addr_lock_bh.
982 * This function is intended to be called from the ndo_set_rx_mode
983 * function of layered software devices. It allows for a single
984 * source device to be synced to multiple destination devices.
986 int dev_mc_sync_multiple(struct net_device
*to
, struct net_device
*from
)
990 if (to
->addr_len
!= from
->addr_len
)
994 err
= __hw_addr_sync_multiple(&to
->mc
, &from
->mc
, to
->addr_len
);
996 __dev_set_rx_mode(to
);
997 netif_addr_unlock(to
);
1000 EXPORT_SYMBOL(dev_mc_sync_multiple
);
1003 * dev_mc_unsync - Remove synchronized addresses from the destination device
1004 * @to: destination device
1005 * @from: source device
1007 * Remove all addresses that were added to the destination device by
1008 * dev_mc_sync(). This function is intended to be called from the
1009 * dev->stop function of layered software devices.
1011 void dev_mc_unsync(struct net_device
*to
, struct net_device
*from
)
1013 if (to
->addr_len
!= from
->addr_len
)
1016 /* See the above comments inside dev_uc_unsync(). */
1017 netif_addr_lock_bh(from
);
1018 netif_addr_lock(to
);
1019 __hw_addr_unsync(&to
->mc
, &from
->mc
, to
->addr_len
);
1020 __dev_set_rx_mode(to
);
1021 netif_addr_unlock(to
);
1022 netif_addr_unlock_bh(from
);
1024 EXPORT_SYMBOL(dev_mc_unsync
);
1027 * dev_mc_flush - Flush multicast addresses
1030 * Flush multicast addresses.
1032 void dev_mc_flush(struct net_device
*dev
)
1034 netif_addr_lock_bh(dev
);
1035 __hw_addr_flush(&dev
->mc
);
1036 netif_addr_unlock_bh(dev
);
1038 EXPORT_SYMBOL(dev_mc_flush
);
1041 * dev_mc_init - Init multicast address list
1044 * Init multicast address list.
1046 void dev_mc_init(struct net_device
*dev
)
1048 __hw_addr_init(&dev
->mc
);
1050 EXPORT_SYMBOL(dev_mc_init
);