Lines Matching refs:ifa
173 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
174 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
805 struct inet6_ifaddr *ifa; in dev_forward_change() local
826 list_for_each_entry(ifa, &idev->addr_list, if_list) { in dev_forward_change()
827 if (ifa->flags&IFA_F_TENTATIVE) in dev_forward_change()
829 list_add_tail(&ifa->if_list_aux, &tmp_addr_list); in dev_forward_change()
834 ifa = list_first_entry(&tmp_addr_list, in dev_forward_change()
836 list_del(&ifa->if_list_aux); in dev_forward_change()
838 addrconf_join_anycast(ifa); in dev_forward_change()
840 addrconf_leave_anycast(ifa); in dev_forward_change()
1007 struct inet6_ifaddr *ifa in ipv6_link_dev_addr() local
1009 if (ifp_scope >= ipv6_addr_src_scope(&ifa->addr)) in ipv6_link_dev_addr()
1037 static int ipv6_add_addr_hash(struct net_device *dev, struct inet6_ifaddr *ifa) in ipv6_add_addr_hash() argument
1040 unsigned int hash = inet6_addr_hash(net, &ifa->addr); in ipv6_add_addr_hash()
1046 if (ipv6_chk_same_addr(net, &ifa->addr, dev, hash)) { in ipv6_add_addr_hash()
1050 hlist_add_head_rcu(&ifa->addr_lst, &net->ipv6.inet6_addr_lst[hash]); in ipv6_add_addr_hash()
1067 struct inet6_ifaddr *ifa = NULL; in ipv6_add_addr() local
1113 ifa = kzalloc(sizeof(*ifa), gfp_flags | __GFP_ACCOUNT); in ipv6_add_addr()
1114 if (!ifa) { in ipv6_add_addr()
1128 ifa->addr = *cfg->pfx; in ipv6_add_addr()
1130 ifa->peer_addr = *cfg->peer_pfx; in ipv6_add_addr()
1132 spin_lock_init(&ifa->lock); in ipv6_add_addr()
1133 INIT_DELAYED_WORK(&ifa->dad_work, addrconf_dad_work); in ipv6_add_addr()
1134 INIT_HLIST_NODE(&ifa->addr_lst); in ipv6_add_addr()
1135 ifa->scope = cfg->scope; in ipv6_add_addr()
1136 ifa->prefix_len = cfg->plen; in ipv6_add_addr()
1137 ifa->rt_priority = cfg->rt_priority; in ipv6_add_addr()
1138 ifa->flags = cfg->ifa_flags; in ipv6_add_addr()
1139 ifa->ifa_proto = cfg->ifa_proto; in ipv6_add_addr()
1142 ifa->flags |= IFA_F_TENTATIVE; in ipv6_add_addr()
1143 ifa->valid_lft = cfg->valid_lft; in ipv6_add_addr()
1144 ifa->prefered_lft = cfg->preferred_lft; in ipv6_add_addr()
1145 ifa->cstamp = ifa->tstamp = jiffies; in ipv6_add_addr()
1146 ifa->tokenized = false; in ipv6_add_addr()
1148 ifa->rt = f6i; in ipv6_add_addr()
1150 ifa->idev = idev; in ipv6_add_addr()
1154 refcount_set(&ifa->refcnt, 1); in ipv6_add_addr()
1158 err = ipv6_add_addr_hash(idev->dev, ifa); in ipv6_add_addr()
1167 ipv6_link_dev_addr(idev, ifa); in ipv6_add_addr()
1169 if (ifa->flags&IFA_F_TEMPORARY) { in ipv6_add_addr()
1170 list_add(&ifa->tmp_list, &idev->tempaddr_list); in ipv6_add_addr()
1171 in6_ifa_hold(ifa); in ipv6_add_addr()
1174 in6_ifa_hold(ifa); in ipv6_add_addr()
1179 inet6addr_notifier_call_chain(NETDEV_UP, ifa); in ipv6_add_addr()
1184 if (ifa) { in ipv6_add_addr()
1185 if (ifa->idev) in ipv6_add_addr()
1186 in6_dev_put(ifa->idev); in ipv6_add_addr()
1187 kfree(ifa); in ipv6_add_addr()
1189 ifa = ERR_PTR(err); in ipv6_add_addr()
1192 return ifa; in ipv6_add_addr()
1222 struct inet6_ifaddr *ifa; in check_cleanup_prefix_route() local
1229 list_for_each_entry(ifa, &idev->addr_list, if_list) { in check_cleanup_prefix_route()
1230 if (ifa == ifp) in check_cleanup_prefix_route()
1232 if (ifa->prefix_len != ifp->prefix_len || in check_cleanup_prefix_route()
1233 !ipv6_prefix_equal(&ifa->addr, &ifp->addr, in check_cleanup_prefix_route()
1236 if (ifa->flags & (IFA_F_PERMANENT | IFA_F_NOPREFIXROUTE)) in check_cleanup_prefix_route()
1241 spin_lock(&ifa->lock); in check_cleanup_prefix_route()
1243 lifetime = addrconf_timeout_fixup(ifa->valid_lft, HZ); in check_cleanup_prefix_route()
1249 if (time_before(*expires, ifa->tstamp + lifetime * HZ)) in check_cleanup_prefix_route()
1250 *expires = ifa->tstamp + lifetime * HZ; in check_cleanup_prefix_route()
1251 spin_unlock(&ifa->lock); in check_cleanup_prefix_route()
1522 struct inet6_ifaddr *ifa; member
1602 ret = !!score->ifa; in ipv6_get_saddr_eval()
1606 ret = ipv6_addr_equal(&score->ifa->addr, dst->addr); in ipv6_get_saddr_eval()
1642 if (!ipv6_use_optimistic_addr(net, score->ifa->idev)) in ipv6_get_saddr_eval()
1645 !(score->ifa->flags & avoid); in ipv6_get_saddr_eval()
1653 ret = !(score->ifa->flags & IFA_F_HOMEADDRESS) ^ prefhome; in ipv6_get_saddr_eval()
1660 dst->ifindex == score->ifa->idev->dev->ifindex); in ipv6_get_saddr_eval()
1665 &score->ifa->addr, score->addr_type, in ipv6_get_saddr_eval()
1666 score->ifa->idev->dev->ifindex) == dst->label; in ipv6_get_saddr_eval()
1675 READ_ONCE(score->ifa->idev->cnf.use_tempaddr) >= 2; in ipv6_get_saddr_eval()
1676 ret = (!(score->ifa->flags & IFA_F_TEMPORARY)) ^ preftmp; in ipv6_get_saddr_eval()
1683 ret = !(ipv6_addr_orchid(&score->ifa->addr) ^ in ipv6_get_saddr_eval()
1688 ret = ipv6_addr_diff(&score->ifa->addr, dst->addr); in ipv6_get_saddr_eval()
1689 if (ret > score->ifa->prefix_len) in ipv6_get_saddr_eval()
1690 ret = score->ifa->prefix_len; in ipv6_get_saddr_eval()
1698 ret = !(score->ifa->flags & IFA_F_OPTIMISTIC); in ipv6_get_saddr_eval()
1720 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) { in __ipv6_dev_get_saddr()
1733 if ((score->ifa->flags & IFA_F_TENTATIVE) && in __ipv6_dev_get_saddr()
1734 (!(score->ifa->flags & IFA_F_OPTIMISTIC))) in __ipv6_dev_get_saddr()
1737 score->addr_type = __ipv6_addr_type(&score->ifa->addr); in __ipv6_dev_get_saddr()
1774 score->ifa = hiscore->ifa; in __ipv6_dev_get_saddr()
1827 scores[hiscore_idx].ifa = NULL; in ipv6_dev_get_saddr()
1875 if (scores[hiscore_idx].ifa && in ipv6_dev_get_saddr()
1895 if (!hiscore->ifa) in ipv6_dev_get_saddr()
1898 *saddr = hiscore->ifa->addr; in ipv6_dev_get_saddr()
2027 const struct inet6_ifaddr *ifa; in ipv6_chk_custom_prefix() local
2034 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_custom_prefix()
2035 ret = ipv6_prefix_equal(addr, &ifa->addr, prefix_len); in ipv6_chk_custom_prefix()
2048 const struct inet6_ifaddr *ifa; in ipv6_chk_prefix() local
2056 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_prefix()
2057 onlink = ipv6_prefix_equal(addr, &ifa->addr, in ipv6_chk_prefix()
2058 ifa->prefix_len); in ipv6_chk_prefix()
3246 struct in_ifaddr *ifa; in add_v4_addrs() local
3249 in_dev_for_each_ifa_rtnl(ifa, in_dev) { in add_v4_addrs()
3250 addr.s6_addr32[3] = ifa->ifa_local; in add_v4_addrs()
3252 if (ifa->ifa_scope == RT_SCOPE_LINK) in add_v4_addrs()
3254 if (ifa->ifa_scope >= RT_SCOPE_HOST) { in add_v4_addrs()
3841 struct inet6_ifaddr *ifa; in addrconf_ifdown() local
3889 hlist_for_each_entry_rcu(ifa, h, addr_lst) { in addrconf_ifdown()
3890 if (ifa->idev == idev) { in addrconf_ifdown()
3891 addrconf_del_dad_work(ifa); in addrconf_ifdown()
3896 !(ifa->flags & IFA_F_PERMANENT) || in addrconf_ifdown()
3897 addr_is_local(&ifa->addr)) { in addrconf_ifdown()
3898 hlist_del_init_rcu(&ifa->addr_lst); in addrconf_ifdown()
3919 ifa = list_first_entry(&idev->tempaddr_list, in addrconf_ifdown()
3921 list_del(&ifa->tmp_list); in addrconf_ifdown()
3923 spin_lock_bh(&ifa->lock); in addrconf_ifdown()
3925 if (ifa->ifpub) { in addrconf_ifdown()
3926 in6_ifa_put(ifa->ifpub); in addrconf_ifdown()
3927 ifa->ifpub = NULL; in addrconf_ifdown()
3929 spin_unlock_bh(&ifa->lock); in addrconf_ifdown()
3930 in6_ifa_put(ifa); in addrconf_ifdown()
3934 list_for_each_entry(ifa, &idev->addr_list, if_list) in addrconf_ifdown()
3935 list_add_tail(&ifa->if_list_aux, &tmp_addr_list); in addrconf_ifdown()
3942 ifa = list_first_entry(&tmp_addr_list, in addrconf_ifdown()
3944 list_del(&ifa->if_list_aux); in addrconf_ifdown()
3946 addrconf_del_dad_work(ifa); in addrconf_ifdown()
3948 keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) && in addrconf_ifdown()
3949 !addr_is_local(&ifa->addr); in addrconf_ifdown()
3951 spin_lock_bh(&ifa->lock); in addrconf_ifdown()
3956 ifa->state = INET6_IFADDR_STATE_PREDAD; in addrconf_ifdown()
3957 if (!(ifa->flags & IFA_F_NODAD)) in addrconf_ifdown()
3958 ifa->flags |= IFA_F_TENTATIVE; in addrconf_ifdown()
3960 rt = ifa->rt; in addrconf_ifdown()
3961 ifa->rt = NULL; in addrconf_ifdown()
3963 state = ifa->state; in addrconf_ifdown()
3964 ifa->state = INET6_IFADDR_STATE_DEAD; in addrconf_ifdown()
3967 spin_unlock_bh(&ifa->lock); in addrconf_ifdown()
3973 __ipv6_ifa_notify(RTM_DELADDR, ifa); in addrconf_ifdown()
3974 inet6addr_notifier_call_chain(NETDEV_DOWN, ifa); in addrconf_ifdown()
3977 addrconf_leave_anycast(ifa); in addrconf_ifdown()
3978 addrconf_leave_solict(ifa->idev, &ifa->addr); in addrconf_ifdown()
3983 list_del_rcu(&ifa->if_list); in addrconf_ifdown()
3985 in6_ifa_put(ifa); in addrconf_ifdown()
4408 struct inet6_ifaddr *ifa = NULL; in if6_get_first() local
4418 hlist_for_each_entry_rcu(ifa, &net->ipv6.inet6_addr_lst[state->bucket], in if6_get_first()
4425 return ifa; in if6_get_first()
4436 struct inet6_ifaddr *ifa) in if6_get_next() argument
4441 hlist_for_each_entry_continue_rcu(ifa, addr_lst) { in if6_get_next()
4443 return ifa; in if6_get_next()
4448 hlist_for_each_entry_rcu(ifa, in if6_get_next()
4450 return ifa; in if6_get_next()
4466 struct inet6_ifaddr *ifa; in if6_seq_next() local
4468 ifa = if6_get_next(seq, v); in if6_seq_next()
4470 return ifa; in if6_seq_next()
4951 struct inet6_ifaddr *ifa; in inet6_rtm_newaddr() local
5048 ifa = ipv6_get_ifaddr(net, cfg.pfx, dev, 1); in inet6_rtm_newaddr()
5049 if (!ifa) { in inet6_rtm_newaddr()
5063 err = inet6_addr_modify(net, ifa, &cfg, expires, flags); in inet6_rtm_newaddr()
5066 in6_ifa_put(ifa); in inet6_rtm_newaddr()
5123 const struct inet6_ifaddr *ifa, in inet6_fill_ifaddr() argument
5136 flags = READ_ONCE(ifa->flags); in inet6_fill_ifaddr()
5137 put_ifaddrmsg(nlh, ifa->prefix_len, ifa->flags, rt_scope(ifa->scope), in inet6_fill_ifaddr()
5138 ifa->idev->dev->ifindex); in inet6_fill_ifaddr()
5144 preferred = READ_ONCE(ifa->prefered_lft); in inet6_fill_ifaddr()
5145 valid = READ_ONCE(ifa->valid_lft); in inet6_fill_ifaddr()
5150 long tval = (jiffies - READ_ONCE(ifa->tstamp)) / HZ; in inet6_fill_ifaddr()
5168 if (!ipv6_addr_any(&ifa->peer_addr)) { in inet6_fill_ifaddr()
5169 if (nla_put_in6_addr(skb, IFA_LOCAL, &ifa->addr) < 0 || in inet6_fill_ifaddr()
5170 nla_put_in6_addr(skb, IFA_ADDRESS, &ifa->peer_addr) < 0) in inet6_fill_ifaddr()
5173 if (nla_put_in6_addr(skb, IFA_ADDRESS, &ifa->addr) < 0) in inet6_fill_ifaddr()
5177 priority = READ_ONCE(ifa->rt_priority); in inet6_fill_ifaddr()
5181 if (put_cacheinfo(skb, ifa->cstamp, READ_ONCE(ifa->tstamp), in inet6_fill_ifaddr()
5188 proto = READ_ONCE(ifa->ifa_proto); in inet6_fill_ifaddr()
5282 const struct inet6_ifaddr *ifa; in in6_dump_addrs() local
5286 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in in6_dump_addrs()
5289 err = inet6_fill_ifaddr(skb, ifa, fillargs); in in6_dump_addrs()
5533 struct inet6_ifaddr *ifa; in inet6_rtm_getaddr() local
5559 ifa = ipv6_get_ifaddr(tgt_net, addr, dev, 1); in inet6_rtm_getaddr()
5560 if (!ifa) { in inet6_rtm_getaddr()
5571 err = inet6_fill_ifaddr(skb, ifa, &fillargs); in inet6_rtm_getaddr()
5580 in6_ifa_put(ifa); in inet6_rtm_getaddr()
5589 static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) in inet6_ifa_notify() argument
5592 struct net *net = dev_net(ifa->idev->dev); in inet6_ifa_notify()
5607 err = inet6_fill_ifaddr(skb, ifa, &fillargs); in inet6_ifa_notify()
6640 struct inet6_ifaddr *ifa; in addrconf_disable_policy_idev() local
6643 list_for_each_entry(ifa, &idev->addr_list, if_list) { in addrconf_disable_policy_idev()
6644 spin_lock(&ifa->lock); in addrconf_disable_policy_idev()
6645 if (ifa->rt) { in addrconf_disable_policy_idev()
6647 struct fib6_nh *nh = ifa->rt->fib6_nh; in addrconf_disable_policy_idev()
6651 ifa->rt->dst_nopolicy = val ? true : false; in addrconf_disable_policy_idev()
6662 spin_unlock(&ifa->lock); in addrconf_disable_policy_idev()