• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/net/ipv6/

Lines Matching defs:ifp

140 static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
141 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
147 static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags);
149 static void addrconf_dad_completed(struct inet6_ifaddr *ifp);
252 static void addrconf_del_timer(struct inet6_ifaddr *ifp)
254 if (del_timer(&ifp->timer))
255 __in6_ifa_put(ifp);
264 static void addrconf_mod_timer(struct inet6_ifaddr *ifp,
268 if (!del_timer(&ifp->timer))
269 in6_ifa_hold(ifp);
273 ifp->timer.function = addrconf_dad_timer;
276 ifp->timer.function = addrconf_rs_timer;
281 ifp->timer.expires = jiffies + when;
282 add_timer(&ifp->timer);
544 struct inet6_ifaddr *ifp = container_of(head, struct inet6_ifaddr, rcu);
545 kfree(ifp);
549 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp)
551 WARN_ON(!hlist_unhashed(&ifp->addr_lst));
557 in6_dev_put(ifp->idev);
559 if (del_timer(&ifp->timer))
560 pr_notice("Timer is still running, when freeing ifa=%p\n", ifp);
562 if (ifp->state != INET6_IFADDR_STATE_DEAD) {
563 pr_warning("Freeing alive inet6 address %p\n", ifp);
566 dst_release(&ifp->rt->dst);
568 call_rcu(&ifp->rcu, inet6_ifa_finish_destroy_rcu);
572 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp)
575 int ifp_scope = ipv6_addr_src_scope(&ifp->addr);
588 list_add_tail(&ifp->if_list, p);
602 /* On success it returns ifp with increased reference count */
718 /* This function wants to get referenced ifp and releases it before return */
720 static void ipv6_del_addr(struct inet6_ifaddr *ifp)
723 struct inet6_dev *idev = ifp->idev;
729 hash = ipv6_addr_hash(&ifp->addr);
731 spin_lock_bh(&ifp->state_lock);
732 state = ifp->state;
733 ifp->state = INET6_IFADDR_STATE_DEAD;
734 spin_unlock_bh(&ifp->state_lock);
740 hlist_del_init_rcu(&ifp->addr_lst);
745 if (ifp->flags&IFA_F_TEMPORARY) {
746 list_del(&ifp->tmp_list);
747 if (ifp->ifpub) {
748 in6_ifa_put(ifp->ifpub);
749 ifp->ifpub = NULL;
751 __in6_ifa_put(ifp);
756 if (ifa == ifp) {
757 list_del_init(&ifp->if_list);
758 __in6_ifa_put(ifp);
760 if (!(ifp->flags & IFA_F_PERMANENT) || onlink > 0)
764 } else if (ifp->flags & IFA_F_PERMANENT) {
765 if (ipv6_prefix_equal(&ifa->addr, &ifp->addr,
766 ifp->prefix_len)) {
795 addrconf_del_timer(ifp);
797 ipv6_ifa_notify(RTM_DELADDR, ifp);
799 atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifp);
816 if ((ifp->flags & IFA_F_PERMANENT) && onlink < 1) {
819 struct net *net = dev_net(ifp->idev->dev);
820 ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len);
821 rt = rt6_lookup(net, &prefix, NULL, ifp->idev->dev->ifindex, 1);
836 in6_ifa_put(ifp);
840 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *ift)
842 struct inet6_dev *idev = ifp->idev;
870 spin_lock_bh(&ifp->lock);
871 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) {
873 spin_unlock_bh(&ifp->lock);
881 in6_ifa_hold(ifp);
882 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8);
884 spin_unlock_bh(&ifp->lock);
888 in6_ifa_put(ifp);
895 ifp->valid_lft,
898 ifp->prefered_lft,
901 tmp_plen = ifp->prefix_len;
903 tmp_cstamp = ifp->cstamp;
904 tmp_tstamp = ifp->tstamp;
905 spin_unlock_bh(&ifp->lock);
918 in6_ifa_put(ifp);
926 if (ifp->flags & IFA_F_OPTIMISTIC)
935 in6_ifa_put(ifp);
945 ift->ifpub = ifp;
1261 struct inet6_ifaddr *ifp;
1264 list_for_each_entry(ifp, &idev->addr_list, if_list) {
1265 if (ifp->scope == IFA_LINK &&
1266 !(ifp->flags & banned_flags)) {
1267 ipv6_addr_copy(addr, &ifp->addr);
1281 struct inet6_ifaddr *ifp;
1284 list_for_each_entry(ifp, &idev->addr_list, if_list)
1293 struct inet6_ifaddr *ifp;
1298 hlist_for_each_entry_rcu(ifp, node, &inet6_addr_lst[hash], addr_lst) {
1299 if (!net_eq(dev_net(ifp->idev->dev), net))
1301 if (ipv6_addr_equal(&ifp->addr, addr) &&
1302 !(ifp->flags&IFA_F_TENTATIVE) &&
1303 (dev == NULL || ifp->idev->dev == dev ||
1304 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) {
1319 struct inet6_ifaddr *ifp;
1322 hlist_for_each_entry(ifp, node, &inet6_addr_lst[hash], addr_lst) {
1323 if (!net_eq(dev_net(ifp->idev->dev), net))
1325 if (ipv6_addr_equal(&ifp->addr, addr)) {
1326 if (dev == NULL || ifp->idev->dev == dev)
1361 struct inet6_ifaddr *ifp, *result = NULL;
1366 hlist_for_each_entry_rcu_bh(ifp, node, &inet6_addr_lst[hash], addr_lst) {
1367 if (!net_eq(dev_net(ifp->idev->dev), net))
1369 if (ipv6_addr_equal(&ifp->addr, addr)) {
1370 if (dev == NULL || ifp->idev->dev == dev ||
1371 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) {
1372 result = ifp;
1373 in6_ifa_hold(ifp);
1412 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed)
1414 if (ifp->flags&IFA_F_PERMANENT) {
1415 spin_lock_bh(&ifp->lock);
1416 addrconf_del_timer(ifp);
1417 ifp->flags |= IFA_F_TENTATIVE;
1419 ifp->flags |= IFA_F_DADFAILED;
1420 spin_unlock_bh(&ifp->lock);
1422 ipv6_ifa_notify(0, ifp);
1423 in6_ifa_put(ifp);
1427 if (strcmp(ifp->idev->dev->name, lan_if_name) == 0)
1430 ifp->idev->cnf.forwarding = 0;
1433 else if (strcmp(ifp->idev->dev->name, wan_if_name) == 0)
1436 ifp->idev->cnf.forwarding = 0;
1447 memcpy(&dad_wan_ip_addr, &(ifp->addr), sizeof(dad_wan_ip_addr));
1453 } else if (ifp->flags&IFA_F_TEMPORARY) {
1455 spin_lock_bh(&ifp->lock);
1456 ifpub = ifp->ifpub;
1459 spin_unlock_bh(&ifp->lock);
1460 ipv6_create_tempaddr(ifpub, ifp);
1463 spin_unlock_bh(&ifp->lock);
1465 ipv6_del_addr(ifp);
1468 ipv6_del_addr(ifp);
1471 static int addrconf_dad_end(struct inet6_ifaddr *ifp)
1475 spin_lock(&ifp->state_lock);
1476 if (ifp->state == INET6_IFADDR_STATE_DAD) {
1477 ifp->state = INET6_IFADDR_STATE_POSTDAD;
1480 spin_unlock(&ifp->state_lock);
1485 void addrconf_dad_failure(struct inet6_ifaddr *ifp)
1487 struct inet6_dev *idev = ifp->idev;
1489 if (addrconf_dad_end(ifp))
1494 ifp->idev->dev->name, &ifp->addr);
1503 ipv6_addr_equal(&ifp->addr, &addr)) {
1508 ifp->idev->dev->name);
1512 addrconf_dad_stop(ifp, 1);
1539 static void addrconf_join_anycast(struct inet6_ifaddr *ifp)
1542 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
1545 ipv6_dev_ac_inc(ifp->idev->dev, &addr);
1548 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp)
1551 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
1554 __ipv6_dev_ac_dec(ifp->idev, &addr);
1651 struct inet6_ifaddr *ifp;
1654 list_for_each_entry(ifp, &idev->addr_list, if_list) {
1655 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) {
1656 memcpy(eui, ifp->addr.s6_addr+8, 8);
1926 struct inet6_ifaddr * ifp;
1947 ifp = ipv6_get_ifaddr(net, &addr, dev, 1);
1949 if (ifp == NULL && valid_lft) {
1964 ifp = ipv6_add_addr(in6_dev, &addr, pinfo->prefix_len,
1968 if (!ifp || IS_ERR(ifp)) {
1974 ifp->cstamp = jiffies;
1975 addrconf_dad_start(ifp, RTF_ADDRCONF|RTF_PREFIX_RT);
1978 if (ifp) {
1987 spin_lock(&ifp->lock);
1989 if (ifp->valid_lft > (now - ifp->tstamp) / HZ)
1990 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ;
2021 if (prefered_lft != ifp->prefered_lft) {
2034 ifp->valid_lft = valid_lft;
2035 ifp->prefered_lft = prefered_lft;
2036 ifp->tstamp = now;
2037 flags = ifp->flags;
2038 ifp->flags &= ~IFA_F_DEPRECATED;
2039 spin_unlock(&ifp->lock);
2042 ipv6_ifa_notify(0, ifp);
2044 spin_unlock(&ifp->lock);
2057 if (ifp != ift->ifpub)
2079 ipv6_create_tempaddr(ifp, NULL);
2084 in6_ifa_put(ifp);
2165 struct inet6_ifaddr *ifp;
2210 ifp = ipv6_add_addr(idev, pfx, plen, scope, ifa_flags);
2212 if (!IS_ERR(ifp)) {
2213 spin_lock_bh(&ifp->lock);
2214 ifp->valid_lft = valid_lft;
2215 ifp->prefered_lft = prefered_lft;
2216 ifp->tstamp = jiffies;
2217 spin_unlock_bh(&ifp->lock);
2219 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev,
2226 addrconf_dad_start(ifp, 0);
2227 in6_ifa_put(ifp);
2232 return PTR_ERR(ifp);
2238 struct inet6_ifaddr *ifp;
2253 list_for_each_entry(ifp, &idev->addr_list, if_list) {
2254 if (ifp->prefix_len == plen &&
2255 ipv6_addr_equal(pfx, &ifp->addr)) {
2256 in6_ifa_hold(ifp);
2259 ipv6_del_addr(ifp);
2267 if (strcmp(ifp->idev->dev->name, wan_if_name) == 0) {
2268 if (memcmp(&(ifp->addr), &dad_wan_ip_addr,
2273 ifp->idev->cnf.forwarding = 1;
2332 struct inet6_ifaddr *ifp;
2334 ifp = ipv6_add_addr(idev, addr, plen, scope, IFA_F_PERMANENT);
2335 if (!IS_ERR(ifp)) {
2336 spin_lock_bh(&ifp->lock);
2337 ifp->flags &= ~IFA_F_TENTATIVE;
2338 spin_unlock_bh(&ifp->lock);
2339 ipv6_ifa_notify(RTM_NEWADDR, ifp);
2340 in6_ifa_put(ifp);
2418 struct inet6_ifaddr * ifp;
2428 ifp = ipv6_add_addr(idev, addr, 64, IFA_LINK, addr_flags);
2429 if (!IS_ERR(ifp)) {
2430 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0);
2431 addrconf_dad_start(ifp, 0);
2432 in6_ifa_put(ifp);
2863 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data;
2864 struct inet6_dev *idev = ifp->idev;
2877 spin_lock(&ifp->lock);
2878 if (ifp->probes++ < idev->cnf.rtr_solicits) {
2880 addrconf_mod_timer(ifp, AC_RS,
2881 (ifp->probes == idev->cnf.rtr_solicits) ?
2884 spin_unlock(&ifp->lock);
2886 ndisc_send_rs(idev->dev, &ifp->addr, &in6addr_linklocal_allrouters);
2888 spin_unlock(&ifp->lock);
2899 in6_ifa_put(ifp);
2905 static void addrconf_dad_kick(struct inet6_ifaddr *ifp)
2908 struct inet6_dev *idev = ifp->idev;
2910 if (ifp->flags & IFA_F_OPTIMISTIC)
2915 ifp->probes = idev->cnf.dad_transmits;
2916 addrconf_mod_timer(ifp, AC_DAD, rand_num);
2919 static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags)
2921 struct inet6_dev *idev = ifp->idev;
2924 addrconf_join_solict(dev, &ifp->addr);
2926 net_srandom(ifp->addr.s6_addr32[3]);
2929 spin_lock(&ifp->lock);
2930 if (ifp->state == INET6_IFADDR_STATE_DEAD)
2935 !(ifp->flags&IFA_F_TENTATIVE) ||
2936 ifp->flags & IFA_F_NODAD) {
2937 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
2938 spin_unlock(&ifp->lock);
2941 addrconf_dad_completed(ifp);
2946 spin_unlock(&ifp->lock);
2953 in6_ifa_hold(ifp);
2954 addrconf_dad_stop(ifp, 0);
2962 if (ifp->flags & IFA_F_OPTIMISTIC)
2963 ip6_ins_rt(ifp->rt);
2965 addrconf_dad_kick(ifp);
2967 spin_unlock(&ifp->lock);
2973 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data;
2974 struct inet6_dev *idev = ifp->idev;
2977 if (!ifp->probes && addrconf_dad_end(ifp))
2986 spin_lock(&ifp->lock);
2987 if (ifp->state == INET6_IFADDR_STATE_DEAD) {
2988 spin_unlock(&ifp->lock);
2993 if (ifp->probes == 0) {
2998 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
2999 spin_unlock(&ifp->lock);
3002 addrconf_dad_completed(ifp);
3007 ifp->probes--;
3008 addrconf_mod_timer(ifp, AC_DAD, ifp->idev->nd_parms->retrans_time);
3009 spin_unlock(&ifp->lock);
3013 addrconf_addr_solict_mult(&ifp->addr, &mcaddr);
3014 ndisc_send_ns(ifp->idev->dev, NULL, &ifp->addr, &mcaddr, &in6addr_any);
3016 in6_ifa_put(ifp);
3019 static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
3021 struct net_device *dev = ifp->idev->dev;
3027 ipv6_ifa_notify(RTM_NEWADDR, ifp);
3033 if (ifp->idev->cnf.forwarding == 0 &&
3034 ifp->idev->cnf.rtr_solicits > 0 &&
3036 (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
3042 ndisc_send_rs(ifp->idev->dev, &ifp->addr, &in6addr_linklocal_allrouters);
3044 spin_lock_bh(&ifp->lock);
3045 ifp->probes = 1;
3046 ifp->idev->if_flags |= IF_RS_SENT;
3047 addrconf_mod_timer(ifp, AC_RS, ifp->idev->cnf.rtr_solicit_interval);
3048 spin_unlock_bh(&ifp->lock);
3054 struct inet6_ifaddr *ifp;
3057 list_for_each_entry(ifp, &idev->addr_list, if_list) {
3058 spin_lock(&ifp->lock);
3059 if (ifp->flags & IFA_F_TENTATIVE &&
3060 ifp->state == INET6_IFADDR_STATE_DAD)
3061 addrconf_dad_kick(ifp);
3062 spin_unlock(&ifp->lock);
3145 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v;
3147 &ifp->addr,
3148 ifp->idev->dev->ifindex,
3149 ifp->prefix_len,
3150 ifp->scope,
3151 ifp->flags,
3152 ifp->idev->dev->name);
3210 struct inet6_ifaddr *ifp = NULL;
3215 hlist_for_each_entry_rcu_bh(ifp, n, &inet6_addr_lst[hash], addr_lst) {
3216 if (!net_eq(dev_net(ifp->idev->dev), net))
3218 if (ipv6_addr_equal(&ifp->addr, addr) &&
3219 (ifp->flags & IFA_F_HOMEADDRESS)) {
3236 struct inet6_ifaddr *ifp;
3249 hlist_for_each_entry_rcu_bh(ifp, node,
3253 if (ifp->flags & IFA_F_PERMANENT)
3256 spin_lock(&ifp->lock);
3258 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
3260 if (ifp->valid_lft != INFINITY_LIFE_TIME &&
3261 age >= ifp->valid_lft) {
3262 spin_unlock(&ifp->lock);
3263 in6_ifa_hold(ifp);
3264 ipv6_del_addr(ifp);
3266 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) {
3267 spin_unlock(&ifp->lock);
3269 } else if (age >= ifp->prefered_lft) {
3270 /* jiffies - ifp->tstamp > age >= ifp->prefered_lft */
3273 if (!(ifp->flags&IFA_F_DEPRECATED)) {
3275 ifp->flags |= IFA_F_DEPRECATED;
3278 if (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))
3279 next = ifp->tstamp + ifp->valid_lft * HZ;
3281 spin_unlock(&ifp->lock);
3284 in6_ifa_hold(ifp);
3286 ipv6_ifa_notify(0, ifp);
3287 in6_ifa_put(ifp);
3291 } else if ((ifp->flags&IFA_F_TEMPORARY) &&
3292 !(ifp->flags&IFA_F_TENTATIVE)) {
3293 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry *
3294 ifp->idev->cnf.dad_transmits *
3295 ifp->idev->nd_parms->retrans_time / HZ;
3297 if (age >= ifp->prefered_lft - regen_advance) {
3298 struct inet6_ifaddr *ifpub = ifp->ifpub;
3299 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
3300 next = ifp->tstamp + ifp->prefered_lft * HZ;
3301 if (!ifp->regen_count && ifpub) {
3302 ifp->regen_count++;
3303 in6_ifa_hold(ifp);
3305 spin_unlock(&ifp->lock);
3310 ipv6_create_tempaddr(ifpub, ifp);
3312 in6_ifa_put(ifp);
3315 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next))
3316 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ;
3317 spin_unlock(&ifp->lock);
3320 /* ifp->prefered_lft <= ifp->valid_lft */
3321 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
3322 next = ifp->tstamp + ifp->prefered_lft * HZ;
3323 spin_unlock(&ifp->lock);
3392 static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags,
3420 spin_lock_bh(&ifp->lock);
3421 ifp->flags = (ifp->flags & ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD | IFA_F_HOMEADDRESS)) | ifa_flags;
3422 ifp->tstamp = jiffies;
3423 ifp->valid_lft = valid_lft;
3424 ifp->prefered_lft = prefered_lft;
3426 spin_unlock_bh(&ifp->lock);
3427 if (!(ifp->flags&IFA_F_TENTATIVE))
3428 ipv6_ifa_notify(0, ifp);
3430 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, ifp->idev->dev,
4167 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
4169 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp);
4179 if (!(ifp->rt->rt6i_node))
4180 ip6_ins_rt(ifp->rt);
4181 if (ifp->idev->cnf.forwarding)
4182 addrconf_join_anycast(ifp);
4185 if (ifp->idev->cnf.forwarding)
4186 addrconf_leave_anycast(ifp);
4187 addrconf_leave_solict(ifp->idev, &ifp->addr);
4188 dst_hold(&ifp->rt->dst);
4190 if (ifp->state == INET6_IFADDR_STATE_DEAD &&
4191 ip6_del_rt(ifp->rt))
4192 dst_free(&ifp->rt->dst);
4197 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
4200 if (likely(ifp->idev->dead == 0))
4201 __ipv6_ifa_notify(event, ifp);