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

1 // SPDX-License-Identifier: GPL-2.0-or-later
58 return -ENOMEM; in fib4_rules_init()
64 hlist_add_head_rcu(&local_table->tb_hlist, in fib4_rules_init()
65 &net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX]); in fib4_rules_init()
66 hlist_add_head_rcu(&main_table->tb_hlist, in fib4_rules_init()
67 &net->ipv4.fib_table_hash[TABLE_MAIN_INDEX]); in fib4_rules_init()
72 return -ENOMEM; in fib4_rules_init()
87 if (id == RT_TABLE_LOCAL && !net->ipv4.fib_has_custom_rules) in fib_new_table()
96 rcu_assign_pointer(net->ipv4.fib_main, tb); in fib_new_table()
99 rcu_assign_pointer(net->ipv4.fib_default, tb); in fib_new_table()
105 h = id & (FIB_TABLE_HASHSZ - 1); in fib_new_table()
106 hlist_add_head_rcu(&tb->tb_hlist, &net->ipv4.fib_table_hash[h]); in fib_new_table()
120 h = id & (FIB_TABLE_HASHSZ - 1); in fib_get_table()
122 head = &net->ipv4.fib_table_hash[h]; in fib_get_table()
125 if (tb->tb_id == id) in fib_get_table()
136 switch (new->tb_id) { in fib_replace_table()
138 rcu_assign_pointer(net->ipv4.fib_main, new); in fib_replace_table()
141 rcu_assign_pointer(net->ipv4.fib_default, new); in fib_replace_table()
149 hlist_replace_rcu(&old->tb_hlist, &new->tb_hlist); in fib_replace_table()
163 return -ENOMEM; in fib_unmerge()
190 struct hlist_head *head = &net->ipv4.fib_table_hash[h]; in fib_flush()
228 if (!dev || dev == nhc->nhc_dev) in __inet_dev_addr_type()
273 struct net_device *dev = skb->dev; in fib_compute_spec_dst()
281 if ((rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST | RTCF_LOCAL)) == in fib_compute_spec_dst()
283 return ip_hdr(skb)->daddr; in fib_compute_spec_dst()
290 if (!ipv4_is_zeronet(ip_hdr(skb)->saddr)) { in fib_compute_spec_dst()
295 .daddr = ip_hdr(skb)->saddr, in fib_compute_spec_dst()
298 .flowi4_mark = vmark ? skb->mark : 0, in fib_compute_spec_dst()
306 return inet_select_addr(dev, ip_hdr(skb)->saddr, scope); in fib_compute_spec_dst()
313 if (unlikely(fi->nh)) { in fib_info_nh_uses_dev()
314 dev_match = nexthop_uses_dev(fi->nh, dev); in fib_info_nh_uses_dev()
328 if (fib_info_nhc(fi, 0)->nhc_dev == dev) in fib_info_nh_uses_dev()
337 * - (main) check, that source is valid i.e. not broadcast or our local
339 * - figure out what "logical" interface this packet arrived
341 * - check, that packet arrived from expected physical interface.
368 no_addr = idev->ifa_list == NULL; in __fib_validate_source()
370 fl4.flowi4_mark = IN_DEV_SRC_VMARK(idev) ? skb->mark : 0; in __fib_validate_source()
397 dev == net->loopback_dev); in __fib_validate_source()
399 ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_HOST; in __fib_validate_source()
406 fl4.flowi4_oif = dev->ifindex; in __fib_validate_source()
411 ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_HOST; in __fib_validate_source()
422 return -reason; in __fib_validate_source()
424 return -SKB_DROP_REASON_IP_RPFILTER; in __fib_validate_source()
436 (dev->ifindex != oif || !IN_DEV_TX_REDIRECTS(idev))) { in fib_validate_source()
443 if (net->ipv4.fib_has_custom_local_routes || in fib_validate_source()
450 return -SKB_DROP_REASON_IP_LOCAL_SOURCE; in fib_validate_source()
464 return ((struct sockaddr_in *) addr)->sin_addr.s_addr; in sk_extract_addr()
472 nla->nla_type = type; in put_rtax()
473 nla->nla_len = nla_attr_size(4); in put_rtax()
486 cfg->fc_nlinfo.nl_net = net; in rtentry_to_fib_config()
488 if (rt->rt_dst.sa_family != AF_INET) in rtentry_to_fib_config()
489 return -EAFNOSUPPORT; in rtentry_to_fib_config()
500 addr = sk_extract_addr(&rt->rt_dst); in rtentry_to_fib_config()
501 if (!(rt->rt_flags & RTF_HOST)) { in rtentry_to_fib_config()
502 __be32 mask = sk_extract_addr(&rt->rt_genmask); in rtentry_to_fib_config()
504 if (rt->rt_genmask.sa_family != AF_INET) { in rtentry_to_fib_config()
505 if (mask || rt->rt_genmask.sa_family) in rtentry_to_fib_config()
506 return -EAFNOSUPPORT; in rtentry_to_fib_config()
510 return -EINVAL; in rtentry_to_fib_config()
515 cfg->fc_dst_len = plen; in rtentry_to_fib_config()
516 cfg->fc_dst = addr; in rtentry_to_fib_config()
519 cfg->fc_nlflags = NLM_F_CREATE; in rtentry_to_fib_config()
520 cfg->fc_protocol = RTPROT_BOOT; in rtentry_to_fib_config()
523 if (rt->rt_metric) in rtentry_to_fib_config()
524 cfg->fc_priority = rt->rt_metric - 1; in rtentry_to_fib_config()
526 if (rt->rt_flags & RTF_REJECT) { in rtentry_to_fib_config()
527 cfg->fc_scope = RT_SCOPE_HOST; in rtentry_to_fib_config()
528 cfg->fc_type = RTN_UNREACHABLE; in rtentry_to_fib_config()
532 cfg->fc_scope = RT_SCOPE_NOWHERE; in rtentry_to_fib_config()
533 cfg->fc_type = RTN_UNICAST; in rtentry_to_fib_config()
535 if (rt->rt_dev) { in rtentry_to_fib_config()
540 if (copy_from_user(devname, rt->rt_dev, IFNAMSIZ-1)) in rtentry_to_fib_config()
541 return -EFAULT; in rtentry_to_fib_config()
543 devname[IFNAMSIZ-1] = 0; in rtentry_to_fib_config()
549 return -ENODEV; in rtentry_to_fib_config()
550 cfg->fc_oif = dev->ifindex; in rtentry_to_fib_config()
551 cfg->fc_table = l3mdev_fib_table(dev); in rtentry_to_fib_config()
558 return -ENODEV; in rtentry_to_fib_config()
564 if (strcmp(ifa->ifa_label, devname) == 0) in rtentry_to_fib_config()
570 return -ENODEV; in rtentry_to_fib_config()
571 cfg->fc_prefsrc = ifa->ifa_local; in rtentry_to_fib_config()
575 addr = sk_extract_addr(&rt->rt_gateway); in rtentry_to_fib_config()
576 if (rt->rt_gateway.sa_family == AF_INET && addr) { in rtentry_to_fib_config()
579 cfg->fc_gw4 = addr; in rtentry_to_fib_config()
580 cfg->fc_gw_family = AF_INET; in rtentry_to_fib_config()
581 addr_type = inet_addr_type_table(net, addr, cfg->fc_table); in rtentry_to_fib_config()
582 if (rt->rt_flags & RTF_GATEWAY && in rtentry_to_fib_config()
584 cfg->fc_scope = RT_SCOPE_UNIVERSE; in rtentry_to_fib_config()
587 if (!cfg->fc_table) in rtentry_to_fib_config()
588 cfg->fc_table = RT_TABLE_MAIN; in rtentry_to_fib_config()
593 if (rt->rt_flags & RTF_GATEWAY && !cfg->fc_gw_family) in rtentry_to_fib_config()
594 return -EINVAL; in rtentry_to_fib_config()
596 if (cfg->fc_scope == RT_SCOPE_NOWHERE) in rtentry_to_fib_config()
597 cfg->fc_scope = RT_SCOPE_LINK; in rtentry_to_fib_config()
599 if (rt->rt_flags & (RTF_MTU | RTF_WINDOW | RTF_IRTT)) { in rtentry_to_fib_config()
605 return -ENOMEM; in rtentry_to_fib_config()
607 if (rt->rt_flags & RTF_MTU) in rtentry_to_fib_config()
608 len = put_rtax(mx, len, RTAX_ADVMSS, rt->rt_mtu - 40); in rtentry_to_fib_config()
610 if (rt->rt_flags & RTF_WINDOW) in rtentry_to_fib_config()
611 len = put_rtax(mx, len, RTAX_WINDOW, rt->rt_window); in rtentry_to_fib_config()
613 if (rt->rt_flags & RTF_IRTT) in rtentry_to_fib_config()
614 len = put_rtax(mx, len, RTAX_RTT, rt->rt_irtt << 3); in rtentry_to_fib_config()
616 cfg->fc_mx = mx; in rtentry_to_fib_config()
617 cfg->fc_mx_len = len; in rtentry_to_fib_config()
635 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip_rt_ioctl()
636 return -EPERM; in ip_rt_ioctl()
649 err = -ESRCH; in ip_rt_ioctl()
656 err = -ENOBUFS; in ip_rt_ioctl()
665 return -EINVAL; in ip_rt_ioctl()
699 return -EINVAL; in fib_gw_from_via()
703 alen = nla_len(nla) - offsetof(struct rtvia, rtvia_addr); in fib_gw_from_via()
705 switch (via->rtvia_family) { in fib_gw_from_via()
709 return -EINVAL; in fib_gw_from_via()
711 cfg->fc_gw_family = AF_INET; in fib_gw_from_via()
712 cfg->fc_gw4 = *((__be32 *)via->rtvia_addr); in fib_gw_from_via()
718 return -EINVAL; in fib_gw_from_via()
720 cfg->fc_gw_family = AF_INET6; in fib_gw_from_via()
721 cfg->fc_gw6 = *((struct in6_addr *)via->rtvia_addr); in fib_gw_from_via()
724 return -EINVAL; in fib_gw_from_via()
729 return -EINVAL; in fib_gw_from_via()
742 struct rtmsg *rtm; in rtm_to_fib_config() local
744 err = nlmsg_validate_deprecated(nlh, sizeof(*rtm), RTA_MAX, in rtm_to_fib_config()
751 rtm = nlmsg_data(nlh); in rtm_to_fib_config()
753 if (!inet_validate_dscp(rtm->rtm_tos)) { in rtm_to_fib_config()
756 err = -EINVAL; in rtm_to_fib_config()
759 cfg->fc_dscp = inet_dsfield_to_dscp(rtm->rtm_tos); in rtm_to_fib_config()
761 cfg->fc_dst_len = rtm->rtm_dst_len; in rtm_to_fib_config()
762 cfg->fc_table = rtm->rtm_table; in rtm_to_fib_config()
763 cfg->fc_protocol = rtm->rtm_protocol; in rtm_to_fib_config()
764 cfg->fc_scope = rtm->rtm_scope; in rtm_to_fib_config()
765 cfg->fc_type = rtm->rtm_type; in rtm_to_fib_config()
766 cfg->fc_flags = rtm->rtm_flags; in rtm_to_fib_config()
767 cfg->fc_nlflags = nlh->nlmsg_flags; in rtm_to_fib_config()
769 cfg->fc_nlinfo.portid = NETLINK_CB(skb).portid; in rtm_to_fib_config()
770 cfg->fc_nlinfo.nlh = nlh; in rtm_to_fib_config()
771 cfg->fc_nlinfo.nl_net = net; in rtm_to_fib_config()
773 if (cfg->fc_type > RTN_MAX) { in rtm_to_fib_config()
775 err = -EINVAL; in rtm_to_fib_config()
782 cfg->fc_dst = nla_get_be32(attr); in rtm_to_fib_config()
785 cfg->fc_oif = nla_get_u32(attr); in rtm_to_fib_config()
789 cfg->fc_gw4 = nla_get_be32(attr); in rtm_to_fib_config()
790 if (cfg->fc_gw4) in rtm_to_fib_config()
791 cfg->fc_gw_family = AF_INET; in rtm_to_fib_config()
800 cfg->fc_priority = nla_get_u32(attr); in rtm_to_fib_config()
803 cfg->fc_prefsrc = nla_get_be32(attr); in rtm_to_fib_config()
806 cfg->fc_mx = nla_data(attr); in rtm_to_fib_config()
807 cfg->fc_mx_len = nla_len(attr); in rtm_to_fib_config()
815 cfg->fc_mp = nla_data(attr); in rtm_to_fib_config()
816 cfg->fc_mp_len = nla_len(attr); in rtm_to_fib_config()
819 cfg->fc_flow = nla_get_u32(attr); in rtm_to_fib_config()
822 cfg->fc_table = nla_get_u32(attr); in rtm_to_fib_config()
825 cfg->fc_encap = attr; in rtm_to_fib_config()
828 cfg->fc_encap_type = nla_get_u16(attr); in rtm_to_fib_config()
829 err = lwtunnel_valid_encap_type(cfg->fc_encap_type, in rtm_to_fib_config()
835 cfg->fc_nh_id = nla_get_u32(attr); in rtm_to_fib_config()
840 if (cfg->fc_nh_id) { in rtm_to_fib_config()
841 if (cfg->fc_oif || cfg->fc_gw_family || in rtm_to_fib_config()
842 cfg->fc_encap || cfg->fc_mp) { in rtm_to_fib_config()
845 return -EINVAL; in rtm_to_fib_config()
852 return -EINVAL; in rtm_to_fib_config()
855 if (!cfg->fc_table) in rtm_to_fib_config()
856 cfg->fc_table = RT_TABLE_MAIN; in rtm_to_fib_config()
866 struct net *net = sock_net(skb->sk); in inet_rtm_delroute()
877 err = -EINVAL; in inet_rtm_delroute()
884 err = -ESRCH; in inet_rtm_delroute()
896 struct net *net = sock_net(skb->sk); in inet_rtm_newroute()
907 err = -ENOBUFS; in inet_rtm_newroute()
913 net->ipv4.fib_has_custom_local_routes = true; in inet_rtm_newroute()
922 struct netlink_ext_ack *extack = cb->extack; in ip_valid_fib_dump_req()
924 struct rtmsg *rtm; in ip_valid_fib_dump_req() local
927 if (filter->rtnl_held) in ip_valid_fib_dump_req()
930 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*rtm))) { in ip_valid_fib_dump_req()
932 return -EINVAL; in ip_valid_fib_dump_req()
935 rtm = nlmsg_data(nlh); in ip_valid_fib_dump_req()
936 if (rtm->rtm_dst_len || rtm->rtm_src_len || rtm->rtm_tos || in ip_valid_fib_dump_req()
937 rtm->rtm_scope) { in ip_valid_fib_dump_req()
939 return -EINVAL; in ip_valid_fib_dump_req()
942 if (rtm->rtm_flags & ~(RTM_F_CLONED | RTM_F_PREFIX)) { in ip_valid_fib_dump_req()
944 return -EINVAL; in ip_valid_fib_dump_req()
946 if (rtm->rtm_flags & RTM_F_CLONED) in ip_valid_fib_dump_req()
947 filter->dump_routes = false; in ip_valid_fib_dump_req()
949 filter->dump_exceptions = false; in ip_valid_fib_dump_req()
951 filter->flags = rtm->rtm_flags; in ip_valid_fib_dump_req()
952 filter->protocol = rtm->rtm_protocol; in ip_valid_fib_dump_req()
953 filter->rt_type = rtm->rtm_type; in ip_valid_fib_dump_req()
954 filter->table_id = rtm->rtm_table; in ip_valid_fib_dump_req()
956 err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX, in ip_valid_fib_dump_req()
969 filter->table_id = nla_get_u32(tb[i]); in ip_valid_fib_dump_req()
973 if (filter->rtnl_held) in ip_valid_fib_dump_req()
974 filter->dev = __dev_get_by_index(net, ifindex); in ip_valid_fib_dump_req()
976 filter->dev = dev_get_by_index_rcu(net, ifindex); in ip_valid_fib_dump_req()
977 if (!filter->dev) in ip_valid_fib_dump_req()
978 return -ENODEV; in ip_valid_fib_dump_req()
982 return -EINVAL; in ip_valid_fib_dump_req()
986 if (filter->flags || filter->protocol || filter->rt_type || in ip_valid_fib_dump_req()
987 filter->table_id || filter->dev) { in ip_valid_fib_dump_req()
988 filter->filter_set = 1; in ip_valid_fib_dump_req()
989 cb->answer_flags = NLM_F_DUMP_FILTERED; in ip_valid_fib_dump_req()
1003 const struct nlmsghdr *nlh = cb->nlh; in inet_dump_fib()
1004 struct net *net = sock_net(skb->sk); in inet_dump_fib()
1012 if (cb->strict_check) { in inet_dump_fib()
1017 struct rtmsg *rtm = nlmsg_data(nlh); in inet_dump_fib() local
1019 filter.flags = rtm->rtm_flags & (RTM_F_PREFIX | RTM_F_CLONED); in inet_dump_fib()
1022 /* ipv4 does not use prefix flag */ in inet_dump_fib()
1029 if (rtnl_msg_family(cb->nlh) != PF_INET) in inet_dump_fib()
1032 NL_SET_ERR_MSG(cb->extack, "ipv4: FIB table does not exist"); in inet_dump_fib()
1033 err = -ENOENT; in inet_dump_fib()
1040 s_h = cb->args[0]; in inet_dump_fib()
1041 s_e = cb->args[1]; in inet_dump_fib()
1046 head = &net->ipv4.fib_table_hash[h]; in inet_dump_fib()
1051 memset(&cb->args[2], 0, sizeof(cb->args) - in inet_dump_fib()
1052 2 * sizeof(cb->args[0])); in inet_dump_fib()
1063 cb->args[1] = e; in inet_dump_fib()
1064 cb->args[0] = h; in inet_dump_fib()
1071 /* Prepare and feed intra-kernel routing request.
1072 * Really, it should be netlink message, but :-( netlink
1080 struct net *net = dev_net(ifa->ifa_dev->dev); in fib_magic()
1081 u32 tb_id = l3mdev_fib_table(ifa->ifa_dev->dev); in fib_magic()
1089 .fc_prefsrc = ifa->ifa_local, in fib_magic()
1090 .fc_oif = ifa->ifa_dev->dev->ifindex, in fib_magic()
1104 cfg.fc_table = tb->tb_id; in fib_magic()
1119 struct in_device *in_dev = ifa->ifa_dev; in fib_add_ifaddr()
1120 struct net_device *dev = in_dev->dev; in fib_add_ifaddr()
1122 __be32 mask = ifa->ifa_mask; in fib_add_ifaddr()
1123 __be32 addr = ifa->ifa_local; in fib_add_ifaddr()
1124 __be32 prefix = ifa->ifa_address & mask; in fib_add_ifaddr()
1126 if (ifa->ifa_flags & IFA_F_SECONDARY) { in fib_add_ifaddr()
1136 if (!(dev->flags & IFF_UP)) in fib_add_ifaddr()
1140 if (ifa->ifa_broadcast && ifa->ifa_broadcast != htonl(0xFFFFFFFF)) { in fib_add_ifaddr()
1141 fib_magic(RTM_NEWROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, in fib_add_ifaddr()
1143 arp_invalidate(dev, ifa->ifa_broadcast, false); in fib_add_ifaddr()
1146 if (!ipv4_is_zeronet(prefix) && !(ifa->ifa_flags & IFA_F_SECONDARY) && in fib_add_ifaddr()
1147 (prefix != addr || ifa->ifa_prefixlen < 32)) { in fib_add_ifaddr()
1148 if (!(ifa->ifa_flags & IFA_F_NOPREFIXROUTE)) in fib_add_ifaddr()
1150 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, in fib_add_ifaddr()
1151 prefix, ifa->ifa_prefixlen, prim, in fib_add_ifaddr()
1152 ifa->ifa_rt_priority); in fib_add_ifaddr()
1155 if (ifa->ifa_prefixlen < 31) { in fib_add_ifaddr()
1165 __be32 prefix = ifa->ifa_address & ifa->ifa_mask; in fib_modify_prefix_metric()
1166 struct in_device *in_dev = ifa->ifa_dev; in fib_modify_prefix_metric()
1167 struct net_device *dev = in_dev->dev; in fib_modify_prefix_metric()
1169 if (!(dev->flags & IFF_UP) || in fib_modify_prefix_metric()
1170 ifa->ifa_flags & (IFA_F_SECONDARY | IFA_F_NOPREFIXROUTE) || in fib_modify_prefix_metric()
1172 (prefix == ifa->ifa_local && ifa->ifa_prefixlen == 32)) in fib_modify_prefix_metric()
1177 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, in fib_modify_prefix_metric()
1178 prefix, ifa->ifa_prefixlen, ifa, new_metric); in fib_modify_prefix_metric()
1182 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, in fib_modify_prefix_metric()
1183 prefix, ifa->ifa_prefixlen, ifa, ifa->ifa_rt_priority); in fib_modify_prefix_metric()
1193 struct in_device *in_dev = ifa->ifa_dev; in fib_del_ifaddr()
1194 struct net_device *dev = in_dev->dev; in fib_del_ifaddr()
1197 __be32 brd = ifa->ifa_address | ~ifa->ifa_mask; in fib_del_ifaddr()
1198 __be32 any = ifa->ifa_address & ifa->ifa_mask; in fib_del_ifaddr()
1208 if (ifa->ifa_flags & IFA_F_SECONDARY) { in fib_del_ifaddr()
1209 prim = inet_ifa_byprefix(in_dev, any, ifa->ifa_mask); in fib_del_ifaddr()
1214 if (!in_dev->dead) in fib_del_ifaddr()
1223 (any != ifa->ifa_local || ifa->ifa_prefixlen < 32)) { in fib_del_ifaddr()
1224 if (!(ifa->ifa_flags & IFA_F_NOPREFIXROUTE)) in fib_del_ifaddr()
1226 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, in fib_del_ifaddr()
1227 any, ifa->ifa_prefixlen, prim, 0); in fib_del_ifaddr()
1231 if (in_dev->dead) in fib_del_ifaddr()
1235 * We should take care of not to delete too much :-) in fib_del_ifaddr()
1247 if (iprim && ifa1->ifa_mask == iprim->ifa_mask && in fib_del_ifaddr()
1248 inet_ifa_match(ifa1->ifa_address, iprim)) in fib_del_ifaddr()
1252 if (ifa1->ifa_flags & IFA_F_SECONDARY) { in fib_del_ifaddr()
1254 if (ifa1->ifa_mask == prim->ifa_mask && in fib_del_ifaddr()
1255 inet_ifa_match(ifa1->ifa_address, prim)) in fib_del_ifaddr()
1267 ifa1->ifa_mask != prim1->ifa_mask || in fib_del_ifaddr()
1268 !inet_ifa_match(ifa1->ifa_address, prim1)) in fib_del_ifaddr()
1270 ifa1->ifa_address, in fib_del_ifaddr()
1271 ifa1->ifa_mask); in fib_del_ifaddr()
1274 if (prim1->ifa_local != prim->ifa_local) in fib_del_ifaddr()
1278 if (prim->ifa_local != ifa1->ifa_local) in fib_del_ifaddr()
1284 if (ifa->ifa_local == ifa1->ifa_local) in fib_del_ifaddr()
1286 if (ifa->ifa_broadcast == ifa1->ifa_broadcast) in fib_del_ifaddr()
1288 if (brd == ifa1->ifa_broadcast) in fib_del_ifaddr()
1290 if (any == ifa1->ifa_broadcast) in fib_del_ifaddr()
1293 if (prim1 == ifa1 && ifa1->ifa_prefixlen < 31) { in fib_del_ifaddr()
1294 __be32 brd1 = ifa1->ifa_address | ~ifa1->ifa_mask; in fib_del_ifaddr()
1295 __be32 any1 = ifa1->ifa_address & ifa1->ifa_mask; in fib_del_ifaddr()
1298 if (ifa->ifa_broadcast == brd1 || in fib_del_ifaddr()
1299 ifa->ifa_broadcast == any1) in fib_del_ifaddr()
1312 fib_magic(RTM_DELROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, in fib_del_ifaddr()
1314 if (subnet && ifa->ifa_prefixlen < 31) { in fib_del_ifaddr()
1325 fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 32, prim, 0); in fib_del_ifaddr()
1329 ifa->ifa_local); in fib_del_ifaddr()
1337 if (fib_sync_down_addr(dev, ifa->ifa_local)) in fib_del_ifaddr()
1352 .flowi4_mark = frn->fl_mark, in nl_fib_lookup()
1353 .daddr = frn->fl_addr, in nl_fib_lookup()
1354 .flowi4_tos = frn->fl_tos & INET_DSCP_MASK, in nl_fib_lookup()
1355 .flowi4_scope = frn->fl_scope, in nl_fib_lookup()
1361 tb = fib_get_table(net, frn->tb_id_in); in nl_fib_lookup()
1363 frn->err = -ENOENT; in nl_fib_lookup()
1367 frn->tb_id = tb->tb_id; in nl_fib_lookup()
1368 frn->err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF); in nl_fib_lookup()
1370 if (!frn->err) { in nl_fib_lookup()
1371 frn->prefixlen = res.prefixlen; in nl_fib_lookup()
1372 frn->nh_sel = res.nh_sel; in nl_fib_lookup()
1373 frn->type = res.type; in nl_fib_lookup()
1374 frn->scope = res.scope; in nl_fib_lookup()
1389 net = sock_net(skb->sk); in nl_fib_input()
1391 if (skb->len < nlmsg_total_size(sizeof(*frn)) || in nl_fib_input()
1392 skb->len < nlh->nlmsg_len || in nl_fib_input()
1407 nlmsg_unicast(net->ipv4.fibnl, skb, portid); in nl_fib_input()
1419 return -EAFNOSUPPORT; in nl_fib_lookup_init()
1420 net->ipv4.fibnl = sk; in nl_fib_lookup_init()
1426 netlink_kernel_release(net->ipv4.fibnl); in nl_fib_lookup_exit()
1427 net->ipv4.fibnl = NULL; in nl_fib_lookup_exit()
1443 struct net_device *dev = ifa->ifa_dev->dev; in fib_inetaddr_event()
1452 atomic_inc(&net->ipv4.dev_addr_genid); in fib_inetaddr_event()
1457 atomic_inc(&net->ipv4.dev_addr_genid); in fib_inetaddr_event()
1458 if (!ifa->ifa_dev->ifa_list) { in fib_inetaddr_event()
1499 atomic_inc(&net->ipv4.dev_addr_genid); in fib_netdev_event()
1514 fib_sync_mtu(dev, info_ext->ext.mtu); in fib_netdev_event()
1522 if (upper_info->upper_dev && in fib_netdev_event()
1523 netif_is_l3_master(upper_info->upper_dev)) in fib_netdev_event()
1548 /* Default to 3-tuple */ in ip_fib_net_init()
1549 net->ipv4.sysctl_fib_multipath_hash_fields = in ip_fib_net_init()
1553 /* Avoid false sharing : Use at least a full cache line */ in ip_fib_net_init()
1556 net->ipv4.fib_table_hash = kzalloc(size, GFP_KERNEL); in ip_fib_net_init()
1557 if (!net->ipv4.fib_table_hash) { in ip_fib_net_init()
1558 err = -ENOMEM; in ip_fib_net_init()
1568 kfree(net->ipv4.fib_table_hash); in ip_fib_net_init()
1580 RCU_INIT_POINTER(net->ipv4.fib_main, NULL); in ip_fib_net_exit()
1581 RCU_INIT_POINTER(net->ipv4.fib_default, NULL); in ip_fib_net_exit()
1588 for (i = FIB_TABLE_HASHSZ - 1; i >= 0; i--) { in ip_fib_net_exit()
1589 struct hlist_head *head = &net->ipv4.fib_table_hash[i]; in ip_fib_net_exit()
1594 hlist_del(&tb->tb_hlist); in ip_fib_net_exit()
1604 kfree(net->ipv4.fib_table_hash); in ip_fib_net_exit()
1613 atomic_set(&net->ipv4.fib_num_tclassid_users, 0); in fib_net_init()