Lines Matching refs:aca
217 static void ipv6_add_acaddr_hash(struct net *net, struct ifacaddr6 *aca) in ipv6_add_acaddr_hash() argument
219 unsigned int hash = inet6_acaddr_hash(net, &aca->aca_addr); in ipv6_add_acaddr_hash()
222 hlist_add_head_rcu(&aca->aca_addr_lst, &inet6_acaddr_lst[hash]); in ipv6_add_acaddr_hash()
226 static void ipv6_del_acaddr_hash(struct ifacaddr6 *aca) in ipv6_del_acaddr_hash() argument
229 hlist_del_init_rcu(&aca->aca_addr_lst); in ipv6_del_acaddr_hash()
233 static void aca_get(struct ifacaddr6 *aca) in aca_get() argument
235 refcount_inc(&aca->aca_refcnt); in aca_get()
240 struct ifacaddr6 *aca = container_of(h, struct ifacaddr6, rcu); in aca_free_rcu() local
242 fib6_info_release(aca->aca_rt); in aca_free_rcu()
243 kfree(aca); in aca_free_rcu()
256 struct ifacaddr6 *aca; in aca_alloc() local
258 aca = kzalloc(sizeof(*aca), GFP_ATOMIC); in aca_alloc()
259 if (!aca) in aca_alloc()
262 aca->aca_addr = *addr; in aca_alloc()
264 aca->aca_rt = f6i; in aca_alloc()
265 INIT_HLIST_NODE(&aca->aca_addr_lst); in aca_alloc()
266 aca->aca_users = 1; in aca_alloc()
268 aca->aca_cstamp = aca->aca_tstamp = jiffies; in aca_alloc()
269 refcount_set(&aca->aca_refcnt, 1); in aca_alloc()
271 return aca; in aca_alloc()
279 struct ifacaddr6 *aca; in __ipv6_dev_ac_inc() local
292 for (aca = idev->ac_list; aca; aca = aca->aca_next) { in __ipv6_dev_ac_inc()
293 if (ipv6_addr_equal(&aca->aca_addr, addr)) { in __ipv6_dev_ac_inc()
294 aca->aca_users++; in __ipv6_dev_ac_inc()
306 aca = aca_alloc(f6i, addr); in __ipv6_dev_ac_inc()
307 if (!aca) { in __ipv6_dev_ac_inc()
313 aca->aca_next = idev->ac_list; in __ipv6_dev_ac_inc()
314 idev->ac_list = aca; in __ipv6_dev_ac_inc()
319 aca_get(aca); in __ipv6_dev_ac_inc()
322 ipv6_add_acaddr_hash(net, aca); in __ipv6_dev_ac_inc()
326 addrconf_join_solict(idev->dev, &aca->aca_addr); in __ipv6_dev_ac_inc()
328 aca_put(aca); in __ipv6_dev_ac_inc()
340 struct ifacaddr6 *aca, *prev_aca; in __ipv6_dev_ac_dec() local
346 for (aca = idev->ac_list; aca; aca = aca->aca_next) { in __ipv6_dev_ac_dec()
347 if (ipv6_addr_equal(&aca->aca_addr, addr)) in __ipv6_dev_ac_dec()
349 prev_aca = aca; in __ipv6_dev_ac_dec()
351 if (!aca) { in __ipv6_dev_ac_dec()
355 if (--aca->aca_users > 0) { in __ipv6_dev_ac_dec()
360 prev_aca->aca_next = aca->aca_next; in __ipv6_dev_ac_dec()
362 idev->ac_list = aca->aca_next; in __ipv6_dev_ac_dec()
364 ipv6_del_acaddr_hash(aca); in __ipv6_dev_ac_dec()
365 addrconf_leave_solict(idev, &aca->aca_addr); in __ipv6_dev_ac_dec()
367 ip6_del_rt(dev_net(idev->dev), aca->aca_rt); in __ipv6_dev_ac_dec()
369 aca_put(aca); in __ipv6_dev_ac_dec()
385 struct ifacaddr6 *aca; in ipv6_ac_destroy_dev() local
388 while ((aca = idev->ac_list) != NULL) { in ipv6_ac_destroy_dev()
389 idev->ac_list = aca->aca_next; in ipv6_ac_destroy_dev()
392 ipv6_del_acaddr_hash(aca); in ipv6_ac_destroy_dev()
394 addrconf_leave_solict(idev, &aca->aca_addr); in ipv6_ac_destroy_dev()
396 ip6_del_rt(dev_net(idev->dev), aca->aca_rt); in ipv6_ac_destroy_dev()
398 aca_put(aca); in ipv6_ac_destroy_dev()
412 struct ifacaddr6 *aca; in ipv6_chk_acast_dev() local
417 for (aca = idev->ac_list; aca; aca = aca->aca_next) in ipv6_chk_acast_dev()
418 if (ipv6_addr_equal(&aca->aca_addr, addr)) in ipv6_chk_acast_dev()
421 return aca != NULL; in ipv6_chk_acast_dev()
433 struct ifacaddr6 *aca; in ipv6_chk_acast_addr() local
442 hlist_for_each_entry_rcu(aca, &inet6_acaddr_lst[hash], in ipv6_chk_acast_addr()
444 nh_dev = fib6_info_nh_dev(aca->aca_rt); in ipv6_chk_acast_addr()
447 if (ipv6_addr_equal(&aca->aca_addr, addr)) { in ipv6_chk_acast_addr()