Blame view

include/linux/netdevice.h 83.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
  /*
   * INET		An implementation of the TCP/IP protocol suite for the LINUX
   *		operating system.  INET is implemented using the  BSD Socket
   *		interface as the means of communication with the user level.
   *
   *		Definitions for the Interfaces handler.
   *
   * Version:	@(#)dev.h	1.0.10	08/12/93
   *
02c30a84e   Jesper Juhl   [PATCH] update Ro...
10
   * Authors:	Ross Biro
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
   *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
   *		Corey Minyard <wf-rch!minyard@relay.EU.net>
   *		Donald J. Becker, <becker@cesdis.gsfc.nasa.gov>
113aa838e   Alan Cox   net: Rationalise ...
14
   *		Alan Cox, <alan@lxorguk.ukuu.org.uk>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   *		Bjorn Ekwall. <bj0rn@blox.se>
   *              Pekka Riikonen <priikone@poseidon.pspt.fi>
   *
   *		This program is free software; you can redistribute it and/or
   *		modify it under the terms of the GNU General Public License
   *		as published by the Free Software Foundation; either version
   *		2 of the License, or (at your option) any later version.
   *
   *		Moved to /usr/include/linux for NET3
   */
  #ifndef _LINUX_NETDEVICE_H
  #define _LINUX_NETDEVICE_H
  
  #include <linux/if.h>
  #include <linux/if_ether.h>
  #include <linux/if_packet.h>
95c26df82   Williams, Mitch A   net: Add netdev o...
31
  #include <linux/if_link.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
33
  
  #ifdef __KERNEL__
e8db0be12   Jean Pihet   PM QoS: Move and ...
34
  #include <linux/pm_qos.h>
d7fe0f241   Al Viro   [PATCH] severing ...
35
  #include <linux/timer.h>
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
36
  #include <linux/delay.h>
60063497a   Arun Sharma   atomic: use <linu...
37
  #include <linux/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
  #include <asm/cache.h>
  #include <asm/byteorder.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
  #include <linux/device.h>
  #include <linux/percpu.h>
4d5b78c05   David S. Miller   net: Add missing ...
42
  #include <linux/rculist.h>
db2173348   Chris Leech   [I/OAT]: Setup th...
43
  #include <linux/dmaengine.h>
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
44
  #include <linux/workqueue.h>
114cf5802   Tom Herbert   bql: Byte queue l...
45
  #include <linux/dynamic_queue_limits.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46

b1b67dd45   Patrick McHardy   net: factor out e...
47
  #include <linux/ethtool.h>
a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
48
  #include <net/net_namespace.h>
cf85d08fd   Lennert Buytenhek   dsa: add support ...
49
  #include <net/dsa.h>
7a6b6f515   Jeff Kirsher   DCB: fix kconfig ...
50
  #ifdef CONFIG_DCB
2f90b8657   Alexander Duyck   ixgbe: this patch...
51
52
  #include <net/dcbnl.h>
  #endif
5bc1421e3   Neil Horman   net: add network ...
53
  #include <net/netprio_cgroup.h>
a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
54

a59e2ecb8   Michał Mirosław   net: split netdev...
55
  #include <linux/netdev_features.h>
115c1d6e6   Jeff Moyer   [NETPOLL]: Introd...
56
  struct netpoll_info;
c1f19b51d   Richard Cochran   net: support time...
57
  struct phy_device;
704232c27   Johannes Berg   [WIRELESS] cfg802...
58
59
  /* 802.11 specific */
  struct wireless_dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
  					/* source back-compat hooks */
  #define SET_ETHTOOL_OPS(netdev,ops) \
  	( (netdev)->ethtool_ops = (ops) )
c1f79426e   Stefan Assmann   sysfs: add attrib...
63
64
65
66
  /* hardware address assignment types */
  #define NET_ADDR_PERM		0	/* address is permanent (default) */
  #define NET_ADDR_RANDOM		1	/* address is generated randomly */
  #define NET_ADDR_STOLEN		2	/* address is stolen from other device */
9a1654ba0   Jarek Poplawski   net: Optimize har...
67
68
69
  /* Backlog congestion levels */
  #define NET_RX_SUCCESS		0	/* keep 'em coming, baby */
  #define NET_RX_DROP		1	/* packet dropped */
572a9d7b6   Patrick McHardy   net: allow to pro...
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  /*
   * Transmit return codes: transmit return codes originate from three different
   * namespaces:
   *
   * - qdisc return codes
   * - driver transmit return codes
   * - errno values
   *
   * Drivers are allowed to return any one of those in their hard_start_xmit()
   * function. Real network devices commonly used with qdiscs should only return
   * the driver transmit return codes though - when qdiscs are used, the actual
   * transmission happens asynchronously, so the value is not propagated to
   * higher layers. Virtual network devices transmit synchronously, in this case
   * the driver transmit return codes are consumed by dev_queue_xmit(), all
   * others are propagated to higher layers.
   */
  
  /* qdisc ->enqueue() return codes. */
  #define NET_XMIT_SUCCESS	0x00
9a1654ba0   Jarek Poplawski   net: Optimize har...
89
90
91
92
  #define NET_XMIT_DROP		0x01	/* skb dropped			*/
  #define NET_XMIT_CN		0x02	/* congestion notification	*/
  #define NET_XMIT_POLICED	0x03	/* skb is shot by police	*/
  #define NET_XMIT_MASK		0x0f	/* qdisc flags in net/sch_generic.h */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93

b9df3cb8c   Gerrit Renker   [TCP/DCCP]: Intro...
94
95
96
  /* NET_XMIT_CN is special. It does not guarantee that this packet is lost. It
   * indicates that the device will soon be dropping packets, or already drops
   * some packets of the same priority; prompting us to send less aggressively. */
572a9d7b6   Patrick McHardy   net: allow to pro...
97
  #define net_xmit_eval(e)	((e) == NET_XMIT_CN ? 0 : (e))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
  #define net_xmit_errno(e)	((e) != NET_XMIT_CN ? -ENOBUFS : 0)
dc1f8bf68   Stephen Hemminger   netdev: change tr...
99
  /* Driver transmit return codes */
9a1654ba0   Jarek Poplawski   net: Optimize har...
100
  #define NETDEV_TX_MASK		0xf0
572a9d7b6   Patrick McHardy   net: allow to pro...
101

dc1f8bf68   Stephen Hemminger   netdev: change tr...
102
  enum netdev_tx {
572a9d7b6   Patrick McHardy   net: allow to pro...
103
  	__NETDEV_TX_MIN	 = INT_MIN,	/* make sure enum is signed */
9a1654ba0   Jarek Poplawski   net: Optimize har...
104
105
106
  	NETDEV_TX_OK	 = 0x00,	/* driver took care of packet */
  	NETDEV_TX_BUSY	 = 0x10,	/* driver tx path was busy*/
  	NETDEV_TX_LOCKED = 0x20,	/* driver tx lock was already taken */
dc1f8bf68   Stephen Hemminger   netdev: change tr...
107
108
  };
  typedef enum netdev_tx netdev_tx_t;
9a1654ba0   Jarek Poplawski   net: Optimize har...
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  /*
   * Current order: NETDEV_TX_MASK > NET_XMIT_MASK >= 0 is significant;
   * hard_start_xmit() return < NET_XMIT_MASK means skb was consumed.
   */
  static inline bool dev_xmit_complete(int rc)
  {
  	/*
  	 * Positive cases with an skb consumed by a driver:
  	 * - successful transmission (rc == NETDEV_TX_OK)
  	 * - error while transmitting (rc < 0)
  	 * - error while queueing to a different device (rc & NET_XMIT_MASK)
  	 */
  	if (likely(rc < NET_XMIT_MASK))
  		return true;
  
  	return false;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126
127
128
  #endif
  
  #define MAX_ADDR_LEN	32		/* Largest hardware address length */
23b41168f   Vlad Dogaru   netdevice: make i...
129
130
  /* Initial net device group. All devices belong to group 0 by default. */
  #define INIT_NETDEV_GROUP	0
c88e6f51c   Adrian Bunk   include/linux/net...
131
  #ifdef  __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
133
134
135
  /*
   *	Compute the worst case header length according to the protocols
   *	used.
   */
fe2918b09   Graf Yang   net: fix some tra...
136

d11ead756   Ben Hutchings   net: Use IS_ENABL...
137
  #if defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
8388e3da3   David S. Miller   net: Set LL_MAX_H...
138
139
140
141
142
  # if defined(CONFIG_MAC80211_MESH)
  #  define LL_MAX_HEADER 128
  # else
  #  define LL_MAX_HEADER 96
  # endif
d11ead756   Ben Hutchings   net: Use IS_ENABL...
143
  #elif IS_ENABLED(CONFIG_TR)
8388e3da3   David S. Miller   net: Set LL_MAX_H...
144
  # define LL_MAX_HEADER 48
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
  #else
8388e3da3   David S. Miller   net: Set LL_MAX_H...
146
  # define LL_MAX_HEADER 32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  #endif
d11ead756   Ben Hutchings   net: Use IS_ENABL...
148
149
  #if !IS_ENABLED(CONFIG_NET_IPIP) && !IS_ENABLED(CONFIG_NET_IPGRE) && \
      !IS_ENABLED(CONFIG_IPV6_SIT) && !IS_ENABLED(CONFIG_IPV6_TUNNEL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
151
152
153
154
155
  #define MAX_HEADER LL_MAX_HEADER
  #else
  #define MAX_HEADER (LL_MAX_HEADER + 48)
  #endif
  
  /*
be1f3c2c0   Ben Hutchings   net: Enable 64-bi...
156
157
   *	Old network device statistics. Fields are native words
   *	(unsigned long) so they can be read and written atomically.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
   */
fe2918b09   Graf Yang   net: fix some tra...
159

d94d9fee9   Eric Dumazet   net: cleanup incl...
160
  struct net_device_stats {
3cfde79c6   Ben Hutchings   net: Get rid of r...
161
162
163
164
165
166
167
168
169
  	unsigned long	rx_packets;
  	unsigned long	tx_packets;
  	unsigned long	rx_bytes;
  	unsigned long	tx_bytes;
  	unsigned long	rx_errors;
  	unsigned long	tx_errors;
  	unsigned long	rx_dropped;
  	unsigned long	tx_dropped;
  	unsigned long	multicast;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
  	unsigned long	collisions;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  	unsigned long	rx_length_errors;
3cfde79c6   Ben Hutchings   net: Get rid of r...
172
173
174
175
176
  	unsigned long	rx_over_errors;
  	unsigned long	rx_crc_errors;
  	unsigned long	rx_frame_errors;
  	unsigned long	rx_fifo_errors;
  	unsigned long	rx_missed_errors;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
179
180
181
  	unsigned long	tx_aborted_errors;
  	unsigned long	tx_carrier_errors;
  	unsigned long	tx_fifo_errors;
  	unsigned long	tx_heartbeat_errors;
  	unsigned long	tx_window_errors;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
183
184
  	unsigned long	rx_compressed;
  	unsigned long	tx_compressed;
  };
be1f3c2c0   Ben Hutchings   net: Enable 64-bi...
185
  #endif  /*  __KERNEL__  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
  
  /* Media selection options. */
  enum {
          IF_PORT_UNKNOWN = 0,
          IF_PORT_10BASE2,
          IF_PORT_10BASET,
          IF_PORT_AUI,
          IF_PORT_100BASET,
          IF_PORT_100BASETX,
          IF_PORT_100BASEFX
  };
  
  #ifdef __KERNEL__
  
  #include <linux/cache.h>
  #include <linux/skbuff.h>
adc9300e7   Eric Dumazet   net: use jump_lab...
202
203
204
205
  #ifdef CONFIG_RPS
  #include <linux/jump_label.h>
  extern struct jump_label_key rps_needed;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
  struct neighbour;
  struct neigh_parms;
  struct sk_buff;
f001fde5e   Jiri Pirko   net: introduce a ...
209
210
211
212
  struct netdev_hw_addr {
  	struct list_head	list;
  	unsigned char		addr[MAX_ADDR_LEN];
  	unsigned char		type;
ccffad25b   Jiri Pirko   net: convert unic...
213
214
215
216
  #define NETDEV_HW_ADDR_T_LAN		1
  #define NETDEV_HW_ADDR_T_SAN		2
  #define NETDEV_HW_ADDR_T_SLAVE		3
  #define NETDEV_HW_ADDR_T_UNICAST	4
22bedad3c   Jiri Pirko   net: convert mult...
217
  #define NETDEV_HW_ADDR_T_MULTICAST	5
ccffad25b   Jiri Pirko   net: convert unic...
218
  	bool			synced;
22bedad3c   Jiri Pirko   net: convert mult...
219
  	bool			global_use;
8f8f103d8   Eric Dumazet   net: reorder stru...
220
  	int			refcount;
f001fde5e   Jiri Pirko   net: introduce a ...
221
222
  	struct rcu_head		rcu_head;
  };
31278e714   Jiri Pirko   net: group addres...
223
224
225
226
  struct netdev_hw_addr_list {
  	struct list_head	list;
  	int			count;
  };
22bedad3c   Jiri Pirko   net: convert mult...
227
228
229
230
  #define netdev_hw_addr_list_count(l) ((l)->count)
  #define netdev_hw_addr_list_empty(l) (netdev_hw_addr_list_count(l) == 0)
  #define netdev_hw_addr_list_for_each(ha, l) \
  	list_for_each_entry(ha, &(l)->list, list)
32e7bfc41   Jiri Pirko   net: use helpers ...
231

22bedad3c   Jiri Pirko   net: convert mult...
232
233
234
235
  #define netdev_uc_count(dev) netdev_hw_addr_list_count(&(dev)->uc)
  #define netdev_uc_empty(dev) netdev_hw_addr_list_empty(&(dev)->uc)
  #define netdev_for_each_uc_addr(ha, dev) \
  	netdev_hw_addr_list_for_each(ha, &(dev)->uc)
6683ece36   Jiri Pirko   net: use helpers ...
236

22bedad3c   Jiri Pirko   net: convert mult...
237
238
  #define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc)
  #define netdev_mc_empty(dev) netdev_hw_addr_list_empty(&(dev)->mc)
18e225f25   Pavel Roskin   net: fix definiti...
239
  #define netdev_for_each_mc_addr(ha, dev) \
22bedad3c   Jiri Pirko   net: convert mult...
240
  	netdev_hw_addr_list_for_each(ha, &(dev)->mc)
6683ece36   Jiri Pirko   net: use helpers ...
241

d94d9fee9   Eric Dumazet   net: cleanup incl...
242
  struct hh_cache {
f6b72b621   David S. Miller   net: Embed hh_cac...
243
  	u16		hh_len;
5c25f686d   David S. Miller   net: Kill support...
244
  	u16		__pad;
3644f0cee   Stephen Hemminger   [NET]: Convert hh...
245
  	seqlock_t	hh_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
247
248
249
  
  	/* cached hardware header; allow for machine alignment needs.        */
  #define HH_DATA_MOD	16
  #define HH_DATA_OFF(__len) \
5ba0eac6e   Jiri Benc   [NET]: Fix HH_DAT...
250
  	(HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
254
255
256
257
258
259
260
261
262
263
264
  #define HH_DATA_ALIGN(__len) \
  	(((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))
  	unsigned long	hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)];
  };
  
  /* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much.
   * Alternative is:
   *   dev->hard_header_len ? (dev->hard_header_len +
   *                           (HH_DATA_MOD - 1)) & ~(HH_DATA_MOD - 1) : 0
   *
   * We could use other alignment values, but we must maintain the
   * relationship HH alignment <= LL alignment.
   */
  #define LL_RESERVED_SPACE(dev) \
f5184d267   Johannes Berg   net: Allow netdev...
265
  	((((dev)->hard_header_len+(dev)->needed_headroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
266
  #define LL_RESERVED_SPACE_EXTRA(dev,extra) \
f5184d267   Johannes Berg   net: Allow netdev...
267
  	((((dev)->hard_header_len+(dev)->needed_headroom+(extra))&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268

3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
269
270
271
272
273
274
  struct header_ops {
  	int	(*create) (struct sk_buff *skb, struct net_device *dev,
  			   unsigned short type, const void *daddr,
  			   const void *saddr, unsigned len);
  	int	(*parse)(const struct sk_buff *skb, unsigned char *haddr);
  	int	(*rebuild)(struct sk_buff *skb);
e69dd336e   David S. Miller   net: Push protoco...
275
  	int	(*cache)(const struct neighbour *neigh, struct hh_cache *hh, __be16 type);
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
276
277
278
279
  	void	(*cache_update)(struct hh_cache *hh,
  				const struct net_device *dev,
  				const unsigned char *haddr);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
282
283
  /* These flag bits are private to the generic network queueing
   * layer, they may not be explicitly referenced by any other
   * code.
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
284
  enum netdev_state_t {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
286
  	__LINK_STATE_START,
  	__LINK_STATE_PRESENT,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
  	__LINK_STATE_NOCARRIER,
b00055aac   Stefan Rompf   [NET] core: add R...
288
289
  	__LINK_STATE_LINKWATCH_PENDING,
  	__LINK_STATE_DORMANT,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
291
292
293
294
  };
  
  
  /*
   * This structure holds at boot time configured netdevice settings. They
fe2918b09   Graf Yang   net: fix some tra...
295
   * are then used in the device probing.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
296
297
298
299
300
301
   */
  struct netdev_boot_setup {
  	char name[IFNAMSIZ];
  	struct ifmap map;
  };
  #define NETDEV_BOOT_SETUP_MAX 8
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
302
  extern int __init netdev_boot_setup(char *str);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
304
  
  /*
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
   * Structure for NAPI scheduling similar to tasklet but with weighting
   */
  struct napi_struct {
  	/* The poll_list must only be managed by the entity which
  	 * changes the state of the NAPI_STATE_SCHED bit.  This means
  	 * whoever atomically sets that bit can add this napi_struct
  	 * to the per-cpu poll_list, and whoever clears that bit
  	 * can remove from the list right before clearing the bit.
  	 */
  	struct list_head	poll_list;
  
  	unsigned long		state;
  	int			weight;
  	int			(*poll)(struct napi_struct *, int);
  #ifdef CONFIG_NETPOLL
  	spinlock_t		poll_lock;
  	int			poll_owner;
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
322
  #endif
4ae5544f9   Herbert Xu   gro: Remember num...
323
324
  
  	unsigned int		gro_count;
5d38a079c   Herbert Xu   gro: Add page fra...
325
  	struct net_device	*dev;
d565b0a1a   Herbert Xu   net: Add Generic ...
326
327
  	struct list_head	dev_list;
  	struct sk_buff		*gro_list;
5d38a079c   Herbert Xu   gro: Add page fra...
328
  	struct sk_buff		*skb;
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
329
  };
d94d9fee9   Eric Dumazet   net: cleanup incl...
330
  enum {
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
331
  	NAPI_STATE_SCHED,	/* Poll is scheduled */
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
332
  	NAPI_STATE_DISABLE,	/* Disable pending */
7b363e440   Neil Horman   netpoll: fix race...
333
  	NAPI_STATE_NPSVC,	/* Netpoll - don't dequeue from poll_list */
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
334
  };
5b252f0c2   Ben Hutchings   gro: Name the GRO...
335
  enum gro_result {
d1c76af9e   Herbert Xu   GRO: Move netpoll...
336
337
338
339
340
341
  	GRO_MERGED,
  	GRO_MERGED_FREE,
  	GRO_HELD,
  	GRO_NORMAL,
  	GRO_DROP,
  };
5b252f0c2   Ben Hutchings   gro: Name the GRO...
342
  typedef enum gro_result gro_result_t;
d1c76af9e   Herbert Xu   GRO: Move netpoll...
343

8a4eb5734   Jiri Pirko   net: introduce rx...
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
  /*
   * enum rx_handler_result - Possible return values for rx_handlers.
   * @RX_HANDLER_CONSUMED: skb was consumed by rx_handler, do not process it
   * further.
   * @RX_HANDLER_ANOTHER: Do another round in receive path. This is indicated in
   * case skb->dev was changed by rx_handler.
   * @RX_HANDLER_EXACT: Force exact delivery, no wildcard.
   * @RX_HANDLER_PASS: Do nothing, passe the skb as if no rx_handler was called.
   *
   * rx_handlers are functions called from inside __netif_receive_skb(), to do
   * special processing of the skb, prior to delivery to protocol handlers.
   *
   * Currently, a net_device can only have a single rx_handler registered. Trying
   * to register a second rx_handler will return -EBUSY.
   *
   * To register a rx_handler on a net_device, use netdev_rx_handler_register().
   * To unregister a rx_handler on a net_device, use
   * netdev_rx_handler_unregister().
   *
   * Upon return, rx_handler is expected to tell __netif_receive_skb() what to
   * do with the skb.
   *
   * If the rx_handler consumed to skb in some way, it should return
   * RX_HANDLER_CONSUMED. This is appropriate when the rx_handler arranged for
   * the skb to be delivered in some other ways.
   *
   * If the rx_handler changed skb->dev, to divert the skb to another
   * net_device, it should return RX_HANDLER_ANOTHER. The rx_handler for the
   * new device will be called if it exists.
   *
   * If the rx_handler consider the skb should be ignored, it should return
   * RX_HANDLER_EXACT. The skb will only be delivered to protocol handlers that
   * are registred on exact device (ptype->dev == skb->dev).
   *
   * If the rx_handler didn't changed skb->dev, but want the skb to be normally
   * delivered, it should return RX_HANDLER_PASS.
   *
   * A device without a registered rx_handler will behave as if rx_handler
   * returned RX_HANDLER_PASS.
   */
  
  enum rx_handler_result {
  	RX_HANDLER_CONSUMED,
  	RX_HANDLER_ANOTHER,
  	RX_HANDLER_EXACT,
  	RX_HANDLER_PASS,
  };
  typedef enum rx_handler_result rx_handler_result_t;
  typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb);
ab95bfe01   Jiri Pirko   net: replace hook...
393

b3c975286   Harvey Harrison   include/linux: Re...
394
  extern void __napi_schedule(struct napi_struct *n);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
395

a0a46196c   David S. Miller   [NET]: Add NAPI_S...
396
397
398
399
  static inline int napi_disable_pending(struct napi_struct *n)
  {
  	return test_bit(NAPI_STATE_DISABLE, &n->state);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
400
401
402
403
404
405
  /**
   *	napi_schedule_prep - check if napi can be scheduled
   *	@n: napi context
   *
   * Test if NAPI routine is already running, and if not mark
   * it as running.  This is used as a condition variable
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
406
407
   * insure only one NAPI poll instance runs.  We also make
   * sure there is no pending NAPI disable.
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
408
409
410
   */
  static inline int napi_schedule_prep(struct napi_struct *n)
  {
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
411
412
  	return !napi_disable_pending(n) &&
  		!test_and_set_bit(NAPI_STATE_SCHED, &n->state);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
413
414
415
416
417
418
419
420
421
422
423
424
425
426
  }
  
  /**
   *	napi_schedule - schedule NAPI poll
   *	@n: napi context
   *
   * Schedule NAPI poll routine to be called if it is not already
   * running.
   */
  static inline void napi_schedule(struct napi_struct *n)
  {
  	if (napi_schedule_prep(n))
  		__napi_schedule(n);
  }
bfe13f54f   Roland Dreier   ibm_emac: Convert...
427
428
429
430
431
432
433
434
435
  /* Try to reschedule poll. Called by dev->poll() after napi_complete().  */
  static inline int napi_reschedule(struct napi_struct *napi)
  {
  	if (napi_schedule_prep(napi)) {
  		__napi_schedule(napi);
  		return 1;
  	}
  	return 0;
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
436
437
438
439
440
441
  /**
   *	napi_complete - NAPI processing complete
   *	@n: napi context
   *
   * Mark NAPI processing as complete.
   */
d565b0a1a   Herbert Xu   net: Add Generic ...
442
443
  extern void __napi_complete(struct napi_struct *n);
  extern void napi_complete(struct napi_struct *n);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
444
445
446
447
448
449
450
451
452
453
  
  /**
   *	napi_disable - prevent NAPI from scheduling
   *	@n: napi context
   *
   * Stop NAPI from being scheduled on this context.
   * Waits till any outstanding processing completes.
   */
  static inline void napi_disable(struct napi_struct *n)
  {
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
454
  	set_bit(NAPI_STATE_DISABLE, &n->state);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
455
  	while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
43cc7380e   Benjamin Herrenschmidt   [NET] napi: use n...
456
  		msleep(1);
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
457
  	clear_bit(NAPI_STATE_DISABLE, &n->state);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
  }
  
  /**
   *	napi_enable - enable NAPI scheduling
   *	@n: napi context
   *
   * Resume NAPI from being scheduled on this context.
   * Must be paired with napi_disable.
   */
  static inline void napi_enable(struct napi_struct *n)
  {
  	BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
  	smp_mb__before_clear_bit();
  	clear_bit(NAPI_STATE_SCHED, &n->state);
  }
c264c3dee   Stephen Hemminger   napi_synchronize:...
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
  #ifdef CONFIG_SMP
  /**
   *	napi_synchronize - wait until NAPI is not running
   *	@n: napi context
   *
   * Wait until NAPI is done being scheduled on this context.
   * Waits till any outstanding processing completes but
   * does not disable future activations.
   */
  static inline void napi_synchronize(const struct napi_struct *n)
  {
  	while (test_bit(NAPI_STATE_SCHED, &n->state))
  		msleep(1);
  }
  #else
  # define napi_synchronize(n)	barrier()
  #endif
d94d9fee9   Eric Dumazet   net: cleanup incl...
490
  enum netdev_queue_state_t {
734664982   Tom Herbert   net: Add queue st...
491
492
  	__QUEUE_STATE_DRV_XOFF,
  	__QUEUE_STATE_STACK_XOFF,
c3f26a269   David S. Miller   netdev: Fix lockd...
493
  	__QUEUE_STATE_FROZEN,
734664982   Tom Herbert   net: Add queue st...
494
495
496
497
  #define QUEUE_STATE_ANY_XOFF ((1 << __QUEUE_STATE_DRV_XOFF)		| \
  			      (1 << __QUEUE_STATE_STACK_XOFF))
  #define QUEUE_STATE_ANY_XOFF_OR_FROZEN (QUEUE_STATE_ANY_XOFF		| \
  					(1 << __QUEUE_STATE_FROZEN))
79d16385c   David S. Miller   netdev: Move atom...
498
  };
734664982   Tom Herbert   net: Add queue st...
499
500
501
502
503
504
505
506
507
  /*
   * __QUEUE_STATE_DRV_XOFF is used by drivers to stop the transmit queue.  The
   * netif_tx_* functions below are used to manipulate this flag.  The
   * __QUEUE_STATE_STACK_XOFF flag is used by the stack to stop the transmit
   * queue independently.  The netif_xmit_*stopped functions below are called
   * to check if the queue has been stopped by the driver or stack (either
   * of the XOFF bits are set in the state).  Drivers should not need to call
   * netif_xmit*stopped functions, they should only be using netif_tx_*.
   */
79d16385c   David S. Miller   netdev: Move atom...
508

bb949fbd1   David S. Miller   netdev: Create ne...
509
  struct netdev_queue {
6a321cb37   Eric Dumazet   net: netif_tx_que...
510
511
512
  /*
   * read mostly part
   */
bb949fbd1   David S. Miller   netdev: Create ne...
513
  	struct net_device	*dev;
b0e1e6462   David S. Miller   netdev: Move rest...
514
515
  	struct Qdisc		*qdisc;
  	struct Qdisc		*qdisc_sleeping;
ccf5ff69f   david decotigny   net: new counter ...
516
  #ifdef CONFIG_SYSFS
1d24eb481   Tom Herbert   xps: Transmit Pac...
517
518
  	struct kobject		kobj;
  #endif
f2cd2d3e9   Eric Dumazet   net sched: use xp...
519
520
521
  #if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
  	int			numa_node;
  #endif
6a321cb37   Eric Dumazet   net: netif_tx_que...
522
523
524
525
526
  /*
   * write mostly part
   */
  	spinlock_t		_xmit_lock ____cacheline_aligned_in_smp;
  	int			xmit_lock_owner;
9d21493b4   Eric Dumazet   net: tx scalabili...
527
528
529
530
  	/*
  	 * please use this field instead of dev->trans_start
  	 */
  	unsigned long		trans_start;
ccf5ff69f   david decotigny   net: new counter ...
531
532
533
534
535
536
  
  	/*
  	 * Number of TX timeouts for this queue
  	 * (/sys/class/net/DEV/Q/trans_timeout)
  	 */
  	unsigned long		trans_timeout;
114cf5802   Tom Herbert   bql: Byte queue l...
537
538
539
540
541
542
  
  	unsigned long		state;
  
  #ifdef CONFIG_BQL
  	struct dql		dql;
  #endif
e8a0464cc   David S. Miller   netdev: Allocate ...
543
  } ____cacheline_aligned_in_smp;
bb949fbd1   David S. Miller   netdev: Create ne...
544

f2cd2d3e9   Eric Dumazet   net sched: use xp...
545
546
547
548
549
  static inline int netdev_queue_numa_node_read(const struct netdev_queue *q)
  {
  #if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
  	return q->numa_node;
  #else
b236da693   Changli Gao   net: use NUMA_NO_...
550
  	return NUMA_NO_NODE;
f2cd2d3e9   Eric Dumazet   net sched: use xp...
551
552
553
554
555
556
557
558
559
  #endif
  }
  
  static inline void netdev_queue_numa_node_write(struct netdev_queue *q, int node)
  {
  #if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
  	q->numa_node = node;
  #endif
  }
df3345457   Eric Dumazet   rps: add CONFIG_RPS
560
  #ifdef CONFIG_RPS
0a9627f26   Tom Herbert   rps: Receive Pack...
561
562
563
564
565
566
567
568
569
  /*
   * This structure holds an RPS map which can be of variable length.  The
   * map is an array of CPUs.
   */
  struct rps_map {
  	unsigned int len;
  	struct rcu_head rcu;
  	u16 cpus[0];
  };
60b778ce5   Eric Dumazet   rfs: better sizin...
570
  #define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + ((_num) * sizeof(u16)))
0a9627f26   Tom Herbert   rps: Receive Pack...
571

fec5e652e   Tom Herbert   rfs: Receive Flow...
572
  /*
c445477d7   Ben Hutchings   net: RPS: Enable ...
573
574
575
   * The rps_dev_flow structure contains the mapping of a flow to a CPU, the
   * tail pointer for that CPU's input queue at the time of last enqueue, and
   * a hardware filter index.
fec5e652e   Tom Herbert   rfs: Receive Flow...
576
577
578
   */
  struct rps_dev_flow {
  	u16 cpu;
c445477d7   Ben Hutchings   net: RPS: Enable ...
579
  	u16 filter;
fec5e652e   Tom Herbert   rfs: Receive Flow...
580
581
  	unsigned int last_qtail;
  };
c445477d7   Ben Hutchings   net: RPS: Enable ...
582
  #define RPS_NO_FILTER 0xffff
fec5e652e   Tom Herbert   rfs: Receive Flow...
583
584
585
586
587
588
589
590
591
592
593
  
  /*
   * The rps_dev_flow_table structure contains a table of flow mappings.
   */
  struct rps_dev_flow_table {
  	unsigned int mask;
  	struct rcu_head rcu;
  	struct work_struct free_work;
  	struct rps_dev_flow flows[0];
  };
  #define RPS_DEV_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_dev_flow_table) + \
60b778ce5   Eric Dumazet   rfs: better sizin...
594
      ((_num) * sizeof(struct rps_dev_flow)))
fec5e652e   Tom Herbert   rfs: Receive Flow...
595
596
597
598
599
600
601
602
603
604
  
  /*
   * The rps_sock_flow_table contains mappings of flows to the last CPU
   * on which they were processed by the application (set in recvmsg).
   */
  struct rps_sock_flow_table {
  	unsigned int mask;
  	u16 ents[0];
  };
  #define	RPS_SOCK_FLOW_TABLE_SIZE(_num) (sizeof(struct rps_sock_flow_table) + \
60b778ce5   Eric Dumazet   rfs: better sizin...
605
      ((_num) * sizeof(u16)))
fec5e652e   Tom Herbert   rfs: Receive Flow...
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
  
  #define RPS_NO_CPU 0xffff
  
  static inline void rps_record_sock_flow(struct rps_sock_flow_table *table,
  					u32 hash)
  {
  	if (table && hash) {
  		unsigned int cpu, index = hash & table->mask;
  
  		/* We only give a hint, preemption can change cpu under us */
  		cpu = raw_smp_processor_id();
  
  		if (table->ents[index] != cpu)
  			table->ents[index] = cpu;
  	}
  }
  
  static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table,
  				       u32 hash)
  {
  	if (table && hash)
  		table->ents[hash & table->mask] = RPS_NO_CPU;
  }
6e3f7faf3   Eric Dumazet   rps: add __rcu an...
629
  extern struct rps_sock_flow_table __rcu *rps_sock_flow_table;
fec5e652e   Tom Herbert   rfs: Receive Flow...
630

c445477d7   Ben Hutchings   net: RPS: Enable ...
631
632
633
634
  #ifdef CONFIG_RFS_ACCEL
  extern bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index,
  				u32 flow_id, u16 filter_id);
  #endif
0a9627f26   Tom Herbert   rps: Receive Pack...
635
636
  /* This structure contains an instance of an RX queue. */
  struct netdev_rx_queue {
6e3f7faf3   Eric Dumazet   rps: add __rcu an...
637
638
639
  	struct rps_map __rcu		*rps_map;
  	struct rps_dev_flow_table __rcu	*rps_flow_table;
  	struct kobject			kobj;
fe8222406   Tom Herbert   net: Simplify RX ...
640
  	struct net_device		*dev;
0a9627f26   Tom Herbert   rps: Receive Pack...
641
  } ____cacheline_aligned_in_smp;
fec5e652e   Tom Herbert   rfs: Receive Flow...
642
  #endif /* CONFIG_RPS */
d314774cf   Stephen Hemminger   netdev: network d...
643

bf2641451   Tom Herbert   xps: Add CONFIG_XPS
644
645
646
647
648
649
650
651
652
653
654
  #ifdef CONFIG_XPS
  /*
   * This structure holds an XPS map which can be of variable length.  The
   * map is an array of queues.
   */
  struct xps_map {
  	unsigned int len;
  	unsigned int alloc_len;
  	struct rcu_head rcu;
  	u16 queues[0];
  };
60b778ce5   Eric Dumazet   rfs: better sizin...
655
  #define XPS_MAP_SIZE(_num) (sizeof(struct xps_map) + ((_num) * sizeof(u16)))
bf2641451   Tom Herbert   xps: Add CONFIG_XPS
656
657
658
659
660
661
662
663
  #define XPS_MIN_MAP_ALLOC ((L1_CACHE_BYTES - sizeof(struct xps_map))	\
      / sizeof(u16))
  
  /*
   * This structure holds all XPS maps for device.  Maps are indexed by CPU.
   */
  struct xps_dev_maps {
  	struct rcu_head rcu;
a41778694   Eric Dumazet   xps: add __rcu an...
664
  	struct xps_map __rcu *cpu_map[0];
bf2641451   Tom Herbert   xps: Add CONFIG_XPS
665
666
667
668
  };
  #define XPS_DEV_MAPS_SIZE (sizeof(struct xps_dev_maps) +		\
      (nr_cpu_ids * sizeof(struct xps_map *)))
  #endif /* CONFIG_XPS */
4f57c087d   John Fastabend   net: implement me...
669
670
671
672
673
674
675
  #define TC_MAX_QUEUE	16
  #define TC_BITMASK	15
  /* HW offloaded queuing disciplines txq count and offset maps */
  struct netdev_tc_txq {
  	u16 count;
  	u16 offset;
  };
68bad94ed   Neerav Parikh   netdev: FCoE: Add...
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
  #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
  /*
   * This structure is to hold information about the device
   * configured to run FCoE protocol stack.
   */
  struct netdev_fcoe_hbainfo {
  	char	manufacturer[64];
  	char	serial_number[64];
  	char	hardware_version[64];
  	char	driver_version[64];
  	char	optionrom_version[64];
  	char	firmware_version[64];
  	char	model[256];
  	char	model_description[256];
  };
  #endif
d314774cf   Stephen Hemminger   netdev: network d...
692
693
  /*
   * This structure defines the management hooks for network devices.
008298231   Stephen Hemminger   netdev: add more ...
694
695
   * The following hooks can be defined; unless noted otherwise, they are
   * optional and can be filled with a null pointer.
d314774cf   Stephen Hemminger   netdev: network d...
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
   *
   * int (*ndo_init)(struct net_device *dev);
   *     This function is called once when network device is registered.
   *     The network device can use this to any late stage initializaton
   *     or semantic validattion. It can fail with an error code which will
   *     be propogated back to register_netdev
   *
   * void (*ndo_uninit)(struct net_device *dev);
   *     This function is called when device is unregistered or when registration
   *     fails. It is not called if init fails.
   *
   * int (*ndo_open)(struct net_device *dev);
   *     This function is called when network device transistions to the up
   *     state.
   *
   * int (*ndo_stop)(struct net_device *dev);
   *     This function is called when network device transistions to the down
   *     state.
   *
dc1f8bf68   Stephen Hemminger   netdev: change tr...
715
716
   * netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb,
   *                               struct net_device *dev);
008298231   Stephen Hemminger   netdev: add more ...
717
   *	Called when a packet needs to be transmitted.
dc1f8bf68   Stephen Hemminger   netdev: change tr...
718
719
   *	Must return NETDEV_TX_OK , NETDEV_TX_BUSY.
   *        (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX)
008298231   Stephen Hemminger   netdev: add more ...
720
721
722
723
724
725
   *	Required can not be NULL.
   *
   * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb);
   *	Called to decide which queue to when device supports multiple
   *	transmit queues.
   *
d314774cf   Stephen Hemminger   netdev: network d...
726
727
728
729
730
731
   * void (*ndo_change_rx_flags)(struct net_device *dev, int flags);
   *	This function is called to allow device receiver to make
   *	changes to configuration when multicast or promiscious is enabled.
   *
   * void (*ndo_set_rx_mode)(struct net_device *dev);
   *	This function is called device changes address list filtering.
01789349e   Jiri Pirko   net: introduce IF...
732
733
   *	If driver handles unicast address filtering, it should set
   *	IFF_UNICAST_FLT to its priv_flags.
d314774cf   Stephen Hemminger   netdev: network d...
734
735
736
   *
   * int (*ndo_set_mac_address)(struct net_device *dev, void *addr);
   *	This function  is called when the Media Access Control address
37b607c5a   Mike Rapoport   net: Fix typo in ...
737
   *	needs to be changed. If this interface is not defined, the
d314774cf   Stephen Hemminger   netdev: network d...
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
   *	mac address can not be changed.
   *
   * int (*ndo_validate_addr)(struct net_device *dev);
   *	Test if Media Access Control address is valid for the device.
   *
   * int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
   *	Called when a user request an ioctl which can't be handled by
   *	the generic interface code. If not defined ioctl's return
   *	not supported error code.
   *
   * int (*ndo_set_config)(struct net_device *dev, struct ifmap *map);
   *	Used to set network devices bus interface parameters. This interface
   *	is retained for legacy reason, new devices should use the bus
   *	interface (PCI) for low level management.
   *
   * int (*ndo_change_mtu)(struct net_device *dev, int new_mtu);
   *	Called when a user wants to change the Maximum Transfer Unit
   *	of a device. If not defined, any request to change MTU will
   *	will return an error.
   *
008298231   Stephen Hemminger   netdev: add more ...
758
   * void (*ndo_tx_timeout)(struct net_device *dev);
d314774cf   Stephen Hemminger   netdev: network d...
759
760
761
   *	Callback uses when the transmitter has not made any progress
   *	for dev->watchdog ticks.
   *
3cfde79c6   Ben Hutchings   net: Get rid of r...
762
   * struct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev,
28172739f   Eric Dumazet   net: fix 64 bit c...
763
   *                      struct rtnl_link_stats64 *storage);
d308e38fa   Wolfram Sang   include/linux/net...
764
   * struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
d314774cf   Stephen Hemminger   netdev: network d...
765
   *	Called when a user wants to get the network device usage
be1f3c2c0   Ben Hutchings   net: Enable 64-bi...
766
   *	statistics. Drivers must do one of the following:
3cfde79c6   Ben Hutchings   net: Get rid of r...
767
768
   *	1. Define @ndo_get_stats64 to fill in a zero-initialised
   *	   rtnl_link_stats64 structure passed by the caller.
82695d9b1   Ben Hutchings   net: Fix error in...
769
   *	2. Define @ndo_get_stats to update a net_device_stats structure
be1f3c2c0   Ben Hutchings   net: Enable 64-bi...
770
771
772
773
774
   *	   (which should normally be dev->stats) and return a pointer to
   *	   it. The structure may be changed asynchronously only if each
   *	   field is written atomically.
   *	3. Update dev->stats asynchronously and atomically, and define
   *	   neither operation.
d314774cf   Stephen Hemminger   netdev: network d...
775
   *
8e586137e   Jiri Pirko   net: make vlan nd...
776
   * int (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid);
d314774cf   Stephen Hemminger   netdev: network d...
777
778
779
   *	If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
   *	this function is called when a VLAN id is registered.
   *
8e586137e   Jiri Pirko   net: make vlan nd...
780
   * int (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid);
d314774cf   Stephen Hemminger   netdev: network d...
781
782
783
784
   *	If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
   *	this function is called when a VLAN id is unregistered.
   *
   * void (*ndo_poll_controller)(struct net_device *dev);
95c26df82   Williams, Mitch A   net: Add netdev o...
785
786
787
788
789
   *
   *	SR-IOV management functions.
   * int (*ndo_set_vf_mac)(struct net_device *dev, int vf, u8* mac);
   * int (*ndo_set_vf_vlan)(struct net_device *dev, int vf, u16 vlan, u8 qos);
   * int (*ndo_set_vf_tx_rate)(struct net_device *dev, int vf, int rate);
5f8444a3f   Greg Rose   if_link: Add addi...
790
   * int (*ndo_set_vf_spoofchk)(struct net_device *dev, int vf, bool setting);
95c26df82   Williams, Mitch A   net: Add netdev o...
791
792
   * int (*ndo_get_vf_config)(struct net_device *dev,
   *			    int vf, struct ifla_vf_info *ivf);
57b610805   Scott Feldman   net: Add netlink ...
793
794
795
   * int (*ndo_set_vf_port)(struct net_device *dev, int vf,
   *			  struct nlattr *port[]);
   * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb);
4f57c087d   John Fastabend   net: implement me...
796
797
798
799
800
   * int (*ndo_setup_tc)(struct net_device *dev, u8 tc)
   * 	Called to setup 'tc' number of traffic classes in the net device. This
   * 	is always called from the stack with the rtnl lock held and netif tx
   * 	queues stopped. This allows the netdevice to perform queue management
   * 	safely.
c445477d7   Ben Hutchings   net: RPS: Enable ...
801
   *
e9bce845c   Yi Zou   net: add proper d...
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
   *	Fiber Channel over Ethernet (FCoE) offload functions.
   * int (*ndo_fcoe_enable)(struct net_device *dev);
   *	Called when the FCoE protocol stack wants to start using LLD for FCoE
   *	so the underlying device can perform whatever needed configuration or
   *	initialization to support acceleration of FCoE traffic.
   *
   * int (*ndo_fcoe_disable)(struct net_device *dev);
   *	Called when the FCoE protocol stack wants to stop using LLD for FCoE
   *	so the underlying device can perform whatever needed clean-ups to
   *	stop supporting acceleration of FCoE traffic.
   *
   * int (*ndo_fcoe_ddp_setup)(struct net_device *dev, u16 xid,
   *			     struct scatterlist *sgl, unsigned int sgc);
   *	Called when the FCoE Initiator wants to initialize an I/O that
   *	is a possible candidate for Direct Data Placement (DDP). The LLD can
   *	perform necessary setup and returns 1 to indicate the device is set up
   *	successfully to perform DDP on this I/O, otherwise this returns 0.
   *
   * int (*ndo_fcoe_ddp_done)(struct net_device *dev,  u16 xid);
   *	Called when the FCoE Initiator/Target is done with the DDPed I/O as
   *	indicated by the FC exchange id 'xid', so the underlying device can
   *	clean up and reuse resources for later DDP requests.
   *
   * int (*ndo_fcoe_ddp_target)(struct net_device *dev, u16 xid,
   *			      struct scatterlist *sgl, unsigned int sgc);
   *	Called when the FCoE Target wants to initialize an I/O that
   *	is a possible candidate for Direct Data Placement (DDP). The LLD can
   *	perform necessary setup and returns 1 to indicate the device is set up
   *	successfully to perform DDP on this I/O, otherwise this returns 0.
   *
68bad94ed   Neerav Parikh   netdev: FCoE: Add...
832
833
834
835
836
837
838
   * int (*ndo_fcoe_get_hbainfo)(struct net_device *dev,
   *			       struct netdev_fcoe_hbainfo *hbainfo);
   *	Called when the FCoE Protocol stack wants information on the underlying
   *	device. This information is utilized by the FCoE protocol stack to
   *	register attributes with Fiber Channel management service as per the
   *	FC-GS Fabric Device Management Information(FDMI) specification.
   *
e9bce845c   Yi Zou   net: add proper d...
839
840
841
842
843
844
   * int (*ndo_fcoe_get_wwn)(struct net_device *dev, u64 *wwn, int type);
   *	Called when the underlying device wants to override default World Wide
   *	Name (WWN) generation mechanism in FCoE protocol stack to pass its own
   *	World Wide Port Name (WWPN) or World Wide Node Name (WWNN) to the FCoE
   *	protocol stack to use.
   *
c445477d7   Ben Hutchings   net: RPS: Enable ...
845
846
847
848
849
850
   *	RFS acceleration.
   * int (*ndo_rx_flow_steer)(struct net_device *dev, const struct sk_buff *skb,
   *			    u16 rxq_index, u32 flow_id);
   *	Set hardware filter for RFS.  rxq_index is the target queue index;
   *	flow_id is a flow ID to be passed to rps_may_expire_flow() later.
   *	Return the filter ID on success, or a negative error code.
fbaec0ea5   Jiri Pirko   rtnetlink: implem...
851
852
853
854
855
856
857
858
   *
   *	Slave management functions (for bridge, bonding, etc). User should
   *	call netdev_set_master() to set dev->master properly.
   * int (*ndo_add_slave)(struct net_device *dev, struct net_device *slave_dev);
   *	Called to make another netdev an underling.
   *
   * int (*ndo_del_slave)(struct net_device *dev, struct net_device *slave_dev);
   *	Called to release previously enslaved netdev.
5455c6998   Michał Mirosław   net: Introduce ne...
859
860
   *
   *      Feature/offload setting functions.
c8f44affb   Michał Mirosław   net: introduce an...
861
862
   * netdev_features_t (*ndo_fix_features)(struct net_device *dev,
   *		netdev_features_t features);
5455c6998   Michał Mirosław   net: Introduce ne...
863
864
865
866
   *	Adjusts the requested feature flags according to device-specific
   *	constraints, and returns the resulting flags. Must not modify
   *	the device state.
   *
c8f44affb   Michał Mirosław   net: introduce an...
867
   * int (*ndo_set_features)(struct net_device *dev, netdev_features_t features);
5455c6998   Michał Mirosław   net: Introduce ne...
868
869
870
871
   *	Called to update device configuration to new features. Passed
   *	feature set might be less than what was returned by ndo_fix_features()).
   *	Must return >0 or -errno if it changed dev->features itself.
   *
d314774cf   Stephen Hemminger   netdev: network d...
872
873
874
875
876
877
   */
  struct net_device_ops {
  	int			(*ndo_init)(struct net_device *dev);
  	void			(*ndo_uninit)(struct net_device *dev);
  	int			(*ndo_open)(struct net_device *dev);
  	int			(*ndo_stop)(struct net_device *dev);
dc1f8bf68   Stephen Hemminger   netdev: change tr...
878
  	netdev_tx_t		(*ndo_start_xmit) (struct sk_buff *skb,
008298231   Stephen Hemminger   netdev: add more ...
879
880
881
  						   struct net_device *dev);
  	u16			(*ndo_select_queue)(struct net_device *dev,
  						    struct sk_buff *skb);
d314774cf   Stephen Hemminger   netdev: network d...
882
883
  	void			(*ndo_change_rx_flags)(struct net_device *dev,
  						       int flags);
d314774cf   Stephen Hemminger   netdev: network d...
884
  	void			(*ndo_set_rx_mode)(struct net_device *dev);
d314774cf   Stephen Hemminger   netdev: network d...
885
886
  	int			(*ndo_set_mac_address)(struct net_device *dev,
  						       void *addr);
d314774cf   Stephen Hemminger   netdev: network d...
887
  	int			(*ndo_validate_addr)(struct net_device *dev);
d314774cf   Stephen Hemminger   netdev: network d...
888
889
  	int			(*ndo_do_ioctl)(struct net_device *dev,
  					        struct ifreq *ifr, int cmd);
d314774cf   Stephen Hemminger   netdev: network d...
890
891
  	int			(*ndo_set_config)(struct net_device *dev,
  					          struct ifmap *map);
008298231   Stephen Hemminger   netdev: add more ...
892
893
894
895
  	int			(*ndo_change_mtu)(struct net_device *dev,
  						  int new_mtu);
  	int			(*ndo_neigh_setup)(struct net_device *dev,
  						   struct neigh_parms *);
d314774cf   Stephen Hemminger   netdev: network d...
896
  	void			(*ndo_tx_timeout) (struct net_device *dev);
28172739f   Eric Dumazet   net: fix 64 bit c...
897
898
  	struct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev,
  						     struct rtnl_link_stats64 *storage);
d314774cf   Stephen Hemminger   netdev: network d...
899
  	struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
8e586137e   Jiri Pirko   net: make vlan nd...
900
  	int			(*ndo_vlan_rx_add_vid)(struct net_device *dev,
d314774cf   Stephen Hemminger   netdev: network d...
901
  						       unsigned short vid);
8e586137e   Jiri Pirko   net: make vlan nd...
902
  	int			(*ndo_vlan_rx_kill_vid)(struct net_device *dev,
d314774cf   Stephen Hemminger   netdev: network d...
903
904
  						        unsigned short vid);
  #ifdef CONFIG_NET_POLL_CONTROLLER
d314774cf   Stephen Hemminger   netdev: network d...
905
  	void                    (*ndo_poll_controller)(struct net_device *dev);
4247e161b   Herbert Xu   netpoll: Add ndo_...
906
907
  	int			(*ndo_netpoll_setup)(struct net_device *dev,
  						     struct netpoll_info *info);
0e34e9317   WANG Cong   netpoll: add gene...
908
  	void			(*ndo_netpoll_cleanup)(struct net_device *dev);
d314774cf   Stephen Hemminger   netdev: network d...
909
  #endif
95c26df82   Williams, Mitch A   net: Add netdev o...
910
911
912
913
914
915
  	int			(*ndo_set_vf_mac)(struct net_device *dev,
  						  int queue, u8 *mac);
  	int			(*ndo_set_vf_vlan)(struct net_device *dev,
  						   int queue, u16 vlan, u8 qos);
  	int			(*ndo_set_vf_tx_rate)(struct net_device *dev,
  						      int vf, int rate);
5f8444a3f   Greg Rose   if_link: Add addi...
916
917
  	int			(*ndo_set_vf_spoofchk)(struct net_device *dev,
  						       int vf, bool setting);
95c26df82   Williams, Mitch A   net: Add netdev o...
918
919
920
  	int			(*ndo_get_vf_config)(struct net_device *dev,
  						     int vf,
  						     struct ifla_vf_info *ivf);
57b610805   Scott Feldman   net: Add netlink ...
921
922
923
924
925
  	int			(*ndo_set_vf_port)(struct net_device *dev,
  						   int vf,
  						   struct nlattr *port[]);
  	int			(*ndo_get_vf_port)(struct net_device *dev,
  						   int vf, struct sk_buff *skb);
4f57c087d   John Fastabend   net: implement me...
926
  	int			(*ndo_setup_tc)(struct net_device *dev, u8 tc);
d11ead756   Ben Hutchings   net: Use IS_ENABL...
927
  #if IS_ENABLED(CONFIG_FCOE)
cb4543997   Yi Zou   net: Add ndo_fcoe...
928
929
  	int			(*ndo_fcoe_enable)(struct net_device *dev);
  	int			(*ndo_fcoe_disable)(struct net_device *dev);
4d288d576   Yi Zou   [SCSI] net: add F...
930
931
932
933
934
935
  	int			(*ndo_fcoe_ddp_setup)(struct net_device *dev,
  						      u16 xid,
  						      struct scatterlist *sgl,
  						      unsigned int sgc);
  	int			(*ndo_fcoe_ddp_done)(struct net_device *dev,
  						     u16 xid);
6247e0861   Yi Zou   net: add ndo_fcoe...
936
937
938
939
  	int			(*ndo_fcoe_ddp_target)(struct net_device *dev,
  						       u16 xid,
  						       struct scatterlist *sgl,
  						       unsigned int sgc);
68bad94ed   Neerav Parikh   netdev: FCoE: Add...
940
941
  	int			(*ndo_fcoe_get_hbainfo)(struct net_device *dev,
  							struct netdev_fcoe_hbainfo *hbainfo);
3c9c36bce   Bhanu Prakash Gollapudi   net: Define NETDE...
942
  #endif
d11ead756   Ben Hutchings   net: Use IS_ENABL...
943
  #if IS_ENABLED(CONFIG_LIBFCOE)
df5c79452   Yi Zou   net: Add ndo_fcoe...
944
945
946
947
  #define NETDEV_FCOE_WWNN 0
  #define NETDEV_FCOE_WWPN 1
  	int			(*ndo_fcoe_get_wwn)(struct net_device *dev,
  						    u64 *wwn, int type);
4d288d576   Yi Zou   [SCSI] net: add F...
948
  #endif
3c9c36bce   Bhanu Prakash Gollapudi   net: Define NETDE...
949

c445477d7   Ben Hutchings   net: RPS: Enable ...
950
951
952
953
954
955
  #ifdef CONFIG_RFS_ACCEL
  	int			(*ndo_rx_flow_steer)(struct net_device *dev,
  						     const struct sk_buff *skb,
  						     u16 rxq_index,
  						     u32 flow_id);
  #endif
fbaec0ea5   Jiri Pirko   rtnetlink: implem...
956
957
958
959
  	int			(*ndo_add_slave)(struct net_device *dev,
  						 struct net_device *slave_dev);
  	int			(*ndo_del_slave)(struct net_device *dev,
  						 struct net_device *slave_dev);
c8f44affb   Michał Mirosław   net: introduce an...
960
961
  	netdev_features_t	(*ndo_fix_features)(struct net_device *dev,
  						    netdev_features_t features);
5455c6998   Michał Mirosław   net: Introduce ne...
962
  	int			(*ndo_set_features)(struct net_device *dev,
c8f44affb   Michał Mirosław   net: introduce an...
963
  						    netdev_features_t features);
da6a8fa02   David Miller   neigh: Add device...
964
  	int			(*ndo_neigh_construct)(struct neighbour *n);
447f21919   David S. Miller   Revert "net: Remo...
965
  	void			(*ndo_neigh_destroy)(struct neighbour *n);
d314774cf   Stephen Hemminger   netdev: network d...
966
  };
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
967
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
969
970
971
972
973
974
975
   *	The DEVICE structure.
   *	Actually, this whole structure is a big mistake.  It mixes I/O
   *	data with strictly "high-level" data, and it has to know about
   *	almost every data structure used in the INET module.
   *
   *	FIXME: cleanup struct net_device such that network protocol info
   *	moves out.
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
976
  struct net_device {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
977
978
979
980
  
  	/*
  	 * This is the first field of the "visible" part of this structure
  	 * (i.e. as seen by users in the "Space.c" file).  It is the name
724df6159   Justin P. Mattock   fix comment typo ...
981
  	 * of the interface.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
982
983
  	 */
  	char			name[IFNAMSIZ];
ed77134bf   Mark Gross   PM QOS update
984

cc7499861   Jean Pihet   PM QoS: Minor cle...
985
  	struct pm_qos_request	pm_qos_req;
ed77134bf   Mark Gross   PM QOS update
986

9356b8fc0   Eric Dumazet   [NET]: Reorder so...
987
988
  	/* device name hash chain */
  	struct hlist_node	name_hlist;
0b815a1a6   Stephen Hemminger   net: network devi...
989
990
  	/* snmp alias */
  	char 			*ifalias;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
  
  	/*
  	 *	I/O specific fields
  	 *	FIXME: Merge these and struct ifmap into one
  	 */
  	unsigned long		mem_end;	/* shared mem end	*/
  	unsigned long		mem_start;	/* shared mem start	*/
  	unsigned long		base_addr;	/* device I/O address	*/
  	unsigned int		irq;		/* device IRQ number	*/
  
  	/*
  	 *	Some hardware also needs these fields, but they are not
  	 *	part of the usual set specified in Space.c.
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1005
  	unsigned long		state;
7562f876c   Pavel Emelianov   [NET]: Rework dev...
1006
  	struct list_head	dev_list;
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1007
  	struct list_head	napi_list;
44a0873d5   Eric Dumazet   net: Introduce un...
1008
  	struct list_head	unreg_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009

5455c6998   Michał Mirosław   net: Introduce ne...
1010
  	/* currently active device features */
c8f44affb   Michał Mirosław   net: introduce an...
1011
  	netdev_features_t	features;
5455c6998   Michał Mirosław   net: Introduce ne...
1012
  	/* user-changeable features */
c8f44affb   Michał Mirosław   net: introduce an...
1013
  	netdev_features_t	hw_features;
5455c6998   Michał Mirosław   net: Introduce ne...
1014
  	/* user-requested features */
c8f44affb   Michał Mirosław   net: introduce an...
1015
  	netdev_features_t	wanted_features;
1aac62671   Michał Mirosław   net: vlan_feature...
1016
  	/* mask of features inheritable by VLAN devices */
c8f44affb   Michał Mirosław   net: introduce an...
1017
  	netdev_features_t	vlan_features;
04ed3e741   Michał Mirosław   net: change netde...
1018

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1019
1020
1021
  	/* Interface index. Unique device identifier	*/
  	int			ifindex;
  	int			iflink;
c45d286e7   Rusty Russell   [NET]: Inline net...
1022
  	struct net_device_stats	stats;
caf586e5f   Eric Dumazet   net: add a core n...
1023
1024
1025
  	atomic_long_t		rx_dropped; /* dropped packets by core network
  					     * Do not use this in drivers.
  					     */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026

b86e0280b   Johannes Berg   [WEXT] net_device...
1027
  #ifdef CONFIG_WIRELESS_EXT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1028
1029
1030
1031
1032
  	/* List of functions to handle Wireless Extensions (instead of ioctl).
  	 * See <net/iw_handler.h> for details. Jean II */
  	const struct iw_handler_def *	wireless_handlers;
  	/* Instance data managed by the core of Wireless Extensions. */
  	struct iw_public_data *	wireless_data;
b86e0280b   Johannes Berg   [WEXT] net_device...
1033
  #endif
d314774cf   Stephen Hemminger   netdev: network d...
1034
1035
  	/* Management operations */
  	const struct net_device_ops *netdev_ops;
76fd85937   Stephen Hemminger   [PATCH] ethtool: ...
1036
  	const struct ethtool_ops *ethtool_ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1037

3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
1038
1039
  	/* Hardware header description */
  	const struct header_ops *header_ops;
b00055aac   Stefan Rompf   [NET] core: add R...
1040
  	unsigned int		flags;	/* interface flags (a la BSD)	*/
bdc220da3   Joe Perches   netdevice.h: Alig...
1041
  	unsigned int		priv_flags; /* Like 'flags' but invisible to userspace. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1042
  	unsigned short		gflags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1043
  	unsigned short		padded;	/* How much padding added by alloc_netdev() */
b00055aac   Stefan Rompf   [NET] core: add R...
1044
1045
  	unsigned char		operstate; /* RFC2863 operstate */
  	unsigned char		link_mode; /* mapping policy to operstate */
bdc220da3   Joe Perches   netdevice.h: Alig...
1046
1047
  	unsigned char		if_port;	/* Selectable AUI, TP,..*/
  	unsigned char		dma;		/* DMA channel		*/
cd7b5396e   David S. Miller   net: Use explicit...
1048
  	unsigned int		mtu;	/* interface MTU value		*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1049
1050
  	unsigned short		type;	/* interface hardware type	*/
  	unsigned short		hard_header_len;	/* hardware hdr length	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1051

f5184d267   Johannes Berg   net: Allow netdev...
1052
1053
1054
1055
1056
1057
  	/* extra head- and tailroom the hardware may need, but not in all cases
  	 * can this be guaranteed, especially tailroom. Some cases also use
  	 * LL_MAX_HEADER instead to allocate the skb.
  	 */
  	unsigned short		needed_headroom;
  	unsigned short		needed_tailroom;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1058
  	/* Interface address info. */
a6f9a7057   Jon Wetzel   [NET]: Add suppor...
1059
  	unsigned char		perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
c1f79426e   Stefan Assmann   sysfs: add attrib...
1060
  	unsigned char		addr_assign_type; /* hw address assignment type */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1061
  	unsigned char		addr_len;	/* hardware address length	*/
596b9b68e   David Miller   neigh: Add infras...
1062
  	unsigned char		neigh_priv_len;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1063
  	unsigned short          dev_id;		/* for shared network cards */
ccffad25b   Jiri Pirko   net: convert unic...
1064
  	spinlock_t		addr_list_lock;
22bedad3c   Jiri Pirko   net: convert mult...
1065
1066
  	struct netdev_hw_addr_list	uc;	/* Unicast mac addresses */
  	struct netdev_hw_addr_list	mc;	/* Multicast mac addresses */
2d348d1f5   Joe Perches   net: Convert stru...
1067
  	bool			uc_promisc;
9d45abe1c   Wang Chen   netdevice: change...
1068
1069
  	unsigned int		promiscuity;
  	unsigned int		allmulti;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1070

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1071
1072
  
  	/* Protocol specific pointers */
65ac6a5fa   Jesse Gross   vlan: Avoid hash ...
1073

d11ead756   Ben Hutchings   net: Use IS_ENABL...
1074
  #if IS_ENABLED(CONFIG_VLAN_8021Q)
5b9ea6e02   Jiri Pirko   vlan: introduce v...
1075
  	struct vlan_info __rcu	*vlan_info;	/* VLAN info */
65ac6a5fa   Jesse Gross   vlan: Avoid hash ...
1076
  #endif
34a430d7b   Ben Hutchings   dsa: Allow core a...
1077
  #if IS_ENABLED(CONFIG_NET_DSA)
cf50dcc24   Ben Hutchings   dsa: Change dsa_u...
1078
  	struct dsa_switch_tree	*dsa_ptr;	/* dsa specific data */
91da11f87   Lennert Buytenhek   net: Distributed ...
1079
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1080
  	void 			*atalk_ptr;	/* AppleTalk link 	*/
95ae6b228   Eric Dumazet   ipv4: ip_ptr clea...
1081
  	struct in_device __rcu	*ip_ptr;	/* IPv4 specific data	*/
fc766e4c4   Eric Dumazet   decnet: RCU conve...
1082
  	struct dn_dev __rcu     *dn_ptr;        /* DECnet specific data */
198caeca3   Eric Dumazet   ipv6: ip6_ptr rcu...
1083
  	struct inet6_dev __rcu	*ip6_ptr;       /* IPv6 specific data */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1084
1085
  	void			*ec_ptr;	/* Econet specific data	*/
  	void			*ax25_ptr;	/* AX.25 specific data */
704232c27   Johannes Berg   [WIRELESS] cfg802...
1086
1087
  	struct wireless_dev	*ieee80211_ptr;	/* IEEE 802.11 specific data,
  						   assign before registering */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1088

9356b8fc0   Eric Dumazet   [NET]: Reorder so...
1089
  /*
cd13539b8   Eric Dumazet   net: shrinks stru...
1090
   * Cache lines mostly used on receive path (including eth_type_trans())
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
1091
   */
4dc89133f   Eric Dumazet   net: add a commen...
1092
1093
1094
1095
1096
1097
1098
  	unsigned long		last_rx;	/* Time of last Rx
  						 * This should not be set in
  						 * drivers, unless really needed,
  						 * because network stack (bonding)
  						 * use it if/when necessary, to
  						 * avoid dirtying this cache line.
  						 */
cd13539b8   Eric Dumazet   net: shrinks stru...
1099
1100
1101
  	struct net_device	*master; /* Pointer to master device of a group,
  					  * which this device is member of.
  					  */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
1102
  	/* Interface address info used in eth_type_trans() */
f001fde5e   Jiri Pirko   net: introduce a ...
1103
1104
1105
  	unsigned char		*dev_addr;	/* hw address, (before bcast
  						   because most packets are
  						   unicast) */
31278e714   Jiri Pirko   net: group addres...
1106
1107
  	struct netdev_hw_addr_list	dev_addrs; /* list of device
  						      hw addresses */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
1108
1109
  
  	unsigned char		broadcast[MAX_ADDR_LEN];	/* hw bcast add	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1110

ccf5ff69f   david decotigny   net: new counter ...
1111
  #ifdef CONFIG_SYSFS
0a9627f26   Tom Herbert   rps: Receive Pack...
1112
  	struct kset		*queues_kset;
ccf5ff69f   david decotigny   net: new counter ...
1113
  #endif
0a9627f26   Tom Herbert   rps: Receive Pack...
1114

ccf5ff69f   david decotigny   net: new counter ...
1115
  #ifdef CONFIG_RPS
0a9627f26   Tom Herbert   rps: Receive Pack...
1116
  	struct netdev_rx_queue	*_rx;
62fe0b40a   Ben Hutchings   net: Allow changi...
1117
  	/* Number of RX queues allocated at register_netdev() time */
0a9627f26   Tom Herbert   rps: Receive Pack...
1118
  	unsigned int		num_rx_queues;
62fe0b40a   Ben Hutchings   net: Allow changi...
1119
1120
1121
  
  	/* Number of RX queues currently active in device */
  	unsigned int		real_num_rx_queues;
c445477d7   Ben Hutchings   net: RPS: Enable ...
1122
1123
1124
1125
1126
1127
1128
  
  #ifdef CONFIG_RFS_ACCEL
  	/* CPU reverse-mapping for RX completion interrupts, indexed
  	 * by RX queue number.  Assigned by driver.  This must only be
  	 * set if the ndo_rx_flow_steer operation is defined. */
  	struct cpu_rmap		*rx_cpu_rmap;
  #endif
df3345457   Eric Dumazet   rps: add CONFIG_RPS
1129
  #endif
0a9627f26   Tom Herbert   rps: Receive Pack...
1130

61391cde9   stephen hemminger   netdev: add rcu a...
1131
1132
  	rx_handler_func_t __rcu	*rx_handler;
  	void __rcu		*rx_handler_data;
e8a0464cc   David S. Miller   netdev: Allocate ...
1133

24824a09e   Eric Dumazet   net: dynamic ingr...
1134
  	struct netdev_queue __rcu *ingress_queue;
cd13539b8   Eric Dumazet   net: shrinks stru...
1135
1136
1137
1138
  
  /*
   * Cache lines mostly used on transmit path
   */
e8a0464cc   David S. Miller   netdev: Allocate ...
1139
  	struct netdev_queue	*_tx ____cacheline_aligned_in_smp;
fd2ea0a79   David S. Miller   net: Use queue aw...
1140
1141
  
  	/* Number of TX queues allocated at alloc_netdev_mq() time  */
e8a0464cc   David S. Miller   netdev: Allocate ...
1142
  	unsigned int		num_tx_queues;
fd2ea0a79   David S. Miller   net: Use queue aw...
1143
1144
1145
  
  	/* Number of TX queues currently active in device  */
  	unsigned int		real_num_tx_queues;
af356afa0   Patrick McHardy   net_sched: reintr...
1146
1147
  	/* root qdisc from userspace point of view */
  	struct Qdisc		*qdisc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1148
  	unsigned long		tx_queue_len;	/* Max frames per queue allowed */
c3f26a269   David S. Miller   netdev: Fix lockd...
1149
  	spinlock_t		tx_global_lock;
cd13539b8   Eric Dumazet   net: shrinks stru...
1150

bf2641451   Tom Herbert   xps: Add CONFIG_XPS
1151
  #ifdef CONFIG_XPS
a41778694   Eric Dumazet   xps: add __rcu an...
1152
  	struct xps_dev_maps __rcu *xps_maps;
bf2641451   Tom Herbert   xps: Add CONFIG_XPS
1153
  #endif
1d24eb481   Tom Herbert   xps: Transmit Pac...
1154

9356b8fc0   Eric Dumazet   [NET]: Reorder so...
1155
  	/* These may be needed for future network-power-down code. */
9d21493b4   Eric Dumazet   net: tx scalabili...
1156
1157
1158
1159
1160
  
  	/*
  	 * trans_start here is expensive for high speed devices on SMP,
  	 * please use netdev_queue->trans_start instead.
  	 */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
1161
1162
1163
1164
  	unsigned long		trans_start;	/* Time (in jiffies) of last Tx	*/
  
  	int			watchdog_timeo; /* used by dev_watchdog() */
  	struct timer_list	watchdog_timer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1165
  	/* Number of references to this device */
29b4433d9   Eric Dumazet   net: percpu net_d...
1166
  	int __percpu		*pcpu_refcnt;
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
1167

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1168
1169
  	/* delayed register/unregister */
  	struct list_head	todo_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1170
1171
  	/* device index hash chain */
  	struct hlist_node	index_hlist;
e014debec   Eric Dumazet   linkwatch: linkwa...
1172
  	struct list_head	link_watch_list;
572a103de   Herbert Xu   [NET] link_watch:...
1173

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1174
1175
  	/* register/unregister state machine */
  	enum { NETREG_UNINITIALIZED=0,
b17a7c179   Stephen Hemminger   [NET]: Do sysfs r...
1176
  	       NETREG_REGISTERED,	/* completed register_netdevice */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1177
1178
1179
  	       NETREG_UNREGISTERING,	/* called unregister_netdevice */
  	       NETREG_UNREGISTERED,	/* completed unregister todo */
  	       NETREG_RELEASED,		/* called free_netdev */
937f1ba56   Benjamin Herrenschmidt   net: Add init_dum...
1180
  	       NETREG_DUMMY,		/* dummy device for NAPI poll */
449f45442   Eric Dumazet   macvlan: remove o...
1181
1182
1183
  	} reg_state:8;
  
  	bool dismantle; /* device is going do be freed */
a2835763e   Patrick McHardy   rtnetlink: handle...
1184
1185
1186
1187
1188
  
  	enum {
  		RTNL_LINK_INITIALIZED,
  		RTNL_LINK_INITIALIZING,
  	} rtnl_link_state:16;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1189

d314774cf   Stephen Hemminger   netdev: network d...
1190
1191
  	/* Called from unregister, can be used to call free_netdev */
  	void (*destructor)(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1192

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1193
  #ifdef CONFIG_NETPOLL
115c1d6e6   Jeff Moyer   [NETPOLL]: Introd...
1194
  	struct netpoll_info	*npinfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1195
  #endif
eae792b72   David S. Miller   netdev: Add netde...
1196

c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
1197
  #ifdef CONFIG_NET_NS
4a1c53711   Eric W. Biederman   [NET]: Add a netw...
1198
1199
  	/* Network namespace this network device is inside */
  	struct net		*nd_net;
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
1200
  #endif
4a1c53711   Eric W. Biederman   [NET]: Add a netw...
1201

4951704b4   David S. Miller   syncppp: Fix cras...
1202
  	/* mid-layer private */
a7855c78a   Eric Dumazet   net: loopback dri...
1203
1204
1205
  	union {
  		void				*ml_priv;
  		struct pcpu_lstats __percpu	*lstats; /* loopback stats */
290b895e0   Eric Dumazet   tunnels: prepare ...
1206
  		struct pcpu_tstats __percpu	*tstats; /* tunnel stats */
6d81f41c5   Eric Dumazet   dummy: percpu sta...
1207
  		struct pcpu_dstats __percpu	*dstats; /* dummy stats */
a7855c78a   Eric Dumazet   net: loopback dri...
1208
  	};
eca9ebac6   Patrick McHardy   net: Add GARP app...
1209
  	/* GARP */
3cc77ec74   Eric Dumazet   net/802: add __rc...
1210
  	struct garp_port __rcu	*garp_port;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1211

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1212
  	/* class/net/name entry */
43cb76d91   Greg Kroah-Hartman   Network: convert ...
1213
  	struct device		dev;
0c509a6c9   Eric W. Biederman   net: Allow device...
1214
1215
  	/* space for optional device, statistics, and wireless sysfs groups */
  	const struct attribute_group *sysfs_groups[4];
38f7b870d   Patrick McHardy   [RTNETLINK]: Link...
1216
1217
1218
  
  	/* rtnetlink link ops */
  	const struct rtnl_link_ops *rtnl_link_ops;
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1219

82cc1a7a5   Peter P Waskiewicz Jr   [NET]: Add per-co...
1220
1221
1222
  	/* for setting kernel sock attribute on TCP connection setup */
  #define GSO_MAX_SIZE		65536
  	unsigned int		gso_max_size;
d314774cf   Stephen Hemminger   netdev: network d...
1223

7a6b6f515   Jeff Kirsher   DCB: fix kconfig ...
1224
  #ifdef CONFIG_DCB
2f90b8657   Alexander Duyck   ixgbe: this patch...
1225
  	/* Data Center Bridging netlink ops */
329535432   Stephen Hemminger   dcb: data center ...
1226
  	const struct dcbnl_rtnl_ops *dcbnl_ops;
2f90b8657   Alexander Duyck   ixgbe: this patch...
1227
  #endif
4f57c087d   John Fastabend   net: implement me...
1228
1229
1230
  	u8 num_tc;
  	struct netdev_tc_txq tc_to_txq[TC_MAX_QUEUE];
  	u8 prio_tc_map[TC_BITMASK + 1];
2f90b8657   Alexander Duyck   ixgbe: this patch...
1231

d11ead756   Ben Hutchings   net: Use IS_ENABL...
1232
  #if IS_ENABLED(CONFIG_FCOE)
4d288d576   Yi Zou   [SCSI] net: add F...
1233
1234
1235
  	/* max exchange id for FCoE LRO by ddp */
  	unsigned int		fcoe_ddp_xid;
  #endif
5bc1421e3   Neil Horman   net: add network ...
1236
1237
1238
  #if IS_ENABLED(CONFIG_NETPRIO_CGROUP)
  	struct netprio_map __rcu *priomap;
  #endif
c1f19b51d   Richard Cochran   net: support time...
1239
1240
  	/* phy device may attach itself for hardware timestamping */
  	struct phy_device *phydev;
cbda10fa9   Vlad Dogaru   net_device: add s...
1241
1242
1243
  
  	/* group the device belongs to */
  	int group;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1244
  };
43cb76d91   Greg Kroah-Hartman   Network: convert ...
1245
  #define to_net_dev(d) container_of(d, struct net_device, dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1246
1247
  
  #define	NETDEV_ALIGN		32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1248

e8a0464cc   David S. Miller   netdev: Allocate ...
1249
  static inline
4f57c087d   John Fastabend   net: implement me...
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
  int netdev_get_prio_tc_map(const struct net_device *dev, u32 prio)
  {
  	return dev->prio_tc_map[prio & TC_BITMASK];
  }
  
  static inline
  int netdev_set_prio_tc_map(struct net_device *dev, u8 prio, u8 tc)
  {
  	if (tc >= dev->num_tc)
  		return -EINVAL;
  
  	dev->prio_tc_map[prio & TC_BITMASK] = tc & TC_BITMASK;
  	return 0;
  }
  
  static inline
  void netdev_reset_tc(struct net_device *dev)
  {
  	dev->num_tc = 0;
  	memset(dev->tc_to_txq, 0, sizeof(dev->tc_to_txq));
  	memset(dev->prio_tc_map, 0, sizeof(dev->prio_tc_map));
  }
  
  static inline
  int netdev_set_tc_queue(struct net_device *dev, u8 tc, u16 count, u16 offset)
  {
  	if (tc >= dev->num_tc)
  		return -EINVAL;
  
  	dev->tc_to_txq[tc].count = count;
  	dev->tc_to_txq[tc].offset = offset;
  	return 0;
  }
  
  static inline
  int netdev_set_num_tc(struct net_device *dev, u8 num_tc)
  {
  	if (num_tc > TC_MAX_QUEUE)
  		return -EINVAL;
  
  	dev->num_tc = num_tc;
  	return 0;
  }
  
  static inline
  int netdev_get_num_tc(struct net_device *dev)
  {
  	return dev->num_tc;
  }
  
  static inline
e8a0464cc   David S. Miller   netdev: Allocate ...
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
  struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev,
  					 unsigned int index)
  {
  	return &dev->_tx[index];
  }
  
  static inline void netdev_for_each_tx_queue(struct net_device *dev,
  					    void (*f)(struct net_device *,
  						      struct netdev_queue *,
  						      void *),
  					    void *arg)
  {
  	unsigned int i;
  
  	for (i = 0; i < dev->num_tx_queues; i++)
  		f(dev, &dev->_tx[i], arg);
  }
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
1318
1319
1320
1321
1322
1323
  /*
   * Net namespace inlines
   */
  static inline
  struct net *dev_net(const struct net_device *dev)
  {
c2d9ba9bc   Eric Dumazet   net: CONFIG_NET_N...
1324
  	return read_pnet(&dev->nd_net);
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
1325
1326
1327
  }
  
  static inline
f5aa23fd4   Denis V. Lunev   [NETNS]: Compilat...
1328
  void dev_net_set(struct net_device *dev, struct net *net)
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
1329
1330
  {
  #ifdef CONFIG_NET_NS
f3005d7f4   Denis V. Lunev   [NETNS]: Add netn...
1331
1332
  	release_net(dev->nd_net);
  	dev->nd_net = hold_net(net);
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
1333
1334
  #endif
  }
cf85d08fd   Lennert Buytenhek   dsa: add support ...
1335
1336
1337
1338
1339
1340
1341
1342
1343
  static inline bool netdev_uses_dsa_tags(struct net_device *dev)
  {
  #ifdef CONFIG_NET_DSA_TAG_DSA
  	if (dev->dsa_ptr != NULL)
  		return dsa_uses_dsa_tags(dev->dsa_ptr);
  #endif
  
  	return 0;
  }
8a83a00b0   Arnd Bergmann   net: maintain nam...
1344
1345
1346
1347
1348
1349
1350
1351
  #ifndef CONFIG_NET_NS
  static inline void skb_set_dev(struct sk_buff *skb, struct net_device *dev)
  {
  	skb->dev = dev;
  }
  #else /* CONFIG_NET_NS */
  void skb_set_dev(struct sk_buff *skb, struct net_device *dev);
  #endif
396138f03   Lennert Buytenhek   dsa: add support ...
1352
1353
1354
1355
1356
1357
1358
1359
1360
  static inline bool netdev_uses_trailer_tags(struct net_device *dev)
  {
  #ifdef CONFIG_NET_DSA_TAG_TRAILER
  	if (dev->dsa_ptr != NULL)
  		return dsa_uses_trailer_tags(dev->dsa_ptr);
  #endif
  
  	return 0;
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1361
1362
1363
1364
1365
1366
  /**
   *	netdev_priv - access network device private data
   *	@dev: network device
   *
   * Get network device private data
   */
6472ce609   Patrick McHardy   [NET]: Mark struc...
1367
  static inline void *netdev_priv(const struct net_device *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1368
  {
1ce8e7b57   Eric Dumazet   net: ALIGN/PTR_AL...
1369
  	return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1370
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1371
1372
1373
  /* Set the sysfs physical device reference for the network logical device
   * if set prior to registration will cause a symlink during initialization.
   */
43cb76d91   Greg Kroah-Hartman   Network: convert ...
1374
  #define SET_NETDEV_DEV(net, pdev)	((net)->dev.parent = (pdev))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1375

384912ed1   Marcel Holtmann   net: Add DEVTYPE ...
1376
1377
1378
1379
1380
  /* Set the sysfs device type for the network logical device to allow
   * fin grained indentification of different network device types. For
   * example Ethernet, Wirelss LAN, Bluetooth, WiMAX etc.
   */
  #define SET_NETDEV_DEVTYPE(net, devtype)	((net)->dev.type = (devtype))
3b582cc14   Stephen Hemminger   [NET]: docbook fi...
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
  /**
   *	netif_napi_add - initialize a napi context
   *	@dev:  network device
   *	@napi: napi context
   *	@poll: polling function
   *	@weight: default weight
   *
   * netif_napi_add() must be used to initialize a napi context prior to calling
   * *any* of the other napi related functions.
   */
d565b0a1a   Herbert Xu   net: Add Generic ...
1391
1392
  void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
  		    int (*poll)(struct napi_struct *, int), int weight);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1393

d81565340   Alexander Duyck   net: add netif_na...
1394
1395
1396
1397
1398
1399
  /**
   *  netif_napi_del - remove a napi context
   *  @napi: napi context
   *
   *  netif_napi_del() removes a napi context from the network device napi list
   */
d565b0a1a   Herbert Xu   net: Add Generic ...
1400
1401
1402
  void netif_napi_del(struct napi_struct *napi);
  
  struct napi_gro_cb {
78a478d0e   Herbert Xu   gro: Inline skb_g...
1403
1404
  	/* Virtual address of skb_shinfo(skb)->frags[0].page + offset. */
  	void *frag0;
7489594cb   Herbert Xu   gro: Optimise len...
1405
1406
  	/* Length of frag0. */
  	unsigned int frag0_len;
86911732d   Herbert Xu   gro: Avoid copyin...
1407
1408
  	/* This indicates where we are processing relative to skb->data. */
  	int data_offset;
d565b0a1a   Herbert Xu   net: Add Generic ...
1409
1410
1411
1412
1413
1414
1415
1416
  	/* This is non-zero if the packet may be of the same flow. */
  	int same_flow;
  
  	/* This is non-zero if the packet cannot be merged with the new skb. */
  	int flush;
  
  	/* Number of segments aggregated. */
  	int count;
5d38a079c   Herbert Xu   gro: Add page fra...
1417
1418
1419
  
  	/* Free the skb? */
  	int free;
d565b0a1a   Herbert Xu   net: Add Generic ...
1420
1421
1422
  };
  
  #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb)
d81565340   Alexander Duyck   net: add netif_na...
1423

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1424
  struct packet_type {
f2ccd8fa0   David S. Miller   [NET]: Kill skb->...
1425
1426
1427
1428
1429
1430
  	__be16			type;	/* This is really htons(ether_type). */
  	struct net_device	*dev;	/* NULL is wildcarded here	     */
  	int			(*func) (struct sk_buff *,
  					 struct net_device *,
  					 struct packet_type *,
  					 struct net_device *);
576a30eb6   Herbert Xu   [NET]: Added GSO ...
1431
  	struct sk_buff		*(*gso_segment)(struct sk_buff *skb,
c8f44affb   Michał Mirosław   net: introduce an...
1432
  						netdev_features_t features);
a430a43d0   Herbert Xu   [NET] gso: Fix up...
1433
  	int			(*gso_send_check)(struct sk_buff *skb);
d565b0a1a   Herbert Xu   net: Add Generic ...
1434
1435
1436
  	struct sk_buff		**(*gro_receive)(struct sk_buff **head,
  					       struct sk_buff *skb);
  	int			(*gro_complete)(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1437
1438
1439
  	void			*af_packet_priv;
  	struct list_head	list;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1440
  #include <linux/notifier.h>
dcfe1421c   Amerigo Wang   notifiers: net: m...
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
  /* netdevice notifier chain. Please remember to update the rtnetlink
   * notification exclusion list in rtnetlink_event() when adding new
   * types.
   */
  #define NETDEV_UP	0x0001	/* For now you can't veto a device up/down */
  #define NETDEV_DOWN	0x0002
  #define NETDEV_REBOOT	0x0003	/* Tell a protocol stack a network interface
  				   detected a hardware crash and restarted
  				   - we can use this eg to kick tcp sessions
  				   once done */
  #define NETDEV_CHANGE	0x0004	/* Notify device state change */
  #define NETDEV_REGISTER 0x0005
  #define NETDEV_UNREGISTER	0x0006
  #define NETDEV_CHANGEMTU	0x0007
  #define NETDEV_CHANGEADDR	0x0008
  #define NETDEV_GOING_DOWN	0x0009
  #define NETDEV_CHANGENAME	0x000A
  #define NETDEV_FEAT_CHANGE	0x000B
  #define NETDEV_BONDING_FAILOVER 0x000C
  #define NETDEV_PRE_UP		0x000D
  #define NETDEV_PRE_TYPE_CHANGE	0x000E
  #define NETDEV_POST_TYPE_CHANGE	0x000F
  #define NETDEV_POST_INIT	0x0010
  #define NETDEV_UNREGISTER_BATCH 0x0011
  #define NETDEV_RELEASE		0x0012
  #define NETDEV_NOTIFY_PEERS	0x0013
  #define NETDEV_JOIN		0x0014
  
  extern int register_netdevice_notifier(struct notifier_block *nb);
  extern int unregister_netdevice_notifier(struct notifier_block *nb);
  extern int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1472
  extern rwlock_t				dev_base_lock;		/* Device list lock */
7562f876c   Pavel Emelianov   [NET]: Rework dev...
1473

881d966b4   Eric W. Biederman   [NET]: Make the d...
1474
1475
  #define for_each_netdev(net, d)		\
  		list_for_each_entry(d, &(net)->dev_base_head, dev_list)
dcbccbd4f   Eric W. Biederman   net: Implement fo...
1476
1477
  #define for_each_netdev_reverse(net, d)	\
  		list_for_each_entry_reverse(d, &(net)->dev_base_head, dev_list)
c6d14c845   Eric Dumazet   net: Introduce fo...
1478
1479
  #define for_each_netdev_rcu(net, d)		\
  		list_for_each_entry_rcu(d, &(net)->dev_base_head, dev_list)
881d966b4   Eric W. Biederman   [NET]: Make the d...
1480
1481
1482
1483
  #define for_each_netdev_safe(net, d, n)	\
  		list_for_each_entry_safe(d, n, &(net)->dev_base_head, dev_list)
  #define for_each_netdev_continue(net, d)		\
  		list_for_each_entry_continue(d, &(net)->dev_base_head, dev_list)
254245d23   stephen hemminger   netdev: add netde...
1484
1485
  #define for_each_netdev_continue_rcu(net, d)		\
  	list_for_each_entry_continue_rcu(d, &(net)->dev_base_head, dev_list)
881d966b4   Eric W. Biederman   [NET]: Make the d...
1486
  #define net_device_entry(lh)	list_entry(lh, struct net_device, dev_list)
7562f876c   Pavel Emelianov   [NET]: Rework dev...
1487

a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
1488
1489
1490
1491
  static inline struct net_device *next_net_device(struct net_device *dev)
  {
  	struct list_head *lh;
  	struct net *net;
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
1492
  	net = dev_net(dev);
a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
1493
1494
1495
  	lh = dev->dev_list.next;
  	return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
  }
ce81b76a3   Eric Dumazet   ipv6: use RCU to ...
1496
1497
1498
1499
1500
1501
  static inline struct net_device *next_net_device_rcu(struct net_device *dev)
  {
  	struct list_head *lh;
  	struct net *net;
  
  	net = dev_net(dev);
ccf434380   Eric Dumazet   net: fix dev_seq_...
1502
  	lh = rcu_dereference(list_next_rcu(&dev->dev_list));
ce81b76a3   Eric Dumazet   ipv6: use RCU to ...
1503
1504
  	return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
  }
a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
1505
1506
1507
1508
1509
  static inline struct net_device *first_net_device(struct net *net)
  {
  	return list_empty(&net->dev_base_head) ? NULL :
  		net_device_entry(net->dev_base_head.next);
  }
7562f876c   Pavel Emelianov   [NET]: Rework dev...
1510

ccf434380   Eric Dumazet   net: fix dev_seq_...
1511
1512
1513
1514
1515
1516
  static inline struct net_device *first_net_device_rcu(struct net *net)
  {
  	struct list_head *lh = rcu_dereference(list_next_rcu(&net->dev_base_head));
  
  	return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1517
1518
  extern int 			netdev_boot_setup_check(struct net_device *dev);
  extern unsigned long		netdev_boot_base(const char *prefix, int unit);
941666c2e   Eric Dumazet   net: RCU conversi...
1519
1520
  extern struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
  					      const char *hwaddr);
881d966b4   Eric W. Biederman   [NET]: Make the d...
1521
1522
  extern struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type);
  extern struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1523
1524
1525
  extern void		dev_add_pack(struct packet_type *pt);
  extern void		dev_remove_pack(struct packet_type *pt);
  extern void		__dev_remove_pack(struct packet_type *pt);
bb69ae049   Eric Dumazet   anycast: Some RCU...
1526
1527
  extern struct net_device	*dev_get_by_flags_rcu(struct net *net, unsigned short flags,
  						      unsigned short mask);
881d966b4   Eric W. Biederman   [NET]: Make the d...
1528
  extern struct net_device	*dev_get_by_name(struct net *net, const char *name);
72c9528ba   Eric Dumazet   net: Introduce de...
1529
  extern struct net_device	*dev_get_by_name_rcu(struct net *net, const char *name);
881d966b4   Eric W. Biederman   [NET]: Make the d...
1530
  extern struct net_device	*__dev_get_by_name(struct net *net, const char *name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1531
1532
1533
  extern int		dev_alloc_name(struct net_device *dev, const char *name);
  extern int		dev_open(struct net_device *dev);
  extern int		dev_close(struct net_device *dev);
0187bdfb0   Ben Hutchings   net: Disable LRO ...
1534
  extern void		dev_disable_lro(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1535
1536
  extern int		dev_queue_xmit(struct sk_buff *skb);
  extern int		register_netdevice(struct net_device *dev);
44a0873d5   Eric Dumazet   net: Introduce un...
1537
1538
  extern void		unregister_netdevice_queue(struct net_device *dev,
  						   struct list_head *head);
9b5e383c1   Eric Dumazet   net: Introduce un...
1539
  extern void		unregister_netdevice_many(struct list_head *head);
44a0873d5   Eric Dumazet   net: Introduce un...
1540
1541
1542
1543
  static inline void unregister_netdevice(struct net_device *dev)
  {
  	unregister_netdevice_queue(dev, NULL);
  }
29b4433d9   Eric Dumazet   net: percpu net_d...
1544
  extern int 		netdev_refcnt_read(const struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1545
1546
  extern void		free_netdev(struct net_device *dev);
  extern void		synchronize_net(void);
937f1ba56   Benjamin Herrenschmidt   net: Add init_dum...
1547
  extern int		init_dummy_netdev(struct net_device *dev);
9d40bbda5   David S. Miller   vlan: Fix vlan-in...
1548
  extern void		netdev_resync_ops(struct net_device *dev);
937f1ba56   Benjamin Herrenschmidt   net: Add init_dum...
1549

881d966b4   Eric W. Biederman   [NET]: Make the d...
1550
1551
  extern struct net_device	*dev_get_by_index(struct net *net, int ifindex);
  extern struct net_device	*__dev_get_by_index(struct net *net, int ifindex);
fb699dfd4   Eric Dumazet   net: Introduce de...
1552
  extern struct net_device	*dev_get_by_index_rcu(struct net *net, int ifindex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1553
1554
1555
1556
  extern int		dev_restart(struct net_device *dev);
  #ifdef CONFIG_NETPOLL_TRAP
  extern int		netpoll_trap(void);
  #endif
86911732d   Herbert Xu   gro: Avoid copyin...
1557
1558
  extern int	       skb_gro_receive(struct sk_buff **head,
  				       struct sk_buff *skb);
78a478d0e   Herbert Xu   gro: Inline skb_g...
1559
  extern void	       skb_gro_reset_offset(struct sk_buff *skb);
86911732d   Herbert Xu   gro: Avoid copyin...
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
  
  static inline unsigned int skb_gro_offset(const struct sk_buff *skb)
  {
  	return NAPI_GRO_CB(skb)->data_offset;
  }
  
  static inline unsigned int skb_gro_len(const struct sk_buff *skb)
  {
  	return skb->len - NAPI_GRO_CB(skb)->data_offset;
  }
  
  static inline void skb_gro_pull(struct sk_buff *skb, unsigned int len)
  {
  	NAPI_GRO_CB(skb)->data_offset += len;
  }
a5b1cf288   Herbert Xu   gro: Avoid unnece...
1575
1576
  static inline void *skb_gro_header_fast(struct sk_buff *skb,
  					unsigned int offset)
86911732d   Herbert Xu   gro: Avoid copyin...
1577
  {
a5b1cf288   Herbert Xu   gro: Avoid unnece...
1578
1579
  	return NAPI_GRO_CB(skb)->frag0 + offset;
  }
78a478d0e   Herbert Xu   gro: Inline skb_g...
1580

a5b1cf288   Herbert Xu   gro: Avoid unnece...
1581
1582
1583
1584
  static inline int skb_gro_header_hard(struct sk_buff *skb, unsigned int hlen)
  {
  	return NAPI_GRO_CB(skb)->frag0_len < hlen;
  }
78a478d0e   Herbert Xu   gro: Inline skb_g...
1585

a5b1cf288   Herbert Xu   gro: Avoid unnece...
1586
1587
1588
  static inline void *skb_gro_header_slow(struct sk_buff *skb, unsigned int hlen,
  					unsigned int offset)
  {
17dd759c6   Herbert Xu   gro: Only reset f...
1589
1590
  	if (!pskb_may_pull(skb, hlen))
  		return NULL;
a5b1cf288   Herbert Xu   gro: Avoid unnece...
1591
1592
  	NAPI_GRO_CB(skb)->frag0 = NULL;
  	NAPI_GRO_CB(skb)->frag0_len = 0;
17dd759c6   Herbert Xu   gro: Only reset f...
1593
  	return skb->data + offset;
86911732d   Herbert Xu   gro: Avoid copyin...
1594
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1595

aa4b9f533   Herbert Xu   gro: Optimise Eth...
1596
1597
  static inline void *skb_gro_mac_header(struct sk_buff *skb)
  {
78d3fd0b7   Herbert Xu   gro: Only use skb...
1598
  	return NAPI_GRO_CB(skb)->frag0 ?: skb_mac_header(skb);
aa4b9f533   Herbert Xu   gro: Optimise Eth...
1599
  }
36e7b1b8d   Herbert Xu   gro: Fix COMPLETE...
1600
1601
  static inline void *skb_gro_network_header(struct sk_buff *skb)
  {
78d3fd0b7   Herbert Xu   gro: Only use skb...
1602
1603
  	return (NAPI_GRO_CB(skb)->frag0 ?: skb->data) +
  	       skb_network_offset(skb);
36e7b1b8d   Herbert Xu   gro: Fix COMPLETE...
1604
  }
0c4e85813   Stephen Hemminger   [NET]: Wrap netde...
1605
1606
  static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev,
  				  unsigned short type,
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
1607
1608
  				  const void *daddr, const void *saddr,
  				  unsigned len)
0c4e85813   Stephen Hemminger   [NET]: Wrap netde...
1609
  {
f1ecfd5d3   Ursula Braun   remove header_ops...
1610
  	if (!dev->header_ops || !dev->header_ops->create)
0c4e85813   Stephen Hemminger   [NET]: Wrap netde...
1611
  		return 0;
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
1612
1613
  
  	return dev->header_ops->create(skb, dev, type, daddr, saddr, len);
0c4e85813   Stephen Hemminger   [NET]: Wrap netde...
1614
  }
b95cce357   Stephen Hemminger   [NET]: Wrap hard_...
1615
1616
1617
1618
  static inline int dev_parse_header(const struct sk_buff *skb,
  				   unsigned char *haddr)
  {
  	const struct net_device *dev = skb->dev;
1b83336bb   Patrick McHardy   [NET]: Fix OOPS d...
1619
  	if (!dev->header_ops || !dev->header_ops->parse)
b95cce357   Stephen Hemminger   [NET]: Wrap hard_...
1620
  		return 0;
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
1621
  	return dev->header_ops->parse(skb, haddr);
b95cce357   Stephen Hemminger   [NET]: Wrap hard_...
1622
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1623
1624
1625
1626
1627
1628
1629
1630
  typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len);
  extern int		register_gifconf(unsigned int family, gifconf_func_t * gifconf);
  static inline int unregister_gifconf(unsigned int family)
  {
  	return register_gifconf(family, NULL);
  }
  
  /*
88751275b   Eric Dumazet   rps: shortcut net...
1631
   * Incoming packets are placed on per-cpu queues
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1632
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
1633
  struct softnet_data {
37437bb2e   David S. Miller   pkt_sched: Schedu...
1634
  	struct Qdisc		*output_queue;
a9cbd588f   Changli Gao   net: reimplement ...
1635
  	struct Qdisc		**output_queue_tailp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1636
  	struct list_head	poll_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1637
  	struct sk_buff		*completion_queue;
6e7676c1a   Changli Gao   net: batch skb de...
1638
  	struct sk_buff_head	process_queue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1639

dee42870a   Changli Gao   net: fix softnet_...
1640
  	/* stats */
cd7b5396e   David S. Miller   net: Use explicit...
1641
1642
1643
1644
  	unsigned int		processed;
  	unsigned int		time_squeeze;
  	unsigned int		cpu_collision;
  	unsigned int		received_rps;
dee42870a   Changli Gao   net: fix softnet_...
1645

fd793d890   Changli Gao   net: CONFIG_SMP s...
1646
  #ifdef CONFIG_RPS
88751275b   Eric Dumazet   rps: shortcut net...
1647
1648
1649
  	struct softnet_data	*rps_ipi_list;
  
  	/* Elements below can be accessed between CPUs for RPS */
0a9627f26   Tom Herbert   rps: Receive Pack...
1650
  	struct call_single_data	csd ____cacheline_aligned_in_smp;
88751275b   Eric Dumazet   rps: shortcut net...
1651
1652
  	struct softnet_data	*rps_ipi_next;
  	unsigned int		cpu;
fec5e652e   Tom Herbert   rfs: Receive Flow...
1653
  	unsigned int		input_queue_head;
76cc8b13a   Tom Herbert   net: fix problem ...
1654
  	unsigned int		input_queue_tail;
1e94d72fe   Tom Herbert   rps: Fixed build ...
1655
  #endif
dee42870a   Changli Gao   net: fix softnet_...
1656
  	unsigned		dropped;
0a9627f26   Tom Herbert   rps: Receive Pack...
1657
  	struct sk_buff_head	input_pkt_queue;
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1658
  	struct napi_struct	backlog;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1659
  };
76cc8b13a   Tom Herbert   net: fix problem ...
1660
  static inline void input_queue_head_incr(struct softnet_data *sd)
fec5e652e   Tom Herbert   rfs: Receive Flow...
1661
1662
  {
  #ifdef CONFIG_RPS
76cc8b13a   Tom Herbert   net: fix problem ...
1663
1664
1665
1666
1667
1668
1669
1670
1671
  	sd->input_queue_head++;
  #endif
  }
  
  static inline void input_queue_tail_incr_save(struct softnet_data *sd,
  					      unsigned int *qtail)
  {
  #ifdef CONFIG_RPS
  	*qtail = ++sd->input_queue_tail;
fec5e652e   Tom Herbert   rfs: Receive Flow...
1672
1673
  #endif
  }
0a9627f26   Tom Herbert   rps: Receive Pack...
1674
  DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1675

37437bb2e   David S. Miller   pkt_sched: Schedu...
1676
  extern void __netif_schedule(struct Qdisc *q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1677

86d804e10   David S. Miller   netdev: Make neti...
1678
  static inline void netif_schedule_queue(struct netdev_queue *txq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1679
  {
734664982   Tom Herbert   net: Add queue st...
1680
  	if (!(txq->state & QUEUE_STATE_ANY_XOFF))
37437bb2e   David S. Miller   pkt_sched: Schedu...
1681
  		__netif_schedule(txq->qdisc);
86d804e10   David S. Miller   netdev: Make neti...
1682
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1683
1684
1685
1686
1687
1688
1689
  static inline void netif_tx_schedule_all(struct net_device *dev)
  {
  	unsigned int i;
  
  	for (i = 0; i < dev->num_tx_queues; i++)
  		netif_schedule_queue(netdev_get_tx_queue(dev, i));
  }
d29f749e2   Dave Jones   net: Fix build fa...
1690
1691
  static inline void netif_tx_start_queue(struct netdev_queue *dev_queue)
  {
734664982   Tom Herbert   net: Add queue st...
1692
  	clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
d29f749e2   Dave Jones   net: Fix build fa...
1693
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1694
1695
1696
1697
1698
1699
  /**
   *	netif_start_queue - allow transmit
   *	@dev: network device
   *
   *	Allow upper layers to call the device hard_start_xmit routine.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1700
1701
  static inline void netif_start_queue(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1702
  	netif_tx_start_queue(netdev_get_tx_queue(dev, 0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1703
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1704
1705
1706
1707
1708
1709
1710
1711
1712
  static inline void netif_tx_start_all_queues(struct net_device *dev)
  {
  	unsigned int i;
  
  	for (i = 0; i < dev->num_tx_queues; i++) {
  		struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
  		netif_tx_start_queue(txq);
  	}
  }
79d16385c   David S. Miller   netdev: Move atom...
1713
  static inline void netif_tx_wake_queue(struct netdev_queue *dev_queue)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1714
1715
  {
  #ifdef CONFIG_NETPOLL_TRAP
5f286e113   Sergei Shtylyov   [NETPOLL]: Fix TX...
1716
  	if (netpoll_trap()) {
7b3d3e4fc   Krishna Kumar   netdevice: Consol...
1717
  		netif_tx_start_queue(dev_queue);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1718
  		return;
5f286e113   Sergei Shtylyov   [NETPOLL]: Fix TX...
1719
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1720
  #endif
734664982   Tom Herbert   net: Add queue st...
1721
  	if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state))
37437bb2e   David S. Miller   pkt_sched: Schedu...
1722
  		__netif_schedule(dev_queue->qdisc);
79d16385c   David S. Miller   netdev: Move atom...
1723
  }
d29f749e2   Dave Jones   net: Fix build fa...
1724
1725
1726
1727
1728
1729
1730
  /**
   *	netif_wake_queue - restart transmit
   *	@dev: network device
   *
   *	Allow upper layers to call the device hard_start_xmit routine.
   *	Used for flow control when transmit resources are available.
   */
79d16385c   David S. Miller   netdev: Move atom...
1731
1732
  static inline void netif_wake_queue(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1733
  	netif_tx_wake_queue(netdev_get_tx_queue(dev, 0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1734
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1735
1736
1737
1738
1739
1740
1741
1742
1743
  static inline void netif_tx_wake_all_queues(struct net_device *dev)
  {
  	unsigned int i;
  
  	for (i = 0; i < dev->num_tx_queues; i++) {
  		struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
  		netif_tx_wake_queue(txq);
  	}
  }
d29f749e2   Dave Jones   net: Fix build fa...
1744
1745
  static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
  {
18543a643   Guillaume Chazarain   net: Detect and i...
1746
  	if (WARN_ON(!dev_queue)) {
256ee435b   Joe Perches   netdevice: Conver...
1747
1748
  		pr_info("netif_stop_queue() cannot be called before register_netdev()
  ");
18543a643   Guillaume Chazarain   net: Detect and i...
1749
1750
  		return;
  	}
734664982   Tom Herbert   net: Add queue st...
1751
  	set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
d29f749e2   Dave Jones   net: Fix build fa...
1752
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1753
1754
1755
1756
1757
1758
1759
  /**
   *	netif_stop_queue - stop transmitted packets
   *	@dev: network device
   *
   *	Stop upper layers calling the device hard_start_xmit routine.
   *	Used for flow control when transmit resources are unavailable.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1760
1761
  static inline void netif_stop_queue(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1762
  	netif_tx_stop_queue(netdev_get_tx_queue(dev, 0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1763
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1764
1765
1766
1767
1768
1769
1770
1771
1772
  static inline void netif_tx_stop_all_queues(struct net_device *dev)
  {
  	unsigned int i;
  
  	for (i = 0; i < dev->num_tx_queues; i++) {
  		struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
  		netif_tx_stop_queue(txq);
  	}
  }
d29f749e2   Dave Jones   net: Fix build fa...
1773
1774
  static inline int netif_tx_queue_stopped(const struct netdev_queue *dev_queue)
  {
734664982   Tom Herbert   net: Add queue st...
1775
  	return test_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
d29f749e2   Dave Jones   net: Fix build fa...
1776
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1777
1778
1779
1780
1781
1782
  /**
   *	netif_queue_stopped - test if transmit queue is flowblocked
   *	@dev: network device
   *
   *	Test if transmit queue on device is currently unable to send.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1783
1784
  static inline int netif_queue_stopped(const struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1785
  	return netif_tx_queue_stopped(netdev_get_tx_queue(dev, 0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1786
  }
734664982   Tom Herbert   net: Add queue st...
1787
  static inline int netif_xmit_stopped(const struct netdev_queue *dev_queue)
c3f26a269   David S. Miller   netdev: Fix lockd...
1788
  {
734664982   Tom Herbert   net: Add queue st...
1789
1790
1791
1792
1793
1794
1795
  	return dev_queue->state & QUEUE_STATE_ANY_XOFF;
  }
  
  static inline int netif_xmit_frozen_or_stopped(const struct netdev_queue *dev_queue)
  {
  	return dev_queue->state & QUEUE_STATE_ANY_XOFF_OR_FROZEN;
  }
c5d67bd78   Tom Herbert   net: Add netdev i...
1796
1797
1798
  static inline void netdev_tx_sent_queue(struct netdev_queue *dev_queue,
  					unsigned int bytes)
  {
114cf5802   Tom Herbert   bql: Byte queue l...
1799
1800
1801
1802
1803
1804
1805
1806
1807
  #ifdef CONFIG_BQL
  	dql_queued(&dev_queue->dql, bytes);
  	if (unlikely(dql_avail(&dev_queue->dql) < 0)) {
  		set_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state);
  		if (unlikely(dql_avail(&dev_queue->dql) >= 0))
  			clear_bit(__QUEUE_STATE_STACK_XOFF,
  			    &dev_queue->state);
  	}
  #endif
c5d67bd78   Tom Herbert   net: Add netdev i...
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
  }
  
  static inline void netdev_sent_queue(struct net_device *dev, unsigned int bytes)
  {
  	netdev_tx_sent_queue(netdev_get_tx_queue(dev, 0), bytes);
  }
  
  static inline void netdev_tx_completed_queue(struct netdev_queue *dev_queue,
  					     unsigned pkts, unsigned bytes)
  {
114cf5802   Tom Herbert   bql: Byte queue l...
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
  #ifdef CONFIG_BQL
  	if (likely(bytes)) {
  		dql_completed(&dev_queue->dql, bytes);
  		if (unlikely(test_bit(__QUEUE_STATE_STACK_XOFF,
  		    &dev_queue->state) &&
  		    dql_avail(&dev_queue->dql) >= 0)) {
  			if (test_and_clear_bit(__QUEUE_STATE_STACK_XOFF,
  			     &dev_queue->state))
  				netif_schedule_queue(dev_queue);
  		}
  	}
  #endif
c5d67bd78   Tom Herbert   net: Add netdev i...
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
  }
  
  static inline void netdev_completed_queue(struct net_device *dev,
  					  unsigned pkts, unsigned bytes)
  {
  	netdev_tx_completed_queue(netdev_get_tx_queue(dev, 0), pkts, bytes);
  }
  
  static inline void netdev_tx_reset_queue(struct netdev_queue *q)
  {
114cf5802   Tom Herbert   bql: Byte queue l...
1840
1841
1842
  #ifdef CONFIG_BQL
  	dql_reset(&q->dql);
  #endif
c5d67bd78   Tom Herbert   net: Add netdev i...
1843
1844
1845
1846
1847
  }
  
  static inline void netdev_reset_queue(struct net_device *dev_queue)
  {
  	netdev_tx_reset_queue(netdev_get_tx_queue(dev_queue, 0));
c3f26a269   David S. Miller   netdev: Fix lockd...
1848
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1849
1850
1851
1852
1853
1854
  /**
   *	netif_running - test if up
   *	@dev: network device
   *
   *	Test if the device has been brought up.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1855
1856
1857
1858
  static inline int netif_running(const struct net_device *dev)
  {
  	return test_bit(__LINK_STATE_START, &dev->state);
  }
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1859
1860
1861
1862
1863
1864
  /*
   * Routines to manage the subqueues on a device.  We only need start
   * stop, and a check if it's stopped.  All other device management is
   * done at the overall netdevice level.
   * Also test the device if we're multiqueue.
   */
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1865
1866
1867
1868
1869
1870
1871
1872
  
  /**
   *	netif_start_subqueue - allow sending packets on subqueue
   *	@dev: network device
   *	@queue_index: sub queue index
   *
   * Start individual transmit queue of a device with multiple transmit queues.
   */
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1873
1874
  static inline void netif_start_subqueue(struct net_device *dev, u16 queue_index)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1875
  	struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
7b3d3e4fc   Krishna Kumar   netdevice: Consol...
1876
1877
  
  	netif_tx_start_queue(txq);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1878
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1879
1880
1881
1882
1883
1884
1885
  /**
   *	netif_stop_subqueue - stop sending packets on subqueue
   *	@dev: network device
   *	@queue_index: sub queue index
   *
   * Stop individual transmit queue of a device with multiple transmit queues.
   */
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1886
1887
  static inline void netif_stop_subqueue(struct net_device *dev, u16 queue_index)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1888
  	struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1889
1890
1891
1892
  #ifdef CONFIG_NETPOLL_TRAP
  	if (netpoll_trap())
  		return;
  #endif
7b3d3e4fc   Krishna Kumar   netdevice: Consol...
1893
  	netif_tx_stop_queue(txq);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1894
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1895
1896
1897
1898
1899
1900
1901
  /**
   *	netif_subqueue_stopped - test status of subqueue
   *	@dev: network device
   *	@queue_index: sub queue index
   *
   * Check individual transmit queue of a device with multiple transmit queues.
   */
668f895a8   Pavel Emelyanov   [NET]: Hide the q...
1902
  static inline int __netif_subqueue_stopped(const struct net_device *dev,
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1903
1904
  					 u16 queue_index)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1905
  	struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
7b3d3e4fc   Krishna Kumar   netdevice: Consol...
1906
1907
  
  	return netif_tx_queue_stopped(txq);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1908
  }
668f895a8   Pavel Emelyanov   [NET]: Hide the q...
1909
1910
1911
1912
1913
  static inline int netif_subqueue_stopped(const struct net_device *dev,
  					 struct sk_buff *skb)
  {
  	return __netif_subqueue_stopped(dev, skb_get_queue_mapping(skb));
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1914
1915
1916
1917
1918
1919
1920
1921
  
  /**
   *	netif_wake_subqueue - allow sending packets on subqueue
   *	@dev: network device
   *	@queue_index: sub queue index
   *
   * Resume individual transmit queue of a device with multiple transmit queues.
   */
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1922
1923
  static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1924
  	struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1925
1926
1927
1928
  #ifdef CONFIG_NETPOLL_TRAP
  	if (netpoll_trap())
  		return;
  #endif
734664982   Tom Herbert   net: Add queue st...
1929
  	if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &txq->state))
37437bb2e   David S. Miller   pkt_sched: Schedu...
1930
  		__netif_schedule(txq->qdisc);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1931
  }
a3d22a68d   Vladislav Zolotarov   bnx2x: Take the d...
1932
1933
1934
1935
1936
1937
1938
1939
1940
  /*
   * Returns a Tx hash for the given packet when dev->real_num_tx_queues is used
   * as a distribution range limit for the returned value.
   */
  static inline u16 skb_tx_hash(const struct net_device *dev,
  			      const struct sk_buff *skb)
  {
  	return __skb_tx_hash(dev, skb, dev->real_num_tx_queues);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1941
1942
1943
1944
1945
  /**
   *	netif_is_multiqueue - test if device has multiple transmit queues
   *	@dev: network device
   *
   * Check if device has multiple transmit queues
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1946
   */
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1947
1948
  static inline int netif_is_multiqueue(const struct net_device *dev)
  {
a02cec215   Eric Dumazet   net: return opera...
1949
  	return dev->num_tx_queues > 1;
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1950
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1951

e6484930d   Tom Herbert   net: allocate tx ...
1952
1953
  extern int netif_set_real_num_tx_queues(struct net_device *dev,
  					unsigned int txq);
f0796d5c7   John Fastabend   net: decreasing r...
1954

62fe0b40a   Ben Hutchings   net: Allow changi...
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
  #ifdef CONFIG_RPS
  extern int netif_set_real_num_rx_queues(struct net_device *dev,
  					unsigned int rxq);
  #else
  static inline int netif_set_real_num_rx_queues(struct net_device *dev,
  						unsigned int rxq)
  {
  	return 0;
  }
  #endif
3171d0262   Ben Hutchings   net: Add netif_co...
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
  static inline int netif_copy_real_num_queues(struct net_device *to_dev,
  					     const struct net_device *from_dev)
  {
  	netif_set_real_num_tx_queues(to_dev, from_dev->real_num_tx_queues);
  #ifdef CONFIG_RPS
  	return netif_set_real_num_rx_queues(to_dev,
  					    from_dev->real_num_rx_queues);
  #else
  	return 0;
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1976
  /* Use this variant when it is known for sure that it
0ef473092   Matti Linnanvuori   net: Comment dev_...
1977
1978
   * is executing from hardware interrupt context or with hardware interrupts
   * disabled.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1979
   */
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1980
  extern void dev_kfree_skb_irq(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1981
1982
  
  /* Use this variant in places where it could be invoked
0ef473092   Matti Linnanvuori   net: Comment dev_...
1983
1984
   * from either hardware interrupt or other context, with hardware interrupts
   * either disabled or enabled.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1985
   */
56079431b   Denis Vlasenko   [NET]: Deinline s...
1986
  extern void dev_kfree_skb_any(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1987

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1988
1989
  extern int		netif_rx(struct sk_buff *skb);
  extern int		netif_rx_ni(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1990
  extern int		netif_receive_skb(struct sk_buff *skb);
5b252f0c2   Ben Hutchings   gro: Name the GRO...
1991
  extern gro_result_t	dev_gro_receive(struct napi_struct *napi,
96e93eab2   Herbert Xu   gro: Add internal...
1992
  					struct sk_buff *skb);
c7c4b3b6e   Ben Hutchings   gro: Change all r...
1993
1994
  extern gro_result_t	napi_skb_finish(gro_result_t ret, struct sk_buff *skb);
  extern gro_result_t	napi_gro_receive(struct napi_struct *napi,
d565b0a1a   Herbert Xu   net: Add Generic ...
1995
  					 struct sk_buff *skb);
86cac58b7   Eric Dumazet   skge: add GRO sup...
1996
  extern void		napi_gro_flush(struct napi_struct *napi);
76620aafd   Herbert Xu   gro: New frags in...
1997
  extern struct sk_buff *	napi_get_frags(struct napi_struct *napi);
c7c4b3b6e   Ben Hutchings   gro: Change all r...
1998
  extern gro_result_t	napi_frags_finish(struct napi_struct *napi,
5b252f0c2   Ben Hutchings   gro: Name the GRO...
1999
2000
  					  struct sk_buff *skb,
  					  gro_result_t ret);
76620aafd   Herbert Xu   gro: New frags in...
2001
  extern struct sk_buff *	napi_frags_skb(struct napi_struct *napi);
c7c4b3b6e   Ben Hutchings   gro: Change all r...
2002
  extern gro_result_t	napi_gro_frags(struct napi_struct *napi);
76620aafd   Herbert Xu   gro: New frags in...
2003
2004
2005
2006
2007
2008
  
  static inline void napi_free_frags(struct napi_struct *napi)
  {
  	kfree_skb(napi->skb);
  	napi->skb = NULL;
  }
ab95bfe01   Jiri Pirko   net: replace hook...
2009
  extern int netdev_rx_handler_register(struct net_device *dev,
93e2c32b5   Jiri Pirko   net: add rx_handl...
2010
2011
  				      rx_handler_func_t *rx_handler,
  				      void *rx_handler_data);
ab95bfe01   Jiri Pirko   net: replace hook...
2012
  extern void netdev_rx_handler_unregister(struct net_device *dev);
c2373ee98   Mitch Williams   [PATCH] net: make...
2013
  extern int		dev_valid_name(const char *name);
881d966b4   Eric W. Biederman   [NET]: Make the d...
2014
2015
  extern int		dev_ioctl(struct net *net, unsigned int cmd, void __user *);
  extern int		dev_ethtool(struct net *net, struct ifreq *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2016
  extern unsigned		dev_get_flags(const struct net_device *);
bd3808116   Patrick McHardy   dev: support defe...
2017
  extern int		__dev_change_flags(struct net_device *, unsigned int flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2018
  extern int		dev_change_flags(struct net_device *, unsigned);
bd3808116   Patrick McHardy   dev: support defe...
2019
  extern void		__dev_notify_flags(struct net_device *, unsigned int old_flags);
cf04a4c76   Stephen Hemminger   netdev: use const...
2020
  extern int		dev_change_name(struct net_device *, const char *);
0b815a1a6   Stephen Hemminger   net: network devi...
2021
  extern int		dev_set_alias(struct net_device *, const char *, size_t);
ce286d327   Eric W. Biederman   [NET]: Implement ...
2022
2023
  extern int		dev_change_net_namespace(struct net_device *,
  						 struct net *, const char *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2024
  extern int		dev_set_mtu(struct net_device *, int);
cbda10fa9   Vlad Dogaru   net_device: add s...
2025
  extern void		dev_set_group(struct net_device *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2026
2027
  extern int		dev_set_mac_address(struct net_device *,
  					    struct sockaddr *);
f6a78bfcb   Herbert Xu   [NET]: Add generi...
2028
  extern int		dev_hard_start_xmit(struct sk_buff *skb,
fd2ea0a79   David S. Miller   net: Use queue aw...
2029
2030
  					    struct net_device *dev,
  					    struct netdev_queue *txq);
445409602   Arnd Bergmann   veth: move loopba...
2031
2032
  extern int		dev_forward_skb(struct net_device *dev,
  					struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2033

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
2034
  extern int		netdev_budget;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2035
2036
2037
  
  /* Called by rtnetlink.c:rtnl_unlock() */
  extern void netdev_run_todo(void);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2038
2039
2040
2041
  /**
   *	dev_put - release reference to device
   *	@dev: network device
   *
9ef4429b3   Benjamin Thery   [NET]: Fix dev_pu...
2042
   * Release reference to device to allow it to be freed.
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2043
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2044
2045
  static inline void dev_put(struct net_device *dev)
  {
933393f58   Christoph Lameter   percpu: Remove ir...
2046
  	this_cpu_dec(*dev->pcpu_refcnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2047
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2048
2049
2050
2051
  /**
   *	dev_hold - get reference to device
   *	@dev: network device
   *
9ef4429b3   Benjamin Thery   [NET]: Fix dev_pu...
2052
   * Hold reference to device to keep it from being freed.
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2053
   */
153330618   Stephen Hemminger   [NET]: dev_put/de...
2054
2055
  static inline void dev_hold(struct net_device *dev)
  {
933393f58   Christoph Lameter   percpu: Remove ir...
2056
  	this_cpu_inc(*dev->pcpu_refcnt);
153330618   Stephen Hemminger   [NET]: dev_put/de...
2057
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2058
2059
2060
2061
  
  /* Carrier loss detection, dial on demand. The functions netif_carrier_on
   * and _off may be called from IRQ context, but it is caller
   * who is responsible for serialization of these calls.
b00055aac   Stefan Rompf   [NET] core: add R...
2062
2063
2064
2065
   *
   * The name carrier is inappropriate, these functions should really be
   * called netif_lowerlayer_*() because they represent the state of any
   * kind of lower layer not just hardware media.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2066
2067
2068
   */
  
  extern void linkwatch_fire_event(struct net_device *dev);
e014debec   Eric Dumazet   linkwatch: linkwa...
2069
  extern void linkwatch_forget_dev(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2070

bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2071
2072
2073
2074
2075
2076
  /**
   *	netif_carrier_ok - test if carrier present
   *	@dev: network device
   *
   * Check if carrier is present on device
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2077
2078
2079
2080
  static inline int netif_carrier_ok(const struct net_device *dev)
  {
  	return !test_bit(__LINK_STATE_NOCARRIER, &dev->state);
  }
9d21493b4   Eric Dumazet   net: tx scalabili...
2081
  extern unsigned long dev_trans_start(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2082
  extern void __netdev_watchdog_up(struct net_device *dev);
0a242efc4   Denis Vlasenko   [NET]: Deinline n...
2083
  extern void netif_carrier_on(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2084

0a242efc4   Denis Vlasenko   [NET]: Deinline n...
2085
  extern void netif_carrier_off(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2086

06c4648d4   Ian Campbell   arp_notify: allow...
2087
  extern void netif_notify_peers(struct net_device *dev);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
  /**
   *	netif_dormant_on - mark device as dormant.
   *	@dev: network device
   *
   * Mark device as dormant (as per RFC2863).
   *
   * The dormant state indicates that the relevant interface is not
   * actually in a condition to pass packets (i.e., it is not 'up') but is
   * in a "pending" state, waiting for some external event.  For "on-
   * demand" interfaces, this new state identifies the situation where the
   * interface is waiting for events to place it in the up state.
   *
   */
b00055aac   Stefan Rompf   [NET] core: add R...
2101
2102
2103
2104
2105
  static inline void netif_dormant_on(struct net_device *dev)
  {
  	if (!test_and_set_bit(__LINK_STATE_DORMANT, &dev->state))
  		linkwatch_fire_event(dev);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2106
2107
2108
2109
2110
2111
  /**
   *	netif_dormant_off - set device as not dormant.
   *	@dev: network device
   *
   * Device is not in dormant state.
   */
b00055aac   Stefan Rompf   [NET] core: add R...
2112
2113
2114
2115
2116
  static inline void netif_dormant_off(struct net_device *dev)
  {
  	if (test_and_clear_bit(__LINK_STATE_DORMANT, &dev->state))
  		linkwatch_fire_event(dev);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2117
2118
2119
2120
2121
2122
  /**
   *	netif_dormant - test if carrier present
   *	@dev: network device
   *
   * Check if carrier is present on device
   */
b00055aac   Stefan Rompf   [NET] core: add R...
2123
2124
2125
2126
  static inline int netif_dormant(const struct net_device *dev)
  {
  	return test_bit(__LINK_STATE_DORMANT, &dev->state);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2127
2128
2129
2130
2131
2132
  /**
   *	netif_oper_up - test if device is operational
   *	@dev: network device
   *
   * Check if carrier is operational
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
2133
2134
  static inline int netif_oper_up(const struct net_device *dev)
  {
b00055aac   Stefan Rompf   [NET] core: add R...
2135
2136
2137
  	return (dev->operstate == IF_OPER_UP ||
  		dev->operstate == IF_OPER_UNKNOWN /* backward compat */);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
2138
2139
2140
2141
2142
2143
  /**
   *	netif_device_present - is device available or removed
   *	@dev: network device
   *
   * Check if device has not been removed from system.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2144
2145
2146
2147
  static inline int netif_device_present(struct net_device *dev)
  {
  	return test_bit(__LINK_STATE_PRESENT, &dev->state);
  }
56079431b   Denis Vlasenko   [NET]: Deinline s...
2148
  extern void netif_device_detach(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2149

56079431b   Denis Vlasenko   [NET]: Deinline s...
2150
  extern void netif_device_attach(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2151
2152
2153
2154
  
  /*
   * Network interface message level settings
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
  
  enum {
  	NETIF_MSG_DRV		= 0x0001,
  	NETIF_MSG_PROBE		= 0x0002,
  	NETIF_MSG_LINK		= 0x0004,
  	NETIF_MSG_TIMER		= 0x0008,
  	NETIF_MSG_IFDOWN	= 0x0010,
  	NETIF_MSG_IFUP		= 0x0020,
  	NETIF_MSG_RX_ERR	= 0x0040,
  	NETIF_MSG_TX_ERR	= 0x0080,
  	NETIF_MSG_TX_QUEUED	= 0x0100,
  	NETIF_MSG_INTR		= 0x0200,
  	NETIF_MSG_TX_DONE	= 0x0400,
  	NETIF_MSG_RX_STATUS	= 0x0800,
  	NETIF_MSG_PKTDATA	= 0x1000,
  	NETIF_MSG_HW		= 0x2000,
  	NETIF_MSG_WOL		= 0x4000,
  };
  
  #define netif_msg_drv(p)	((p)->msg_enable & NETIF_MSG_DRV)
  #define netif_msg_probe(p)	((p)->msg_enable & NETIF_MSG_PROBE)
  #define netif_msg_link(p)	((p)->msg_enable & NETIF_MSG_LINK)
  #define netif_msg_timer(p)	((p)->msg_enable & NETIF_MSG_TIMER)
  #define netif_msg_ifdown(p)	((p)->msg_enable & NETIF_MSG_IFDOWN)
  #define netif_msg_ifup(p)	((p)->msg_enable & NETIF_MSG_IFUP)
  #define netif_msg_rx_err(p)	((p)->msg_enable & NETIF_MSG_RX_ERR)
  #define netif_msg_tx_err(p)	((p)->msg_enable & NETIF_MSG_TX_ERR)
  #define netif_msg_tx_queued(p)	((p)->msg_enable & NETIF_MSG_TX_QUEUED)
  #define netif_msg_intr(p)	((p)->msg_enable & NETIF_MSG_INTR)
  #define netif_msg_tx_done(p)	((p)->msg_enable & NETIF_MSG_TX_DONE)
  #define netif_msg_rx_status(p)	((p)->msg_enable & NETIF_MSG_RX_STATUS)
  #define netif_msg_pktdata(p)	((p)->msg_enable & NETIF_MSG_PKTDATA)
  #define netif_msg_hw(p)		((p)->msg_enable & NETIF_MSG_HW)
  #define netif_msg_wol(p)	((p)->msg_enable & NETIF_MSG_WOL)
  
  static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits)
  {
  	/* use default */
  	if (debug_value < 0 || debug_value >= (sizeof(u32) * 8))
  		return default_msg_enable_bits;
  	if (debug_value == 0)	/* no output */
  		return 0;
  	/* set low N bits */
  	return (1 << debug_value) - 1;
  }
c773e847e   David S. Miller   netdev: Move _xmi...
2200
  static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu)
932ff279a   Herbert Xu   [NET]: Add netif_...
2201
  {
c773e847e   David S. Miller   netdev: Move _xmi...
2202
2203
  	spin_lock(&txq->_xmit_lock);
  	txq->xmit_lock_owner = cpu;
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
2204
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
2205
2206
2207
2208
2209
  static inline void __netif_tx_lock_bh(struct netdev_queue *txq)
  {
  	spin_lock_bh(&txq->_xmit_lock);
  	txq->xmit_lock_owner = smp_processor_id();
  }
c3f26a269   David S. Miller   netdev: Fix lockd...
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
  static inline int __netif_tx_trylock(struct netdev_queue *txq)
  {
  	int ok = spin_trylock(&txq->_xmit_lock);
  	if (likely(ok))
  		txq->xmit_lock_owner = smp_processor_id();
  	return ok;
  }
  
  static inline void __netif_tx_unlock(struct netdev_queue *txq)
  {
  	txq->xmit_lock_owner = -1;
  	spin_unlock(&txq->_xmit_lock);
  }
  
  static inline void __netif_tx_unlock_bh(struct netdev_queue *txq)
  {
  	txq->xmit_lock_owner = -1;
  	spin_unlock_bh(&txq->_xmit_lock);
  }
08baf5610   Eric Dumazet   net: txq_trans_up...
2229
2230
2231
2232
2233
  static inline void txq_trans_update(struct netdev_queue *txq)
  {
  	if (txq->xmit_lock_owner != -1)
  		txq->trans_start = jiffies;
  }
d29f749e2   Dave Jones   net: Fix build fa...
2234
2235
2236
  /**
   *	netif_tx_lock - grab network device transmit lock
   *	@dev: network device
d29f749e2   Dave Jones   net: Fix build fa...
2237
2238
2239
   *
   * Get network device transmit lock
   */
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
2240
2241
  static inline void netif_tx_lock(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
2242
  	unsigned int i;
c3f26a269   David S. Miller   netdev: Fix lockd...
2243
  	int cpu;
c773e847e   David S. Miller   netdev: Move _xmi...
2244

c3f26a269   David S. Miller   netdev: Fix lockd...
2245
2246
  	spin_lock(&dev->tx_global_lock);
  	cpu = smp_processor_id();
e8a0464cc   David S. Miller   netdev: Allocate ...
2247
2248
  	for (i = 0; i < dev->num_tx_queues; i++) {
  		struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
c3f26a269   David S. Miller   netdev: Fix lockd...
2249
2250
2251
2252
2253
2254
2255
  
  		/* We are the only thread of execution doing a
  		 * freeze, but we have to grab the _xmit_lock in
  		 * order to synchronize with threads which are in
  		 * the ->hard_start_xmit() handler and already
  		 * checked the frozen bit.
  		 */
e8a0464cc   David S. Miller   netdev: Allocate ...
2256
  		__netif_tx_lock(txq, cpu);
c3f26a269   David S. Miller   netdev: Fix lockd...
2257
2258
  		set_bit(__QUEUE_STATE_FROZEN, &txq->state);
  		__netif_tx_unlock(txq);
e8a0464cc   David S. Miller   netdev: Allocate ...
2259
  	}
932ff279a   Herbert Xu   [NET]: Add netif_...
2260
2261
2262
2263
  }
  
  static inline void netif_tx_lock_bh(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
2264
2265
  	local_bh_disable();
  	netif_tx_lock(dev);
932ff279a   Herbert Xu   [NET]: Add netif_...
2266
  }
932ff279a   Herbert Xu   [NET]: Add netif_...
2267
2268
  static inline void netif_tx_unlock(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
2269
2270
2271
2272
  	unsigned int i;
  
  	for (i = 0; i < dev->num_tx_queues; i++) {
  		struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
c773e847e   David S. Miller   netdev: Move _xmi...
2273

c3f26a269   David S. Miller   netdev: Fix lockd...
2274
2275
2276
2277
2278
  		/* No need to grab the _xmit_lock here.  If the
  		 * queue is not stopped for another reason, we
  		 * force a schedule.
  		 */
  		clear_bit(__QUEUE_STATE_FROZEN, &txq->state);
7b3d3e4fc   Krishna Kumar   netdevice: Consol...
2279
  		netif_schedule_queue(txq);
c3f26a269   David S. Miller   netdev: Fix lockd...
2280
2281
  	}
  	spin_unlock(&dev->tx_global_lock);
932ff279a   Herbert Xu   [NET]: Add netif_...
2282
2283
2284
2285
  }
  
  static inline void netif_tx_unlock_bh(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
2286
2287
  	netif_tx_unlock(dev);
  	local_bh_enable();
932ff279a   Herbert Xu   [NET]: Add netif_...
2288
  }
c773e847e   David S. Miller   netdev: Move _xmi...
2289
  #define HARD_TX_LOCK(dev, txq, cpu) {			\
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
2290
  	if ((dev->features & NETIF_F_LLTX) == 0) {	\
c773e847e   David S. Miller   netdev: Move _xmi...
2291
  		__netif_tx_lock(txq, cpu);		\
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
2292
2293
  	}						\
  }
c773e847e   David S. Miller   netdev: Move _xmi...
2294
  #define HARD_TX_UNLOCK(dev, txq) {			\
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
2295
  	if ((dev->features & NETIF_F_LLTX) == 0) {	\
c773e847e   David S. Miller   netdev: Move _xmi...
2296
  		__netif_tx_unlock(txq);			\
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
2297
2298
  	}						\
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2299
2300
  static inline void netif_tx_disable(struct net_device *dev)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
2301
  	unsigned int i;
c3f26a269   David S. Miller   netdev: Fix lockd...
2302
  	int cpu;
fd2ea0a79   David S. Miller   net: Use queue aw...
2303

c3f26a269   David S. Miller   netdev: Fix lockd...
2304
2305
  	local_bh_disable();
  	cpu = smp_processor_id();
fd2ea0a79   David S. Miller   net: Use queue aw...
2306
2307
  	for (i = 0; i < dev->num_tx_queues; i++) {
  		struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
c3f26a269   David S. Miller   netdev: Fix lockd...
2308
2309
  
  		__netif_tx_lock(txq, cpu);
fd2ea0a79   David S. Miller   net: Use queue aw...
2310
  		netif_tx_stop_queue(txq);
c3f26a269   David S. Miller   netdev: Fix lockd...
2311
  		__netif_tx_unlock(txq);
fd2ea0a79   David S. Miller   net: Use queue aw...
2312
  	}
c3f26a269   David S. Miller   netdev: Fix lockd...
2313
  	local_bh_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2314
  }
e308a5d80   David S. Miller   netdev: Add netde...
2315
2316
2317
2318
  static inline void netif_addr_lock(struct net_device *dev)
  {
  	spin_lock(&dev->addr_list_lock);
  }
2429f7ac2   Jiri Pirko   net: introduce ne...
2319
2320
2321
2322
  static inline void netif_addr_lock_nested(struct net_device *dev)
  {
  	spin_lock_nested(&dev->addr_list_lock, SINGLE_DEPTH_NESTING);
  }
e308a5d80   David S. Miller   netdev: Add netde...
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
  static inline void netif_addr_lock_bh(struct net_device *dev)
  {
  	spin_lock_bh(&dev->addr_list_lock);
  }
  
  static inline void netif_addr_unlock(struct net_device *dev)
  {
  	spin_unlock(&dev->addr_list_lock);
  }
  
  static inline void netif_addr_unlock_bh(struct net_device *dev)
  {
  	spin_unlock_bh(&dev->addr_list_lock);
  }
f001fde5e   Jiri Pirko   net: introduce a ...
2337
  /*
31278e714   Jiri Pirko   net: group addres...
2338
   * dev_addrs walker. Should be used only for read access. Call with
f001fde5e   Jiri Pirko   net: introduce a ...
2339
2340
2341
   * rcu_read_lock held.
   */
  #define for_each_dev_addr(dev, ha) \
31278e714   Jiri Pirko   net: group addres...
2342
  		list_for_each_entry_rcu(ha, &dev->dev_addrs.list, list)
f001fde5e   Jiri Pirko   net: introduce a ...
2343

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2344
2345
2346
2347
2348
  /* These functions live elsewhere (drivers/net/net_init.c, but related) */
  
  extern void		ether_setup(struct net_device *dev);
  
  /* Support for loadable net-drivers */
36909ea43   Tom Herbert   net: Add alloc_ne...
2349
  extern struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2350
  				       void (*setup)(struct net_device *),
36909ea43   Tom Herbert   net: Add alloc_ne...
2351
  				       unsigned int txqs, unsigned int rxqs);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
2352
  #define alloc_netdev(sizeof_priv, name, setup) \
36909ea43   Tom Herbert   net: Add alloc_ne...
2353
2354
2355
2356
  	alloc_netdev_mqs(sizeof_priv, name, setup, 1, 1)
  
  #define alloc_netdev_mq(sizeof_priv, name, setup, count) \
  	alloc_netdev_mqs(sizeof_priv, name, setup, count, count)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2357
2358
  extern int		register_netdev(struct net_device *dev);
  extern void		unregister_netdev(struct net_device *dev);
f001fde5e   Jiri Pirko   net: introduce a ...
2359

22bedad3c   Jiri Pirko   net: convert mult...
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
  /* General hardware address lists handling functions */
  extern int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list,
  				  struct netdev_hw_addr_list *from_list,
  				  int addr_len, unsigned char addr_type);
  extern void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list,
  				   struct netdev_hw_addr_list *from_list,
  				   int addr_len, unsigned char addr_type);
  extern int __hw_addr_sync(struct netdev_hw_addr_list *to_list,
  			  struct netdev_hw_addr_list *from_list,
  			  int addr_len);
  extern void __hw_addr_unsync(struct netdev_hw_addr_list *to_list,
  			     struct netdev_hw_addr_list *from_list,
  			     int addr_len);
  extern void __hw_addr_flush(struct netdev_hw_addr_list *list);
  extern void __hw_addr_init(struct netdev_hw_addr_list *list);
f001fde5e   Jiri Pirko   net: introduce a ...
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
  /* Functions used for device addresses handling */
  extern int dev_addr_add(struct net_device *dev, unsigned char *addr,
  			unsigned char addr_type);
  extern int dev_addr_del(struct net_device *dev, unsigned char *addr,
  			unsigned char addr_type);
  extern int dev_addr_add_multiple(struct net_device *to_dev,
  				 struct net_device *from_dev,
  				 unsigned char addr_type);
  extern int dev_addr_del_multiple(struct net_device *to_dev,
  				 struct net_device *from_dev,
  				 unsigned char addr_type);
a748ee242   Jiri Pirko   net: move address...
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
  extern void dev_addr_flush(struct net_device *dev);
  extern int dev_addr_init(struct net_device *dev);
  
  /* Functions used for unicast addresses handling */
  extern int dev_uc_add(struct net_device *dev, unsigned char *addr);
  extern int dev_uc_del(struct net_device *dev, unsigned char *addr);
  extern int dev_uc_sync(struct net_device *to, struct net_device *from);
  extern void dev_uc_unsync(struct net_device *to, struct net_device *from);
  extern void dev_uc_flush(struct net_device *dev);
  extern void dev_uc_init(struct net_device *dev);
f001fde5e   Jiri Pirko   net: introduce a ...
2396

22bedad3c   Jiri Pirko   net: convert mult...
2397
2398
2399
2400
2401
2402
2403
2404
2405
  /* Functions used for multicast addresses handling */
  extern int dev_mc_add(struct net_device *dev, unsigned char *addr);
  extern int dev_mc_add_global(struct net_device *dev, unsigned char *addr);
  extern int dev_mc_del(struct net_device *dev, unsigned char *addr);
  extern int dev_mc_del_global(struct net_device *dev, unsigned char *addr);
  extern int dev_mc_sync(struct net_device *to, struct net_device *from);
  extern void dev_mc_unsync(struct net_device *to, struct net_device *from);
  extern void dev_mc_flush(struct net_device *dev);
  extern void dev_mc_init(struct net_device *dev);
f001fde5e   Jiri Pirko   net: introduce a ...
2406

4417da668   Patrick McHardy   [NET]: dev: secon...
2407
2408
2409
  /* Functions used for secondary unicast and multicast support */
  extern void		dev_set_rx_mode(struct net_device *dev);
  extern void		__dev_set_rx_mode(struct net_device *dev);
dad9b335c   Wang Chen   netdevice: Fix pr...
2410
2411
  extern int		dev_set_promiscuity(struct net_device *dev, int inc);
  extern int		dev_set_allmulti(struct net_device *dev, int inc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2412
  extern void		netdev_state_change(struct net_device *dev);
3ca5b4042   Jiri Pirko   bonding: check re...
2413
  extern int		netdev_bonding_change(struct net_device *dev,
75c78500d   Moni Shoua   bonding: remap mu...
2414
  					      unsigned long event);
d8a33ac43   Stephen Hemminger   [BRIDGE]: feature...
2415
  extern void		netdev_features_change(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2416
  /* Load a device via the kmod */
881d966b4   Eric W. Biederman   [NET]: Make the d...
2417
  extern void		dev_load(struct net *net, const char *name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2418
  extern void		dev_mcast_init(void);
d77535162   Ben Hutchings   net: Document tha...
2419
2420
  extern struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
  					       struct rtnl_link_stats64 *storage);
eeda3fd64   Stephen Hemminger   netdev: introduce...
2421

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2422
  extern int		netdev_max_backlog;
3b098e2d7   Eric Dumazet   net: Consistent s...
2423
  extern int		netdev_tstamp_prequeue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2424
  extern int		weight_p;
0a14842f5   Eric Dumazet   net: filter: Just...
2425
  extern int		bpf_jit_enable;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2426
  extern int		netdev_set_master(struct net_device *dev, struct net_device *master);
1765a5753   Jiri Pirko   net: make dev->ma...
2427
2428
  extern int netdev_set_bond_master(struct net_device *dev,
  				  struct net_device *master);
84fa7933a   Patrick McHardy   [NET]: Replace CH...
2429
  extern int skb_checksum_help(struct sk_buff *skb);
c8f44affb   Michał Mirosław   net: introduce an...
2430
2431
  extern struct sk_buff *skb_gso_segment(struct sk_buff *skb,
  	netdev_features_t features);
fb286bb29   Herbert Xu   [NET]: Detect har...
2432
2433
2434
2435
2436
2437
2438
  #ifdef CONFIG_BUG
  extern void netdev_rx_csum_fault(struct net_device *dev);
  #else
  static inline void netdev_rx_csum_fault(struct net_device *dev)
  {
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2439
2440
2441
  /* rx skb timestamps */
  extern void		net_enable_timestamp(void);
  extern void		net_disable_timestamp(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
2442
2443
2444
2445
  #ifdef CONFIG_PROC_FS
  extern void *dev_seq_start(struct seq_file *seq, loff_t *pos);
  extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos);
  extern void dev_seq_stop(struct seq_file *seq, void *v);
5cac98dd0   Anton Blanchard   net: Fix corrupti...
2446
2447
  extern int dev_seq_open_ops(struct inode *inode, struct file *file,
  			    const struct seq_operations *ops);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
2448
  #endif
b8a9787ed   Jay Vosburgh   bonding: Allow se...
2449
2450
  extern int netdev_class_create_file(struct class_attribute *class_attr);
  extern void netdev_class_remove_file(struct class_attribute *class_attr);
046007949   Johannes Berg   cfg80211: support...
2451
  extern struct kobj_ns_type_operations net_ns_type_operations;
3019de124   David S. Miller   net: Rework netde...
2452
  extern const char *netdev_drivername(const struct net_device *dev);
6579e57b3   Arjan van de Ven   net: Print the mo...
2453

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
2454
  extern void linkwatch_run_queue(void);
c8f44affb   Michał Mirosław   net: introduce an...
2455
2456
  static inline netdev_features_t netdev_get_wanted_features(
  	struct net_device *dev)
5455c6998   Michał Mirosław   net: Introduce ne...
2457
2458
2459
  {
  	return (dev->features & ~dev->hw_features) | dev->wanted_features;
  }
c8f44affb   Michał Mirosław   net: introduce an...
2460
2461
  netdev_features_t netdev_increment_features(netdev_features_t all,
  	netdev_features_t one, netdev_features_t mask);
6cb6a27c4   Michał Mirosław   net: Call netdev_...
2462
  int __netdev_update_features(struct net_device *dev);
5455c6998   Michał Mirosław   net: Introduce ne...
2463
  void netdev_update_features(struct net_device *dev);
afe12cc86   Michał Mirosław   net: introduce ne...
2464
  void netdev_change_features(struct net_device *dev);
7f353bf29   Herbert Xu   [NET]: Share corr...
2465

fc4a74896   Patrick Mullaney   netdevice: provid...
2466
2467
  void netif_stacked_transfer_operstate(const struct net_device *rootdev,
  					struct net_device *dev);
c8f44affb   Michał Mirosław   net: introduce an...
2468
  netdev_features_t netif_skb_features(struct sk_buff *skb);
58e998c6d   Jesse Gross   offloading: Force...
2469

c8f44affb   Michał Mirosław   net: introduce an...
2470
  static inline int net_gso_ok(netdev_features_t features, int gso_type)
576a30eb6   Herbert Xu   [NET]: Added GSO ...
2471
  {
c8f44affb   Michał Mirosław   net: introduce an...
2472
  	netdev_features_t feature = gso_type << NETIF_F_GSO_SHIFT;
0345e1864   Michał Mirosław   net: verify GSO f...
2473
2474
2475
2476
2477
2478
2479
2480
  
  	/* check flags correspondence */
  	BUILD_BUG_ON(SKB_GSO_TCPV4   != (NETIF_F_TSO >> NETIF_F_GSO_SHIFT));
  	BUILD_BUG_ON(SKB_GSO_UDP     != (NETIF_F_UFO >> NETIF_F_GSO_SHIFT));
  	BUILD_BUG_ON(SKB_GSO_DODGY   != (NETIF_F_GSO_ROBUST >> NETIF_F_GSO_SHIFT));
  	BUILD_BUG_ON(SKB_GSO_TCP_ECN != (NETIF_F_TSO_ECN >> NETIF_F_GSO_SHIFT));
  	BUILD_BUG_ON(SKB_GSO_TCPV6   != (NETIF_F_TSO6 >> NETIF_F_GSO_SHIFT));
  	BUILD_BUG_ON(SKB_GSO_FCOE    != (NETIF_F_FSO >> NETIF_F_GSO_SHIFT));
d6b4991ad   Herbert Xu   [NET]: Fix logica...
2481
  	return (features & feature) == feature;
576a30eb6   Herbert Xu   [NET]: Added GSO ...
2482
  }
c8f44affb   Michał Mirosław   net: introduce an...
2483
  static inline int skb_gso_ok(struct sk_buff *skb, netdev_features_t features)
bcd761111   Herbert Xu   [NET]: Generalise...
2484
  {
278b2513f   Herbert Xu   gso: Stop fraglis...
2485
  	return net_gso_ok(features, skb_shinfo(skb)->gso_type) &&
21dc33015   David S. Miller   net: Rename skb_h...
2486
  	       (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST));
bcd761111   Herbert Xu   [NET]: Generalise...
2487
  }
c8f44affb   Michał Mirosław   net: introduce an...
2488
2489
  static inline int netif_needs_gso(struct sk_buff *skb,
  	netdev_features_t features)
7967168ce   Herbert Xu   [NET]: Merge TSO/...
2490
  {
fc741216d   Jesse Gross   net offloading: P...
2491
2492
  	return skb_is_gso(skb) && (!skb_gso_ok(skb, features) ||
  		unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
7967168ce   Herbert Xu   [NET]: Merge TSO/...
2493
  }
82cc1a7a5   Peter P Waskiewicz Jr   [NET]: Add per-co...
2494
2495
2496
2497
2498
  static inline void netif_set_gso_max_size(struct net_device *dev,
  					  unsigned int size)
  {
  	dev->gso_max_size = size;
  }
1765a5753   Jiri Pirko   net: make dev->ma...
2499
2500
2501
2502
  static inline int netif_is_bond_slave(struct net_device *dev)
  {
  	return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING;
  }
505d4f73d   Eric W. Biederman   net: Guaranetee t...
2503
  extern struct pernet_operations __net_initdata loopback_net_ops;
b1b67dd45   Patrick McHardy   net: factor out e...
2504

571ba4230   Joe Perches   netdevice.h: Add ...
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
  /* Logging, debugging and troubleshooting/diagnostic helpers. */
  
  /* netdev_printk helpers, similar to dev_printk */
  
  static inline const char *netdev_name(const struct net_device *dev)
  {
  	if (dev->reg_state != NETREG_REGISTERED)
  		return "(unregistered net_device)";
  	return dev->name;
  }
ffa10cb47   Jason Baron   dynamic_debug: ma...
2515
2516
  extern int __netdev_printk(const char *level, const struct net_device *dev,
  			struct va_format *vaf);
b9075fa96   Joe Perches   treewide: use __p...
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
  extern __printf(3, 4)
  int netdev_printk(const char *level, const struct net_device *dev,
  		  const char *format, ...);
  extern __printf(2, 3)
  int netdev_emerg(const struct net_device *dev, const char *format, ...);
  extern __printf(2, 3)
  int netdev_alert(const struct net_device *dev, const char *format, ...);
  extern __printf(2, 3)
  int netdev_crit(const struct net_device *dev, const char *format, ...);
  extern __printf(2, 3)
  int netdev_err(const struct net_device *dev, const char *format, ...);
  extern __printf(2, 3)
  int netdev_warn(const struct net_device *dev, const char *format, ...);
  extern __printf(2, 3)
  int netdev_notice(const struct net_device *dev, const char *format, ...);
  extern __printf(2, 3)
  int netdev_info(const struct net_device *dev, const char *format, ...);
571ba4230   Joe Perches   netdevice.h: Add ...
2534

8909c9ad8   Vasiliy Kulikov   net: don't allow ...
2535
2536
  #define MODULE_ALIAS_NETDEV(device) \
  	MODULE_ALIAS("netdev-" device)
571ba4230   Joe Perches   netdevice.h: Add ...
2537
2538
2539
2540
2541
2542
  #if defined(DEBUG)
  #define netdev_dbg(__dev, format, args...)			\
  	netdev_printk(KERN_DEBUG, __dev, format, ##args)
  #elif defined(CONFIG_DYNAMIC_DEBUG)
  #define netdev_dbg(__dev, format, args...)			\
  do {								\
ffa10cb47   Jason Baron   dynamic_debug: ma...
2543
  	dynamic_netdev_dbg(__dev, format, ##args);		\
571ba4230   Joe Perches   netdevice.h: Add ...
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
  } while (0)
  #else
  #define netdev_dbg(__dev, format, args...)			\
  ({								\
  	if (0)							\
  		netdev_printk(KERN_DEBUG, __dev, format, ##args); \
  	0;							\
  })
  #endif
  
  #if defined(VERBOSE_DEBUG)
  #define netdev_vdbg	netdev_dbg
  #else
  
  #define netdev_vdbg(dev, format, args...)			\
  ({								\
  	if (0)							\
  		netdev_printk(KERN_DEBUG, dev, format, ##args);	\
  	0;							\
  })
  #endif
  
  /*
   * netdev_WARN() acts like dev_printk(), but with the key difference
   * of using a WARN/WARN_ON to get the message out, including the
   * file/line information and a backtrace.
   */
  #define netdev_WARN(dev, format, args...)			\
  	WARN(1, "netdevice: %s
  " format, netdev_name(dev), ##args);
b3d95c5c9   Joe Perches   include/linux/net...
2574
2575
2576
2577
2578
2579
2580
  /* netif printk helpers, similar to netdev_printk */
  
  #define netif_printk(priv, type, level, dev, fmt, args...)	\
  do {					  			\
  	if (netif_msg_##type(priv))				\
  		netdev_printk(level, (dev), fmt, ##args);	\
  } while (0)
f45f4321d   Joe Perches   netdevice.h: Chan...
2581
2582
2583
2584
2585
  #define netif_level(level, priv, type, dev, fmt, args...)	\
  do {								\
  	if (netif_msg_##type(priv))				\
  		netdev_##level(dev, fmt, ##args);		\
  } while (0)
b3d95c5c9   Joe Perches   include/linux/net...
2586
  #define netif_emerg(priv, type, dev, fmt, args...)		\
f45f4321d   Joe Perches   netdevice.h: Chan...
2587
  	netif_level(emerg, priv, type, dev, fmt, ##args)
b3d95c5c9   Joe Perches   include/linux/net...
2588
  #define netif_alert(priv, type, dev, fmt, args...)		\
f45f4321d   Joe Perches   netdevice.h: Chan...
2589
  	netif_level(alert, priv, type, dev, fmt, ##args)
b3d95c5c9   Joe Perches   include/linux/net...
2590
  #define netif_crit(priv, type, dev, fmt, args...)		\
f45f4321d   Joe Perches   netdevice.h: Chan...
2591
  	netif_level(crit, priv, type, dev, fmt, ##args)
b3d95c5c9   Joe Perches   include/linux/net...
2592
  #define netif_err(priv, type, dev, fmt, args...)		\
f45f4321d   Joe Perches   netdevice.h: Chan...
2593
  	netif_level(err, priv, type, dev, fmt, ##args)
b3d95c5c9   Joe Perches   include/linux/net...
2594
  #define netif_warn(priv, type, dev, fmt, args...)		\
f45f4321d   Joe Perches   netdevice.h: Chan...
2595
  	netif_level(warn, priv, type, dev, fmt, ##args)
b3d95c5c9   Joe Perches   include/linux/net...
2596
  #define netif_notice(priv, type, dev, fmt, args...)		\
f45f4321d   Joe Perches   netdevice.h: Chan...
2597
  	netif_level(notice, priv, type, dev, fmt, ##args)
b3d95c5c9   Joe Perches   include/linux/net...
2598
  #define netif_info(priv, type, dev, fmt, args...)		\
f45f4321d   Joe Perches   netdevice.h: Chan...
2599
  	netif_level(info, priv, type, dev, fmt, ##args)
b3d95c5c9   Joe Perches   include/linux/net...
2600
2601
2602
2603
2604
2605
2606
2607
  
  #if defined(DEBUG)
  #define netif_dbg(priv, type, dev, format, args...)		\
  	netif_printk(priv, type, KERN_DEBUG, dev, format, ##args)
  #elif defined(CONFIG_DYNAMIC_DEBUG)
  #define netif_dbg(priv, type, netdev, format, args...)		\
  do {								\
  	if (netif_msg_##type(priv))				\
b5fb0a032   Jason Baron   dynamic_debug: ma...
2608
  		dynamic_netdev_dbg(netdev, format, ##args);	\
b3d95c5c9   Joe Perches   include/linux/net...
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
  } while (0)
  #else
  #define netif_dbg(priv, type, dev, format, args...)			\
  ({									\
  	if (0)								\
  		netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \
  	0;								\
  })
  #endif
  
  #if defined(VERBOSE_DEBUG)
bcfcc450b   Ben Hutchings   net: Fix definiti...
2620
  #define netif_vdbg	netif_dbg
b3d95c5c9   Joe Perches   include/linux/net...
2621
2622
2623
2624
  #else
  #define netif_vdbg(priv, type, dev, format, args...)		\
  ({								\
  	if (0)							\
a4ed89cb9   Ben Hutchings   net: Fix definiti...
2625
  		netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \
b3d95c5c9   Joe Perches   include/linux/net...
2626
2627
2628
  	0;							\
  })
  #endif
571ba4230   Joe Perches   netdevice.h: Add ...
2629

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2630
  #endif /* __KERNEL__ */
385a154ca   Jiri Pirko   net: correct a co...
2631
  #endif	/* _LINUX_NETDEVICE_H */