Lines Matching refs:ifa
131 static void inet_hash_insert(struct net *net, struct in_ifaddr *ifa)
133 u32 hash = inet_addr_hash(net, ifa->ifa_local);
136 hlist_add_head_rcu(&ifa->hash, &inet_addr_lst[hash]);
139 static void inet_hash_remove(struct in_ifaddr *ifa)
142 hlist_del_init_rcu(&ifa->hash);
156 struct in_ifaddr *ifa;
159 ifa = inet_lookup_ifaddr_rcu(net, addr);
160 if (!ifa) {
174 result = ifa->ifa_dev->dev;
187 struct in_ifaddr *ifa;
189 hlist_for_each_entry_rcu(ifa, &inet_addr_lst[hash], hash)
190 if (ifa->ifa_local == addr &&
191 net_eq(dev_net(ifa->ifa_dev->dev), net))
192 return ifa;
226 struct in_ifaddr *ifa = container_of(head, struct in_ifaddr, rcu_head);
227 if (ifa->ifa_dev)
228 in_dev_put(ifa->ifa_dev);
229 kfree(ifa);
232 static void inet_free_ifa(struct in_ifaddr *ifa)
234 call_rcu(&ifa->rcu_head, inet_rcu_free_ifa);
311 struct in_ifaddr *ifa;
321 while ((ifa = rtnl_dereference(in_dev->ifa_list)) != NULL) {
323 inet_free_ifa(ifa);
337 const struct in_ifaddr *ifa;
340 in_dev_for_each_ifa_rcu(ifa, in_dev) {
341 if (inet_ifa_match(a, ifa)) {
342 if (!b || inet_ifa_match(b, ifa)) {
357 struct in_ifaddr *ifa, *ifa1;
376 while ((ifa = rtnl_dereference(*ifap1)) != NULL) {
377 if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
378 ifa1->ifa_scope <= ifa->ifa_scope)
379 last_prim = &ifa->ifa_next;
381 if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
382 ifa1->ifa_mask != ifa->ifa_mask ||
383 !inet_ifa_match(ifa1->ifa_address, ifa)) {
384 ifap1 = &ifa->ifa_next;
385 prev_prom = ifa;
390 inet_hash_remove(ifa);
391 *ifap1 = ifa->ifa_next;
393 rtmsg_ifa(RTM_DELADDR, ifa, nlh, portid);
395 NETDEV_DOWN, ifa);
396 inet_free_ifa(ifa);
398 promote = ifa;
409 for (ifa = promote; ifa; ifa = rtnl_dereference(ifa->ifa_next)) {
410 if (ifa1->ifa_mask == ifa->ifa_mask &&
411 inet_ifa_match(ifa1->ifa_address, ifa))
412 fib_del_ifaddr(ifa, ifa1);
452 for (ifa = next_sec; ifa;
453 ifa = rtnl_dereference(ifa->ifa_next)) {
454 if (ifa1->ifa_mask != ifa->ifa_mask ||
455 !inet_ifa_match(ifa1->ifa_address, ifa))
457 fib_add_ifaddr(ifa);
476 static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
480 struct in_device *in_dev = ifa->ifa_dev;
487 if (!ifa->ifa_local) {
488 inet_free_ifa(ifa);
492 ifa->ifa_flags &= ~IFA_F_SECONDARY;
496 ifa->ifa_flags &= ~IPV6ONLY_FLAGS;
503 ifa->ifa_scope <= ifa1->ifa_scope)
505 if (ifa1->ifa_mask == ifa->ifa_mask &&
506 inet_ifa_match(ifa1->ifa_address, ifa)) {
507 if (ifa1->ifa_local == ifa->ifa_local) {
508 inet_free_ifa(ifa);
511 if (ifa1->ifa_scope != ifa->ifa_scope) {
513 inet_free_ifa(ifa);
516 ifa->ifa_flags |= IFA_F_SECONDARY;
530 ivi.ivi_addr = ifa->ifa_address;
531 ivi.ivi_dev = ifa->ifa_dev;
537 inet_free_ifa(ifa);
541 if (!(ifa->ifa_flags & IFA_F_SECONDARY))
544 rcu_assign_pointer(ifa->ifa_next, *ifap);
545 rcu_assign_pointer(*ifap, ifa);
547 inet_hash_insert(dev_net(in_dev->dev), ifa);
555 rtmsg_ifa(RTM_NEWADDR, ifa, nlh, portid);
556 blocking_notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);
561 static int inet_insert_ifa(struct in_ifaddr *ifa)
563 return __inet_insert_ifa(ifa, NULL, 0, NULL);
566 static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
573 inet_free_ifa(ifa);
578 if (ifa->ifa_dev != in_dev) {
579 WARN_ON(ifa->ifa_dev);
581 ifa->ifa_dev = in_dev;
583 if (ipv4_is_loopback(ifa->ifa_local))
584 ifa->ifa_scope = RT_SCOPE_HOST;
585 return inet_insert_ifa(ifa);
610 struct in_ifaddr *ifa;
614 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
615 if (ifa->ifa_mask == mask && inet_ifa_match(prefix, ifa))
616 return ifa;
622 const struct in_ifaddr *ifa)
626 .imr_multiaddr.s_addr = ifa->ifa_address,
627 .imr_ifindex = ifa->ifa_dev->dev->ifindex,
655 struct in_ifaddr *ifa;
673 for (ifap = &in_dev->ifa_list; (ifa = rtnl_dereference(*ifap)) != NULL;
674 ifap = &ifa->ifa_next) {
676 ifa->ifa_local != nla_get_in_addr(tb[IFA_LOCAL]))
679 if (tb[IFA_LABEL] && nla_strcmp(tb[IFA_LABEL], ifa->ifa_label))
683 (ifm->ifa_prefixlen != ifa->ifa_prefixlen ||
684 !inet_ifa_match(nla_get_in_addr(tb[IFA_ADDRESS]), ifa)))
687 if (ipv4_is_multicast(ifa->ifa_address))
688 ip_mc_autojoin_config(net, false, ifa);
704 struct in_ifaddr *ifa;
715 hlist_for_each_entry_rcu(ifa, &inet_addr_lst[i], hash) {
718 if (ifa->ifa_flags & IFA_F_PERMANENT)
722 age = (now - ifa->ifa_tstamp +
725 if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
726 age >= ifa->ifa_valid_lft) {
728 } else if (ifa->ifa_preferred_lft ==
731 } else if (age >= ifa->ifa_preferred_lft) {
732 if (time_before(ifa->ifa_tstamp +
733 ifa->ifa_valid_lft * HZ, next))
734 next = ifa->ifa_tstamp +
735 ifa->ifa_valid_lft * HZ;
737 if (!(ifa->ifa_flags & IFA_F_DEPRECATED))
739 } else if (time_before(ifa->ifa_tstamp +
740 ifa->ifa_preferred_lft * HZ,
742 next = ifa->ifa_tstamp +
743 ifa->ifa_preferred_lft * HZ;
750 hlist_for_each_entry_safe(ifa, n, &inet_addr_lst[i], hash) {
753 if (ifa->ifa_flags & IFA_F_PERMANENT)
757 age = (now - ifa->ifa_tstamp +
760 if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
761 age >= ifa->ifa_valid_lft) {
765 ifap = &ifa->ifa_dev->ifa_list;
768 if (tmp == ifa) {
769 inet_del_ifa(ifa->ifa_dev,
776 } else if (ifa->ifa_preferred_lft !=
778 age >= ifa->ifa_preferred_lft &&
779 !(ifa->ifa_flags & IFA_F_DEPRECATED)) {
780 ifa->ifa_flags |= IFA_F_DEPRECATED;
781 rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
803 static void set_ifa_lifetime(struct in_ifaddr *ifa, __u32 valid_lft,
808 ifa->ifa_flags &= ~(IFA_F_PERMANENT | IFA_F_DEPRECATED);
812 ifa->ifa_valid_lft = timeout;
814 ifa->ifa_flags |= IFA_F_PERMANENT;
819 ifa->ifa_flags |= IFA_F_DEPRECATED;
820 ifa->ifa_preferred_lft = timeout;
822 ifa->ifa_tstamp = jiffies;
823 if (!ifa->ifa_cstamp)
824 ifa->ifa_cstamp = ifa->ifa_tstamp;
832 struct in_ifaddr *ifa;
868 ifa = inet_alloc_ifa();
869 if (!ifa)
883 INIT_HLIST_NODE(&ifa->hash);
884 ifa->ifa_prefixlen = ifm->ifa_prefixlen;
885 ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
886 ifa->ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) :
888 ifa->ifa_scope = ifm->ifa_scope;
889 ifa->ifa_dev = in_dev;
891 ifa->ifa_local = nla_get_in_addr(tb[IFA_LOCAL]);
892 ifa->ifa_address = nla_get_in_addr(tb[IFA_ADDRESS]);
895 ifa->ifa_broadcast = nla_get_in_addr(tb[IFA_BROADCAST]);
898 nla_strscpy(ifa->ifa_label, tb[IFA_LABEL], IFNAMSIZ);
900 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
903 ifa->ifa_rt_priority = nla_get_u32(tb[IFA_RT_PRIORITY]);
906 ifa->ifa_proto = nla_get_u8(tb[IFA_PROTO]);
921 return ifa;
924 inet_free_ifa(ifa);
929 static struct in_ifaddr *find_matching_ifa(struct in_ifaddr *ifa)
931 struct in_device *in_dev = ifa->ifa_dev;
934 if (!ifa->ifa_local)
938 if (ifa1->ifa_mask == ifa->ifa_mask &&
939 inet_ifa_match(ifa1->ifa_address, ifa) &&
940 ifa1->ifa_local == ifa->ifa_local)
950 struct in_ifaddr *ifa;
957 ifa = rtm_to_ifaddr(net, nlh, &valid_lft, &prefered_lft, extack);
958 if (IS_ERR(ifa))
959 return PTR_ERR(ifa);
961 ifa_existing = find_matching_ifa(ifa);
966 set_ifa_lifetime(ifa, valid_lft, prefered_lft);
967 if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) {
968 int ret = ip_mc_autojoin_config(net, true, ifa);
972 inet_free_ifa(ifa);
976 return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).portid,
979 u32 new_metric = ifa->ifa_rt_priority;
980 u8 new_proto = ifa->ifa_proto;
982 inet_free_ifa(ifa);
989 ifa = ifa_existing;
991 if (ifa->ifa_rt_priority != new_metric) {
992 fib_modify_prefix_metric(ifa, new_metric);
993 ifa->ifa_rt_priority = new_metric;
996 ifa->ifa_proto = new_proto;
998 set_ifa_lifetime(ifa, valid_lft, prefered_lft);
1002 rtmsg_ifa(RTM_NEWADDR, ifa, nlh, NETLINK_CB(skb).portid);
1039 struct in_ifaddr *ifa = NULL;
1111 (ifa = rtnl_dereference(*ifap)) != NULL;
1112 ifap = &ifa->ifa_next) {
1113 if (!strcmp(ifr->ifr_name, ifa->ifa_label) &&
1115 ifa->ifa_local) {
1123 if (!ifa) {
1125 (ifa = rtnl_dereference(*ifap)) != NULL;
1126 ifap = &ifa->ifa_next)
1127 if (!strcmp(ifr->ifr_name, ifa->ifa_label))
1133 if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS)
1139 sin->sin_addr.s_addr = ifa->ifa_local;
1144 sin->sin_addr.s_addr = ifa->ifa_broadcast;
1149 sin->sin_addr.s_addr = ifa->ifa_address;
1154 sin->sin_addr.s_addr = ifa->ifa_mask;
1160 if (!ifa)
1175 if (!ifa) {
1177 ifa = inet_alloc_ifa();
1178 if (!ifa)
1180 INIT_HLIST_NODE(&ifa->hash);
1182 memcpy(ifa->ifa_label, ifr->ifr_name, IFNAMSIZ);
1184 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1187 if (ifa->ifa_local == sin->sin_addr.s_addr)
1190 ifa->ifa_broadcast = 0;
1191 ifa->ifa_scope = 0;
1194 ifa->ifa_address = ifa->ifa_local = sin->sin_addr.s_addr;
1197 ifa->ifa_prefixlen = inet_abc_len(ifa->ifa_address);
1198 ifa->ifa_mask = inet_make_mask(ifa->ifa_prefixlen);
1200 ifa->ifa_prefixlen < 31)
1201 ifa->ifa_broadcast = ifa->ifa_address |
1202 ~ifa->ifa_mask;
1204 ifa->ifa_prefixlen = 32;
1205 ifa->ifa_mask = inet_make_mask(32);
1207 set_ifa_lifetime(ifa, INFINITY_LIFE_TIME, INFINITY_LIFE_TIME);
1208 ret = inet_set_ifa(dev, ifa);
1213 if (ifa->ifa_broadcast != sin->sin_addr.s_addr) {
1215 ifa->ifa_broadcast = sin->sin_addr.s_addr;
1216 inet_insert_ifa(ifa);
1222 if (ifa->ifa_address == sin->sin_addr.s_addr)
1229 ifa->ifa_address = sin->sin_addr.s_addr;
1230 inet_insert_ifa(ifa);
1242 if (ifa->ifa_mask != sin->sin_addr.s_addr) {
1243 __be32 old_mask = ifa->ifa_mask;
1245 ifa->ifa_mask = sin->sin_addr.s_addr;
1246 ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
1255 (ifa->ifa_prefixlen < 31) &&
1256 (ifa->ifa_broadcast ==
1257 (ifa->ifa_local|~old_mask))) {
1258 ifa->ifa_broadcast = (ifa->ifa_local |
1261 inet_insert_ifa(ifa);
1274 const struct in_ifaddr *ifa;
1284 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1292 strcpy(ifr.ifr_name, ifa->ifa_label);
1296 ifa->ifa_local;
1312 const struct in_ifaddr *ifa;
1314 in_dev_for_each_ifa_rcu(ifa, in_dev) {
1315 if (ifa->ifa_flags & IFA_F_SECONDARY)
1317 if (ifa->ifa_scope != RT_SCOPE_LINK &&
1318 ifa->ifa_scope <= scope)
1319 return ifa->ifa_local;
1327 const struct in_ifaddr *ifa;
1342 in_dev_for_each_ifa_rcu(ifa, in_dev) {
1343 if (ifa->ifa_flags & IFA_F_SECONDARY)
1345 if (min(ifa->ifa_scope, localnet_scope) > scope)
1347 if (!dst || inet_ifa_match(dst, ifa)) {
1348 addr = ifa->ifa_local;
1352 addr = ifa->ifa_local;
1399 const struct in_ifaddr *ifa;
1406 in_dev_for_each_ifa_rcu(ifa, in_dev) {
1407 unsigned char min_scope = min(ifa->ifa_scope, localnet_scope);
1410 (local == ifa->ifa_local || !local) &&
1412 addr = ifa->ifa_local;
1417 same = (!local || inet_ifa_match(local, ifa)) &&
1418 (!dst || inet_ifa_match(dst, ifa));
1423 if (inet_ifa_match(addr, ifa))
1427 addr = ifa->ifa_local;
1505 struct in_ifaddr *ifa;
1508 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1511 memcpy(old, ifa->ifa_label, IFNAMSIZ);
1512 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1521 strcat(ifa->ifa_label, dot);
1523 strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
1525 rtmsg_ifa(RTM_NEWADDR, ifa, NULL, 0);
1533 const struct in_ifaddr *ifa;
1535 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1537 ifa->ifa_local, dev,
1538 ifa->ifa_local, NULL,
1579 struct in_ifaddr *ifa = inet_alloc_ifa();
1581 if (ifa) {
1582 INIT_HLIST_NODE(&ifa->hash);
1583 ifa->ifa_local =
1584 ifa->ifa_address = htonl(INADDR_LOOPBACK);
1585 ifa->ifa_prefixlen = 8;
1586 ifa->ifa_mask = inet_make_mask(8);
1588 ifa->ifa_dev = in_dev;
1589 ifa->ifa_scope = RT_SCOPE_HOST;
1590 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
1591 set_ifa_lifetime(ifa, INFINITY_LIFE_TIME,
1595 inet_insert_ifa(ifa);
1674 static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
1688 ifm->ifa_prefixlen = ifa->ifa_prefixlen;
1689 ifm->ifa_flags = ifa->ifa_flags;
1690 ifm->ifa_scope = ifa->ifa_scope;
1691 ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
1698 preferred = ifa->ifa_preferred_lft;
1699 valid = ifa->ifa_valid_lft;
1701 long tval = (jiffies - ifa->ifa_tstamp) / HZ;
1718 if ((ifa->ifa_address &&
1719 nla_put_in_addr(skb, IFA_ADDRESS, ifa->ifa_address)) ||
1720 (ifa->ifa_local &&
1721 nla_put_in_addr(skb, IFA_LOCAL, ifa->ifa_local)) ||
1722 (ifa->ifa_broadcast &&
1723 nla_put_in_addr(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
1724 (ifa->ifa_label[0] &&
1725 nla_put_string(skb, IFA_LABEL, ifa->ifa_label)) ||
1726 (ifa->ifa_proto &&
1727 nla_put_u8(skb, IFA_PROTO, ifa->ifa_proto)) ||
1728 nla_put_u32(skb, IFA_FLAGS, ifa->ifa_flags) ||
1729 (ifa->ifa_rt_priority &&
1730 nla_put_u32(skb, IFA_RT_PRIORITY, ifa->ifa_rt_priority)) ||
1731 put_cacheinfo(skb, ifa->ifa_cstamp, ifa->ifa_tstamp,
1804 struct in_ifaddr *ifa;
1808 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
1813 err = inet_fill_ifaddr(skb, ifa, fillargs);
1926 static void rtmsg_ifa(int event, struct in_ifaddr *ifa, struct nlmsghdr *nlh,
1940 net = dev_net(ifa->ifa_dev->dev);
1945 err = inet_fill_ifaddr(skb, ifa, &fillargs);