xref: /OK3568_Linux_fs/kernel/drivers/net/ipvlan/ipvlan_main.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /* Copyright (c) 2014 Mahesh Bandewar <maheshb@google.com>
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include "ipvlan.h"
6*4882a593Smuzhiyun 
ipvlan_set_port_mode(struct ipvl_port * port,u16 nval,struct netlink_ext_ack * extack)7*4882a593Smuzhiyun static int ipvlan_set_port_mode(struct ipvl_port *port, u16 nval,
8*4882a593Smuzhiyun 				struct netlink_ext_ack *extack)
9*4882a593Smuzhiyun {
10*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan;
11*4882a593Smuzhiyun 	unsigned int flags;
12*4882a593Smuzhiyun 	int err;
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun 	ASSERT_RTNL();
15*4882a593Smuzhiyun 	if (port->mode != nval) {
16*4882a593Smuzhiyun 		list_for_each_entry(ipvlan, &port->ipvlans, pnode) {
17*4882a593Smuzhiyun 			flags = ipvlan->dev->flags;
18*4882a593Smuzhiyun 			if (nval == IPVLAN_MODE_L3 || nval == IPVLAN_MODE_L3S) {
19*4882a593Smuzhiyun 				err = dev_change_flags(ipvlan->dev,
20*4882a593Smuzhiyun 						       flags | IFF_NOARP,
21*4882a593Smuzhiyun 						       extack);
22*4882a593Smuzhiyun 			} else {
23*4882a593Smuzhiyun 				err = dev_change_flags(ipvlan->dev,
24*4882a593Smuzhiyun 						       flags & ~IFF_NOARP,
25*4882a593Smuzhiyun 						       extack);
26*4882a593Smuzhiyun 			}
27*4882a593Smuzhiyun 			if (unlikely(err))
28*4882a593Smuzhiyun 				goto fail;
29*4882a593Smuzhiyun 		}
30*4882a593Smuzhiyun 		if (nval == IPVLAN_MODE_L3S) {
31*4882a593Smuzhiyun 			/* New mode is L3S */
32*4882a593Smuzhiyun 			err = ipvlan_l3s_register(port);
33*4882a593Smuzhiyun 			if (err)
34*4882a593Smuzhiyun 				goto fail;
35*4882a593Smuzhiyun 		} else if (port->mode == IPVLAN_MODE_L3S) {
36*4882a593Smuzhiyun 			/* Old mode was L3S */
37*4882a593Smuzhiyun 			ipvlan_l3s_unregister(port);
38*4882a593Smuzhiyun 		}
39*4882a593Smuzhiyun 		port->mode = nval;
40*4882a593Smuzhiyun 	}
41*4882a593Smuzhiyun 	return 0;
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun fail:
44*4882a593Smuzhiyun 	/* Undo the flags changes that have been done so far. */
45*4882a593Smuzhiyun 	list_for_each_entry_continue_reverse(ipvlan, &port->ipvlans, pnode) {
46*4882a593Smuzhiyun 		flags = ipvlan->dev->flags;
47*4882a593Smuzhiyun 		if (port->mode == IPVLAN_MODE_L3 ||
48*4882a593Smuzhiyun 		    port->mode == IPVLAN_MODE_L3S)
49*4882a593Smuzhiyun 			dev_change_flags(ipvlan->dev, flags | IFF_NOARP,
50*4882a593Smuzhiyun 					 NULL);
51*4882a593Smuzhiyun 		else
52*4882a593Smuzhiyun 			dev_change_flags(ipvlan->dev, flags & ~IFF_NOARP,
53*4882a593Smuzhiyun 					 NULL);
54*4882a593Smuzhiyun 	}
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	return err;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun 
ipvlan_port_create(struct net_device * dev)59*4882a593Smuzhiyun static int ipvlan_port_create(struct net_device *dev)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun 	struct ipvl_port *port;
62*4882a593Smuzhiyun 	int err, idx;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	port = kzalloc(sizeof(struct ipvl_port), GFP_KERNEL);
65*4882a593Smuzhiyun 	if (!port)
66*4882a593Smuzhiyun 		return -ENOMEM;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	write_pnet(&port->pnet, dev_net(dev));
69*4882a593Smuzhiyun 	port->dev = dev;
70*4882a593Smuzhiyun 	port->mode = IPVLAN_MODE_L3;
71*4882a593Smuzhiyun 	INIT_LIST_HEAD(&port->ipvlans);
72*4882a593Smuzhiyun 	for (idx = 0; idx < IPVLAN_HASH_SIZE; idx++)
73*4882a593Smuzhiyun 		INIT_HLIST_HEAD(&port->hlhead[idx]);
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	skb_queue_head_init(&port->backlog);
76*4882a593Smuzhiyun 	INIT_WORK(&port->wq, ipvlan_process_multicast);
77*4882a593Smuzhiyun 	ida_init(&port->ida);
78*4882a593Smuzhiyun 	port->dev_id_start = 1;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	err = netdev_rx_handler_register(dev, ipvlan_handle_frame, port);
81*4882a593Smuzhiyun 	if (err)
82*4882a593Smuzhiyun 		goto err;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	return 0;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun err:
87*4882a593Smuzhiyun 	kfree(port);
88*4882a593Smuzhiyun 	return err;
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
ipvlan_port_destroy(struct net_device * dev)91*4882a593Smuzhiyun static void ipvlan_port_destroy(struct net_device *dev)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	struct ipvl_port *port = ipvlan_port_get_rtnl(dev);
94*4882a593Smuzhiyun 	struct sk_buff *skb;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	if (port->mode == IPVLAN_MODE_L3S)
97*4882a593Smuzhiyun 		ipvlan_l3s_unregister(port);
98*4882a593Smuzhiyun 	netdev_rx_handler_unregister(dev);
99*4882a593Smuzhiyun 	cancel_work_sync(&port->wq);
100*4882a593Smuzhiyun 	while ((skb = __skb_dequeue(&port->backlog)) != NULL) {
101*4882a593Smuzhiyun 		if (skb->dev)
102*4882a593Smuzhiyun 			dev_put(skb->dev);
103*4882a593Smuzhiyun 		kfree_skb(skb);
104*4882a593Smuzhiyun 	}
105*4882a593Smuzhiyun 	ida_destroy(&port->ida);
106*4882a593Smuzhiyun 	kfree(port);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #define IPVLAN_ALWAYS_ON_OFLOADS \
110*4882a593Smuzhiyun 	(NETIF_F_SG | NETIF_F_HW_CSUM | \
111*4882a593Smuzhiyun 	 NETIF_F_GSO_ROBUST | NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL)
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define IPVLAN_ALWAYS_ON \
114*4882a593Smuzhiyun 	(IPVLAN_ALWAYS_ON_OFLOADS | NETIF_F_LLTX | NETIF_F_VLAN_CHALLENGED)
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define IPVLAN_FEATURES \
117*4882a593Smuzhiyun 	(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
118*4882a593Smuzhiyun 	 NETIF_F_GSO | NETIF_F_ALL_TSO | NETIF_F_GSO_ROBUST | \
119*4882a593Smuzhiyun 	 NETIF_F_GRO | NETIF_F_RXCSUM | \
120*4882a593Smuzhiyun 	 NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_STAG_FILTER)
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	/* NETIF_F_GSO_ENCAP_ALL NETIF_F_GSO_SOFTWARE Newly added */
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define IPVLAN_STATE_MASK \
125*4882a593Smuzhiyun 	((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT))
126*4882a593Smuzhiyun 
ipvlan_init(struct net_device * dev)127*4882a593Smuzhiyun static int ipvlan_init(struct net_device *dev)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
130*4882a593Smuzhiyun 	struct net_device *phy_dev = ipvlan->phy_dev;
131*4882a593Smuzhiyun 	struct ipvl_port *port;
132*4882a593Smuzhiyun 	int err;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	dev->state = (dev->state & ~IPVLAN_STATE_MASK) |
135*4882a593Smuzhiyun 		     (phy_dev->state & IPVLAN_STATE_MASK);
136*4882a593Smuzhiyun 	dev->features = phy_dev->features & IPVLAN_FEATURES;
137*4882a593Smuzhiyun 	dev->features |= IPVLAN_ALWAYS_ON;
138*4882a593Smuzhiyun 	dev->vlan_features = phy_dev->vlan_features & IPVLAN_FEATURES;
139*4882a593Smuzhiyun 	dev->vlan_features |= IPVLAN_ALWAYS_ON_OFLOADS;
140*4882a593Smuzhiyun 	dev->hw_enc_features |= dev->features;
141*4882a593Smuzhiyun 	dev->gso_max_size = phy_dev->gso_max_size;
142*4882a593Smuzhiyun 	dev->gso_max_segs = phy_dev->gso_max_segs;
143*4882a593Smuzhiyun 	dev->hard_header_len = phy_dev->hard_header_len;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	netdev_lockdep_set_classes(dev);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	ipvlan->pcpu_stats = netdev_alloc_pcpu_stats(struct ipvl_pcpu_stats);
148*4882a593Smuzhiyun 	if (!ipvlan->pcpu_stats)
149*4882a593Smuzhiyun 		return -ENOMEM;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	if (!netif_is_ipvlan_port(phy_dev)) {
152*4882a593Smuzhiyun 		err = ipvlan_port_create(phy_dev);
153*4882a593Smuzhiyun 		if (err < 0) {
154*4882a593Smuzhiyun 			free_percpu(ipvlan->pcpu_stats);
155*4882a593Smuzhiyun 			return err;
156*4882a593Smuzhiyun 		}
157*4882a593Smuzhiyun 	}
158*4882a593Smuzhiyun 	port = ipvlan_port_get_rtnl(phy_dev);
159*4882a593Smuzhiyun 	port->count += 1;
160*4882a593Smuzhiyun 	return 0;
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun 
ipvlan_uninit(struct net_device * dev)163*4882a593Smuzhiyun static void ipvlan_uninit(struct net_device *dev)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
166*4882a593Smuzhiyun 	struct net_device *phy_dev = ipvlan->phy_dev;
167*4882a593Smuzhiyun 	struct ipvl_port *port;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	free_percpu(ipvlan->pcpu_stats);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	port = ipvlan_port_get_rtnl(phy_dev);
172*4882a593Smuzhiyun 	port->count -= 1;
173*4882a593Smuzhiyun 	if (!port->count)
174*4882a593Smuzhiyun 		ipvlan_port_destroy(port->dev);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun 
ipvlan_open(struct net_device * dev)177*4882a593Smuzhiyun static int ipvlan_open(struct net_device *dev)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
180*4882a593Smuzhiyun 	struct ipvl_addr *addr;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	if (ipvlan->port->mode == IPVLAN_MODE_L3 ||
183*4882a593Smuzhiyun 	    ipvlan->port->mode == IPVLAN_MODE_L3S)
184*4882a593Smuzhiyun 		dev->flags |= IFF_NOARP;
185*4882a593Smuzhiyun 	else
186*4882a593Smuzhiyun 		dev->flags &= ~IFF_NOARP;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	rcu_read_lock();
189*4882a593Smuzhiyun 	list_for_each_entry_rcu(addr, &ipvlan->addrs, anode)
190*4882a593Smuzhiyun 		ipvlan_ht_addr_add(ipvlan, addr);
191*4882a593Smuzhiyun 	rcu_read_unlock();
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	return 0;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun 
ipvlan_stop(struct net_device * dev)196*4882a593Smuzhiyun static int ipvlan_stop(struct net_device *dev)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
199*4882a593Smuzhiyun 	struct net_device *phy_dev = ipvlan->phy_dev;
200*4882a593Smuzhiyun 	struct ipvl_addr *addr;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	dev_uc_unsync(phy_dev, dev);
203*4882a593Smuzhiyun 	dev_mc_unsync(phy_dev, dev);
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	rcu_read_lock();
206*4882a593Smuzhiyun 	list_for_each_entry_rcu(addr, &ipvlan->addrs, anode)
207*4882a593Smuzhiyun 		ipvlan_ht_addr_del(addr);
208*4882a593Smuzhiyun 	rcu_read_unlock();
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	return 0;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun 
ipvlan_start_xmit(struct sk_buff * skb,struct net_device * dev)213*4882a593Smuzhiyun static netdev_tx_t ipvlan_start_xmit(struct sk_buff *skb,
214*4882a593Smuzhiyun 				     struct net_device *dev)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun 	const struct ipvl_dev *ipvlan = netdev_priv(dev);
217*4882a593Smuzhiyun 	int skblen = skb->len;
218*4882a593Smuzhiyun 	int ret;
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	ret = ipvlan_queue_xmit(skb, dev);
221*4882a593Smuzhiyun 	if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
222*4882a593Smuzhiyun 		struct ipvl_pcpu_stats *pcptr;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 		pcptr = this_cpu_ptr(ipvlan->pcpu_stats);
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 		u64_stats_update_begin(&pcptr->syncp);
227*4882a593Smuzhiyun 		pcptr->tx_pkts++;
228*4882a593Smuzhiyun 		pcptr->tx_bytes += skblen;
229*4882a593Smuzhiyun 		u64_stats_update_end(&pcptr->syncp);
230*4882a593Smuzhiyun 	} else {
231*4882a593Smuzhiyun 		this_cpu_inc(ipvlan->pcpu_stats->tx_drps);
232*4882a593Smuzhiyun 	}
233*4882a593Smuzhiyun 	return ret;
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun 
ipvlan_fix_features(struct net_device * dev,netdev_features_t features)236*4882a593Smuzhiyun static netdev_features_t ipvlan_fix_features(struct net_device *dev,
237*4882a593Smuzhiyun 					     netdev_features_t features)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	features |= NETIF_F_ALL_FOR_ALL;
242*4882a593Smuzhiyun 	features &= (ipvlan->sfeatures | ~IPVLAN_FEATURES);
243*4882a593Smuzhiyun 	features = netdev_increment_features(ipvlan->phy_dev->features,
244*4882a593Smuzhiyun 					     features, features);
245*4882a593Smuzhiyun 	features |= IPVLAN_ALWAYS_ON;
246*4882a593Smuzhiyun 	features &= (IPVLAN_FEATURES | IPVLAN_ALWAYS_ON);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	return features;
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun 
ipvlan_change_rx_flags(struct net_device * dev,int change)251*4882a593Smuzhiyun static void ipvlan_change_rx_flags(struct net_device *dev, int change)
252*4882a593Smuzhiyun {
253*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
254*4882a593Smuzhiyun 	struct net_device *phy_dev = ipvlan->phy_dev;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	if (change & IFF_ALLMULTI)
257*4882a593Smuzhiyun 		dev_set_allmulti(phy_dev, dev->flags & IFF_ALLMULTI? 1 : -1);
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
ipvlan_set_multicast_mac_filter(struct net_device * dev)260*4882a593Smuzhiyun static void ipvlan_set_multicast_mac_filter(struct net_device *dev)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	if (dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) {
265*4882a593Smuzhiyun 		bitmap_fill(ipvlan->mac_filters, IPVLAN_MAC_FILTER_SIZE);
266*4882a593Smuzhiyun 	} else {
267*4882a593Smuzhiyun 		struct netdev_hw_addr *ha;
268*4882a593Smuzhiyun 		DECLARE_BITMAP(mc_filters, IPVLAN_MAC_FILTER_SIZE);
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 		bitmap_zero(mc_filters, IPVLAN_MAC_FILTER_SIZE);
271*4882a593Smuzhiyun 		netdev_for_each_mc_addr(ha, dev)
272*4882a593Smuzhiyun 			__set_bit(ipvlan_mac_hash(ha->addr), mc_filters);
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 		/* Turn-on broadcast bit irrespective of address family,
275*4882a593Smuzhiyun 		 * since broadcast is deferred to a work-queue, hence no
276*4882a593Smuzhiyun 		 * impact on fast-path processing.
277*4882a593Smuzhiyun 		 */
278*4882a593Smuzhiyun 		__set_bit(ipvlan_mac_hash(dev->broadcast), mc_filters);
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 		bitmap_copy(ipvlan->mac_filters, mc_filters,
281*4882a593Smuzhiyun 			    IPVLAN_MAC_FILTER_SIZE);
282*4882a593Smuzhiyun 	}
283*4882a593Smuzhiyun 	dev_uc_sync(ipvlan->phy_dev, dev);
284*4882a593Smuzhiyun 	dev_mc_sync(ipvlan->phy_dev, dev);
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun 
ipvlan_get_stats64(struct net_device * dev,struct rtnl_link_stats64 * s)287*4882a593Smuzhiyun static void ipvlan_get_stats64(struct net_device *dev,
288*4882a593Smuzhiyun 			       struct rtnl_link_stats64 *s)
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	if (ipvlan->pcpu_stats) {
293*4882a593Smuzhiyun 		struct ipvl_pcpu_stats *pcptr;
294*4882a593Smuzhiyun 		u64 rx_pkts, rx_bytes, rx_mcast, tx_pkts, tx_bytes;
295*4882a593Smuzhiyun 		u32 rx_errs = 0, tx_drps = 0;
296*4882a593Smuzhiyun 		u32 strt;
297*4882a593Smuzhiyun 		int idx;
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 		for_each_possible_cpu(idx) {
300*4882a593Smuzhiyun 			pcptr = per_cpu_ptr(ipvlan->pcpu_stats, idx);
301*4882a593Smuzhiyun 			do {
302*4882a593Smuzhiyun 				strt= u64_stats_fetch_begin_irq(&pcptr->syncp);
303*4882a593Smuzhiyun 				rx_pkts = pcptr->rx_pkts;
304*4882a593Smuzhiyun 				rx_bytes = pcptr->rx_bytes;
305*4882a593Smuzhiyun 				rx_mcast = pcptr->rx_mcast;
306*4882a593Smuzhiyun 				tx_pkts = pcptr->tx_pkts;
307*4882a593Smuzhiyun 				tx_bytes = pcptr->tx_bytes;
308*4882a593Smuzhiyun 			} while (u64_stats_fetch_retry_irq(&pcptr->syncp,
309*4882a593Smuzhiyun 							   strt));
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 			s->rx_packets += rx_pkts;
312*4882a593Smuzhiyun 			s->rx_bytes += rx_bytes;
313*4882a593Smuzhiyun 			s->multicast += rx_mcast;
314*4882a593Smuzhiyun 			s->tx_packets += tx_pkts;
315*4882a593Smuzhiyun 			s->tx_bytes += tx_bytes;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 			/* u32 values are updated without syncp protection. */
318*4882a593Smuzhiyun 			rx_errs += pcptr->rx_errs;
319*4882a593Smuzhiyun 			tx_drps += pcptr->tx_drps;
320*4882a593Smuzhiyun 		}
321*4882a593Smuzhiyun 		s->rx_errors = rx_errs;
322*4882a593Smuzhiyun 		s->rx_dropped = rx_errs;
323*4882a593Smuzhiyun 		s->tx_dropped = tx_drps;
324*4882a593Smuzhiyun 	}
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun 
ipvlan_vlan_rx_add_vid(struct net_device * dev,__be16 proto,u16 vid)327*4882a593Smuzhiyun static int ipvlan_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
330*4882a593Smuzhiyun 	struct net_device *phy_dev = ipvlan->phy_dev;
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	return vlan_vid_add(phy_dev, proto, vid);
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun 
ipvlan_vlan_rx_kill_vid(struct net_device * dev,__be16 proto,u16 vid)335*4882a593Smuzhiyun static int ipvlan_vlan_rx_kill_vid(struct net_device *dev, __be16 proto,
336*4882a593Smuzhiyun 				   u16 vid)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
339*4882a593Smuzhiyun 	struct net_device *phy_dev = ipvlan->phy_dev;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	vlan_vid_del(phy_dev, proto, vid);
342*4882a593Smuzhiyun 	return 0;
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun 
ipvlan_get_iflink(const struct net_device * dev)345*4882a593Smuzhiyun static int ipvlan_get_iflink(const struct net_device *dev)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	return ipvlan->phy_dev->ifindex;
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun static const struct net_device_ops ipvlan_netdev_ops = {
353*4882a593Smuzhiyun 	.ndo_init		= ipvlan_init,
354*4882a593Smuzhiyun 	.ndo_uninit		= ipvlan_uninit,
355*4882a593Smuzhiyun 	.ndo_open		= ipvlan_open,
356*4882a593Smuzhiyun 	.ndo_stop		= ipvlan_stop,
357*4882a593Smuzhiyun 	.ndo_start_xmit		= ipvlan_start_xmit,
358*4882a593Smuzhiyun 	.ndo_fix_features	= ipvlan_fix_features,
359*4882a593Smuzhiyun 	.ndo_change_rx_flags	= ipvlan_change_rx_flags,
360*4882a593Smuzhiyun 	.ndo_set_rx_mode	= ipvlan_set_multicast_mac_filter,
361*4882a593Smuzhiyun 	.ndo_get_stats64	= ipvlan_get_stats64,
362*4882a593Smuzhiyun 	.ndo_vlan_rx_add_vid	= ipvlan_vlan_rx_add_vid,
363*4882a593Smuzhiyun 	.ndo_vlan_rx_kill_vid	= ipvlan_vlan_rx_kill_vid,
364*4882a593Smuzhiyun 	.ndo_get_iflink		= ipvlan_get_iflink,
365*4882a593Smuzhiyun };
366*4882a593Smuzhiyun 
ipvlan_hard_header(struct sk_buff * skb,struct net_device * dev,unsigned short type,const void * daddr,const void * saddr,unsigned len)367*4882a593Smuzhiyun static int ipvlan_hard_header(struct sk_buff *skb, struct net_device *dev,
368*4882a593Smuzhiyun 			      unsigned short type, const void *daddr,
369*4882a593Smuzhiyun 			      const void *saddr, unsigned len)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun 	const struct ipvl_dev *ipvlan = netdev_priv(dev);
372*4882a593Smuzhiyun 	struct net_device *phy_dev = ipvlan->phy_dev;
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	/* TODO Probably use a different field than dev_addr so that the
375*4882a593Smuzhiyun 	 * mac-address on the virtual device is portable and can be carried
376*4882a593Smuzhiyun 	 * while the packets use the mac-addr on the physical device.
377*4882a593Smuzhiyun 	 */
378*4882a593Smuzhiyun 	return dev_hard_header(skb, phy_dev, type, daddr,
379*4882a593Smuzhiyun 			       saddr ? : phy_dev->dev_addr, len);
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun static const struct header_ops ipvlan_header_ops = {
383*4882a593Smuzhiyun 	.create  	= ipvlan_hard_header,
384*4882a593Smuzhiyun 	.parse		= eth_header_parse,
385*4882a593Smuzhiyun 	.cache		= eth_header_cache,
386*4882a593Smuzhiyun 	.cache_update	= eth_header_cache_update,
387*4882a593Smuzhiyun };
388*4882a593Smuzhiyun 
ipvlan_adjust_mtu(struct ipvl_dev * ipvlan,struct net_device * dev)389*4882a593Smuzhiyun static void ipvlan_adjust_mtu(struct ipvl_dev *ipvlan, struct net_device *dev)
390*4882a593Smuzhiyun {
391*4882a593Smuzhiyun 	ipvlan->dev->mtu = dev->mtu;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun 
netif_is_ipvlan(const struct net_device * dev)394*4882a593Smuzhiyun static bool netif_is_ipvlan(const struct net_device *dev)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun 	/* both ipvlan and ipvtap devices use the same netdev_ops */
397*4882a593Smuzhiyun 	return dev->netdev_ops == &ipvlan_netdev_ops;
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun 
ipvlan_ethtool_get_link_ksettings(struct net_device * dev,struct ethtool_link_ksettings * cmd)400*4882a593Smuzhiyun static int ipvlan_ethtool_get_link_ksettings(struct net_device *dev,
401*4882a593Smuzhiyun 					     struct ethtool_link_ksettings *cmd)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun 	const struct ipvl_dev *ipvlan = netdev_priv(dev);
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	return __ethtool_get_link_ksettings(ipvlan->phy_dev, cmd);
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
ipvlan_ethtool_get_drvinfo(struct net_device * dev,struct ethtool_drvinfo * drvinfo)408*4882a593Smuzhiyun static void ipvlan_ethtool_get_drvinfo(struct net_device *dev,
409*4882a593Smuzhiyun 				       struct ethtool_drvinfo *drvinfo)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun 	strlcpy(drvinfo->driver, IPVLAN_DRV, sizeof(drvinfo->driver));
412*4882a593Smuzhiyun 	strlcpy(drvinfo->version, IPV_DRV_VER, sizeof(drvinfo->version));
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun 
ipvlan_ethtool_get_msglevel(struct net_device * dev)415*4882a593Smuzhiyun static u32 ipvlan_ethtool_get_msglevel(struct net_device *dev)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun 	const struct ipvl_dev *ipvlan = netdev_priv(dev);
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	return ipvlan->msg_enable;
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun 
ipvlan_ethtool_set_msglevel(struct net_device * dev,u32 value)422*4882a593Smuzhiyun static void ipvlan_ethtool_set_msglevel(struct net_device *dev, u32 value)
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	ipvlan->msg_enable = value;
427*4882a593Smuzhiyun }
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun static const struct ethtool_ops ipvlan_ethtool_ops = {
430*4882a593Smuzhiyun 	.get_link	= ethtool_op_get_link,
431*4882a593Smuzhiyun 	.get_link_ksettings	= ipvlan_ethtool_get_link_ksettings,
432*4882a593Smuzhiyun 	.get_drvinfo	= ipvlan_ethtool_get_drvinfo,
433*4882a593Smuzhiyun 	.get_msglevel	= ipvlan_ethtool_get_msglevel,
434*4882a593Smuzhiyun 	.set_msglevel	= ipvlan_ethtool_set_msglevel,
435*4882a593Smuzhiyun };
436*4882a593Smuzhiyun 
ipvlan_nl_changelink(struct net_device * dev,struct nlattr * tb[],struct nlattr * data[],struct netlink_ext_ack * extack)437*4882a593Smuzhiyun static int ipvlan_nl_changelink(struct net_device *dev,
438*4882a593Smuzhiyun 				struct nlattr *tb[], struct nlattr *data[],
439*4882a593Smuzhiyun 				struct netlink_ext_ack *extack)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
442*4882a593Smuzhiyun 	struct ipvl_port *port = ipvlan_port_get_rtnl(ipvlan->phy_dev);
443*4882a593Smuzhiyun 	int err = 0;
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	if (!data)
446*4882a593Smuzhiyun 		return 0;
447*4882a593Smuzhiyun 	if (!ns_capable(dev_net(ipvlan->phy_dev)->user_ns, CAP_NET_ADMIN))
448*4882a593Smuzhiyun 		return -EPERM;
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 	if (data[IFLA_IPVLAN_MODE]) {
451*4882a593Smuzhiyun 		u16 nmode = nla_get_u16(data[IFLA_IPVLAN_MODE]);
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 		err = ipvlan_set_port_mode(port, nmode, extack);
454*4882a593Smuzhiyun 	}
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	if (!err && data[IFLA_IPVLAN_FLAGS]) {
457*4882a593Smuzhiyun 		u16 flags = nla_get_u16(data[IFLA_IPVLAN_FLAGS]);
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 		if (flags & IPVLAN_F_PRIVATE)
460*4882a593Smuzhiyun 			ipvlan_mark_private(port);
461*4882a593Smuzhiyun 		else
462*4882a593Smuzhiyun 			ipvlan_clear_private(port);
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 		if (flags & IPVLAN_F_VEPA)
465*4882a593Smuzhiyun 			ipvlan_mark_vepa(port);
466*4882a593Smuzhiyun 		else
467*4882a593Smuzhiyun 			ipvlan_clear_vepa(port);
468*4882a593Smuzhiyun 	}
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	return err;
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun 
ipvlan_nl_getsize(const struct net_device * dev)473*4882a593Smuzhiyun static size_t ipvlan_nl_getsize(const struct net_device *dev)
474*4882a593Smuzhiyun {
475*4882a593Smuzhiyun 	return (0
476*4882a593Smuzhiyun 		+ nla_total_size(2) /* IFLA_IPVLAN_MODE */
477*4882a593Smuzhiyun 		+ nla_total_size(2) /* IFLA_IPVLAN_FLAGS */
478*4882a593Smuzhiyun 		);
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun 
ipvlan_nl_validate(struct nlattr * tb[],struct nlattr * data[],struct netlink_ext_ack * extack)481*4882a593Smuzhiyun static int ipvlan_nl_validate(struct nlattr *tb[], struct nlattr *data[],
482*4882a593Smuzhiyun 			      struct netlink_ext_ack *extack)
483*4882a593Smuzhiyun {
484*4882a593Smuzhiyun 	if (!data)
485*4882a593Smuzhiyun 		return 0;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	if (data[IFLA_IPVLAN_MODE]) {
488*4882a593Smuzhiyun 		u16 mode = nla_get_u16(data[IFLA_IPVLAN_MODE]);
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 		if (mode >= IPVLAN_MODE_MAX)
491*4882a593Smuzhiyun 			return -EINVAL;
492*4882a593Smuzhiyun 	}
493*4882a593Smuzhiyun 	if (data[IFLA_IPVLAN_FLAGS]) {
494*4882a593Smuzhiyun 		u16 flags = nla_get_u16(data[IFLA_IPVLAN_FLAGS]);
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 		/* Only two bits are used at this moment. */
497*4882a593Smuzhiyun 		if (flags & ~(IPVLAN_F_PRIVATE | IPVLAN_F_VEPA))
498*4882a593Smuzhiyun 			return -EINVAL;
499*4882a593Smuzhiyun 		/* Also both flags can't be active at the same time. */
500*4882a593Smuzhiyun 		if ((flags & (IPVLAN_F_PRIVATE | IPVLAN_F_VEPA)) ==
501*4882a593Smuzhiyun 		    (IPVLAN_F_PRIVATE | IPVLAN_F_VEPA))
502*4882a593Smuzhiyun 			return -EINVAL;
503*4882a593Smuzhiyun 	}
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 	return 0;
506*4882a593Smuzhiyun }
507*4882a593Smuzhiyun 
ipvlan_nl_fillinfo(struct sk_buff * skb,const struct net_device * dev)508*4882a593Smuzhiyun static int ipvlan_nl_fillinfo(struct sk_buff *skb,
509*4882a593Smuzhiyun 			      const struct net_device *dev)
510*4882a593Smuzhiyun {
511*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
512*4882a593Smuzhiyun 	struct ipvl_port *port = ipvlan_port_get_rtnl(ipvlan->phy_dev);
513*4882a593Smuzhiyun 	int ret = -EINVAL;
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	if (!port)
516*4882a593Smuzhiyun 		goto err;
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 	ret = -EMSGSIZE;
519*4882a593Smuzhiyun 	if (nla_put_u16(skb, IFLA_IPVLAN_MODE, port->mode))
520*4882a593Smuzhiyun 		goto err;
521*4882a593Smuzhiyun 	if (nla_put_u16(skb, IFLA_IPVLAN_FLAGS, port->flags))
522*4882a593Smuzhiyun 		goto err;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	return 0;
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun err:
527*4882a593Smuzhiyun 	return ret;
528*4882a593Smuzhiyun }
529*4882a593Smuzhiyun 
ipvlan_link_new(struct net * src_net,struct net_device * dev,struct nlattr * tb[],struct nlattr * data[],struct netlink_ext_ack * extack)530*4882a593Smuzhiyun int ipvlan_link_new(struct net *src_net, struct net_device *dev,
531*4882a593Smuzhiyun 		    struct nlattr *tb[], struct nlattr *data[],
532*4882a593Smuzhiyun 		    struct netlink_ext_ack *extack)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
535*4882a593Smuzhiyun 	struct ipvl_port *port;
536*4882a593Smuzhiyun 	struct net_device *phy_dev;
537*4882a593Smuzhiyun 	int err;
538*4882a593Smuzhiyun 	u16 mode = IPVLAN_MODE_L3;
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	if (!tb[IFLA_LINK])
541*4882a593Smuzhiyun 		return -EINVAL;
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	phy_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
544*4882a593Smuzhiyun 	if (!phy_dev)
545*4882a593Smuzhiyun 		return -ENODEV;
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 	if (netif_is_ipvlan(phy_dev)) {
548*4882a593Smuzhiyun 		struct ipvl_dev *tmp = netdev_priv(phy_dev);
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun 		phy_dev = tmp->phy_dev;
551*4882a593Smuzhiyun 		if (!ns_capable(dev_net(phy_dev)->user_ns, CAP_NET_ADMIN))
552*4882a593Smuzhiyun 			return -EPERM;
553*4882a593Smuzhiyun 	} else if (!netif_is_ipvlan_port(phy_dev)) {
554*4882a593Smuzhiyun 		/* Exit early if the underlying link is invalid or busy */
555*4882a593Smuzhiyun 		if (phy_dev->type != ARPHRD_ETHER ||
556*4882a593Smuzhiyun 		    phy_dev->flags & IFF_LOOPBACK) {
557*4882a593Smuzhiyun 			netdev_err(phy_dev,
558*4882a593Smuzhiyun 				   "Master is either lo or non-ether device\n");
559*4882a593Smuzhiyun 			return -EINVAL;
560*4882a593Smuzhiyun 		}
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun 		if (netdev_is_rx_handler_busy(phy_dev)) {
563*4882a593Smuzhiyun 			netdev_err(phy_dev, "Device is already in use.\n");
564*4882a593Smuzhiyun 			return -EBUSY;
565*4882a593Smuzhiyun 		}
566*4882a593Smuzhiyun 	}
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	ipvlan->phy_dev = phy_dev;
569*4882a593Smuzhiyun 	ipvlan->dev = dev;
570*4882a593Smuzhiyun 	ipvlan->sfeatures = IPVLAN_FEATURES;
571*4882a593Smuzhiyun 	if (!tb[IFLA_MTU])
572*4882a593Smuzhiyun 		ipvlan_adjust_mtu(ipvlan, phy_dev);
573*4882a593Smuzhiyun 	INIT_LIST_HEAD(&ipvlan->addrs);
574*4882a593Smuzhiyun 	spin_lock_init(&ipvlan->addrs_lock);
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun 	/* TODO Probably put random address here to be presented to the
577*4882a593Smuzhiyun 	 * world but keep using the physical-dev address for the outgoing
578*4882a593Smuzhiyun 	 * packets.
579*4882a593Smuzhiyun 	 */
580*4882a593Smuzhiyun 	memcpy(dev->dev_addr, phy_dev->dev_addr, ETH_ALEN);
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun 	dev->priv_flags |= IFF_NO_RX_HANDLER;
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun 	err = register_netdevice(dev);
585*4882a593Smuzhiyun 	if (err < 0)
586*4882a593Smuzhiyun 		return err;
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	/* ipvlan_init() would have created the port, if required */
589*4882a593Smuzhiyun 	port = ipvlan_port_get_rtnl(phy_dev);
590*4882a593Smuzhiyun 	ipvlan->port = port;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	/* If the port-id base is at the MAX value, then wrap it around and
593*4882a593Smuzhiyun 	 * begin from 0x1 again. This may be due to a busy system where lots
594*4882a593Smuzhiyun 	 * of slaves are getting created and deleted.
595*4882a593Smuzhiyun 	 */
596*4882a593Smuzhiyun 	if (port->dev_id_start == 0xFFFE)
597*4882a593Smuzhiyun 		port->dev_id_start = 0x1;
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun 	/* Since L2 address is shared among all IPvlan slaves including
600*4882a593Smuzhiyun 	 * master, use unique 16 bit dev-ids to diffentiate among them.
601*4882a593Smuzhiyun 	 * Assign IDs between 0x1 and 0xFFFE (used by the master) to each
602*4882a593Smuzhiyun 	 * slave link [see addrconf_ifid_eui48()].
603*4882a593Smuzhiyun 	 */
604*4882a593Smuzhiyun 	err = ida_simple_get(&port->ida, port->dev_id_start, 0xFFFE,
605*4882a593Smuzhiyun 			     GFP_KERNEL);
606*4882a593Smuzhiyun 	if (err < 0)
607*4882a593Smuzhiyun 		err = ida_simple_get(&port->ida, 0x1, port->dev_id_start,
608*4882a593Smuzhiyun 				     GFP_KERNEL);
609*4882a593Smuzhiyun 	if (err < 0)
610*4882a593Smuzhiyun 		goto unregister_netdev;
611*4882a593Smuzhiyun 	dev->dev_id = err;
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun 	/* Increment id-base to the next slot for the future assignment */
614*4882a593Smuzhiyun 	port->dev_id_start = err + 1;
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	err = netdev_upper_dev_link(phy_dev, dev, extack);
617*4882a593Smuzhiyun 	if (err)
618*4882a593Smuzhiyun 		goto remove_ida;
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun 	/* Flags are per port and latest update overrides. User has
621*4882a593Smuzhiyun 	 * to be consistent in setting it just like the mode attribute.
622*4882a593Smuzhiyun 	 */
623*4882a593Smuzhiyun 	if (data && data[IFLA_IPVLAN_FLAGS])
624*4882a593Smuzhiyun 		port->flags = nla_get_u16(data[IFLA_IPVLAN_FLAGS]);
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun 	if (data && data[IFLA_IPVLAN_MODE])
627*4882a593Smuzhiyun 		mode = nla_get_u16(data[IFLA_IPVLAN_MODE]);
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 	err = ipvlan_set_port_mode(port, mode, extack);
630*4882a593Smuzhiyun 	if (err)
631*4882a593Smuzhiyun 		goto unlink_netdev;
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun 	list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans);
634*4882a593Smuzhiyun 	netif_stacked_transfer_operstate(phy_dev, dev);
635*4882a593Smuzhiyun 	return 0;
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun unlink_netdev:
638*4882a593Smuzhiyun 	netdev_upper_dev_unlink(phy_dev, dev);
639*4882a593Smuzhiyun remove_ida:
640*4882a593Smuzhiyun 	ida_simple_remove(&port->ida, dev->dev_id);
641*4882a593Smuzhiyun unregister_netdev:
642*4882a593Smuzhiyun 	unregister_netdevice(dev);
643*4882a593Smuzhiyun 	return err;
644*4882a593Smuzhiyun }
645*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ipvlan_link_new);
646*4882a593Smuzhiyun 
ipvlan_link_delete(struct net_device * dev,struct list_head * head)647*4882a593Smuzhiyun void ipvlan_link_delete(struct net_device *dev, struct list_head *head)
648*4882a593Smuzhiyun {
649*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
650*4882a593Smuzhiyun 	struct ipvl_addr *addr, *next;
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun 	spin_lock_bh(&ipvlan->addrs_lock);
653*4882a593Smuzhiyun 	list_for_each_entry_safe(addr, next, &ipvlan->addrs, anode) {
654*4882a593Smuzhiyun 		ipvlan_ht_addr_del(addr);
655*4882a593Smuzhiyun 		list_del_rcu(&addr->anode);
656*4882a593Smuzhiyun 		kfree_rcu(addr, rcu);
657*4882a593Smuzhiyun 	}
658*4882a593Smuzhiyun 	spin_unlock_bh(&ipvlan->addrs_lock);
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun 	ida_simple_remove(&ipvlan->port->ida, dev->dev_id);
661*4882a593Smuzhiyun 	list_del_rcu(&ipvlan->pnode);
662*4882a593Smuzhiyun 	unregister_netdevice_queue(dev, head);
663*4882a593Smuzhiyun 	netdev_upper_dev_unlink(ipvlan->phy_dev, dev);
664*4882a593Smuzhiyun }
665*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ipvlan_link_delete);
666*4882a593Smuzhiyun 
ipvlan_link_setup(struct net_device * dev)667*4882a593Smuzhiyun void ipvlan_link_setup(struct net_device *dev)
668*4882a593Smuzhiyun {
669*4882a593Smuzhiyun 	ether_setup(dev);
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun 	dev->max_mtu = ETH_MAX_MTU;
672*4882a593Smuzhiyun 	dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING);
673*4882a593Smuzhiyun 	dev->priv_flags |= IFF_UNICAST_FLT | IFF_NO_QUEUE;
674*4882a593Smuzhiyun 	dev->netdev_ops = &ipvlan_netdev_ops;
675*4882a593Smuzhiyun 	dev->needs_free_netdev = true;
676*4882a593Smuzhiyun 	dev->header_ops = &ipvlan_header_ops;
677*4882a593Smuzhiyun 	dev->ethtool_ops = &ipvlan_ethtool_ops;
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ipvlan_link_setup);
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun static const struct nla_policy ipvlan_nl_policy[IFLA_IPVLAN_MAX + 1] =
682*4882a593Smuzhiyun {
683*4882a593Smuzhiyun 	[IFLA_IPVLAN_MODE] = { .type = NLA_U16 },
684*4882a593Smuzhiyun 	[IFLA_IPVLAN_FLAGS] = { .type = NLA_U16 },
685*4882a593Smuzhiyun };
686*4882a593Smuzhiyun 
ipvlan_get_link_net(const struct net_device * dev)687*4882a593Smuzhiyun static struct net *ipvlan_get_link_net(const struct net_device *dev)
688*4882a593Smuzhiyun {
689*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun 	return dev_net(ipvlan->phy_dev);
692*4882a593Smuzhiyun }
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun static struct rtnl_link_ops ipvlan_link_ops = {
695*4882a593Smuzhiyun 	.kind		= "ipvlan",
696*4882a593Smuzhiyun 	.priv_size	= sizeof(struct ipvl_dev),
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 	.setup		= ipvlan_link_setup,
699*4882a593Smuzhiyun 	.newlink	= ipvlan_link_new,
700*4882a593Smuzhiyun 	.dellink	= ipvlan_link_delete,
701*4882a593Smuzhiyun 	.get_link_net   = ipvlan_get_link_net,
702*4882a593Smuzhiyun };
703*4882a593Smuzhiyun 
ipvlan_link_register(struct rtnl_link_ops * ops)704*4882a593Smuzhiyun int ipvlan_link_register(struct rtnl_link_ops *ops)
705*4882a593Smuzhiyun {
706*4882a593Smuzhiyun 	ops->get_size	= ipvlan_nl_getsize;
707*4882a593Smuzhiyun 	ops->policy	= ipvlan_nl_policy;
708*4882a593Smuzhiyun 	ops->validate	= ipvlan_nl_validate;
709*4882a593Smuzhiyun 	ops->fill_info	= ipvlan_nl_fillinfo;
710*4882a593Smuzhiyun 	ops->changelink = ipvlan_nl_changelink;
711*4882a593Smuzhiyun 	ops->maxtype	= IFLA_IPVLAN_MAX;
712*4882a593Smuzhiyun 	return rtnl_link_register(ops);
713*4882a593Smuzhiyun }
714*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ipvlan_link_register);
715*4882a593Smuzhiyun 
ipvlan_device_event(struct notifier_block * unused,unsigned long event,void * ptr)716*4882a593Smuzhiyun static int ipvlan_device_event(struct notifier_block *unused,
717*4882a593Smuzhiyun 			       unsigned long event, void *ptr)
718*4882a593Smuzhiyun {
719*4882a593Smuzhiyun 	struct netlink_ext_ack *extack = netdev_notifier_info_to_extack(ptr);
720*4882a593Smuzhiyun 	struct netdev_notifier_pre_changeaddr_info *prechaddr_info;
721*4882a593Smuzhiyun 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
722*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan, *next;
723*4882a593Smuzhiyun 	struct ipvl_port *port;
724*4882a593Smuzhiyun 	LIST_HEAD(lst_kill);
725*4882a593Smuzhiyun 	int err;
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun 	if (!netif_is_ipvlan_port(dev))
728*4882a593Smuzhiyun 		return NOTIFY_DONE;
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun 	port = ipvlan_port_get_rtnl(dev);
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 	switch (event) {
733*4882a593Smuzhiyun 	case NETDEV_CHANGE:
734*4882a593Smuzhiyun 		list_for_each_entry(ipvlan, &port->ipvlans, pnode)
735*4882a593Smuzhiyun 			netif_stacked_transfer_operstate(ipvlan->phy_dev,
736*4882a593Smuzhiyun 							 ipvlan->dev);
737*4882a593Smuzhiyun 		break;
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 	case NETDEV_REGISTER: {
740*4882a593Smuzhiyun 		struct net *oldnet, *newnet = dev_net(dev);
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun 		oldnet = read_pnet(&port->pnet);
743*4882a593Smuzhiyun 		if (net_eq(newnet, oldnet))
744*4882a593Smuzhiyun 			break;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 		write_pnet(&port->pnet, newnet);
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 		ipvlan_migrate_l3s_hook(oldnet, newnet);
749*4882a593Smuzhiyun 		break;
750*4882a593Smuzhiyun 	}
751*4882a593Smuzhiyun 	case NETDEV_UNREGISTER:
752*4882a593Smuzhiyun 		if (dev->reg_state != NETREG_UNREGISTERING)
753*4882a593Smuzhiyun 			break;
754*4882a593Smuzhiyun 
755*4882a593Smuzhiyun 		list_for_each_entry_safe(ipvlan, next, &port->ipvlans, pnode)
756*4882a593Smuzhiyun 			ipvlan->dev->rtnl_link_ops->dellink(ipvlan->dev,
757*4882a593Smuzhiyun 							    &lst_kill);
758*4882a593Smuzhiyun 		unregister_netdevice_many(&lst_kill);
759*4882a593Smuzhiyun 		break;
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun 	case NETDEV_FEAT_CHANGE:
762*4882a593Smuzhiyun 		list_for_each_entry(ipvlan, &port->ipvlans, pnode) {
763*4882a593Smuzhiyun 			ipvlan->dev->gso_max_size = dev->gso_max_size;
764*4882a593Smuzhiyun 			ipvlan->dev->gso_max_segs = dev->gso_max_segs;
765*4882a593Smuzhiyun 			netdev_update_features(ipvlan->dev);
766*4882a593Smuzhiyun 		}
767*4882a593Smuzhiyun 		break;
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun 	case NETDEV_CHANGEMTU:
770*4882a593Smuzhiyun 		list_for_each_entry(ipvlan, &port->ipvlans, pnode)
771*4882a593Smuzhiyun 			ipvlan_adjust_mtu(ipvlan, dev);
772*4882a593Smuzhiyun 		break;
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun 	case NETDEV_PRE_CHANGEADDR:
775*4882a593Smuzhiyun 		prechaddr_info = ptr;
776*4882a593Smuzhiyun 		list_for_each_entry(ipvlan, &port->ipvlans, pnode) {
777*4882a593Smuzhiyun 			err = dev_pre_changeaddr_notify(ipvlan->dev,
778*4882a593Smuzhiyun 						    prechaddr_info->dev_addr,
779*4882a593Smuzhiyun 						    extack);
780*4882a593Smuzhiyun 			if (err)
781*4882a593Smuzhiyun 				return notifier_from_errno(err);
782*4882a593Smuzhiyun 		}
783*4882a593Smuzhiyun 		break;
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	case NETDEV_CHANGEADDR:
786*4882a593Smuzhiyun 		list_for_each_entry(ipvlan, &port->ipvlans, pnode) {
787*4882a593Smuzhiyun 			ether_addr_copy(ipvlan->dev->dev_addr, dev->dev_addr);
788*4882a593Smuzhiyun 			call_netdevice_notifiers(NETDEV_CHANGEADDR, ipvlan->dev);
789*4882a593Smuzhiyun 		}
790*4882a593Smuzhiyun 		break;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	case NETDEV_PRE_TYPE_CHANGE:
793*4882a593Smuzhiyun 		/* Forbid underlying device to change its type. */
794*4882a593Smuzhiyun 		return NOTIFY_BAD;
795*4882a593Smuzhiyun 	}
796*4882a593Smuzhiyun 	return NOTIFY_DONE;
797*4882a593Smuzhiyun }
798*4882a593Smuzhiyun 
799*4882a593Smuzhiyun /* the caller must held the addrs lock */
ipvlan_add_addr(struct ipvl_dev * ipvlan,void * iaddr,bool is_v6)800*4882a593Smuzhiyun static int ipvlan_add_addr(struct ipvl_dev *ipvlan, void *iaddr, bool is_v6)
801*4882a593Smuzhiyun {
802*4882a593Smuzhiyun 	struct ipvl_addr *addr;
803*4882a593Smuzhiyun 
804*4882a593Smuzhiyun 	addr = kzalloc(sizeof(struct ipvl_addr), GFP_ATOMIC);
805*4882a593Smuzhiyun 	if (!addr)
806*4882a593Smuzhiyun 		return -ENOMEM;
807*4882a593Smuzhiyun 
808*4882a593Smuzhiyun 	addr->master = ipvlan;
809*4882a593Smuzhiyun 	if (!is_v6) {
810*4882a593Smuzhiyun 		memcpy(&addr->ip4addr, iaddr, sizeof(struct in_addr));
811*4882a593Smuzhiyun 		addr->atype = IPVL_IPV4;
812*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
813*4882a593Smuzhiyun 	} else {
814*4882a593Smuzhiyun 		memcpy(&addr->ip6addr, iaddr, sizeof(struct in6_addr));
815*4882a593Smuzhiyun 		addr->atype = IPVL_IPV6;
816*4882a593Smuzhiyun #endif
817*4882a593Smuzhiyun 	}
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 	list_add_tail_rcu(&addr->anode, &ipvlan->addrs);
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	/* If the interface is not up, the address will be added to the hash
822*4882a593Smuzhiyun 	 * list by ipvlan_open.
823*4882a593Smuzhiyun 	 */
824*4882a593Smuzhiyun 	if (netif_running(ipvlan->dev))
825*4882a593Smuzhiyun 		ipvlan_ht_addr_add(ipvlan, addr);
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun 	return 0;
828*4882a593Smuzhiyun }
829*4882a593Smuzhiyun 
ipvlan_del_addr(struct ipvl_dev * ipvlan,void * iaddr,bool is_v6)830*4882a593Smuzhiyun static void ipvlan_del_addr(struct ipvl_dev *ipvlan, void *iaddr, bool is_v6)
831*4882a593Smuzhiyun {
832*4882a593Smuzhiyun 	struct ipvl_addr *addr;
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun 	spin_lock_bh(&ipvlan->addrs_lock);
835*4882a593Smuzhiyun 	addr = ipvlan_find_addr(ipvlan, iaddr, is_v6);
836*4882a593Smuzhiyun 	if (!addr) {
837*4882a593Smuzhiyun 		spin_unlock_bh(&ipvlan->addrs_lock);
838*4882a593Smuzhiyun 		return;
839*4882a593Smuzhiyun 	}
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun 	ipvlan_ht_addr_del(addr);
842*4882a593Smuzhiyun 	list_del_rcu(&addr->anode);
843*4882a593Smuzhiyun 	spin_unlock_bh(&ipvlan->addrs_lock);
844*4882a593Smuzhiyun 	kfree_rcu(addr, rcu);
845*4882a593Smuzhiyun }
846*4882a593Smuzhiyun 
ipvlan_is_valid_dev(const struct net_device * dev)847*4882a593Smuzhiyun static bool ipvlan_is_valid_dev(const struct net_device *dev)
848*4882a593Smuzhiyun {
849*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 	if (!netif_is_ipvlan(dev))
852*4882a593Smuzhiyun 		return false;
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun 	if (!ipvlan || !ipvlan->port)
855*4882a593Smuzhiyun 		return false;
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun 	return true;
858*4882a593Smuzhiyun }
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
ipvlan_add_addr6(struct ipvl_dev * ipvlan,struct in6_addr * ip6_addr)861*4882a593Smuzhiyun static int ipvlan_add_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr)
862*4882a593Smuzhiyun {
863*4882a593Smuzhiyun 	int ret = -EINVAL;
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun 	spin_lock_bh(&ipvlan->addrs_lock);
866*4882a593Smuzhiyun 	if (ipvlan_addr_busy(ipvlan->port, ip6_addr, true))
867*4882a593Smuzhiyun 		netif_err(ipvlan, ifup, ipvlan->dev,
868*4882a593Smuzhiyun 			  "Failed to add IPv6=%pI6c addr for %s intf\n",
869*4882a593Smuzhiyun 			  ip6_addr, ipvlan->dev->name);
870*4882a593Smuzhiyun 	else
871*4882a593Smuzhiyun 		ret = ipvlan_add_addr(ipvlan, ip6_addr, true);
872*4882a593Smuzhiyun 	spin_unlock_bh(&ipvlan->addrs_lock);
873*4882a593Smuzhiyun 	return ret;
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun 
ipvlan_del_addr6(struct ipvl_dev * ipvlan,struct in6_addr * ip6_addr)876*4882a593Smuzhiyun static void ipvlan_del_addr6(struct ipvl_dev *ipvlan, struct in6_addr *ip6_addr)
877*4882a593Smuzhiyun {
878*4882a593Smuzhiyun 	return ipvlan_del_addr(ipvlan, ip6_addr, true);
879*4882a593Smuzhiyun }
880*4882a593Smuzhiyun 
ipvlan_addr6_event(struct notifier_block * unused,unsigned long event,void * ptr)881*4882a593Smuzhiyun static int ipvlan_addr6_event(struct notifier_block *unused,
882*4882a593Smuzhiyun 			      unsigned long event, void *ptr)
883*4882a593Smuzhiyun {
884*4882a593Smuzhiyun 	struct inet6_ifaddr *if6 = (struct inet6_ifaddr *)ptr;
885*4882a593Smuzhiyun 	struct net_device *dev = (struct net_device *)if6->idev->dev;
886*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
887*4882a593Smuzhiyun 
888*4882a593Smuzhiyun 	if (!ipvlan_is_valid_dev(dev))
889*4882a593Smuzhiyun 		return NOTIFY_DONE;
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun 	switch (event) {
892*4882a593Smuzhiyun 	case NETDEV_UP:
893*4882a593Smuzhiyun 		if (ipvlan_add_addr6(ipvlan, &if6->addr))
894*4882a593Smuzhiyun 			return NOTIFY_BAD;
895*4882a593Smuzhiyun 		break;
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun 	case NETDEV_DOWN:
898*4882a593Smuzhiyun 		ipvlan_del_addr6(ipvlan, &if6->addr);
899*4882a593Smuzhiyun 		break;
900*4882a593Smuzhiyun 	}
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 	return NOTIFY_OK;
903*4882a593Smuzhiyun }
904*4882a593Smuzhiyun 
ipvlan_addr6_validator_event(struct notifier_block * unused,unsigned long event,void * ptr)905*4882a593Smuzhiyun static int ipvlan_addr6_validator_event(struct notifier_block *unused,
906*4882a593Smuzhiyun 					unsigned long event, void *ptr)
907*4882a593Smuzhiyun {
908*4882a593Smuzhiyun 	struct in6_validator_info *i6vi = (struct in6_validator_info *)ptr;
909*4882a593Smuzhiyun 	struct net_device *dev = (struct net_device *)i6vi->i6vi_dev->dev;
910*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	if (!ipvlan_is_valid_dev(dev))
913*4882a593Smuzhiyun 		return NOTIFY_DONE;
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 	switch (event) {
916*4882a593Smuzhiyun 	case NETDEV_UP:
917*4882a593Smuzhiyun 		if (ipvlan_addr_busy(ipvlan->port, &i6vi->i6vi_addr, true)) {
918*4882a593Smuzhiyun 			NL_SET_ERR_MSG(i6vi->extack,
919*4882a593Smuzhiyun 				       "Address already assigned to an ipvlan device");
920*4882a593Smuzhiyun 			return notifier_from_errno(-EADDRINUSE);
921*4882a593Smuzhiyun 		}
922*4882a593Smuzhiyun 		break;
923*4882a593Smuzhiyun 	}
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun 	return NOTIFY_OK;
926*4882a593Smuzhiyun }
927*4882a593Smuzhiyun #endif
928*4882a593Smuzhiyun 
ipvlan_add_addr4(struct ipvl_dev * ipvlan,struct in_addr * ip4_addr)929*4882a593Smuzhiyun static int ipvlan_add_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr)
930*4882a593Smuzhiyun {
931*4882a593Smuzhiyun 	int ret = -EINVAL;
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun 	spin_lock_bh(&ipvlan->addrs_lock);
934*4882a593Smuzhiyun 	if (ipvlan_addr_busy(ipvlan->port, ip4_addr, false))
935*4882a593Smuzhiyun 		netif_err(ipvlan, ifup, ipvlan->dev,
936*4882a593Smuzhiyun 			  "Failed to add IPv4=%pI4 on %s intf.\n",
937*4882a593Smuzhiyun 			  ip4_addr, ipvlan->dev->name);
938*4882a593Smuzhiyun 	else
939*4882a593Smuzhiyun 		ret = ipvlan_add_addr(ipvlan, ip4_addr, false);
940*4882a593Smuzhiyun 	spin_unlock_bh(&ipvlan->addrs_lock);
941*4882a593Smuzhiyun 	return ret;
942*4882a593Smuzhiyun }
943*4882a593Smuzhiyun 
ipvlan_del_addr4(struct ipvl_dev * ipvlan,struct in_addr * ip4_addr)944*4882a593Smuzhiyun static void ipvlan_del_addr4(struct ipvl_dev *ipvlan, struct in_addr *ip4_addr)
945*4882a593Smuzhiyun {
946*4882a593Smuzhiyun 	return ipvlan_del_addr(ipvlan, ip4_addr, false);
947*4882a593Smuzhiyun }
948*4882a593Smuzhiyun 
ipvlan_addr4_event(struct notifier_block * unused,unsigned long event,void * ptr)949*4882a593Smuzhiyun static int ipvlan_addr4_event(struct notifier_block *unused,
950*4882a593Smuzhiyun 			      unsigned long event, void *ptr)
951*4882a593Smuzhiyun {
952*4882a593Smuzhiyun 	struct in_ifaddr *if4 = (struct in_ifaddr *)ptr;
953*4882a593Smuzhiyun 	struct net_device *dev = (struct net_device *)if4->ifa_dev->dev;
954*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
955*4882a593Smuzhiyun 	struct in_addr ip4_addr;
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun 	if (!ipvlan_is_valid_dev(dev))
958*4882a593Smuzhiyun 		return NOTIFY_DONE;
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun 	switch (event) {
961*4882a593Smuzhiyun 	case NETDEV_UP:
962*4882a593Smuzhiyun 		ip4_addr.s_addr = if4->ifa_address;
963*4882a593Smuzhiyun 		if (ipvlan_add_addr4(ipvlan, &ip4_addr))
964*4882a593Smuzhiyun 			return NOTIFY_BAD;
965*4882a593Smuzhiyun 		break;
966*4882a593Smuzhiyun 
967*4882a593Smuzhiyun 	case NETDEV_DOWN:
968*4882a593Smuzhiyun 		ip4_addr.s_addr = if4->ifa_address;
969*4882a593Smuzhiyun 		ipvlan_del_addr4(ipvlan, &ip4_addr);
970*4882a593Smuzhiyun 		break;
971*4882a593Smuzhiyun 	}
972*4882a593Smuzhiyun 
973*4882a593Smuzhiyun 	return NOTIFY_OK;
974*4882a593Smuzhiyun }
975*4882a593Smuzhiyun 
ipvlan_addr4_validator_event(struct notifier_block * unused,unsigned long event,void * ptr)976*4882a593Smuzhiyun static int ipvlan_addr4_validator_event(struct notifier_block *unused,
977*4882a593Smuzhiyun 					unsigned long event, void *ptr)
978*4882a593Smuzhiyun {
979*4882a593Smuzhiyun 	struct in_validator_info *ivi = (struct in_validator_info *)ptr;
980*4882a593Smuzhiyun 	struct net_device *dev = (struct net_device *)ivi->ivi_dev->dev;
981*4882a593Smuzhiyun 	struct ipvl_dev *ipvlan = netdev_priv(dev);
982*4882a593Smuzhiyun 
983*4882a593Smuzhiyun 	if (!ipvlan_is_valid_dev(dev))
984*4882a593Smuzhiyun 		return NOTIFY_DONE;
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun 	switch (event) {
987*4882a593Smuzhiyun 	case NETDEV_UP:
988*4882a593Smuzhiyun 		if (ipvlan_addr_busy(ipvlan->port, &ivi->ivi_addr, false)) {
989*4882a593Smuzhiyun 			NL_SET_ERR_MSG(ivi->extack,
990*4882a593Smuzhiyun 				       "Address already assigned to an ipvlan device");
991*4882a593Smuzhiyun 			return notifier_from_errno(-EADDRINUSE);
992*4882a593Smuzhiyun 		}
993*4882a593Smuzhiyun 		break;
994*4882a593Smuzhiyun 	}
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun 	return NOTIFY_OK;
997*4882a593Smuzhiyun }
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun static struct notifier_block ipvlan_addr4_notifier_block __read_mostly = {
1000*4882a593Smuzhiyun 	.notifier_call = ipvlan_addr4_event,
1001*4882a593Smuzhiyun };
1002*4882a593Smuzhiyun 
1003*4882a593Smuzhiyun static struct notifier_block ipvlan_addr4_vtor_notifier_block __read_mostly = {
1004*4882a593Smuzhiyun 	.notifier_call = ipvlan_addr4_validator_event,
1005*4882a593Smuzhiyun };
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun static struct notifier_block ipvlan_notifier_block __read_mostly = {
1008*4882a593Smuzhiyun 	.notifier_call = ipvlan_device_event,
1009*4882a593Smuzhiyun };
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
1012*4882a593Smuzhiyun static struct notifier_block ipvlan_addr6_notifier_block __read_mostly = {
1013*4882a593Smuzhiyun 	.notifier_call = ipvlan_addr6_event,
1014*4882a593Smuzhiyun };
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun static struct notifier_block ipvlan_addr6_vtor_notifier_block __read_mostly = {
1017*4882a593Smuzhiyun 	.notifier_call = ipvlan_addr6_validator_event,
1018*4882a593Smuzhiyun };
1019*4882a593Smuzhiyun #endif
1020*4882a593Smuzhiyun 
ipvlan_init_module(void)1021*4882a593Smuzhiyun static int __init ipvlan_init_module(void)
1022*4882a593Smuzhiyun {
1023*4882a593Smuzhiyun 	int err;
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun 	ipvlan_init_secret();
1026*4882a593Smuzhiyun 	register_netdevice_notifier(&ipvlan_notifier_block);
1027*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
1028*4882a593Smuzhiyun 	register_inet6addr_notifier(&ipvlan_addr6_notifier_block);
1029*4882a593Smuzhiyun 	register_inet6addr_validator_notifier(
1030*4882a593Smuzhiyun 	    &ipvlan_addr6_vtor_notifier_block);
1031*4882a593Smuzhiyun #endif
1032*4882a593Smuzhiyun 	register_inetaddr_notifier(&ipvlan_addr4_notifier_block);
1033*4882a593Smuzhiyun 	register_inetaddr_validator_notifier(&ipvlan_addr4_vtor_notifier_block);
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 	err = ipvlan_l3s_init();
1036*4882a593Smuzhiyun 	if (err < 0)
1037*4882a593Smuzhiyun 		goto error;
1038*4882a593Smuzhiyun 
1039*4882a593Smuzhiyun 	err = ipvlan_link_register(&ipvlan_link_ops);
1040*4882a593Smuzhiyun 	if (err < 0) {
1041*4882a593Smuzhiyun 		ipvlan_l3s_cleanup();
1042*4882a593Smuzhiyun 		goto error;
1043*4882a593Smuzhiyun 	}
1044*4882a593Smuzhiyun 
1045*4882a593Smuzhiyun 	return 0;
1046*4882a593Smuzhiyun error:
1047*4882a593Smuzhiyun 	unregister_inetaddr_notifier(&ipvlan_addr4_notifier_block);
1048*4882a593Smuzhiyun 	unregister_inetaddr_validator_notifier(
1049*4882a593Smuzhiyun 	    &ipvlan_addr4_vtor_notifier_block);
1050*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
1051*4882a593Smuzhiyun 	unregister_inet6addr_notifier(&ipvlan_addr6_notifier_block);
1052*4882a593Smuzhiyun 	unregister_inet6addr_validator_notifier(
1053*4882a593Smuzhiyun 	    &ipvlan_addr6_vtor_notifier_block);
1054*4882a593Smuzhiyun #endif
1055*4882a593Smuzhiyun 	unregister_netdevice_notifier(&ipvlan_notifier_block);
1056*4882a593Smuzhiyun 	return err;
1057*4882a593Smuzhiyun }
1058*4882a593Smuzhiyun 
ipvlan_cleanup_module(void)1059*4882a593Smuzhiyun static void __exit ipvlan_cleanup_module(void)
1060*4882a593Smuzhiyun {
1061*4882a593Smuzhiyun 	rtnl_link_unregister(&ipvlan_link_ops);
1062*4882a593Smuzhiyun 	ipvlan_l3s_cleanup();
1063*4882a593Smuzhiyun 	unregister_netdevice_notifier(&ipvlan_notifier_block);
1064*4882a593Smuzhiyun 	unregister_inetaddr_notifier(&ipvlan_addr4_notifier_block);
1065*4882a593Smuzhiyun 	unregister_inetaddr_validator_notifier(
1066*4882a593Smuzhiyun 	    &ipvlan_addr4_vtor_notifier_block);
1067*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
1068*4882a593Smuzhiyun 	unregister_inet6addr_notifier(&ipvlan_addr6_notifier_block);
1069*4882a593Smuzhiyun 	unregister_inet6addr_validator_notifier(
1070*4882a593Smuzhiyun 	    &ipvlan_addr6_vtor_notifier_block);
1071*4882a593Smuzhiyun #endif
1072*4882a593Smuzhiyun }
1073*4882a593Smuzhiyun 
1074*4882a593Smuzhiyun module_init(ipvlan_init_module);
1075*4882a593Smuzhiyun module_exit(ipvlan_cleanup_module);
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1078*4882a593Smuzhiyun MODULE_AUTHOR("Mahesh Bandewar <maheshb@google.com>");
1079*4882a593Smuzhiyun MODULE_DESCRIPTION("Driver for L3 (IPv6/IPv4) based VLANs");
1080*4882a593Smuzhiyun MODULE_ALIAS_RTNL_LINK("ipvlan");
1081