xref: /OK3568_Linux_fs/kernel/net/core/netpoll.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Common framework for low-level network console, dump, and debugger code
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Sep 8 2003  Matt Mackall <mpm@selenic.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * based on the netconsole code from:
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Copyright (C) 2001  Ingo Molnar <mingo@redhat.com>
10*4882a593Smuzhiyun  * Copyright (C) 2002  Red Hat, Inc.
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <linux/moduleparam.h>
16*4882a593Smuzhiyun #include <linux/kernel.h>
17*4882a593Smuzhiyun #include <linux/netdevice.h>
18*4882a593Smuzhiyun #include <linux/etherdevice.h>
19*4882a593Smuzhiyun #include <linux/string.h>
20*4882a593Smuzhiyun #include <linux/if_arp.h>
21*4882a593Smuzhiyun #include <linux/inetdevice.h>
22*4882a593Smuzhiyun #include <linux/inet.h>
23*4882a593Smuzhiyun #include <linux/interrupt.h>
24*4882a593Smuzhiyun #include <linux/netpoll.h>
25*4882a593Smuzhiyun #include <linux/sched.h>
26*4882a593Smuzhiyun #include <linux/delay.h>
27*4882a593Smuzhiyun #include <linux/rcupdate.h>
28*4882a593Smuzhiyun #include <linux/workqueue.h>
29*4882a593Smuzhiyun #include <linux/slab.h>
30*4882a593Smuzhiyun #include <linux/export.h>
31*4882a593Smuzhiyun #include <linux/if_vlan.h>
32*4882a593Smuzhiyun #include <net/dsa.h>
33*4882a593Smuzhiyun #include <net/tcp.h>
34*4882a593Smuzhiyun #include <net/udp.h>
35*4882a593Smuzhiyun #include <net/addrconf.h>
36*4882a593Smuzhiyun #include <net/ndisc.h>
37*4882a593Smuzhiyun #include <net/ip6_checksum.h>
38*4882a593Smuzhiyun #include <asm/unaligned.h>
39*4882a593Smuzhiyun #include <trace/events/napi.h>
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /*
42*4882a593Smuzhiyun  * We maintain a small pool of fully-sized skbs, to make sure the
43*4882a593Smuzhiyun  * message gets out even in extreme OOM situations.
44*4882a593Smuzhiyun  */
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define MAX_UDP_CHUNK 1460
47*4882a593Smuzhiyun #define MAX_SKBS 32
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun static struct sk_buff_head skb_pool;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun DEFINE_STATIC_SRCU(netpoll_srcu);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define USEC_PER_POLL	50
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define MAX_SKB_SIZE							\
56*4882a593Smuzhiyun 	(sizeof(struct ethhdr) +					\
57*4882a593Smuzhiyun 	 sizeof(struct iphdr) +						\
58*4882a593Smuzhiyun 	 sizeof(struct udphdr) +					\
59*4882a593Smuzhiyun 	 MAX_UDP_CHUNK)
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun static void zap_completion_queue(void);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun static unsigned int carrier_timeout = 4;
64*4882a593Smuzhiyun module_param(carrier_timeout, uint, 0644);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define np_info(np, fmt, ...)				\
67*4882a593Smuzhiyun 	pr_info("%s: " fmt, np->name, ##__VA_ARGS__)
68*4882a593Smuzhiyun #define np_err(np, fmt, ...)				\
69*4882a593Smuzhiyun 	pr_err("%s: " fmt, np->name, ##__VA_ARGS__)
70*4882a593Smuzhiyun #define np_notice(np, fmt, ...)				\
71*4882a593Smuzhiyun 	pr_notice("%s: " fmt, np->name, ##__VA_ARGS__)
72*4882a593Smuzhiyun 
netpoll_start_xmit(struct sk_buff * skb,struct net_device * dev,struct netdev_queue * txq)73*4882a593Smuzhiyun static netdev_tx_t netpoll_start_xmit(struct sk_buff *skb,
74*4882a593Smuzhiyun 				      struct net_device *dev,
75*4882a593Smuzhiyun 				      struct netdev_queue *txq)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	netdev_tx_t status = NETDEV_TX_OK;
78*4882a593Smuzhiyun 	netdev_features_t features;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	features = netif_skb_features(skb);
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	if (skb_vlan_tag_present(skb) &&
83*4882a593Smuzhiyun 	    !vlan_hw_offload_capable(features, skb->vlan_proto)) {
84*4882a593Smuzhiyun 		skb = __vlan_hwaccel_push_inside(skb);
85*4882a593Smuzhiyun 		if (unlikely(!skb)) {
86*4882a593Smuzhiyun 			/* This is actually a packet drop, but we
87*4882a593Smuzhiyun 			 * don't want the code that calls this
88*4882a593Smuzhiyun 			 * function to try and operate on a NULL skb.
89*4882a593Smuzhiyun 			 */
90*4882a593Smuzhiyun 			goto out;
91*4882a593Smuzhiyun 		}
92*4882a593Smuzhiyun 	}
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	status = netdev_start_xmit(skb, dev, txq, false);
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun out:
97*4882a593Smuzhiyun 	return status;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun 
queue_process(struct work_struct * work)100*4882a593Smuzhiyun static void queue_process(struct work_struct *work)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun 	struct netpoll_info *npinfo =
103*4882a593Smuzhiyun 		container_of(work, struct netpoll_info, tx_work.work);
104*4882a593Smuzhiyun 	struct sk_buff *skb;
105*4882a593Smuzhiyun 	unsigned long flags;
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	while ((skb = skb_dequeue(&npinfo->txq))) {
108*4882a593Smuzhiyun 		struct net_device *dev = skb->dev;
109*4882a593Smuzhiyun 		struct netdev_queue *txq;
110*4882a593Smuzhiyun 		unsigned int q_index;
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 		if (!netif_device_present(dev) || !netif_running(dev)) {
113*4882a593Smuzhiyun 			kfree_skb(skb);
114*4882a593Smuzhiyun 			continue;
115*4882a593Smuzhiyun 		}
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 		local_irq_save(flags);
118*4882a593Smuzhiyun 		/* check if skb->queue_mapping is still valid */
119*4882a593Smuzhiyun 		q_index = skb_get_queue_mapping(skb);
120*4882a593Smuzhiyun 		if (unlikely(q_index >= dev->real_num_tx_queues)) {
121*4882a593Smuzhiyun 			q_index = q_index % dev->real_num_tx_queues;
122*4882a593Smuzhiyun 			skb_set_queue_mapping(skb, q_index);
123*4882a593Smuzhiyun 		}
124*4882a593Smuzhiyun 		txq = netdev_get_tx_queue(dev, q_index);
125*4882a593Smuzhiyun 		HARD_TX_LOCK(dev, txq, smp_processor_id());
126*4882a593Smuzhiyun 		if (netif_xmit_frozen_or_stopped(txq) ||
127*4882a593Smuzhiyun 		    !dev_xmit_complete(netpoll_start_xmit(skb, dev, txq))) {
128*4882a593Smuzhiyun 			skb_queue_head(&npinfo->txq, skb);
129*4882a593Smuzhiyun 			HARD_TX_UNLOCK(dev, txq);
130*4882a593Smuzhiyun 			local_irq_restore(flags);
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 			schedule_delayed_work(&npinfo->tx_work, HZ/10);
133*4882a593Smuzhiyun 			return;
134*4882a593Smuzhiyun 		}
135*4882a593Smuzhiyun 		HARD_TX_UNLOCK(dev, txq);
136*4882a593Smuzhiyun 		local_irq_restore(flags);
137*4882a593Smuzhiyun 	}
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
poll_one_napi(struct napi_struct * napi)140*4882a593Smuzhiyun static void poll_one_napi(struct napi_struct *napi)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun 	int work;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	/* If we set this bit but see that it has already been set,
145*4882a593Smuzhiyun 	 * that indicates that napi has been disabled and we need
146*4882a593Smuzhiyun 	 * to abort this operation
147*4882a593Smuzhiyun 	 */
148*4882a593Smuzhiyun 	if (test_and_set_bit(NAPI_STATE_NPSVC, &napi->state))
149*4882a593Smuzhiyun 		return;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	/* We explicilty pass the polling call a budget of 0 to
152*4882a593Smuzhiyun 	 * indicate that we are clearing the Tx path only.
153*4882a593Smuzhiyun 	 */
154*4882a593Smuzhiyun 	work = napi->poll(napi, 0);
155*4882a593Smuzhiyun 	WARN_ONCE(work, "%pS exceeded budget in poll\n", napi->poll);
156*4882a593Smuzhiyun 	trace_napi_poll(napi, work, 0);
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	clear_bit(NAPI_STATE_NPSVC, &napi->state);
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun 
poll_napi(struct net_device * dev)161*4882a593Smuzhiyun static void poll_napi(struct net_device *dev)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun 	struct napi_struct *napi;
164*4882a593Smuzhiyun 	int cpu = smp_processor_id();
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	list_for_each_entry_rcu(napi, &dev->napi_list, dev_list) {
167*4882a593Smuzhiyun 		if (cmpxchg(&napi->poll_owner, -1, cpu) == -1) {
168*4882a593Smuzhiyun 			poll_one_napi(napi);
169*4882a593Smuzhiyun 			smp_store_release(&napi->poll_owner, -1);
170*4882a593Smuzhiyun 		}
171*4882a593Smuzhiyun 	}
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun 
netpoll_poll_dev(struct net_device * dev)174*4882a593Smuzhiyun void netpoll_poll_dev(struct net_device *dev)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun 	struct netpoll_info *ni = rcu_dereference_bh(dev->npinfo);
177*4882a593Smuzhiyun 	const struct net_device_ops *ops;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	/* Don't do any rx activity if the dev_lock mutex is held
180*4882a593Smuzhiyun 	 * the dev_open/close paths use this to block netpoll activity
181*4882a593Smuzhiyun 	 * while changing device state
182*4882a593Smuzhiyun 	 */
183*4882a593Smuzhiyun 	if (!ni || down_trylock(&ni->dev_lock))
184*4882a593Smuzhiyun 		return;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	if (!netif_running(dev)) {
187*4882a593Smuzhiyun 		up(&ni->dev_lock);
188*4882a593Smuzhiyun 		return;
189*4882a593Smuzhiyun 	}
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	ops = dev->netdev_ops;
192*4882a593Smuzhiyun 	if (ops->ndo_poll_controller)
193*4882a593Smuzhiyun 		ops->ndo_poll_controller(dev);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	poll_napi(dev);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	up(&ni->dev_lock);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	zap_completion_queue();
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_poll_dev);
202*4882a593Smuzhiyun 
netpoll_poll_disable(struct net_device * dev)203*4882a593Smuzhiyun void netpoll_poll_disable(struct net_device *dev)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	struct netpoll_info *ni;
206*4882a593Smuzhiyun 	int idx;
207*4882a593Smuzhiyun 	might_sleep();
208*4882a593Smuzhiyun 	idx = srcu_read_lock(&netpoll_srcu);
209*4882a593Smuzhiyun 	ni = srcu_dereference(dev->npinfo, &netpoll_srcu);
210*4882a593Smuzhiyun 	if (ni)
211*4882a593Smuzhiyun 		down(&ni->dev_lock);
212*4882a593Smuzhiyun 	srcu_read_unlock(&netpoll_srcu, idx);
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_poll_disable);
215*4882a593Smuzhiyun 
netpoll_poll_enable(struct net_device * dev)216*4882a593Smuzhiyun void netpoll_poll_enable(struct net_device *dev)
217*4882a593Smuzhiyun {
218*4882a593Smuzhiyun 	struct netpoll_info *ni;
219*4882a593Smuzhiyun 	rcu_read_lock();
220*4882a593Smuzhiyun 	ni = rcu_dereference(dev->npinfo);
221*4882a593Smuzhiyun 	if (ni)
222*4882a593Smuzhiyun 		up(&ni->dev_lock);
223*4882a593Smuzhiyun 	rcu_read_unlock();
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_poll_enable);
226*4882a593Smuzhiyun 
refill_skbs(void)227*4882a593Smuzhiyun static void refill_skbs(void)
228*4882a593Smuzhiyun {
229*4882a593Smuzhiyun 	struct sk_buff *skb;
230*4882a593Smuzhiyun 	unsigned long flags;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	spin_lock_irqsave(&skb_pool.lock, flags);
233*4882a593Smuzhiyun 	while (skb_pool.qlen < MAX_SKBS) {
234*4882a593Smuzhiyun 		skb = alloc_skb(MAX_SKB_SIZE, GFP_ATOMIC);
235*4882a593Smuzhiyun 		if (!skb)
236*4882a593Smuzhiyun 			break;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 		__skb_queue_tail(&skb_pool, skb);
239*4882a593Smuzhiyun 	}
240*4882a593Smuzhiyun 	spin_unlock_irqrestore(&skb_pool.lock, flags);
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun 
zap_completion_queue(void)243*4882a593Smuzhiyun static void zap_completion_queue(void)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun 	unsigned long flags;
246*4882a593Smuzhiyun 	struct softnet_data *sd = &get_cpu_var(softnet_data);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	if (sd->completion_queue) {
249*4882a593Smuzhiyun 		struct sk_buff *clist;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 		local_irq_save(flags);
252*4882a593Smuzhiyun 		clist = sd->completion_queue;
253*4882a593Smuzhiyun 		sd->completion_queue = NULL;
254*4882a593Smuzhiyun 		local_irq_restore(flags);
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 		while (clist != NULL) {
257*4882a593Smuzhiyun 			struct sk_buff *skb = clist;
258*4882a593Smuzhiyun 			clist = clist->next;
259*4882a593Smuzhiyun 			if (!skb_irq_freeable(skb)) {
260*4882a593Smuzhiyun 				refcount_set(&skb->users, 1);
261*4882a593Smuzhiyun 				dev_kfree_skb_any(skb); /* put this one back */
262*4882a593Smuzhiyun 			} else {
263*4882a593Smuzhiyun 				__kfree_skb(skb);
264*4882a593Smuzhiyun 			}
265*4882a593Smuzhiyun 		}
266*4882a593Smuzhiyun 	}
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	put_cpu_var(softnet_data);
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
find_skb(struct netpoll * np,int len,int reserve)271*4882a593Smuzhiyun static struct sk_buff *find_skb(struct netpoll *np, int len, int reserve)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun 	int count = 0;
274*4882a593Smuzhiyun 	struct sk_buff *skb;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	zap_completion_queue();
277*4882a593Smuzhiyun 	refill_skbs();
278*4882a593Smuzhiyun repeat:
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	skb = alloc_skb(len, GFP_ATOMIC);
281*4882a593Smuzhiyun 	if (!skb)
282*4882a593Smuzhiyun 		skb = skb_dequeue(&skb_pool);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	if (!skb) {
285*4882a593Smuzhiyun 		if (++count < 10) {
286*4882a593Smuzhiyun 			netpoll_poll_dev(np->dev);
287*4882a593Smuzhiyun 			goto repeat;
288*4882a593Smuzhiyun 		}
289*4882a593Smuzhiyun 		return NULL;
290*4882a593Smuzhiyun 	}
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	refcount_set(&skb->users, 1);
293*4882a593Smuzhiyun 	skb_reserve(skb, reserve);
294*4882a593Smuzhiyun 	return skb;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun 
netpoll_owner_active(struct net_device * dev)297*4882a593Smuzhiyun static int netpoll_owner_active(struct net_device *dev)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun 	struct napi_struct *napi;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 	list_for_each_entry_rcu(napi, &dev->napi_list, dev_list) {
302*4882a593Smuzhiyun 		if (napi->poll_owner == smp_processor_id())
303*4882a593Smuzhiyun 			return 1;
304*4882a593Smuzhiyun 	}
305*4882a593Smuzhiyun 	return 0;
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun /* call with IRQ disabled */
__netpoll_send_skb(struct netpoll * np,struct sk_buff * skb)309*4882a593Smuzhiyun static netdev_tx_t __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun 	netdev_tx_t status = NETDEV_TX_BUSY;
312*4882a593Smuzhiyun 	struct net_device *dev;
313*4882a593Smuzhiyun 	unsigned long tries;
314*4882a593Smuzhiyun 	/* It is up to the caller to keep npinfo alive. */
315*4882a593Smuzhiyun 	struct netpoll_info *npinfo;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	lockdep_assert_irqs_disabled();
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	dev = np->dev;
320*4882a593Smuzhiyun 	npinfo = rcu_dereference_bh(dev->npinfo);
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	if (!npinfo || !netif_running(dev) || !netif_device_present(dev)) {
323*4882a593Smuzhiyun 		dev_kfree_skb_irq(skb);
324*4882a593Smuzhiyun 		return NET_XMIT_DROP;
325*4882a593Smuzhiyun 	}
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	/* don't get messages out of order, and no recursion */
328*4882a593Smuzhiyun 	if (skb_queue_len(&npinfo->txq) == 0 && !netpoll_owner_active(dev)) {
329*4882a593Smuzhiyun 		struct netdev_queue *txq;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 		txq = netdev_core_pick_tx(dev, skb, NULL);
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 		/* try until next clock tick */
334*4882a593Smuzhiyun 		for (tries = jiffies_to_usecs(1)/USEC_PER_POLL;
335*4882a593Smuzhiyun 		     tries > 0; --tries) {
336*4882a593Smuzhiyun 			if (HARD_TX_TRYLOCK(dev, txq)) {
337*4882a593Smuzhiyun 				if (!netif_xmit_stopped(txq))
338*4882a593Smuzhiyun 					status = netpoll_start_xmit(skb, dev, txq);
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 				HARD_TX_UNLOCK(dev, txq);
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 				if (dev_xmit_complete(status))
343*4882a593Smuzhiyun 					break;
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 			}
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 			/* tickle device maybe there is some cleanup */
348*4882a593Smuzhiyun 			netpoll_poll_dev(np->dev);
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 			udelay(USEC_PER_POLL);
351*4882a593Smuzhiyun 		}
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 		WARN_ONCE(!irqs_disabled(),
354*4882a593Smuzhiyun 			"netpoll_send_skb_on_dev(): %s enabled interrupts in poll (%pS)\n",
355*4882a593Smuzhiyun 			dev->name, dev->netdev_ops->ndo_start_xmit);
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	}
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 	if (!dev_xmit_complete(status)) {
360*4882a593Smuzhiyun 		skb_queue_tail(&npinfo->txq, skb);
361*4882a593Smuzhiyun 		schedule_delayed_work(&npinfo->tx_work,0);
362*4882a593Smuzhiyun 	}
363*4882a593Smuzhiyun 	return NETDEV_TX_OK;
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun 
netpoll_send_skb(struct netpoll * np,struct sk_buff * skb)366*4882a593Smuzhiyun netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun 	unsigned long flags;
369*4882a593Smuzhiyun 	netdev_tx_t ret;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	if (unlikely(!np)) {
372*4882a593Smuzhiyun 		dev_kfree_skb_irq(skb);
373*4882a593Smuzhiyun 		ret = NET_XMIT_DROP;
374*4882a593Smuzhiyun 	} else {
375*4882a593Smuzhiyun 		local_irq_save(flags);
376*4882a593Smuzhiyun 		ret = __netpoll_send_skb(np, skb);
377*4882a593Smuzhiyun 		local_irq_restore(flags);
378*4882a593Smuzhiyun 	}
379*4882a593Smuzhiyun 	return ret;
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_send_skb);
382*4882a593Smuzhiyun 
netpoll_send_udp(struct netpoll * np,const char * msg,int len)383*4882a593Smuzhiyun void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
384*4882a593Smuzhiyun {
385*4882a593Smuzhiyun 	int total_len, ip_len, udp_len;
386*4882a593Smuzhiyun 	struct sk_buff *skb;
387*4882a593Smuzhiyun 	struct udphdr *udph;
388*4882a593Smuzhiyun 	struct iphdr *iph;
389*4882a593Smuzhiyun 	struct ethhdr *eth;
390*4882a593Smuzhiyun 	static atomic_t ip_ident;
391*4882a593Smuzhiyun 	struct ipv6hdr *ip6h;
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	WARN_ON_ONCE(!irqs_disabled());
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	udp_len = len + sizeof(*udph);
396*4882a593Smuzhiyun 	if (np->ipv6)
397*4882a593Smuzhiyun 		ip_len = udp_len + sizeof(*ip6h);
398*4882a593Smuzhiyun 	else
399*4882a593Smuzhiyun 		ip_len = udp_len + sizeof(*iph);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	total_len = ip_len + LL_RESERVED_SPACE(np->dev);
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 	skb = find_skb(np, total_len + np->dev->needed_tailroom,
404*4882a593Smuzhiyun 		       total_len - len);
405*4882a593Smuzhiyun 	if (!skb)
406*4882a593Smuzhiyun 		return;
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	skb_copy_to_linear_data(skb, msg, len);
409*4882a593Smuzhiyun 	skb_put(skb, len);
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	skb_push(skb, sizeof(*udph));
412*4882a593Smuzhiyun 	skb_reset_transport_header(skb);
413*4882a593Smuzhiyun 	udph = udp_hdr(skb);
414*4882a593Smuzhiyun 	udph->source = htons(np->local_port);
415*4882a593Smuzhiyun 	udph->dest = htons(np->remote_port);
416*4882a593Smuzhiyun 	udph->len = htons(udp_len);
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	if (np->ipv6) {
419*4882a593Smuzhiyun 		udph->check = 0;
420*4882a593Smuzhiyun 		udph->check = csum_ipv6_magic(&np->local_ip.in6,
421*4882a593Smuzhiyun 					      &np->remote_ip.in6,
422*4882a593Smuzhiyun 					      udp_len, IPPROTO_UDP,
423*4882a593Smuzhiyun 					      csum_partial(udph, udp_len, 0));
424*4882a593Smuzhiyun 		if (udph->check == 0)
425*4882a593Smuzhiyun 			udph->check = CSUM_MANGLED_0;
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 		skb_push(skb, sizeof(*ip6h));
428*4882a593Smuzhiyun 		skb_reset_network_header(skb);
429*4882a593Smuzhiyun 		ip6h = ipv6_hdr(skb);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 		/* ip6h->version = 6; ip6h->priority = 0; */
432*4882a593Smuzhiyun 		put_unaligned(0x60, (unsigned char *)ip6h);
433*4882a593Smuzhiyun 		ip6h->flow_lbl[0] = 0;
434*4882a593Smuzhiyun 		ip6h->flow_lbl[1] = 0;
435*4882a593Smuzhiyun 		ip6h->flow_lbl[2] = 0;
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun 		ip6h->payload_len = htons(sizeof(struct udphdr) + len);
438*4882a593Smuzhiyun 		ip6h->nexthdr = IPPROTO_UDP;
439*4882a593Smuzhiyun 		ip6h->hop_limit = 32;
440*4882a593Smuzhiyun 		ip6h->saddr = np->local_ip.in6;
441*4882a593Smuzhiyun 		ip6h->daddr = np->remote_ip.in6;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 		eth = skb_push(skb, ETH_HLEN);
444*4882a593Smuzhiyun 		skb_reset_mac_header(skb);
445*4882a593Smuzhiyun 		skb->protocol = eth->h_proto = htons(ETH_P_IPV6);
446*4882a593Smuzhiyun 	} else {
447*4882a593Smuzhiyun 		udph->check = 0;
448*4882a593Smuzhiyun 		udph->check = csum_tcpudp_magic(np->local_ip.ip,
449*4882a593Smuzhiyun 						np->remote_ip.ip,
450*4882a593Smuzhiyun 						udp_len, IPPROTO_UDP,
451*4882a593Smuzhiyun 						csum_partial(udph, udp_len, 0));
452*4882a593Smuzhiyun 		if (udph->check == 0)
453*4882a593Smuzhiyun 			udph->check = CSUM_MANGLED_0;
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 		skb_push(skb, sizeof(*iph));
456*4882a593Smuzhiyun 		skb_reset_network_header(skb);
457*4882a593Smuzhiyun 		iph = ip_hdr(skb);
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 		/* iph->version = 4; iph->ihl = 5; */
460*4882a593Smuzhiyun 		put_unaligned(0x45, (unsigned char *)iph);
461*4882a593Smuzhiyun 		iph->tos      = 0;
462*4882a593Smuzhiyun 		put_unaligned(htons(ip_len), &(iph->tot_len));
463*4882a593Smuzhiyun 		iph->id       = htons(atomic_inc_return(&ip_ident));
464*4882a593Smuzhiyun 		iph->frag_off = 0;
465*4882a593Smuzhiyun 		iph->ttl      = 64;
466*4882a593Smuzhiyun 		iph->protocol = IPPROTO_UDP;
467*4882a593Smuzhiyun 		iph->check    = 0;
468*4882a593Smuzhiyun 		put_unaligned(np->local_ip.ip, &(iph->saddr));
469*4882a593Smuzhiyun 		put_unaligned(np->remote_ip.ip, &(iph->daddr));
470*4882a593Smuzhiyun 		iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 		eth = skb_push(skb, ETH_HLEN);
473*4882a593Smuzhiyun 		skb_reset_mac_header(skb);
474*4882a593Smuzhiyun 		skb->protocol = eth->h_proto = htons(ETH_P_IP);
475*4882a593Smuzhiyun 	}
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 	ether_addr_copy(eth->h_source, np->dev->dev_addr);
478*4882a593Smuzhiyun 	ether_addr_copy(eth->h_dest, np->remote_mac);
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun 	skb->dev = np->dev;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	netpoll_send_skb(np, skb);
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_send_udp);
485*4882a593Smuzhiyun 
netpoll_print_options(struct netpoll * np)486*4882a593Smuzhiyun void netpoll_print_options(struct netpoll *np)
487*4882a593Smuzhiyun {
488*4882a593Smuzhiyun 	np_info(np, "local port %d\n", np->local_port);
489*4882a593Smuzhiyun 	if (np->ipv6)
490*4882a593Smuzhiyun 		np_info(np, "local IPv6 address %pI6c\n", &np->local_ip.in6);
491*4882a593Smuzhiyun 	else
492*4882a593Smuzhiyun 		np_info(np, "local IPv4 address %pI4\n", &np->local_ip.ip);
493*4882a593Smuzhiyun 	np_info(np, "interface '%s'\n", np->dev_name);
494*4882a593Smuzhiyun 	np_info(np, "remote port %d\n", np->remote_port);
495*4882a593Smuzhiyun 	if (np->ipv6)
496*4882a593Smuzhiyun 		np_info(np, "remote IPv6 address %pI6c\n", &np->remote_ip.in6);
497*4882a593Smuzhiyun 	else
498*4882a593Smuzhiyun 		np_info(np, "remote IPv4 address %pI4\n", &np->remote_ip.ip);
499*4882a593Smuzhiyun 	np_info(np, "remote ethernet address %pM\n", np->remote_mac);
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_print_options);
502*4882a593Smuzhiyun 
netpoll_parse_ip_addr(const char * str,union inet_addr * addr)503*4882a593Smuzhiyun static int netpoll_parse_ip_addr(const char *str, union inet_addr *addr)
504*4882a593Smuzhiyun {
505*4882a593Smuzhiyun 	const char *end;
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	if (!strchr(str, ':') &&
508*4882a593Smuzhiyun 	    in4_pton(str, -1, (void *)addr, -1, &end) > 0) {
509*4882a593Smuzhiyun 		if (!*end)
510*4882a593Smuzhiyun 			return 0;
511*4882a593Smuzhiyun 	}
512*4882a593Smuzhiyun 	if (in6_pton(str, -1, addr->in6.s6_addr, -1, &end) > 0) {
513*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
514*4882a593Smuzhiyun 		if (!*end)
515*4882a593Smuzhiyun 			return 1;
516*4882a593Smuzhiyun #else
517*4882a593Smuzhiyun 		return -1;
518*4882a593Smuzhiyun #endif
519*4882a593Smuzhiyun 	}
520*4882a593Smuzhiyun 	return -1;
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun 
netpoll_parse_options(struct netpoll * np,char * opt)523*4882a593Smuzhiyun int netpoll_parse_options(struct netpoll *np, char *opt)
524*4882a593Smuzhiyun {
525*4882a593Smuzhiyun 	char *cur=opt, *delim;
526*4882a593Smuzhiyun 	int ipv6;
527*4882a593Smuzhiyun 	bool ipversion_set = false;
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	if (*cur != '@') {
530*4882a593Smuzhiyun 		if ((delim = strchr(cur, '@')) == NULL)
531*4882a593Smuzhiyun 			goto parse_failed;
532*4882a593Smuzhiyun 		*delim = 0;
533*4882a593Smuzhiyun 		if (kstrtou16(cur, 10, &np->local_port))
534*4882a593Smuzhiyun 			goto parse_failed;
535*4882a593Smuzhiyun 		cur = delim;
536*4882a593Smuzhiyun 	}
537*4882a593Smuzhiyun 	cur++;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	if (*cur != '/') {
540*4882a593Smuzhiyun 		ipversion_set = true;
541*4882a593Smuzhiyun 		if ((delim = strchr(cur, '/')) == NULL)
542*4882a593Smuzhiyun 			goto parse_failed;
543*4882a593Smuzhiyun 		*delim = 0;
544*4882a593Smuzhiyun 		ipv6 = netpoll_parse_ip_addr(cur, &np->local_ip);
545*4882a593Smuzhiyun 		if (ipv6 < 0)
546*4882a593Smuzhiyun 			goto parse_failed;
547*4882a593Smuzhiyun 		else
548*4882a593Smuzhiyun 			np->ipv6 = (bool)ipv6;
549*4882a593Smuzhiyun 		cur = delim;
550*4882a593Smuzhiyun 	}
551*4882a593Smuzhiyun 	cur++;
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	if (*cur != ',') {
554*4882a593Smuzhiyun 		/* parse out dev name */
555*4882a593Smuzhiyun 		if ((delim = strchr(cur, ',')) == NULL)
556*4882a593Smuzhiyun 			goto parse_failed;
557*4882a593Smuzhiyun 		*delim = 0;
558*4882a593Smuzhiyun 		strlcpy(np->dev_name, cur, sizeof(np->dev_name));
559*4882a593Smuzhiyun 		cur = delim;
560*4882a593Smuzhiyun 	}
561*4882a593Smuzhiyun 	cur++;
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun 	if (*cur != '@') {
564*4882a593Smuzhiyun 		/* dst port */
565*4882a593Smuzhiyun 		if ((delim = strchr(cur, '@')) == NULL)
566*4882a593Smuzhiyun 			goto parse_failed;
567*4882a593Smuzhiyun 		*delim = 0;
568*4882a593Smuzhiyun 		if (*cur == ' ' || *cur == '\t')
569*4882a593Smuzhiyun 			np_info(np, "warning: whitespace is not allowed\n");
570*4882a593Smuzhiyun 		if (kstrtou16(cur, 10, &np->remote_port))
571*4882a593Smuzhiyun 			goto parse_failed;
572*4882a593Smuzhiyun 		cur = delim;
573*4882a593Smuzhiyun 	}
574*4882a593Smuzhiyun 	cur++;
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun 	/* dst ip */
577*4882a593Smuzhiyun 	if ((delim = strchr(cur, '/')) == NULL)
578*4882a593Smuzhiyun 		goto parse_failed;
579*4882a593Smuzhiyun 	*delim = 0;
580*4882a593Smuzhiyun 	ipv6 = netpoll_parse_ip_addr(cur, &np->remote_ip);
581*4882a593Smuzhiyun 	if (ipv6 < 0)
582*4882a593Smuzhiyun 		goto parse_failed;
583*4882a593Smuzhiyun 	else if (ipversion_set && np->ipv6 != (bool)ipv6)
584*4882a593Smuzhiyun 		goto parse_failed;
585*4882a593Smuzhiyun 	else
586*4882a593Smuzhiyun 		np->ipv6 = (bool)ipv6;
587*4882a593Smuzhiyun 	cur = delim + 1;
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	if (*cur != 0) {
590*4882a593Smuzhiyun 		/* MAC address */
591*4882a593Smuzhiyun 		if (!mac_pton(cur, np->remote_mac))
592*4882a593Smuzhiyun 			goto parse_failed;
593*4882a593Smuzhiyun 	}
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun 	netpoll_print_options(np);
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	return 0;
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun  parse_failed:
600*4882a593Smuzhiyun 	np_info(np, "couldn't parse config at '%s'!\n", cur);
601*4882a593Smuzhiyun 	return -1;
602*4882a593Smuzhiyun }
603*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_parse_options);
604*4882a593Smuzhiyun 
__netpoll_setup(struct netpoll * np,struct net_device * ndev)605*4882a593Smuzhiyun int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
606*4882a593Smuzhiyun {
607*4882a593Smuzhiyun 	struct netpoll_info *npinfo;
608*4882a593Smuzhiyun 	const struct net_device_ops *ops;
609*4882a593Smuzhiyun 	int err;
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 	np->dev = ndev;
612*4882a593Smuzhiyun 	strlcpy(np->dev_name, ndev->name, IFNAMSIZ);
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun 	if (ndev->priv_flags & IFF_DISABLE_NETPOLL) {
615*4882a593Smuzhiyun 		np_err(np, "%s doesn't support polling, aborting\n",
616*4882a593Smuzhiyun 		       np->dev_name);
617*4882a593Smuzhiyun 		err = -ENOTSUPP;
618*4882a593Smuzhiyun 		goto out;
619*4882a593Smuzhiyun 	}
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	if (!ndev->npinfo) {
622*4882a593Smuzhiyun 		npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);
623*4882a593Smuzhiyun 		if (!npinfo) {
624*4882a593Smuzhiyun 			err = -ENOMEM;
625*4882a593Smuzhiyun 			goto out;
626*4882a593Smuzhiyun 		}
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun 		sema_init(&npinfo->dev_lock, 1);
629*4882a593Smuzhiyun 		skb_queue_head_init(&npinfo->txq);
630*4882a593Smuzhiyun 		INIT_DELAYED_WORK(&npinfo->tx_work, queue_process);
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun 		refcount_set(&npinfo->refcnt, 1);
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun 		ops = np->dev->netdev_ops;
635*4882a593Smuzhiyun 		if (ops->ndo_netpoll_setup) {
636*4882a593Smuzhiyun 			err = ops->ndo_netpoll_setup(ndev, npinfo);
637*4882a593Smuzhiyun 			if (err)
638*4882a593Smuzhiyun 				goto free_npinfo;
639*4882a593Smuzhiyun 		}
640*4882a593Smuzhiyun 	} else {
641*4882a593Smuzhiyun 		npinfo = rtnl_dereference(ndev->npinfo);
642*4882a593Smuzhiyun 		refcount_inc(&npinfo->refcnt);
643*4882a593Smuzhiyun 	}
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun 	npinfo->netpoll = np;
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun 	/* last thing to do is link it to the net device structure */
648*4882a593Smuzhiyun 	rcu_assign_pointer(ndev->npinfo, npinfo);
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun 	return 0;
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun free_npinfo:
653*4882a593Smuzhiyun 	kfree(npinfo);
654*4882a593Smuzhiyun out:
655*4882a593Smuzhiyun 	return err;
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__netpoll_setup);
658*4882a593Smuzhiyun 
netpoll_setup(struct netpoll * np)659*4882a593Smuzhiyun int netpoll_setup(struct netpoll *np)
660*4882a593Smuzhiyun {
661*4882a593Smuzhiyun 	struct net_device *ndev = NULL, *dev = NULL;
662*4882a593Smuzhiyun 	struct net *net = current->nsproxy->net_ns;
663*4882a593Smuzhiyun 	struct in_device *in_dev;
664*4882a593Smuzhiyun 	int err;
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun 	rtnl_lock();
667*4882a593Smuzhiyun 	if (np->dev_name[0])
668*4882a593Smuzhiyun 		ndev = __dev_get_by_name(net, np->dev_name);
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	if (!ndev) {
671*4882a593Smuzhiyun 		np_err(np, "%s doesn't exist, aborting\n", np->dev_name);
672*4882a593Smuzhiyun 		err = -ENODEV;
673*4882a593Smuzhiyun 		goto unlock;
674*4882a593Smuzhiyun 	}
675*4882a593Smuzhiyun 	dev_hold(ndev);
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun 	/* bring up DSA management network devices up first */
678*4882a593Smuzhiyun 	for_each_netdev(net, dev) {
679*4882a593Smuzhiyun 		if (!netdev_uses_dsa(dev))
680*4882a593Smuzhiyun 			continue;
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 		err = dev_change_flags(dev, dev->flags | IFF_UP, NULL);
683*4882a593Smuzhiyun 		if (err < 0) {
684*4882a593Smuzhiyun 			np_err(np, "%s failed to open %s\n",
685*4882a593Smuzhiyun 			       np->dev_name, dev->name);
686*4882a593Smuzhiyun 			goto put;
687*4882a593Smuzhiyun 		}
688*4882a593Smuzhiyun 	}
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun 	if (netdev_master_upper_dev_get(ndev)) {
691*4882a593Smuzhiyun 		np_err(np, "%s is a slave device, aborting\n", np->dev_name);
692*4882a593Smuzhiyun 		err = -EBUSY;
693*4882a593Smuzhiyun 		goto put;
694*4882a593Smuzhiyun 	}
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun 	if (!netif_running(ndev)) {
697*4882a593Smuzhiyun 		unsigned long atmost, atleast;
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun 		np_info(np, "device %s not up yet, forcing it\n", np->dev_name);
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun 		err = dev_open(ndev, NULL);
702*4882a593Smuzhiyun 
703*4882a593Smuzhiyun 		if (err) {
704*4882a593Smuzhiyun 			np_err(np, "failed to open %s\n", ndev->name);
705*4882a593Smuzhiyun 			goto put;
706*4882a593Smuzhiyun 		}
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun 		rtnl_unlock();
709*4882a593Smuzhiyun 		atleast = jiffies + HZ/10;
710*4882a593Smuzhiyun 		atmost = jiffies + carrier_timeout * HZ;
711*4882a593Smuzhiyun 		while (!netif_carrier_ok(ndev)) {
712*4882a593Smuzhiyun 			if (time_after(jiffies, atmost)) {
713*4882a593Smuzhiyun 				np_notice(np, "timeout waiting for carrier\n");
714*4882a593Smuzhiyun 				break;
715*4882a593Smuzhiyun 			}
716*4882a593Smuzhiyun 			msleep(1);
717*4882a593Smuzhiyun 		}
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun 		/* If carrier appears to come up instantly, we don't
720*4882a593Smuzhiyun 		 * trust it and pause so that we don't pump all our
721*4882a593Smuzhiyun 		 * queued console messages into the bitbucket.
722*4882a593Smuzhiyun 		 */
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun 		if (time_before(jiffies, atleast)) {
725*4882a593Smuzhiyun 			np_notice(np, "carrier detect appears untrustworthy, waiting 4 seconds\n");
726*4882a593Smuzhiyun 			msleep(4000);
727*4882a593Smuzhiyun 		}
728*4882a593Smuzhiyun 		rtnl_lock();
729*4882a593Smuzhiyun 	}
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun 	if (!np->local_ip.ip) {
732*4882a593Smuzhiyun 		if (!np->ipv6) {
733*4882a593Smuzhiyun 			const struct in_ifaddr *ifa;
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 			in_dev = __in_dev_get_rtnl(ndev);
736*4882a593Smuzhiyun 			if (!in_dev)
737*4882a593Smuzhiyun 				goto put_noaddr;
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 			ifa = rtnl_dereference(in_dev->ifa_list);
740*4882a593Smuzhiyun 			if (!ifa) {
741*4882a593Smuzhiyun put_noaddr:
742*4882a593Smuzhiyun 				np_err(np, "no IP address for %s, aborting\n",
743*4882a593Smuzhiyun 				       np->dev_name);
744*4882a593Smuzhiyun 				err = -EDESTADDRREQ;
745*4882a593Smuzhiyun 				goto put;
746*4882a593Smuzhiyun 			}
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 			np->local_ip.ip = ifa->ifa_local;
749*4882a593Smuzhiyun 			np_info(np, "local IP %pI4\n", &np->local_ip.ip);
750*4882a593Smuzhiyun 		} else {
751*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
752*4882a593Smuzhiyun 			struct inet6_dev *idev;
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun 			err = -EDESTADDRREQ;
755*4882a593Smuzhiyun 			idev = __in6_dev_get(ndev);
756*4882a593Smuzhiyun 			if (idev) {
757*4882a593Smuzhiyun 				struct inet6_ifaddr *ifp;
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun 				read_lock_bh(&idev->lock);
760*4882a593Smuzhiyun 				list_for_each_entry(ifp, &idev->addr_list, if_list) {
761*4882a593Smuzhiyun 					if (!!(ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL) !=
762*4882a593Smuzhiyun 					    !!(ipv6_addr_type(&np->remote_ip.in6) & IPV6_ADDR_LINKLOCAL))
763*4882a593Smuzhiyun 						continue;
764*4882a593Smuzhiyun 					np->local_ip.in6 = ifp->addr;
765*4882a593Smuzhiyun 					err = 0;
766*4882a593Smuzhiyun 					break;
767*4882a593Smuzhiyun 				}
768*4882a593Smuzhiyun 				read_unlock_bh(&idev->lock);
769*4882a593Smuzhiyun 			}
770*4882a593Smuzhiyun 			if (err) {
771*4882a593Smuzhiyun 				np_err(np, "no IPv6 address for %s, aborting\n",
772*4882a593Smuzhiyun 				       np->dev_name);
773*4882a593Smuzhiyun 				goto put;
774*4882a593Smuzhiyun 			} else
775*4882a593Smuzhiyun 				np_info(np, "local IPv6 %pI6c\n", &np->local_ip.in6);
776*4882a593Smuzhiyun #else
777*4882a593Smuzhiyun 			np_err(np, "IPv6 is not supported %s, aborting\n",
778*4882a593Smuzhiyun 			       np->dev_name);
779*4882a593Smuzhiyun 			err = -EINVAL;
780*4882a593Smuzhiyun 			goto put;
781*4882a593Smuzhiyun #endif
782*4882a593Smuzhiyun 		}
783*4882a593Smuzhiyun 	}
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	/* fill up the skb queue */
786*4882a593Smuzhiyun 	refill_skbs();
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	err = __netpoll_setup(np, ndev);
789*4882a593Smuzhiyun 	if (err)
790*4882a593Smuzhiyun 		goto put;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	rtnl_unlock();
793*4882a593Smuzhiyun 	return 0;
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun put:
796*4882a593Smuzhiyun 	dev_put(ndev);
797*4882a593Smuzhiyun unlock:
798*4882a593Smuzhiyun 	rtnl_unlock();
799*4882a593Smuzhiyun 	return err;
800*4882a593Smuzhiyun }
801*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_setup);
802*4882a593Smuzhiyun 
netpoll_init(void)803*4882a593Smuzhiyun static int __init netpoll_init(void)
804*4882a593Smuzhiyun {
805*4882a593Smuzhiyun 	skb_queue_head_init(&skb_pool);
806*4882a593Smuzhiyun 	return 0;
807*4882a593Smuzhiyun }
808*4882a593Smuzhiyun core_initcall(netpoll_init);
809*4882a593Smuzhiyun 
rcu_cleanup_netpoll_info(struct rcu_head * rcu_head)810*4882a593Smuzhiyun static void rcu_cleanup_netpoll_info(struct rcu_head *rcu_head)
811*4882a593Smuzhiyun {
812*4882a593Smuzhiyun 	struct netpoll_info *npinfo =
813*4882a593Smuzhiyun 			container_of(rcu_head, struct netpoll_info, rcu);
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 	skb_queue_purge(&npinfo->txq);
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 	/* we can't call cancel_delayed_work_sync here, as we are in softirq */
818*4882a593Smuzhiyun 	cancel_delayed_work(&npinfo->tx_work);
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun 	/* clean after last, unfinished work */
821*4882a593Smuzhiyun 	__skb_queue_purge(&npinfo->txq);
822*4882a593Smuzhiyun 	/* now cancel it again */
823*4882a593Smuzhiyun 	cancel_delayed_work(&npinfo->tx_work);
824*4882a593Smuzhiyun 	kfree(npinfo);
825*4882a593Smuzhiyun }
826*4882a593Smuzhiyun 
__netpoll_cleanup(struct netpoll * np)827*4882a593Smuzhiyun void __netpoll_cleanup(struct netpoll *np)
828*4882a593Smuzhiyun {
829*4882a593Smuzhiyun 	struct netpoll_info *npinfo;
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun 	npinfo = rtnl_dereference(np->dev->npinfo);
832*4882a593Smuzhiyun 	if (!npinfo)
833*4882a593Smuzhiyun 		return;
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun 	synchronize_srcu(&netpoll_srcu);
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun 	if (refcount_dec_and_test(&npinfo->refcnt)) {
838*4882a593Smuzhiyun 		const struct net_device_ops *ops;
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun 		ops = np->dev->netdev_ops;
841*4882a593Smuzhiyun 		if (ops->ndo_netpoll_cleanup)
842*4882a593Smuzhiyun 			ops->ndo_netpoll_cleanup(np->dev);
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun 		RCU_INIT_POINTER(np->dev->npinfo, NULL);
845*4882a593Smuzhiyun 		call_rcu(&npinfo->rcu, rcu_cleanup_netpoll_info);
846*4882a593Smuzhiyun 	} else
847*4882a593Smuzhiyun 		RCU_INIT_POINTER(np->dev->npinfo, NULL);
848*4882a593Smuzhiyun }
849*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__netpoll_cleanup);
850*4882a593Smuzhiyun 
__netpoll_free(struct netpoll * np)851*4882a593Smuzhiyun void __netpoll_free(struct netpoll *np)
852*4882a593Smuzhiyun {
853*4882a593Smuzhiyun 	ASSERT_RTNL();
854*4882a593Smuzhiyun 
855*4882a593Smuzhiyun 	/* Wait for transmitting packets to finish before freeing. */
856*4882a593Smuzhiyun 	synchronize_rcu();
857*4882a593Smuzhiyun 	__netpoll_cleanup(np);
858*4882a593Smuzhiyun 	kfree(np);
859*4882a593Smuzhiyun }
860*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__netpoll_free);
861*4882a593Smuzhiyun 
netpoll_cleanup(struct netpoll * np)862*4882a593Smuzhiyun void netpoll_cleanup(struct netpoll *np)
863*4882a593Smuzhiyun {
864*4882a593Smuzhiyun 	rtnl_lock();
865*4882a593Smuzhiyun 	if (!np->dev)
866*4882a593Smuzhiyun 		goto out;
867*4882a593Smuzhiyun 	__netpoll_cleanup(np);
868*4882a593Smuzhiyun 	dev_put(np->dev);
869*4882a593Smuzhiyun 	np->dev = NULL;
870*4882a593Smuzhiyun out:
871*4882a593Smuzhiyun 	rtnl_unlock();
872*4882a593Smuzhiyun }
873*4882a593Smuzhiyun EXPORT_SYMBOL(netpoll_cleanup);
874