Lines Matching defs:aca

242 static void ipv6_add_acaddr_hash(struct net *net, struct ifacaddr6 *aca)
244 unsigned int hash = inet6_acaddr_hash(net, &aca->aca_addr);
247 hlist_add_head_rcu(&aca->aca_addr_lst, &inet6_acaddr_lst[hash]);
251 static void ipv6_del_acaddr_hash(struct ifacaddr6 *aca)
254 hlist_del_init_rcu(&aca->aca_addr_lst);
258 static void aca_get(struct ifacaddr6 *aca)
260 refcount_inc(&aca->aca_refcnt);
265 struct ifacaddr6 *aca = container_of(h, struct ifacaddr6, rcu);
267 fib6_info_release(aca->aca_rt);
268 kfree(aca);
280 struct ifacaddr6 *aca;
282 aca = kzalloc(sizeof(*aca), GFP_ATOMIC);
283 if (!aca)
286 aca->aca_addr = *addr;
288 aca->aca_rt = f6i;
289 INIT_HLIST_NODE(&aca->aca_addr_lst);
290 aca->aca_users = 1;
292 aca->aca_cstamp = aca->aca_tstamp = jiffies;
293 refcount_set(&aca->aca_refcnt, 1);
295 return aca;
334 struct ifacaddr6 *aca;
345 for (aca = ac_dereference(idev->ac_list, idev); aca;
346 aca = ac_dereference(aca->aca_next, idev)) {
347 if (ipv6_addr_equal(&aca->aca_addr, addr)) {
348 aca->aca_users++;
360 aca = aca_alloc(f6i, addr);
361 if (!aca) {
370 aca_get(aca);
371 aca->aca_next = idev->ac_list;
372 rcu_assign_pointer(idev->ac_list, aca);
376 ipv6_add_acaddr_hash(net, aca);
380 addrconf_join_solict(idev->dev, &aca->aca_addr);
382 inet6_ifacaddr_notify(idev->dev, aca, RTM_NEWANYCAST);
384 aca_put(aca);
396 struct ifacaddr6 *aca, *prev_aca;
400 for (aca = ac_dereference(idev->ac_list, idev); aca;
401 aca = ac_dereference(aca->aca_next, idev)) {
402 if (ipv6_addr_equal(&aca->aca_addr, addr))
404 prev_aca = aca;
406 if (!aca) {
410 if (--aca->aca_users > 0) {
415 rcu_assign_pointer(prev_aca->aca_next, aca->aca_next);
417 rcu_assign_pointer(idev->ac_list, aca->aca_next);
419 ipv6_del_acaddr_hash(aca);
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);
426 aca_put(aca);
446 struct ifacaddr6 *aca;
449 while ((aca = ac_dereference(idev->ac_list, idev)) != NULL) {
450 rcu_assign_pointer(idev->ac_list, aca->aca_next);
453 ipv6_del_acaddr_hash(aca);
455 addrconf_leave_solict(idev, &aca->aca_addr);
457 ip6_del_rt(dev_net(idev->dev), aca->aca_rt, false);
459 aca_put(aca);
473 struct ifacaddr6 *aca;
477 for (aca = rcu_dereference(idev->ac_list); aca;
478 aca = rcu_dereference(aca->aca_next))
479 if (ipv6_addr_equal(&aca->aca_addr, addr))
481 return aca != NULL;
493 struct ifacaddr6 *aca;
502 hlist_for_each_entry_rcu(aca, &inet6_acaddr_lst[hash],
504 nh_dev = fib6_info_nh_dev(aca->aca_rt);
507 if (ipv6_addr_equal(&aca->aca_addr, addr)) {