Lines Matching refs:aca
224 static void ipv6_add_acaddr_hash(struct net *net, struct ifacaddr6 *aca)
226 unsigned int hash = inet6_acaddr_hash(net, &aca->aca_addr);
229 hlist_add_head_rcu(&aca->aca_addr_lst, &inet6_acaddr_lst[hash]);
233 static void ipv6_del_acaddr_hash(struct ifacaddr6 *aca)
236 hlist_del_init_rcu(&aca->aca_addr_lst);
240 static void aca_get(struct ifacaddr6 *aca)
242 refcount_inc(&aca->aca_refcnt);
247 struct ifacaddr6 *aca = container_of(h, struct ifacaddr6, rcu);
249 fib6_info_release(aca->aca_rt);
250 kfree(aca);
263 struct ifacaddr6 *aca;
265 aca = kzalloc(sizeof(*aca), GFP_ATOMIC);
266 if (!aca)
269 aca->aca_addr = *addr;
271 aca->aca_rt = f6i;
272 INIT_HLIST_NODE(&aca->aca_addr_lst);
273 aca->aca_users = 1;
275 aca->aca_cstamp = aca->aca_tstamp = jiffies;
276 refcount_set(&aca->aca_refcnt, 1);
278 return aca;
286 struct ifacaddr6 *aca;
299 for (aca = idev->ac_list; aca; aca = aca->aca_next) {
300 if (ipv6_addr_equal(&aca->aca_addr, addr)) {
301 aca->aca_users++;
313 aca = aca_alloc(f6i, addr);
314 if (!aca) {
320 aca->aca_next = idev->ac_list;
321 idev->ac_list = aca;
326 aca_get(aca);
329 ipv6_add_acaddr_hash(net, aca);
333 addrconf_join_solict(idev->dev, &aca->aca_addr);
335 aca_put(aca);
347 struct ifacaddr6 *aca, *prev_aca;
353 for (aca = idev->ac_list; aca; aca = aca->aca_next) {
354 if (ipv6_addr_equal(&aca->aca_addr, addr))
356 prev_aca = aca;
358 if (!aca) {
362 if (--aca->aca_users > 0) {
367 prev_aca->aca_next = aca->aca_next;
369 idev->ac_list = aca->aca_next;
371 ipv6_del_acaddr_hash(aca);
372 addrconf_leave_solict(idev, &aca->aca_addr);
374 ip6_del_rt(dev_net(idev->dev), aca->aca_rt, false);
376 aca_put(aca);
392 struct ifacaddr6 *aca;
395 while ((aca = idev->ac_list) != NULL) {
396 idev->ac_list = aca->aca_next;
399 ipv6_del_acaddr_hash(aca);
401 addrconf_leave_solict(idev, &aca->aca_addr);
403 ip6_del_rt(dev_net(idev->dev), aca->aca_rt, false);
405 aca_put(aca);
419 struct ifacaddr6 *aca;
424 for (aca = idev->ac_list; aca; aca = aca->aca_next)
425 if (ipv6_addr_equal(&aca->aca_addr, addr))
428 return aca != NULL;
440 struct ifacaddr6 *aca;
449 hlist_for_each_entry_rcu(aca, &inet6_acaddr_lst[hash],
451 nh_dev = fib6_info_nh_dev(aca->aca_rt);
454 if (ipv6_addr_equal(&aca->aca_addr, addr)) {