Lines Matching refs:ifa

184 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
185 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
741 struct inet6_ifaddr *ifa; in dev_forward_change() local
760 list_for_each_entry(ifa, &idev->addr_list, if_list) { in dev_forward_change()
761 if (ifa->flags&IFA_F_TENTATIVE) in dev_forward_change()
764 addrconf_join_anycast(ifa); in dev_forward_change()
766 addrconf_leave_anycast(ifa); in dev_forward_change()
932 struct inet6_ifaddr *ifa in ipv6_link_dev_addr() local
934 if (ifp_scope >= ipv6_addr_src_scope(&ifa->addr)) in ipv6_link_dev_addr()
964 static int ipv6_add_addr_hash(struct net_device *dev, struct inet6_ifaddr *ifa) in ipv6_add_addr_hash() argument
966 unsigned int hash = inet6_addr_hash(dev_net(dev), &ifa->addr); in ipv6_add_addr_hash()
972 if (ipv6_chk_same_addr(dev_net(dev), &ifa->addr, dev, hash)) { in ipv6_add_addr_hash()
976 hlist_add_head_rcu(&ifa->addr_lst, &inet6_addr_lst[hash]); in ipv6_add_addr_hash()
993 struct inet6_ifaddr *ifa = NULL; in ipv6_add_addr() local
1029 ifa = kzalloc(sizeof(*ifa), gfp_flags); in ipv6_add_addr()
1030 if (!ifa) { in ipv6_add_addr()
1048 ifa->addr = *cfg->pfx; in ipv6_add_addr()
1050 ifa->peer_addr = *cfg->peer_pfx; in ipv6_add_addr()
1052 spin_lock_init(&ifa->lock); in ipv6_add_addr()
1053 INIT_DELAYED_WORK(&ifa->dad_work, addrconf_dad_work); in ipv6_add_addr()
1054 INIT_HLIST_NODE(&ifa->addr_lst); in ipv6_add_addr()
1055 ifa->scope = cfg->scope; in ipv6_add_addr()
1056 ifa->prefix_len = cfg->plen; in ipv6_add_addr()
1057 ifa->rt_priority = cfg->rt_priority; in ipv6_add_addr()
1058 ifa->flags = cfg->ifa_flags; in ipv6_add_addr()
1061 ifa->flags |= IFA_F_TENTATIVE; in ipv6_add_addr()
1062 ifa->valid_lft = cfg->valid_lft; in ipv6_add_addr()
1063 ifa->prefered_lft = cfg->preferred_lft; in ipv6_add_addr()
1064 ifa->cstamp = ifa->tstamp = jiffies; in ipv6_add_addr()
1065 ifa->tokenized = false; in ipv6_add_addr()
1067 ifa->rt = f6i; in ipv6_add_addr()
1069 ifa->idev = idev; in ipv6_add_addr()
1073 refcount_set(&ifa->refcnt, 1); in ipv6_add_addr()
1077 err = ipv6_add_addr_hash(idev->dev, ifa); in ipv6_add_addr()
1086 ipv6_link_dev_addr(idev, ifa); in ipv6_add_addr()
1088 if (ifa->flags&IFA_F_TEMPORARY) { in ipv6_add_addr()
1089 list_add(&ifa->tmp_list, &idev->tempaddr_list); in ipv6_add_addr()
1090 in6_ifa_hold(ifa); in ipv6_add_addr()
1093 in6_ifa_hold(ifa); in ipv6_add_addr()
1098 inet6addr_notifier_call_chain(NETDEV_UP, ifa); in ipv6_add_addr()
1103 if (ifa) { in ipv6_add_addr()
1104 if (ifa->idev) in ipv6_add_addr()
1105 in6_dev_put(ifa->idev); in ipv6_add_addr()
1106 kfree(ifa); in ipv6_add_addr()
1108 ifa = ERR_PTR(err); in ipv6_add_addr()
1111 return ifa; in ipv6_add_addr()
1141 struct inet6_ifaddr *ifa; in check_cleanup_prefix_route() local
1148 list_for_each_entry(ifa, &idev->addr_list, if_list) { in check_cleanup_prefix_route()
1149 if (ifa == ifp) in check_cleanup_prefix_route()
1151 if (!ipv6_prefix_equal(&ifa->addr, &ifp->addr, in check_cleanup_prefix_route()
1154 if (ifa->flags & (IFA_F_PERMANENT | IFA_F_NOPREFIXROUTE)) in check_cleanup_prefix_route()
1159 spin_lock(&ifa->lock); in check_cleanup_prefix_route()
1161 lifetime = addrconf_timeout_fixup(ifa->valid_lft, HZ); in check_cleanup_prefix_route()
1167 if (time_before(*expires, ifa->tstamp + lifetime * HZ)) in check_cleanup_prefix_route()
1168 *expires = ifa->tstamp + lifetime * HZ; in check_cleanup_prefix_route()
1169 spin_unlock(&ifa->lock); in check_cleanup_prefix_route()
1408 struct inet6_ifaddr *ifa; member
1485 ret = !!score->ifa; in ipv6_get_saddr_eval()
1489 ret = ipv6_addr_equal(&score->ifa->addr, dst->addr); in ipv6_get_saddr_eval()
1525 if (!ipv6_use_optimistic_addr(net, score->ifa->idev)) in ipv6_get_saddr_eval()
1528 !(score->ifa->flags & avoid); in ipv6_get_saddr_eval()
1536 ret = !(score->ifa->flags & IFA_F_HOMEADDRESS) ^ prefhome; in ipv6_get_saddr_eval()
1543 dst->ifindex == score->ifa->idev->dev->ifindex); in ipv6_get_saddr_eval()
1548 &score->ifa->addr, score->addr_type, in ipv6_get_saddr_eval()
1549 score->ifa->idev->dev->ifindex) == dst->label; in ipv6_get_saddr_eval()
1558 score->ifa->idev->cnf.use_tempaddr >= 2; in ipv6_get_saddr_eval()
1559 ret = (!(score->ifa->flags & IFA_F_TEMPORARY)) ^ preftmp; in ipv6_get_saddr_eval()
1566 ret = !(ipv6_addr_orchid(&score->ifa->addr) ^ in ipv6_get_saddr_eval()
1571 ret = ipv6_addr_diff(&score->ifa->addr, dst->addr); in ipv6_get_saddr_eval()
1572 if (ret > score->ifa->prefix_len) in ipv6_get_saddr_eval()
1573 ret = score->ifa->prefix_len; in ipv6_get_saddr_eval()
1581 ret = !(score->ifa->flags & IFA_F_OPTIMISTIC); in ipv6_get_saddr_eval()
1603 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) { in __ipv6_dev_get_saddr()
1616 if ((score->ifa->flags & IFA_F_TENTATIVE) && in __ipv6_dev_get_saddr()
1617 (!(score->ifa->flags & IFA_F_OPTIMISTIC))) in __ipv6_dev_get_saddr()
1620 score->addr_type = __ipv6_addr_type(&score->ifa->addr); in __ipv6_dev_get_saddr()
1657 score->ifa = hiscore->ifa; in __ipv6_dev_get_saddr()
1710 scores[hiscore_idx].ifa = NULL; in ipv6_dev_get_saddr()
1758 if (scores[hiscore_idx].ifa) in ipv6_dev_get_saddr()
1777 if (!hiscore->ifa) in ipv6_dev_get_saddr()
1780 *saddr = hiscore->ifa->addr; in ipv6_dev_get_saddr()
1901 const struct inet6_ifaddr *ifa; in ipv6_chk_custom_prefix() local
1908 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_custom_prefix()
1909 ret = ipv6_prefix_equal(addr, &ifa->addr, prefix_len); in ipv6_chk_custom_prefix()
1922 const struct inet6_ifaddr *ifa; in ipv6_chk_prefix() local
1930 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_prefix()
1931 onlink = ipv6_prefix_equal(addr, &ifa->addr, in ipv6_chk_prefix()
1932 ifa->prefix_len); in ipv6_chk_prefix()
3072 struct in_ifaddr *ifa; in sit_add_v4_addrs() local
3076 for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { in sit_add_v4_addrs()
3078 addr.s6_addr32[3] = ifa->ifa_local; in sit_add_v4_addrs()
3080 if (ifa->ifa_scope == RT_SCOPE_LINK) in sit_add_v4_addrs()
3082 if (ifa->ifa_scope >= RT_SCOPE_HOST) { in sit_add_v4_addrs()
3642 struct inet6_ifaddr *ifa, *tmp; in addrconf_ifdown() local
3688 hlist_for_each_entry_rcu(ifa, h, addr_lst) { in addrconf_ifdown()
3689 if (ifa->idev == idev) { in addrconf_ifdown()
3690 addrconf_del_dad_work(ifa); in addrconf_ifdown()
3695 !(ifa->flags & IFA_F_PERMANENT) || in addrconf_ifdown()
3696 addr_is_local(&ifa->addr)) { in addrconf_ifdown()
3697 hlist_del_init_rcu(&ifa->addr_lst); in addrconf_ifdown()
3715 ifa = list_first_entry(&idev->tempaddr_list, in addrconf_ifdown()
3717 list_del(&ifa->tmp_list); in addrconf_ifdown()
3719 spin_lock_bh(&ifa->lock); in addrconf_ifdown()
3721 if (ifa->ifpub) { in addrconf_ifdown()
3722 in6_ifa_put(ifa->ifpub); in addrconf_ifdown()
3723 ifa->ifpub = NULL; in addrconf_ifdown()
3725 spin_unlock_bh(&ifa->lock); in addrconf_ifdown()
3726 in6_ifa_put(ifa); in addrconf_ifdown()
3730 list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) { in addrconf_ifdown()
3734 addrconf_del_dad_work(ifa); in addrconf_ifdown()
3736 keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) && in addrconf_ifdown()
3737 !addr_is_local(&ifa->addr); in addrconf_ifdown()
3740 spin_lock_bh(&ifa->lock); in addrconf_ifdown()
3745 ifa->state = INET6_IFADDR_STATE_PREDAD; in addrconf_ifdown()
3746 if (!(ifa->flags & IFA_F_NODAD)) in addrconf_ifdown()
3747 ifa->flags |= IFA_F_TENTATIVE; in addrconf_ifdown()
3749 rt = ifa->rt; in addrconf_ifdown()
3750 ifa->rt = NULL; in addrconf_ifdown()
3752 state = ifa->state; in addrconf_ifdown()
3753 ifa->state = INET6_IFADDR_STATE_DEAD; in addrconf_ifdown()
3756 spin_unlock_bh(&ifa->lock); in addrconf_ifdown()
3762 __ipv6_ifa_notify(RTM_DELADDR, ifa); in addrconf_ifdown()
3763 inet6addr_notifier_call_chain(NETDEV_DOWN, ifa); in addrconf_ifdown()
3766 addrconf_leave_anycast(ifa); in addrconf_ifdown()
3767 addrconf_leave_solict(ifa->idev, &ifa->addr); in addrconf_ifdown()
3772 list_del_rcu(&ifa->if_list); in addrconf_ifdown()
3773 in6_ifa_put(ifa); in addrconf_ifdown()
4185 struct inet6_ifaddr *ifa = NULL; in if6_get_first() local
4195 hlist_for_each_entry_rcu(ifa, &inet6_addr_lst[state->bucket], in if6_get_first()
4197 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_first()
4204 return ifa; in if6_get_first()
4215 struct inet6_ifaddr *ifa) in if6_get_next() argument
4220 hlist_for_each_entry_continue_rcu(ifa, addr_lst) { in if6_get_next()
4221 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
4224 return ifa; in if6_get_next()
4229 hlist_for_each_entry_rcu(ifa, in if6_get_next()
4231 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
4233 return ifa; in if6_get_next()
4249 struct inet6_ifaddr *ifa; in if6_seq_next() local
4251 ifa = if6_get_next(seq, v); in if6_seq_next()
4253 return ifa; in if6_seq_next()
4665 struct inet6_ifaddr *ifa; in inet6_rtm_newaddr() local
4726 ifa = ipv6_get_ifaddr(net, cfg.pfx, dev, 1); in inet6_rtm_newaddr()
4727 if (!ifa) { in inet6_rtm_newaddr()
4739 err = inet6_addr_modify(ifa, &cfg); in inet6_rtm_newaddr()
4741 in6_ifa_put(ifa); in inet6_rtm_newaddr()
4794 static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa, in inet6_fill_ifaddr() argument
4804 put_ifaddrmsg(nlh, ifa->prefix_len, ifa->flags, rt_scope(ifa->scope), in inet6_fill_ifaddr()
4805 ifa->idev->dev->ifindex); in inet6_fill_ifaddr()
4807 if (!((ifa->flags&IFA_F_PERMANENT) && in inet6_fill_ifaddr()
4808 (ifa->prefered_lft == INFINITY_LIFE_TIME))) { in inet6_fill_ifaddr()
4809 preferred = ifa->prefered_lft; in inet6_fill_ifaddr()
4810 valid = ifa->valid_lft; in inet6_fill_ifaddr()
4812 long tval = (jiffies - ifa->tstamp)/HZ; in inet6_fill_ifaddr()
4829 if (!ipv6_addr_any(&ifa->peer_addr)) { in inet6_fill_ifaddr()
4830 if (nla_put_in6_addr(skb, IFA_LOCAL, &ifa->addr) < 0 || in inet6_fill_ifaddr()
4831 nla_put_in6_addr(skb, IFA_ADDRESS, &ifa->peer_addr) < 0) in inet6_fill_ifaddr()
4834 if (nla_put_in6_addr(skb, IFA_ADDRESS, &ifa->addr) < 0) in inet6_fill_ifaddr()
4837 if (ifa->rt_priority && in inet6_fill_ifaddr()
4838 nla_put_u32(skb, IFA_RT_PRIORITY, ifa->rt_priority)) in inet6_fill_ifaddr()
4841 if (put_cacheinfo(skb, ifa->cstamp, ifa->tstamp, preferred, valid) < 0) in inet6_fill_ifaddr()
4844 if (nla_put_u32(skb, IFA_FLAGS, ifa->flags) < 0) in inet6_fill_ifaddr()
4927 struct inet6_ifaddr *ifa; in in6_dump_addrs() local
4930 list_for_each_entry(ifa, &idev->addr_list, if_list) { in in6_dump_addrs()
4933 err = inet6_fill_ifaddr(skb, ifa, in in6_dump_addrs()
5060 struct inet6_ifaddr *ifa; in inet6_rtm_getaddr() local
5077 ifa = ipv6_get_ifaddr(net, addr, dev, 1); in inet6_rtm_getaddr()
5078 if (!ifa) { in inet6_rtm_getaddr()
5089 err = inet6_fill_ifaddr(skb, ifa, NETLINK_CB(in_skb).portid, in inet6_rtm_getaddr()
5099 in6_ifa_put(ifa); in inet6_rtm_getaddr()
5106 static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) in inet6_ifa_notify() argument
5109 struct net *net = dev_net(ifa->idev->dev); in inet6_ifa_notify()
5116 err = inet6_fill_ifaddr(skb, ifa, 0, 0, event, 0); in inet6_ifa_notify()
6061 struct inet6_ifaddr *ifa; in addrconf_disable_policy_idev() local
6064 list_for_each_entry(ifa, &idev->addr_list, if_list) { in addrconf_disable_policy_idev()
6065 spin_lock(&ifa->lock); in addrconf_disable_policy_idev()
6066 if (ifa->rt) { in addrconf_disable_policy_idev()
6067 struct fib6_info *rt = ifa->rt; in addrconf_disable_policy_idev()
6071 ifa->rt->dst_nopolicy = val ? true : false; in addrconf_disable_policy_idev()
6082 spin_unlock(&ifa->lock); in addrconf_disable_policy_idev()