Lines Matching refs:ifa
128 static void inet_hash_insert(struct net *net, struct in_ifaddr *ifa)
130 u32 hash = inet_addr_hash(net, ifa->ifa_local);
133 hlist_add_head_rcu(&ifa->hash, &inet_addr_lst[hash]);
136 static void inet_hash_remove(struct in_ifaddr *ifa)
139 hlist_del_init_rcu(&ifa->hash);
153 struct in_ifaddr *ifa;
156 ifa = inet_lookup_ifaddr_rcu(net, addr);
157 if (!ifa) {
171 result = ifa->ifa_dev->dev;
184 struct in_ifaddr *ifa;
186 hlist_for_each_entry_rcu(ifa, &inet_addr_lst[hash], hash)
187 if (ifa->ifa_local == addr &&
188 net_eq(dev_net(ifa->ifa_dev->dev), net))
189 return ifa;
223 struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
224 if (ifa->ifa_dev)
225 in_dev_put(ifa->ifa_dev);
226 kfree(ifa);
229 static void inet_free_ifa(struct in_ifaddr *ifa)
231 call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
307 struct in_ifaddr *ifa;
317 while ((ifa = rtnl_dereference(in_dev->ifa_list)) != NULL) {
319 inet_free_ifa(ifa);
333 const struct in_ifaddr *ifa;
336 in_dev_for_each_ifa_rcu(ifa, in_dev) {
337 if (inet_ifa_match(a, ifa)) {
338 if (!b || inet_ifa_match(b, ifa)) {
353 struct in_ifaddr *ifa, *ifa1;
372 while ((ifa = rtnl_dereference(*ifap1)) != NULL) {
373 if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
374 ifa1->ifa_scope <= ifa->ifa_scope)
375 last_prim = &ifa->ifa_next;
377 if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
378 ifa1->ifa_mask != ifa->ifa_mask ||
379 !inet_ifa_match(ifa1->ifa_address, ifa)) {
380 ifap1 = &ifa->ifa_next;
381 prev_prom = ifa;
386 inet_hash_remove(ifa);
387 *ifap1 = ifa->ifa_next;
389 rtmsg_ifa(RTM_DELADDR, ifa, nlh, portid);
391 NETDEV_DOWN, ifa);
392 inet_free_ifa(ifa);
394 promote = ifa;
405 for (ifa = promote; ifa; ifa = rtnl_dereference(ifa->ifa_next)) {
406 if (ifa1->ifa_mask == ifa->ifa_mask &&
407 inet_ifa_match(ifa1->ifa_address, ifa))
408 fib_del_ifaddr(ifa, ifa1);
448 for (ifa = next_sec; ifa;
449 ifa = rtnl_dereference(ifa->ifa_next)) {
450 if (ifa1->ifa_mask != ifa->ifa_mask ||
451 !inet_ifa_match(ifa1->ifa_address, ifa))
453 fib_add_ifaddr(ifa);
472 static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
476 struct in_device *in_dev = ifa->ifa_dev;
483 if (!ifa->ifa_local) {
484 inet_free_ifa(ifa);
488 ifa->ifa_flags &= ~IFA_F_SECONDARY;
492 ifa->ifa_flags &= ~IPV6ONLY_FLAGS;
499 ifa->ifa_scope <= ifa1->ifa_scope)
501 if (ifa1->ifa_mask == ifa->ifa_mask &&
502 inet_ifa_match(ifa1->ifa_address, ifa)) {
503 if (ifa1->ifa_local == ifa->ifa_local) {
504 inet_free_ifa(ifa);
507 if (ifa1->ifa_scope != ifa->ifa_scope) {
508 inet_free_ifa(ifa);
511 ifa->ifa_flags |= IFA_F_SECONDARY;
525 ivi.ivi_addr = ifa->ifa_address;
526 ivi.ivi_dev = ifa->ifa_dev;
532 inet_free_ifa(ifa);
536 if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {
537 prandom_seed((__force u32) ifa->ifa_local);
541 rcu_assign_pointer(ifa->ifa_next, *ifap);
542 rcu_assign_pointer(*ifap, ifa);
544 inet_hash_insert(dev_net(in_dev->dev), ifa);
552 rtmsg_ifa(RTM_NEWADDR, ifa, nlh, portid);
553 blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
558 static int inet_insert_ifa(struct in_ifaddr *ifa)
560 return __inet_insert_ifa(ifa, NULL, 0, NULL);
563 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
570 inet_free_ifa(ifa);
575 if (ifa->ifa_dev != in_dev) {
576 WARN_ON(ifa->ifa_dev);
578 ifa->ifa_dev = in_dev;
580 if (ipv4_is_loopback(ifa->ifa_local))
581 ifa->ifa_scope = RT_SCOPE_HOST;
582 return inet_insert_ifa(ifa);
607 struct in_ifaddr *ifa;
611 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
612 if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
613 return ifa;
619 const struct in_ifaddr *ifa)
623 .imr_multiaddr.s_addr = ifa->ifa_address,
624 .imr_ifindex = ifa->ifa_dev->dev->ifindex,
652 struct in_ifaddr *ifa;
670 for (ifap = &in_dev->ifa_list; (ifa = rtnl_dereference(*ifap)) != NULL;
671 ifap = &ifa->ifa_next) {
673 ifa->ifa_local != nla_get_in_addr(tb[IFA_LOCAL]))
676 if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
680 (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
681 !inet_ifa_match(nla_get_in_addr(tb[IFA_ADDRESS]), ifa)))
684 if (ipv4_is_multicast(ifa->ifa_address))
685 ip_mc_autojoin_config(net, false, ifa);
700 struct in_ifaddr *ifa;
711 hlist_for_each_entry_rcu(ifa, &inet_addr_lst[i], hash) {
714 if (ifa->ifa_flags & IFA_F_PERMANENT)
718 age = (now - ifa->ifa_tstamp +
721 if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
722 age >= ifa->ifa_valid_lft) {
724 } else if (ifa->ifa_preferred_lft ==
727 } else if (age >= ifa->ifa_preferred_lft) {
728 if (time_before(ifa->ifa_tstamp +
729 ifa->ifa_valid_lft * HZ, next))
730 next = ifa->ifa_tstamp +
731 ifa->ifa_valid_lft * HZ;
733 if (!(ifa->ifa_flags & IFA_F_DEPRECATED))
735 } else if (time_before(ifa->ifa_tstamp +
736 ifa->ifa_preferred_lft * HZ,
738 next = ifa->ifa_tstamp +
739 ifa->ifa_preferred_lft * HZ;
746 hlist_for_each_entry_safe(ifa, n, &inet_addr_lst[i], hash) {
749 if (ifa->ifa_flags & IFA_F_PERMANENT)
753 age = (now - ifa->ifa_tstamp +
756 if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
757 age >= ifa->ifa_valid_lft) {
761 ifap = &ifa->ifa_dev->ifa_list;
764 if (tmp == ifa) {
765 inet_del_ifa(ifa->ifa_dev,
772 } else if (ifa->ifa_preferred_lft !=
774 age >= ifa->ifa_preferred_lft &&
775 !(ifa->ifa_flags & IFA_F_DEPRECATED)) {
776 ifa->ifa_flags |= IFA_F_DEPRECATED;
777 rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
799 static void set_ifa_lifetime(struct in_ifaddr *ifa, __u32 valid_lft,
804 ifa->ifa_flags &= ~(IFA_F_PERMANENT | IFA_F_DEPRECATED);
808 ifa->ifa_valid_lft = timeout;
810 ifa->ifa_flags |= IFA_F_PERMANENT;
815 ifa->ifa_flags |= IFA_F_DEPRECATED;
816 ifa->ifa_preferred_lft = timeout;
818 ifa->ifa_tstamp = jiffies;
819 if (!ifa->ifa_cstamp)
820 ifa->ifa_cstamp = ifa->ifa_tstamp;
828 struct in_ifaddr *ifa;
854 ifa = inet_alloc_ifa();
855 if (!ifa)
869 INIT_HLIST_NODE(&ifa->hash);
870 ifa->ifa_prefixlen = ifm->ifa_prefixlen;
871 ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
872 ifa->ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) :
874 ifa->ifa_scope = ifm->ifa_scope;
875 ifa->ifa_dev = in_dev;
877 ifa->ifa_local = nla_get_in_addr(tb[IFA_LOCAL]);
878 ifa->ifa_address = nla_get_in_addr(tb[IFA_ADDRESS]);
881 ifa->ifa_broadcast = nla_get_in_addr(tb[IFA_BROADCAST]);
884 nla_strlcpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
886 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
889 ifa->ifa_rt_priority = nla_get_u32(tb[IFA_RT_PRIORITY]);
903 return ifa;
906 inet_free_ifa(ifa);
911 static struct in_ifaddr *find_matching_ifa(struct in_ifaddr *ifa)
913 struct in_device *in_dev = ifa->ifa_dev;
916 if (!ifa->ifa_local)
920 if (ifa1->ifa_mask == ifa->ifa_mask &&
921 inet_ifa_match(ifa1->ifa_address, ifa) &&
922 ifa1->ifa_local == ifa->ifa_local)
932 struct in_ifaddr *ifa;
939 ifa = rtm_to_ifaddr(net, nlh, &valid_lft, &prefered_lft, extack);
940 if (IS_ERR(ifa))
941 return PTR_ERR(ifa);
943 ifa_existing = find_matching_ifa(ifa);
948 set_ifa_lifetime(ifa, valid_lft, prefered_lft);
949 if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) {
950 int ret = ip_mc_autojoin_config(net, true, ifa);
953 inet_free_ifa(ifa);
957 return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).portid,
960 u32 new_metric = ifa->ifa_rt_priority;
962 inet_free_ifa(ifa);
967 ifa = ifa_existing;
969 if (ifa->ifa_rt_priority != new_metric) {
970 fib_modify_prefix_metric(ifa, new_metric);
971 ifa->ifa_rt_priority = new_metric;
974 set_ifa_lifetime(ifa, valid_lft, prefered_lft);
978 rtmsg_ifa(RTM_NEWADDR, ifa, nlh, NETLINK_CB(skb).portid);
1015 struct in_ifaddr *ifa = NULL;
1087 (ifa = rtnl_dereference(*ifap)) != NULL;
1088 ifap = &ifa->ifa_next) {
1089 if (!strcmp(ifr->ifr_name, ifa->ifa_label) &&
1091 ifa->ifa_local) {
1099 if (!ifa) {
1101 (ifa = rtnl_dereference(*ifap)) != NULL;
1102 ifap = &ifa->ifa_next)
1103 if (!strcmp(ifr->ifr_name, ifa->ifa_label))
1109 if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
1115 sin->sin_addr.s_addr = ifa->ifa_local;
1120 sin->sin_addr.s_addr = ifa->ifa_broadcast;
1125 sin->sin_addr.s_addr = ifa->ifa_address;
1130 sin->sin_addr.s_addr = ifa->ifa_mask;
1136 if (!ifa)
1151 if (!ifa) {
1153 ifa = inet_alloc_ifa();
1154 if (!ifa)
1156 INIT_HLIST_NODE(&ifa->hash);
1158 memcpy(ifa->ifa_label, ifr->ifr_name, IFNAMSIZ);
1160 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1163 if (ifa->ifa_local == sin->sin_addr.s_addr)
1166 ifa->ifa_broadcast = 0;
1167 ifa->ifa_scope = 0;
1170 ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
1173 ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
1174 ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
1176 ifa->ifa_prefixlen < 31)
1177 ifa->ifa_broadcast = ifa->ifa_address |
1178 ~ifa->ifa_mask;
1180 ifa->ifa_prefixlen = 32;
1181 ifa->ifa_mask = inet_make_mask(32);
1183 set_ifa_lifetime(ifa, INFINITY_LIFE_TIME, INFINITY_LIFE_TIME);
1184 ret = inet_set_ifa(dev, ifa);
1189 if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
1191 ifa->ifa_broadcast = sin->sin_addr.s_addr;
1192 inet_insert_ifa(ifa);
1198 if (ifa->ifa_address == sin->sin_addr.s_addr)
1205 ifa->ifa_address = sin->sin_addr.s_addr;
1206 inet_insert_ifa(ifa);
1218 if (ifa->ifa_mask != sin->sin_addr.s_addr) {
1219 __be32 old_mask = ifa->ifa_mask;
1221 ifa->ifa_mask = sin->sin_addr.s_addr;
1222 ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
1231 (ifa->ifa_prefixlen < 31) &&
1232 (ifa->ifa_broadcast ==
1233 (ifa->ifa_local|~old_mask))) {
1234 ifa->ifa_broadcast = (ifa->ifa_local |
1237 inet_insert_ifa(ifa);
1250 const struct in_ifaddr *ifa;
1260 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1268 strcpy(ifr.ifr_name, ifa->ifa_label);
1272 ifa->ifa_local;
1288 const struct in_ifaddr *ifa;
1290 in_dev_for_each_ifa_rcu(ifa, in_dev) {
1291 if (ifa->ifa_flags & IFA_F_SECONDARY)
1293 if (ifa->ifa_scope != RT_SCOPE_LINK &&
1294 ifa->ifa_scope <= scope)
1295 return ifa->ifa_local;
1303 const struct in_ifaddr *ifa;
1318 in_dev_for_each_ifa_rcu(ifa, in_dev) {
1319 if (ifa->ifa_flags & IFA_F_SECONDARY)
1321 if (min(ifa->ifa_scope, localnet_scope) > scope)
1323 if (!dst || inet_ifa_match(dst, ifa)) {
1324 addr = ifa->ifa_local;
1328 addr = ifa->ifa_local;
1375 const struct in_ifaddr *ifa;
1382 in_dev_for_each_ifa_rcu(ifa, in_dev) {
1383 unsigned char min_scope = min(ifa->ifa_scope, localnet_scope);
1386 (local == ifa->ifa_local || !local) &&
1388 addr = ifa->ifa_local;
1393 same = (!local || inet_ifa_match(local, ifa)) &&
1394 (!dst || inet_ifa_match(dst, ifa));
1399 if (inet_ifa_match(addr, ifa))
1403 addr = ifa->ifa_local;
1481 struct in_ifaddr *ifa;
1484 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1487 memcpy(old, ifa->ifa_label, IFNAMSIZ);
1488 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1497 strcat(ifa->ifa_label, dot);
1499 strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1501 rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
1509 const struct in_ifaddr *ifa;
1511 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1513 ifa->ifa_local, dev,
1514 ifa->ifa_local, NULL,
1555 struct in_ifaddr *ifa = inet_alloc_ifa();
1557 if (ifa) {
1558 INIT_HLIST_NODE(&ifa->hash);
1559 ifa->ifa_local =
1560 ifa->ifa_address = htonl(INADDR_LOOPBACK);
1561 ifa->ifa_prefixlen = 8;
1562 ifa->ifa_mask = inet_make_mask(8);
1564 ifa->ifa_dev = in_dev;
1565 ifa->ifa_scope = RT_SCOPE_HOST;
1566 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1567 set_ifa_lifetime(ifa, INFINITY_LIFE_TIME,
1571 inet_insert_ifa(ifa);
1649 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1663 ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1664 ifm->ifa_flags = ifa->ifa_flags;
1665 ifm->ifa_scope = ifa->ifa_scope;
1666 ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1673 preferred = ifa->ifa_preferred_lft;
1674 valid = ifa->ifa_valid_lft;
1676 long tval = (jiffies - ifa->ifa_tstamp) / HZ;
1693 if ((ifa->ifa_address &&
1694 nla_put_in_addr(skb, IFA_ADDRESS, ifa->ifa_address)) ||
1695 (ifa->ifa_local &&
1696 nla_put_in_addr(skb, IFA_LOCAL, ifa->ifa_local)) ||
1697 (ifa->ifa_broadcast &&
1698 nla_put_in_addr(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
1699 (ifa->ifa_label[0] &&
1700 nla_put_string(skb, IFA_LABEL, ifa->ifa_label)) ||
1701 nla_put_u32(skb, IFA_FLAGS, ifa->ifa_flags) ||
1702 (ifa->ifa_rt_priority &&
1703 nla_put_u32(skb, IFA_RT_PRIORITY, ifa->ifa_rt_priority)) ||
1704 put_cacheinfo(skb, ifa->ifa_cstamp, ifa->ifa_tstamp,
1777 struct in_ifaddr *ifa;
1781 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1786 err = inet_fill_ifaddr(skb, ifa, fillargs);
1885 static void rtmsg_ifa(int event, struct in_ifaddr *ifa, struct nlmsghdr *nlh,
1899 net = dev_net(ifa->ifa_dev->dev);
1904 err = inet_fill_ifaddr(skb, ifa, &fillargs);