• Home
  • Raw
  • Download

Lines Matching +full:use +full:- +full:rtm

1 // SPDX-License-Identifier: GPL-2.0-or-later
57 return -ENOMEM; in fib4_rules_init()
63 hlist_add_head_rcu(&local_table->tb_hlist, in fib4_rules_init()
64 &net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX]); in fib4_rules_init()
65 hlist_add_head_rcu(&main_table->tb_hlist, in fib4_rules_init()
66 &net->ipv4.fib_table_hash[TABLE_MAIN_INDEX]); in fib4_rules_init()
71 return -ENOMEM; in fib4_rules_init()
86 if (id == RT_TABLE_LOCAL && !net->ipv4.fib_has_custom_rules) in fib_new_table()
95 rcu_assign_pointer(net->ipv4.fib_main, tb); in fib_new_table()
98 rcu_assign_pointer(net->ipv4.fib_default, tb); in fib_new_table()
104 h = id & (FIB_TABLE_HASHSZ - 1); in fib_new_table()
105 hlist_add_head_rcu(&tb->tb_hlist, &net->ipv4.fib_table_hash[h]); in fib_new_table()
119 h = id & (FIB_TABLE_HASHSZ - 1); in fib_get_table()
121 head = &net->ipv4.fib_table_hash[h]; in fib_get_table()
124 if (tb->tb_id == id) in fib_get_table()
135 switch (new->tb_id) { in fib_replace_table()
137 rcu_assign_pointer(net->ipv4.fib_main, new); in fib_replace_table()
140 rcu_assign_pointer(net->ipv4.fib_default, new); in fib_replace_table()
148 hlist_replace_rcu(&old->tb_hlist, &new->tb_hlist); in fib_replace_table()
162 return -ENOMEM; in fib_unmerge()
189 struct hlist_head *head = &net->ipv4.fib_table_hash[h]; in fib_flush()
227 if (!dev || dev == nhc->nhc_dev) in __inet_dev_addr_type()
272 struct net_device *dev = skb->dev; in fib_compute_spec_dst()
280 if ((rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST | RTCF_LOCAL)) == in fib_compute_spec_dst()
282 return ip_hdr(skb)->daddr; in fib_compute_spec_dst()
289 if (!ipv4_is_zeronet(ip_hdr(skb)->saddr)) { in fib_compute_spec_dst()
294 .daddr = ip_hdr(skb)->saddr, in fib_compute_spec_dst()
295 .flowi4_tos = ip_hdr(skb)->tos & IPTOS_RT_MASK, in fib_compute_spec_dst()
297 .flowi4_mark = vmark ? skb->mark : 0, in fib_compute_spec_dst()
305 return inet_select_addr(dev, ip_hdr(skb)->saddr, scope); in fib_compute_spec_dst()
312 if (unlikely(fi->nh)) { in fib_info_nh_uses_dev()
313 dev_match = nexthop_uses_dev(fi->nh, dev); in fib_info_nh_uses_dev()
327 if (fib_info_nhc(fi, 0)->nhc_dev == dev) in fib_info_nh_uses_dev()
336 * - (main) check, that source is valid i.e. not broadcast or our local
338 * - figure out what "logical" interface this packet arrived
340 * - check, that packet arrived from expected physical interface.
367 no_addr = idev->ifa_list == NULL; in __fib_validate_source()
369 fl4.flowi4_mark = IN_DEV_SRC_VMARK(idev) ? skb->mark : 0; in __fib_validate_source()
390 dev == net->loopback_dev); in __fib_validate_source()
392 ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_LINK; in __fib_validate_source()
399 fl4.flowi4_oif = dev->ifindex; in __fib_validate_source()
404 ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_LINK; in __fib_validate_source()
415 return -EINVAL; in __fib_validate_source()
417 return -EXDEV; in __fib_validate_source()
429 (dev->ifindex != oif || !IN_DEV_TX_REDIRECTS(idev))) { in fib_validate_source()
436 if (net->ipv4.fib_has_custom_local_routes || in fib_validate_source()
440 return -EINVAL; in fib_validate_source()
453 return ((struct sockaddr_in *) addr)->sin_addr.s_addr; in sk_extract_addr()
461 nla->nla_type = type; in put_rtax()
462 nla->nla_len = nla_attr_size(4); in put_rtax()
475 cfg->fc_nlinfo.nl_net = net; in rtentry_to_fib_config()
477 if (rt->rt_dst.sa_family != AF_INET) in rtentry_to_fib_config()
478 return -EAFNOSUPPORT; in rtentry_to_fib_config()
489 addr = sk_extract_addr(&rt->rt_dst); in rtentry_to_fib_config()
490 if (!(rt->rt_flags & RTF_HOST)) { in rtentry_to_fib_config()
491 __be32 mask = sk_extract_addr(&rt->rt_genmask); in rtentry_to_fib_config()
493 if (rt->rt_genmask.sa_family != AF_INET) { in rtentry_to_fib_config()
494 if (mask || rt->rt_genmask.sa_family) in rtentry_to_fib_config()
495 return -EAFNOSUPPORT; in rtentry_to_fib_config()
499 return -EINVAL; in rtentry_to_fib_config()
504 cfg->fc_dst_len = plen; in rtentry_to_fib_config()
505 cfg->fc_dst = addr; in rtentry_to_fib_config()
508 cfg->fc_nlflags = NLM_F_CREATE; in rtentry_to_fib_config()
509 cfg->fc_protocol = RTPROT_BOOT; in rtentry_to_fib_config()
512 if (rt->rt_metric) in rtentry_to_fib_config()
513 cfg->fc_priority = rt->rt_metric - 1; in rtentry_to_fib_config()
515 if (rt->rt_flags & RTF_REJECT) { in rtentry_to_fib_config()
516 cfg->fc_scope = RT_SCOPE_HOST; in rtentry_to_fib_config()
517 cfg->fc_type = RTN_UNREACHABLE; in rtentry_to_fib_config()
521 cfg->fc_scope = RT_SCOPE_NOWHERE; in rtentry_to_fib_config()
522 cfg->fc_type = RTN_UNICAST; in rtentry_to_fib_config()
524 if (rt->rt_dev) { in rtentry_to_fib_config()
529 if (copy_from_user(devname, rt->rt_dev, IFNAMSIZ-1)) in rtentry_to_fib_config()
530 return -EFAULT; in rtentry_to_fib_config()
532 devname[IFNAMSIZ-1] = 0; in rtentry_to_fib_config()
538 return -ENODEV; in rtentry_to_fib_config()
539 cfg->fc_oif = dev->ifindex; in rtentry_to_fib_config()
540 cfg->fc_table = l3mdev_fib_table(dev); in rtentry_to_fib_config()
547 return -ENODEV; in rtentry_to_fib_config()
553 if (strcmp(ifa->ifa_label, devname) == 0) in rtentry_to_fib_config()
559 return -ENODEV; in rtentry_to_fib_config()
560 cfg->fc_prefsrc = ifa->ifa_local; in rtentry_to_fib_config()
564 addr = sk_extract_addr(&rt->rt_gateway); in rtentry_to_fib_config()
565 if (rt->rt_gateway.sa_family == AF_INET && addr) { in rtentry_to_fib_config()
568 cfg->fc_gw4 = addr; in rtentry_to_fib_config()
569 cfg->fc_gw_family = AF_INET; in rtentry_to_fib_config()
570 addr_type = inet_addr_type_table(net, addr, cfg->fc_table); in rtentry_to_fib_config()
571 if (rt->rt_flags & RTF_GATEWAY && in rtentry_to_fib_config()
573 cfg->fc_scope = RT_SCOPE_UNIVERSE; in rtentry_to_fib_config()
576 if (!cfg->fc_table) in rtentry_to_fib_config()
577 cfg->fc_table = RT_TABLE_MAIN; in rtentry_to_fib_config()
582 if (rt->rt_flags & RTF_GATEWAY && !cfg->fc_gw_family) in rtentry_to_fib_config()
583 return -EINVAL; in rtentry_to_fib_config()
585 if (cfg->fc_scope == RT_SCOPE_NOWHERE) in rtentry_to_fib_config()
586 cfg->fc_scope = RT_SCOPE_LINK; in rtentry_to_fib_config()
588 if (rt->rt_flags & (RTF_MTU | RTF_WINDOW | RTF_IRTT)) { in rtentry_to_fib_config()
594 return -ENOMEM; in rtentry_to_fib_config()
596 if (rt->rt_flags & RTF_MTU) in rtentry_to_fib_config()
597 len = put_rtax(mx, len, RTAX_ADVMSS, rt->rt_mtu - 40); in rtentry_to_fib_config()
599 if (rt->rt_flags & RTF_WINDOW) in rtentry_to_fib_config()
600 len = put_rtax(mx, len, RTAX_WINDOW, rt->rt_window); in rtentry_to_fib_config()
602 if (rt->rt_flags & RTF_IRTT) in rtentry_to_fib_config()
603 len = put_rtax(mx, len, RTAX_RTT, rt->rt_irtt << 3); in rtentry_to_fib_config()
605 cfg->fc_mx = mx; in rtentry_to_fib_config()
606 cfg->fc_mx_len = len; in rtentry_to_fib_config()
624 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip_rt_ioctl()
625 return -EPERM; in ip_rt_ioctl()
638 err = -ESRCH; in ip_rt_ioctl()
645 err = -ENOBUFS; in ip_rt_ioctl()
654 return -EINVAL; in ip_rt_ioctl()
688 return -EINVAL; in fib_gw_from_via()
692 alen = nla_len(nla) - offsetof(struct rtvia, rtvia_addr); in fib_gw_from_via()
694 switch (via->rtvia_family) { in fib_gw_from_via()
698 return -EINVAL; in fib_gw_from_via()
700 cfg->fc_gw_family = AF_INET; in fib_gw_from_via()
701 cfg->fc_gw4 = *((__be32 *)via->rtvia_addr); in fib_gw_from_via()
707 return -EINVAL; in fib_gw_from_via()
709 cfg->fc_gw_family = AF_INET6; in fib_gw_from_via()
710 cfg->fc_gw6 = *((struct in6_addr *)via->rtvia_addr); in fib_gw_from_via()
713 return -EINVAL; in fib_gw_from_via()
718 return -EINVAL; in fib_gw_from_via()
731 struct rtmsg *rtm; in rtm_to_fib_config() local
733 err = nlmsg_validate_deprecated(nlh, sizeof(*rtm), RTA_MAX, in rtm_to_fib_config()
740 rtm = nlmsg_data(nlh); in rtm_to_fib_config()
741 cfg->fc_dst_len = rtm->rtm_dst_len; in rtm_to_fib_config()
742 cfg->fc_tos = rtm->rtm_tos; in rtm_to_fib_config()
743 cfg->fc_table = rtm->rtm_table; in rtm_to_fib_config()
744 cfg->fc_protocol = rtm->rtm_protocol; in rtm_to_fib_config()
745 cfg->fc_scope = rtm->rtm_scope; in rtm_to_fib_config()
746 cfg->fc_type = rtm->rtm_type; in rtm_to_fib_config()
747 cfg->fc_flags = rtm->rtm_flags; in rtm_to_fib_config()
748 cfg->fc_nlflags = nlh->nlmsg_flags; in rtm_to_fib_config()
750 cfg->fc_nlinfo.portid = NETLINK_CB(skb).portid; in rtm_to_fib_config()
751 cfg->fc_nlinfo.nlh = nlh; in rtm_to_fib_config()
752 cfg->fc_nlinfo.nl_net = net; in rtm_to_fib_config()
754 if (cfg->fc_type > RTN_MAX) { in rtm_to_fib_config()
756 err = -EINVAL; in rtm_to_fib_config()
763 cfg->fc_dst = nla_get_be32(attr); in rtm_to_fib_config()
766 cfg->fc_oif = nla_get_u32(attr); in rtm_to_fib_config()
770 cfg->fc_gw4 = nla_get_be32(attr); in rtm_to_fib_config()
771 if (cfg->fc_gw4) in rtm_to_fib_config()
772 cfg->fc_gw_family = AF_INET; in rtm_to_fib_config()
781 cfg->fc_priority = nla_get_u32(attr); in rtm_to_fib_config()
784 cfg->fc_prefsrc = nla_get_be32(attr); in rtm_to_fib_config()
787 cfg->fc_mx = nla_data(attr); in rtm_to_fib_config()
788 cfg->fc_mx_len = nla_len(attr); in rtm_to_fib_config()
796 cfg->fc_mp = nla_data(attr); in rtm_to_fib_config()
797 cfg->fc_mp_len = nla_len(attr); in rtm_to_fib_config()
800 cfg->fc_flow = nla_get_u32(attr); in rtm_to_fib_config()
803 cfg->fc_table = nla_get_u32(attr); in rtm_to_fib_config()
806 cfg->fc_encap = attr; in rtm_to_fib_config()
809 cfg->fc_encap_type = nla_get_u16(attr); in rtm_to_fib_config()
810 err = lwtunnel_valid_encap_type(cfg->fc_encap_type, in rtm_to_fib_config()
816 cfg->fc_nh_id = nla_get_u32(attr); in rtm_to_fib_config()
821 if (cfg->fc_nh_id) { in rtm_to_fib_config()
822 if (cfg->fc_oif || cfg->fc_gw_family || in rtm_to_fib_config()
823 cfg->fc_encap || cfg->fc_mp) { in rtm_to_fib_config()
826 return -EINVAL; in rtm_to_fib_config()
833 return -EINVAL; in rtm_to_fib_config()
836 if (!cfg->fc_table) in rtm_to_fib_config()
837 cfg->fc_table = RT_TABLE_MAIN; in rtm_to_fib_config()
847 struct net *net = sock_net(skb->sk); in inet_rtm_delroute()
858 err = -EINVAL; in inet_rtm_delroute()
865 err = -ESRCH; in inet_rtm_delroute()
877 struct net *net = sock_net(skb->sk); in inet_rtm_newroute()
888 err = -ENOBUFS; in inet_rtm_newroute()
894 net->ipv4.fib_has_custom_local_routes = true; in inet_rtm_newroute()
903 struct netlink_ext_ack *extack = cb->extack; in ip_valid_fib_dump_req()
905 struct rtmsg *rtm; in ip_valid_fib_dump_req() local
910 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*rtm))) { in ip_valid_fib_dump_req()
912 return -EINVAL; in ip_valid_fib_dump_req()
915 rtm = nlmsg_data(nlh); in ip_valid_fib_dump_req()
916 if (rtm->rtm_dst_len || rtm->rtm_src_len || rtm->rtm_tos || in ip_valid_fib_dump_req()
917 rtm->rtm_scope) { in ip_valid_fib_dump_req()
919 return -EINVAL; in ip_valid_fib_dump_req()
922 if (rtm->rtm_flags & ~(RTM_F_CLONED | RTM_F_PREFIX)) { in ip_valid_fib_dump_req()
924 return -EINVAL; in ip_valid_fib_dump_req()
926 if (rtm->rtm_flags & RTM_F_CLONED) in ip_valid_fib_dump_req()
927 filter->dump_routes = false; in ip_valid_fib_dump_req()
929 filter->dump_exceptions = false; in ip_valid_fib_dump_req()
931 filter->flags = rtm->rtm_flags; in ip_valid_fib_dump_req()
932 filter->protocol = rtm->rtm_protocol; in ip_valid_fib_dump_req()
933 filter->rt_type = rtm->rtm_type; in ip_valid_fib_dump_req()
934 filter->table_id = rtm->rtm_table; in ip_valid_fib_dump_req()
936 err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX, in ip_valid_fib_dump_req()
949 filter->table_id = nla_get_u32(tb[i]); in ip_valid_fib_dump_req()
953 filter->dev = __dev_get_by_index(net, ifindex); in ip_valid_fib_dump_req()
954 if (!filter->dev) in ip_valid_fib_dump_req()
955 return -ENODEV; in ip_valid_fib_dump_req()
959 return -EINVAL; in ip_valid_fib_dump_req()
963 if (filter->flags || filter->protocol || filter->rt_type || in ip_valid_fib_dump_req()
964 filter->table_id || filter->dev) { in ip_valid_fib_dump_req()
965 filter->filter_set = 1; in ip_valid_fib_dump_req()
966 cb->answer_flags = NLM_F_DUMP_FILTERED; in ip_valid_fib_dump_req()
977 const struct nlmsghdr *nlh = cb->nlh; in inet_dump_fib()
978 struct net *net = sock_net(skb->sk); in inet_dump_fib()
985 if (cb->strict_check) { in inet_dump_fib()
990 struct rtmsg *rtm = nlmsg_data(nlh); in inet_dump_fib() local
992 filter.flags = rtm->rtm_flags & (RTM_F_PREFIX | RTM_F_CLONED); in inet_dump_fib()
995 /* ipv4 does not use prefix flag */ in inet_dump_fib()
997 return skb->len; in inet_dump_fib()
1002 if (rtnl_msg_family(cb->nlh) != PF_INET) in inet_dump_fib()
1003 return skb->len; in inet_dump_fib()
1005 NL_SET_ERR_MSG(cb->extack, "ipv4: FIB table does not exist"); in inet_dump_fib()
1006 return -ENOENT; in inet_dump_fib()
1012 return skb->len ? : err; in inet_dump_fib()
1015 s_h = cb->args[0]; in inet_dump_fib()
1016 s_e = cb->args[1]; in inet_dump_fib()
1022 head = &net->ipv4.fib_table_hash[h]; in inet_dump_fib()
1027 memset(&cb->args[2], 0, sizeof(cb->args) - in inet_dump_fib()
1028 2 * sizeof(cb->args[0])); in inet_dump_fib()
1031 if (likely(skb->len)) in inet_dump_fib()
1042 err = skb->len; in inet_dump_fib()
1046 cb->args[1] = e; in inet_dump_fib()
1047 cb->args[0] = h; in inet_dump_fib()
1052 /* Prepare and feed intra-kernel routing request.
1053 * Really, it should be netlink message, but :-( netlink
1061 struct net *net = dev_net(ifa->ifa_dev->dev); in fib_magic()
1062 u32 tb_id = l3mdev_fib_table(ifa->ifa_dev->dev); in fib_magic()
1070 .fc_prefsrc = ifa->ifa_local, in fib_magic()
1071 .fc_oif = ifa->ifa_dev->dev->ifindex, in fib_magic()
1085 cfg.fc_table = tb->tb_id; in fib_magic()
1100 struct in_device *in_dev = ifa->ifa_dev; in fib_add_ifaddr()
1101 struct net_device *dev = in_dev->dev; in fib_add_ifaddr()
1103 __be32 mask = ifa->ifa_mask; in fib_add_ifaddr()
1104 __be32 addr = ifa->ifa_local; in fib_add_ifaddr()
1105 __be32 prefix = ifa->ifa_address & mask; in fib_add_ifaddr()
1107 if (ifa->ifa_flags & IFA_F_SECONDARY) { in fib_add_ifaddr()
1117 if (!(dev->flags & IFF_UP)) in fib_add_ifaddr()
1121 if (ifa->ifa_broadcast && ifa->ifa_broadcast != htonl(0xFFFFFFFF)) { in fib_add_ifaddr()
1122 fib_magic(RTM_NEWROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, in fib_add_ifaddr()
1124 arp_invalidate(dev, ifa->ifa_broadcast, false); in fib_add_ifaddr()
1127 if (!ipv4_is_zeronet(prefix) && !(ifa->ifa_flags & IFA_F_SECONDARY) && in fib_add_ifaddr()
1128 (prefix != addr || ifa->ifa_prefixlen < 32)) { in fib_add_ifaddr()
1129 if (!(ifa->ifa_flags & IFA_F_NOPREFIXROUTE)) in fib_add_ifaddr()
1131 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, in fib_add_ifaddr()
1132 prefix, ifa->ifa_prefixlen, prim, in fib_add_ifaddr()
1133 ifa->ifa_rt_priority); in fib_add_ifaddr()
1136 if (ifa->ifa_prefixlen < 31) { in fib_add_ifaddr()
1148 __be32 prefix = ifa->ifa_address & ifa->ifa_mask; in fib_modify_prefix_metric()
1149 struct in_device *in_dev = ifa->ifa_dev; in fib_modify_prefix_metric()
1150 struct net_device *dev = in_dev->dev; in fib_modify_prefix_metric()
1152 if (!(dev->flags & IFF_UP) || in fib_modify_prefix_metric()
1153 ifa->ifa_flags & (IFA_F_SECONDARY | IFA_F_NOPREFIXROUTE) || in fib_modify_prefix_metric()
1155 (prefix == ifa->ifa_local && ifa->ifa_prefixlen == 32)) in fib_modify_prefix_metric()
1160 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, in fib_modify_prefix_metric()
1161 prefix, ifa->ifa_prefixlen, ifa, new_metric); in fib_modify_prefix_metric()
1165 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, in fib_modify_prefix_metric()
1166 prefix, ifa->ifa_prefixlen, ifa, ifa->ifa_rt_priority); in fib_modify_prefix_metric()
1176 struct in_device *in_dev = ifa->ifa_dev; in fib_del_ifaddr()
1177 struct net_device *dev = in_dev->dev; in fib_del_ifaddr()
1180 __be32 brd = ifa->ifa_address | ~ifa->ifa_mask; in fib_del_ifaddr()
1181 __be32 any = ifa->ifa_address & ifa->ifa_mask; in fib_del_ifaddr()
1191 if (ifa->ifa_flags & IFA_F_SECONDARY) { in fib_del_ifaddr()
1192 prim = inet_ifa_byprefix(in_dev, any, ifa->ifa_mask); in fib_del_ifaddr()
1197 if (!in_dev->dead) in fib_del_ifaddr()
1206 (any != ifa->ifa_local || ifa->ifa_prefixlen < 32)) { in fib_del_ifaddr()
1207 if (!(ifa->ifa_flags & IFA_F_NOPREFIXROUTE)) in fib_del_ifaddr()
1209 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, in fib_del_ifaddr()
1210 any, ifa->ifa_prefixlen, prim, 0); in fib_del_ifaddr()
1214 if (in_dev->dead) in fib_del_ifaddr()
1218 * We should take care of not to delete too much :-) in fib_del_ifaddr()
1230 if (iprim && ifa1->ifa_mask == iprim->ifa_mask && in fib_del_ifaddr()
1231 inet_ifa_match(ifa1->ifa_address, iprim)) in fib_del_ifaddr()
1235 if (ifa1->ifa_flags & IFA_F_SECONDARY) { in fib_del_ifaddr()
1237 if (ifa1->ifa_mask == prim->ifa_mask && in fib_del_ifaddr()
1238 inet_ifa_match(ifa1->ifa_address, prim)) in fib_del_ifaddr()
1250 ifa1->ifa_mask != prim1->ifa_mask || in fib_del_ifaddr()
1251 !inet_ifa_match(ifa1->ifa_address, prim1)) in fib_del_ifaddr()
1253 ifa1->ifa_address, in fib_del_ifaddr()
1254 ifa1->ifa_mask); in fib_del_ifaddr()
1257 if (prim1->ifa_local != prim->ifa_local) in fib_del_ifaddr()
1261 if (prim->ifa_local != ifa1->ifa_local) in fib_del_ifaddr()
1267 if (ifa->ifa_local == ifa1->ifa_local) in fib_del_ifaddr()
1269 if (ifa->ifa_broadcast == ifa1->ifa_broadcast) in fib_del_ifaddr()
1271 if (brd == ifa1->ifa_broadcast) in fib_del_ifaddr()
1273 if (any == ifa1->ifa_broadcast) in fib_del_ifaddr()
1276 if (prim1 == ifa1 && ifa1->ifa_prefixlen < 31) { in fib_del_ifaddr()
1277 __be32 brd1 = ifa1->ifa_address | ~ifa1->ifa_mask; in fib_del_ifaddr()
1278 __be32 any1 = ifa1->ifa_address & ifa1->ifa_mask; in fib_del_ifaddr()
1281 if (ifa->ifa_broadcast == brd1 || in fib_del_ifaddr()
1282 ifa->ifa_broadcast == any1) in fib_del_ifaddr()
1295 fib_magic(RTM_DELROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, in fib_del_ifaddr()
1297 if (subnet && ifa->ifa_prefixlen < 31) { in fib_del_ifaddr()
1308 fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 32, prim, 0); in fib_del_ifaddr()
1312 ifa->ifa_local); in fib_del_ifaddr()
1320 if (fib_sync_down_addr(dev, ifa->ifa_local)) in fib_del_ifaddr()
1335 .flowi4_mark = frn->fl_mark, in nl_fib_lookup()
1336 .daddr = frn->fl_addr, in nl_fib_lookup()
1337 .flowi4_tos = frn->fl_tos, in nl_fib_lookup()
1338 .flowi4_scope = frn->fl_scope, in nl_fib_lookup()
1344 tb = fib_get_table(net, frn->tb_id_in); in nl_fib_lookup()
1346 frn->err = -ENOENT; in nl_fib_lookup()
1350 frn->tb_id = tb->tb_id; in nl_fib_lookup()
1351 frn->err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF); in nl_fib_lookup()
1353 if (!frn->err) { in nl_fib_lookup()
1354 frn->prefixlen = res.prefixlen; in nl_fib_lookup()
1355 frn->nh_sel = res.nh_sel; in nl_fib_lookup()
1356 frn->type = res.type; in nl_fib_lookup()
1357 frn->scope = res.scope; in nl_fib_lookup()
1372 net = sock_net(skb->sk); in nl_fib_input()
1374 if (skb->len < nlmsg_total_size(sizeof(*frn)) || in nl_fib_input()
1375 skb->len < nlh->nlmsg_len || in nl_fib_input()
1390 netlink_unicast(net->ipv4.fibnl, skb, portid, MSG_DONTWAIT); in nl_fib_input()
1402 return -EAFNOSUPPORT; in nl_fib_lookup_init()
1403 net->ipv4.fibnl = sk; in nl_fib_lookup_init()
1409 netlink_kernel_release(net->ipv4.fibnl); in nl_fib_lookup_exit()
1410 net->ipv4.fibnl = NULL; in nl_fib_lookup_exit()
1426 struct net_device *dev = ifa->ifa_dev->dev; in fib_inetaddr_event()
1435 atomic_inc(&net->ipv4.dev_addr_genid); in fib_inetaddr_event()
1440 atomic_inc(&net->ipv4.dev_addr_genid); in fib_inetaddr_event()
1441 if (!ifa->ifa_dev->ifa_list) { in fib_inetaddr_event()
1482 atomic_inc(&net->ipv4.dev_addr_genid); in fib_netdev_event()
1497 fib_sync_mtu(dev, info_ext->ext.mtu); in fib_netdev_event()
1505 if (upper_info->upper_dev && in fib_netdev_event()
1506 netif_is_l3_master(upper_info->upper_dev)) in fib_netdev_event()
1530 /* Avoid false sharing : Use at least a full cache line */ in ip_fib_net_init()
1533 net->ipv4.fib_table_hash = kzalloc(size, GFP_KERNEL); in ip_fib_net_init()
1534 if (!net->ipv4.fib_table_hash) { in ip_fib_net_init()
1535 err = -ENOMEM; in ip_fib_net_init()
1545 kfree(net->ipv4.fib_table_hash); in ip_fib_net_init()
1557 RCU_INIT_POINTER(net->ipv4.fib_main, NULL); in ip_fib_net_exit()
1558 RCU_INIT_POINTER(net->ipv4.fib_default, NULL); in ip_fib_net_exit()
1565 for (i = FIB_TABLE_HASHSZ - 1; i >= 0; i--) { in ip_fib_net_exit()
1566 struct hlist_head *head = &net->ipv4.fib_table_hash[i]; in ip_fib_net_exit()
1571 hlist_del(&tb->tb_hlist); in ip_fib_net_exit()
1581 kfree(net->ipv4.fib_table_hash); in ip_fib_net_exit()
1590 atomic_set(&net->ipv4.fib_num_tclassid_users, 0); in fib_net_init()