Lines Matching refs:net

53 static int __net_init fib4_rules_init(struct net *net)  in fib4_rules_init()  argument
66 &net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX]); in fib4_rules_init()
68 &net->ipv4.fib_table_hash[TABLE_MAIN_INDEX]); in fib4_rules_init()
77 struct fib_table *fib_new_table(struct net *net, u32 id) in fib_new_table() argument
84 tb = fib_get_table(net, id); in fib_new_table()
88 if (!check_net(net)) in fib_new_table()
91 if (id == RT_TABLE_LOCAL && !net->ipv4.fib_has_custom_rules) in fib_new_table()
92 alias = fib_new_table(net, RT_TABLE_MAIN); in fib_new_table()
98 spin_lock(&net->ipv4.fib_table_hash_lock); in fib_new_table()
100 tb = fib_get_table(net, id); in fib_new_table()
102 spin_unlock(&net->ipv4.fib_table_hash_lock); in fib_new_table()
111 rcu_assign_pointer(net->ipv4.fib_main, tb); in fib_new_table()
114 rcu_assign_pointer(net->ipv4.fib_default, tb); in fib_new_table()
121 hlist_add_head_rcu(&tb->tb_hlist, &net->ipv4.fib_table_hash[h]); in fib_new_table()
123 spin_unlock(&net->ipv4.fib_table_hash_lock); in fib_new_table()
129 struct fib_table *fib_get_table(struct net *net, u32 id) in fib_get_table() argument
138 head = &net->ipv4.fib_table_hash[h]; in fib_get_table()
154 static void fib_replace_table(struct net *net, struct fib_table *old, in fib_replace_table() argument
160 rcu_assign_pointer(net->ipv4.fib_main, new); in fib_replace_table()
163 rcu_assign_pointer(net->ipv4.fib_default, new); in fib_replace_table()
174 int fib_unmerge(struct net *net) in fib_unmerge() argument
179 old = fib_get_table(net, RT_TABLE_LOCAL); in fib_unmerge()
192 fib_replace_table(net, old, new); in fib_unmerge()
196 main_table = fib_get_table(net, RT_TABLE_MAIN); in fib_unmerge()
206 void fib_flush(struct net *net) in fib_flush() argument
212 struct hlist_head *head = &net->ipv4.fib_table_hash[h]; in fib_flush()
216 flushed += fib_table_flush(net, tb, false); in fib_flush()
220 rt_cache_flush(net); in fib_flush()
227 static inline unsigned int __inet_dev_addr_type(struct net *net, in __inet_dev_addr_type() argument
243 table = fib_get_table(net, tb_id); in __inet_dev_addr_type()
258 unsigned int inet_addr_type_table(struct net *net, __be32 addr, u32 tb_id) in inet_addr_type_table() argument
260 return __inet_dev_addr_type(net, NULL, addr, tb_id); in inet_addr_type_table()
264 unsigned int inet_addr_type(struct net *net, __be32 addr) in inet_addr_type() argument
266 return __inet_dev_addr_type(net, NULL, addr, RT_TABLE_LOCAL); in inet_addr_type()
270 unsigned int inet_dev_addr_type(struct net *net, const struct net_device *dev, in inet_dev_addr_type() argument
275 return __inet_dev_addr_type(net, dev, addr, rt_table); in inet_dev_addr_type()
282 unsigned int inet_addr_type_dev_table(struct net *net, in inet_addr_type_dev_table() argument
288 return __inet_dev_addr_type(net, NULL, addr, rt_table); in inet_addr_type_dev_table()
298 struct net *net; in fib_compute_spec_dst() local
308 net = dev_net(dev); in fib_compute_spec_dst()
321 if (!fib_lookup(net, &fl4, &res, 0)) in fib_compute_spec_dst()
322 return fib_result_prefsrc(net, &res); in fib_compute_spec_dst()
369 struct net *net = dev_net(dev); in __fib_validate_source() local
386 fl4.flowi4_uid = sock_net_uid(net, NULL); in __fib_validate_source()
392 if (!fib4_rules_early_flow_dissect(net, skb, &fl4, &flkeys)) { in __fib_validate_source()
400 if (fib_lookup(net, &fl4, &res, 0)) in __fib_validate_source()
418 dev == net->loopback_dev); in __fib_validate_source()
430 if (fib_lookup(net, &fl4, &res, FIB_LOOKUP_IGNORE_LINKSTATE) == 0) { in __fib_validate_source()
454 struct net *net = dev_net(dev); in fib_validate_source() local
456 if (!r && !fib_num_tclassid_users(net) && in fib_validate_source()
464 if (net->ipv4.fib_has_custom_local_routes || in fib_validate_source()
465 fib4_has_custom_rules(net)) in fib_validate_source()
470 if (inet_lookup_ifaddr_rcu(net, src)) in fib_validate_source()
500 static int rtentry_to_fib_config(struct net *net, int cmd, struct rtentry *rt, in rtentry_to_fib_config() argument
507 cfg->fc_nlinfo.nl_net = net; in rtentry_to_fib_config()
568 dev = __dev_get_by_name(net, devname); in rtentry_to_fib_config()
583 in_dev_for_each_ifa_rtnl_net(net, ifa, in_dev) { in rtentry_to_fib_config()
600 addr_type = inet_addr_type_table(net, addr, cfg->fc_table); in rtentry_to_fib_config()
646 int ip_rt_ioctl(struct net *net, unsigned int cmd, struct rtentry *rt) in ip_rt_ioctl() argument
654 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip_rt_ioctl()
657 rtnl_net_lock(net); in ip_rt_ioctl()
658 err = rtentry_to_fib_config(net, cmd, rt, &cfg); in ip_rt_ioctl()
663 tb = fib_get_table(net, cfg.fc_table); in ip_rt_ioctl()
665 err = fib_table_delete(net, tb, &cfg, in ip_rt_ioctl()
670 tb = fib_new_table(net, cfg.fc_table); in ip_rt_ioctl()
672 err = fib_table_insert(net, tb, in ip_rt_ioctl()
681 rtnl_net_unlock(net); in ip_rt_ioctl()
754 static int rtm_to_fib_config(struct net *net, struct sk_buff *skb, in rtm_to_fib_config() argument
790 cfg->fc_nlinfo.nl_net = net; in rtm_to_fib_config()
899 struct net *net = sock_net(skb->sk); in inet_rtm_delroute() local
904 err = rtm_to_fib_config(net, skb, nlh, &cfg, extack); in inet_rtm_delroute()
908 rtnl_net_lock(net); in inet_rtm_delroute()
910 if (cfg.fc_nh_id && !nexthop_find_by_id(net, cfg.fc_nh_id)) { in inet_rtm_delroute()
916 tb = fib_get_table(net, cfg.fc_table); in inet_rtm_delroute()
923 err = fib_table_delete(net, tb, &cfg, extack); in inet_rtm_delroute()
925 rtnl_net_unlock(net); in inet_rtm_delroute()
933 struct net *net = sock_net(skb->sk); in inet_rtm_newroute() local
938 err = rtm_to_fib_config(net, skb, nlh, &cfg, extack); in inet_rtm_newroute()
942 rtnl_net_lock(net); in inet_rtm_newroute()
944 tb = fib_new_table(net, cfg.fc_table); in inet_rtm_newroute()
950 err = fib_table_insert(net, tb, &cfg, extack); in inet_rtm_newroute()
952 net->ipv4.fib_has_custom_local_routes = true; in inet_rtm_newroute()
955 rtnl_net_unlock(net); in inet_rtm_newroute()
960 int ip_valid_fib_dump_req(struct net *net, const struct nlmsghdr *nlh, in ip_valid_fib_dump_req() argument
1013 filter->dev = dev_get_by_index_rcu(net, ifindex); in ip_valid_fib_dump_req()
1036 struct net *net = sock_net(skb->sk); in inet_dump_fib() local
1049 err = ip_valid_fib_dump_req(net, nlh, &filter, cb); in inet_dump_fib()
1063 tb = fib_get_table(net, filter.table_id); in inet_dump_fib()
1081 head = &net->ipv4.fib_table_hash[h]; in inet_dump_fib()
1115 struct net *net = dev_net(ifa->ifa_dev->dev); in fib_magic() local
1128 .nl_net = net, in fib_magic()
1135 tb = fib_new_table(net, tb_id); in fib_magic()
1147 fib_table_insert(net, tb, &cfg, NULL); in fib_magic()
1149 fib_table_delete(net, tb, &cfg, NULL); in fib_magic()
1382 static void nl_fib_lookup(struct net *net, struct fib_result_nl *frn) in nl_fib_lookup() argument
1396 tb = fib_get_table(net, frn->tb_id_in); in nl_fib_lookup()
1419 struct net *net; in nl_fib_input() local
1424 net = sock_net(skb->sk); in nl_fib_input()
1437 nl_fib_lookup(net, frn); in nl_fib_input()
1442 nlmsg_unicast(net->ipv4.fibnl, skb, portid); in nl_fib_input()
1445 static int __net_init nl_fib_lookup_init(struct net *net) in nl_fib_lookup_init() argument
1452 sk = netlink_kernel_create(net, NETLINK_FIB_LOOKUP, &cfg); in nl_fib_lookup_init()
1455 net->ipv4.fibnl = sk; in nl_fib_lookup_init()
1459 static void nl_fib_lookup_exit(struct net *net) in nl_fib_lookup_exit() argument
1461 netlink_kernel_release(net->ipv4.fibnl); in nl_fib_lookup_exit()
1462 net->ipv4.fibnl = NULL; in nl_fib_lookup_exit()
1479 struct net *net = dev_net(dev); in fib_inetaddr_event() local
1487 atomic_inc(&net->ipv4.dev_addr_genid); in fib_inetaddr_event()
1488 rt_cache_flush(net); in fib_inetaddr_event()
1492 atomic_inc(&net->ipv4.dev_addr_genid); in fib_inetaddr_event()
1499 rt_cache_flush(net); in fib_inetaddr_event()
1512 struct net *net = dev_net(dev); in fib_netdev_event() local
1534 atomic_inc(&net->ipv4.dev_addr_genid); in fib_netdev_event()
1535 rt_cache_flush(net); in fib_netdev_event()
1546 rt_cache_flush(net); in fib_netdev_event()
1550 rt_cache_flush(net); in fib_netdev_event()
1573 static int __net_init ip_fib_net_init(struct net *net) in ip_fib_net_init() argument
1578 err = fib4_notifier_init(net); in ip_fib_net_init()
1584 net->ipv4.sysctl_fib_multipath_hash_fields = in ip_fib_net_init()
1589 spin_lock_init(&net->ipv4.fib_table_hash_lock); in ip_fib_net_init()
1595 net->ipv4.fib_table_hash = kzalloc(size, GFP_KERNEL); in ip_fib_net_init()
1596 if (!net->ipv4.fib_table_hash) { in ip_fib_net_init()
1601 err = fib4_rules_init(net); in ip_fib_net_init()
1607 kfree(net->ipv4.fib_table_hash); in ip_fib_net_init()
1609 fib4_notifier_exit(net); in ip_fib_net_init()
1613 static void ip_fib_net_exit(struct net *net) in ip_fib_net_exit() argument
1617 ASSERT_RTNL_NET(net); in ip_fib_net_exit()
1619 RCU_INIT_POINTER(net->ipv4.fib_main, NULL); in ip_fib_net_exit()
1620 RCU_INIT_POINTER(net->ipv4.fib_default, NULL); in ip_fib_net_exit()
1628 struct hlist_head *head = &net->ipv4.fib_table_hash[i]; in ip_fib_net_exit()
1634 fib_table_flush(net, tb, true); in ip_fib_net_exit()
1640 static int __net_init fib_net_init(struct net *net) in fib_net_init() argument
1645 atomic_set(&net->ipv4.fib_num_tclassid_users, 0); in fib_net_init()
1647 error = ip_fib_net_init(net); in fib_net_init()
1651 error = fib4_semantics_init(net); in fib_net_init()
1655 error = nl_fib_lookup_init(net); in fib_net_init()
1659 error = fib_proc_init(net); in fib_net_init()
1666 nl_fib_lookup_exit(net); in fib_net_init()
1668 fib4_semantics_exit(net); in fib_net_init()
1670 rtnl_net_lock(net); in fib_net_init()
1671 ip_fib_net_exit(net); in fib_net_init()
1672 rtnl_net_unlock(net); in fib_net_init()
1675 fib4_rules_exit(net); in fib_net_init()
1677 kfree(net->ipv4.fib_table_hash); in fib_net_init()
1678 fib4_notifier_exit(net); in fib_net_init()
1682 static void __net_exit fib_net_pre_exit(struct net *net) in fib_net_pre_exit() argument
1684 fib_proc_exit(net); in fib_net_pre_exit()
1685 nl_fib_lookup_exit(net); in fib_net_pre_exit()
1688 static void __net_exit fib_net_exit_rtnl(struct net *net, in fib_net_exit_rtnl() argument
1691 ip_fib_net_exit(net); in fib_net_exit_rtnl()
1694 static void __net_exit fib_net_exit(struct net *net) in fib_net_exit() argument
1697 fib4_rules_exit(net); in fib_net_exit()
1699 kfree(net->ipv4.fib_table_hash); in fib_net_exit()
1700 fib4_notifier_exit(net); in fib_net_exit()
1701 fib4_semantics_exit(net); in fib_net_exit()