1 // SPDX-License-Identifier: GPL-2.0-or-later
7 static unsigned int ipvlan_netid __read_mostly;
10 unsigned int ipvl_nf_hook_refcnt;
13 static struct ipvl_addr *ipvlan_skb_to_addr(struct sk_buff *skb,
14 struct net_device *dev)
16 struct ipvl_addr *addr = NULL;
17 struct ipvl_port *port;
21 if (!dev || !netif_is_ipvlan_port(dev))
24 port = ipvlan_port_get_rcu(dev);
25 if (!port || port->mode != IPVLAN_MODE_L3S)
28 lyr3h = ipvlan_get_L3_hdr(port, skb, &addr_type);
32 addr = ipvlan_addr_lookup(port, lyr3h, addr_type, true);
37 static struct sk_buff *ipvlan_l3_rcv(struct net_device *dev,
38 struct sk_buff *skb, u16 proto)
40 struct ipvl_addr *addr;
41 struct net_device *sdev;
43 addr = ipvlan_skb_to_addr(skb, dev);
47 sdev = addr->master->dev;
51 struct iphdr *ip4h = ip_hdr(skb);
54 err = ip_route_input_noref(skb, ip4h->daddr, ip4h->saddr,
60 #if IS_ENABLED(CONFIG_IPV6)
63 struct dst_entry *dst;
64 struct ipv6hdr *ip6h = ipv6_hdr(skb);
65 int flags = RT6_LOOKUP_F_HAS_SADDR;
67 .flowi6_iif = sdev->ifindex,
70 .flowlabel = ip6_flowinfo(ip6h),
71 .flowi6_mark = skb->mark,
72 .flowi6_proto = ip6h->nexthdr,
76 dst = ip6_route_input_lookup(dev_net(sdev), sdev, &fl6,
78 skb_dst_set(skb, dst);
89 static const struct l3mdev_ops ipvl_l3mdev_ops = {
90 .l3mdev_l3_rcv = ipvlan_l3_rcv,
93 static unsigned int ipvlan_nf_input(void *priv, struct sk_buff *skb,
94 const struct nf_hook_state *state)
96 struct ipvl_addr *addr;
99 addr = ipvlan_skb_to_addr(skb, skb->dev);
103 skb->dev = addr->master->dev;
104 skb->skb_iif = skb->dev->ifindex;
105 len = skb->len + ETH_HLEN;
106 ipvlan_count_rx(addr->master, len, true, false);
111 static const struct nf_hook_ops ipvl_nfops[] = {
113 .hook = ipvlan_nf_input,
115 .hooknum = NF_INET_LOCAL_IN,
118 #if IS_ENABLED(CONFIG_IPV6)
120 .hook = ipvlan_nf_input,
122 .hooknum = NF_INET_LOCAL_IN,
128 static int ipvlan_register_nf_hook(struct net *net)
130 struct ipvlan_netns *vnet = net_generic(net, ipvlan_netid);
133 if (!vnet->ipvl_nf_hook_refcnt) {
134 err = nf_register_net_hooks(net, ipvl_nfops,
135 ARRAY_SIZE(ipvl_nfops));
137 vnet->ipvl_nf_hook_refcnt = 1;
139 vnet->ipvl_nf_hook_refcnt++;
145 static void ipvlan_unregister_nf_hook(struct net *net)
147 struct ipvlan_netns *vnet = net_generic(net, ipvlan_netid);
149 if (WARN_ON(!vnet->ipvl_nf_hook_refcnt))
152 vnet->ipvl_nf_hook_refcnt--;
153 if (!vnet->ipvl_nf_hook_refcnt)
154 nf_unregister_net_hooks(net, ipvl_nfops,
155 ARRAY_SIZE(ipvl_nfops));
158 void ipvlan_migrate_l3s_hook(struct net *oldnet, struct net *newnet)
160 struct ipvlan_netns *old_vnet;
164 old_vnet = net_generic(oldnet, ipvlan_netid);
165 if (!old_vnet->ipvl_nf_hook_refcnt)
168 ipvlan_register_nf_hook(newnet);
169 ipvlan_unregister_nf_hook(oldnet);
172 static void ipvlan_ns_exit(struct net *net)
174 struct ipvlan_netns *vnet = net_generic(net, ipvlan_netid);
176 if (WARN_ON_ONCE(vnet->ipvl_nf_hook_refcnt)) {
177 vnet->ipvl_nf_hook_refcnt = 0;
178 nf_unregister_net_hooks(net, ipvl_nfops,
179 ARRAY_SIZE(ipvl_nfops));
183 static struct pernet_operations ipvlan_net_ops = {
185 .size = sizeof(struct ipvlan_netns),
186 .exit = ipvlan_ns_exit,
189 int ipvlan_l3s_init(void)
191 return register_pernet_subsys(&ipvlan_net_ops);
194 void ipvlan_l3s_cleanup(void)
196 unregister_pernet_subsys(&ipvlan_net_ops);
199 int ipvlan_l3s_register(struct ipvl_port *port)
201 struct net_device *dev = port->dev;
206 ret = ipvlan_register_nf_hook(read_pnet(&port->pnet));
208 dev->l3mdev_ops = &ipvl_l3mdev_ops;
209 dev->priv_flags |= IFF_L3MDEV_RX_HANDLER;
215 void ipvlan_l3s_unregister(struct ipvl_port *port)
217 struct net_device *dev = port->dev;
221 dev->priv_flags &= ~IFF_L3MDEV_RX_HANDLER;
222 ipvlan_unregister_nf_hook(read_pnet(&port->pnet));
223 dev->l3mdev_ops = NULL;