Lines Matching refs:idev

50 #define ac_dereference(a, idev)						\
51 rcu_dereference_protected(a, lockdep_is_held(&(idev)->lock))
74 struct inet6_dev *idev;
127 idev = in6_dev_get(dev);
128 if (!idev) {
137 ishost = !READ_ONCE(idev->cnf.forwarding);
153 err = __ipv6_dev_ac_inc(idev, addr);
161 in6_dev_put(idev);
332 int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr)
339 write_lock_bh(&idev->lock);
340 if (idev->dead) {
345 for (aca = ac_dereference(idev->ac_list, idev); aca;
346 aca = ac_dereference(aca->aca_next, idev)) {
354 net = dev_net(idev->dev);
355 f6i = addrconf_f6i_alloc(net, idev, addr, true, GFP_ATOMIC, NULL);
368 * it is already exposed via idev->ac_list.
371 aca->aca_next = idev->ac_list;
372 rcu_assign_pointer(idev->ac_list, aca);
374 write_unlock_bh(&idev->lock);
380 addrconf_join_solict(idev->dev, &aca->aca_addr);
382 inet6_ifacaddr_notify(idev->dev, aca, RTM_NEWANYCAST);
387 write_unlock_bh(&idev->lock);
394 int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr)
398 write_lock_bh(&idev->lock);
400 for (aca = ac_dereference(idev->ac_list, idev); aca;
401 aca = ac_dereference(aca->aca_next, idev)) {
407 write_unlock_bh(&idev->lock);
411 write_unlock_bh(&idev->lock);
417 rcu_assign_pointer(idev->ac_list, aca->aca_next);
418 write_unlock_bh(&idev->lock);
420 addrconf_leave_solict(idev, &aca->aca_addr);
422 ip6_del_rt(dev_net(idev->dev), aca->aca_rt, false);
424 inet6_ifacaddr_notify(idev->dev, aca, RTM_DELANYCAST);
432 struct inet6_dev *idev = in6_dev_get(dev);
435 if (!idev)
438 err = __ipv6_dev_ac_dec(idev, addr);
439 in6_dev_put(idev);
444 void ipv6_ac_destroy_dev(struct inet6_dev *idev)
448 write_lock_bh(&idev->lock);
449 while ((aca = ac_dereference(idev->ac_list, idev)) != NULL) {
450 rcu_assign_pointer(idev->ac_list, aca->aca_next);
451 write_unlock_bh(&idev->lock);
455 addrconf_leave_solict(idev, &aca->aca_addr);
457 ip6_del_rt(dev_net(idev->dev), aca->aca_rt, false);
461 write_lock_bh(&idev->lock);
463 write_unlock_bh(&idev->lock);
472 struct inet6_dev *idev;
475 idev = __in6_dev_get(dev);
476 if (idev) {
477 for (aca = rcu_dereference(idev->ac_list); aca;
544 struct inet6_dev *idev;
546 idev = __in6_dev_get(state->dev);
547 if (!idev)
549 im = rcu_dereference(idev->ac_list);
559 struct inet6_dev *idev;
566 idev = __in6_dev_get(state->dev);
567 if (!idev)
569 im = rcu_dereference(idev->ac_list);