Blame view

include/linux/netdevice.h 56.5 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
31
32
   *		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>
  
  #ifdef __KERNEL__
d7fe0f241   Al Viro   [PATCH] severing ...
33
  #include <linux/timer.h>
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
34
  #include <linux/delay.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
  #include <asm/atomic.h>
  #include <asm/cache.h>
  #include <asm/byteorder.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
  #include <linux/device.h>
  #include <linux/percpu.h>
db2173348   Chris Leech   [I/OAT]: Setup th...
40
  #include <linux/dmaengine.h>
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
41
  #include <linux/workqueue.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42

a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
43
  #include <net/net_namespace.h>
cf85d08fd   Lennert Buytenhek   dsa: add support ...
44
  #include <net/dsa.h>
7a6b6f515   Jeff Kirsher   DCB: fix kconfig ...
45
  #ifdef CONFIG_DCB
2f90b8657   Alexander Duyck   ixgbe: this patch...
46
47
  #include <net/dcbnl.h>
  #endif
a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
48

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
  struct vlan_group;
  struct ethtool_ops;
115c1d6e6   Jeff Moyer   [NETPOLL]: Introd...
51
  struct netpoll_info;
704232c27   Johannes Berg   [WIRELESS] cfg802...
52
53
  /* 802.11 specific */
  struct wireless_dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
60
61
62
63
64
65
66
  					/* source back-compat hooks */
  #define SET_ETHTOOL_OPS(netdev,ops) \
  	( (netdev)->ethtool_ops = (ops) )
  
  #define HAVE_ALLOC_NETDEV		/* feature macro: alloc_xxxdev
  					   functions are available. */
  #define HAVE_FREE_NETDEV		/* free_netdev() */
  #define HAVE_NETDEV_PRIV		/* netdev_priv() */
  
  #define NET_XMIT_SUCCESS	0
  #define NET_XMIT_DROP		1	/* skb dropped			*/
  #define NET_XMIT_CN		2	/* congestion notification	*/
  #define NET_XMIT_POLICED	3	/* skb is shot by police	*/
378a2f090   Jarek Poplawski   net_sched: Add qd...
67
  #define NET_XMIT_MASK		0xFFFF	/* qdisc flags in net/sch_generic.h */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
71
72
73
74
75
  
  /* Backlog congestion levels */
  #define NET_RX_SUCCESS		0   /* keep 'em coming, baby */
  #define NET_RX_DROP		1  /* packet dropped */
  #define NET_RX_CN_LOW		2   /* storm alert, just in case */
  #define NET_RX_CN_MOD		3   /* Storm on its way! */
  #define NET_RX_CN_HIGH		4   /* The storm is here */
  #define NET_RX_BAD		5  /* packet dropped due to kernel error */
b9df3cb8c   Gerrit Renker   [TCP/DCCP]: Intro...
76
77
78
79
  /* 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. */
  #define net_xmit_eval(e)	((e) == NET_XMIT_CN? 0 : (e))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
84
85
86
87
88
89
  #define net_xmit_errno(e)	((e) != NET_XMIT_CN ? -ENOBUFS : 0)
  
  #endif
  
  #define MAX_ADDR_LEN	32		/* Largest hardware address length */
  
  /* Driver transmit return codes */
  #define NETDEV_TX_OK 0		/* driver took care of packet */
  #define NETDEV_TX_BUSY 1	/* driver tx path was busy*/
  #define NETDEV_TX_LOCKED -1	/* driver tx lock was already taken */
c88e6f51c   Adrian Bunk   include/linux/net...
90
  #ifdef  __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
93
94
95
  /*
   *	Compute the worst case header length according to the protocols
   *	used.
   */
   
8388e3da3   David S. Miller   net: Set LL_MAX_H...
96
97
98
99
100
101
102
103
  #if defined(CONFIG_WLAN_80211) || defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
  # if defined(CONFIG_MAC80211_MESH)
  #  define LL_MAX_HEADER 128
  # else
  #  define LL_MAX_HEADER 96
  # endif
  #elif defined(CONFIG_TR)
  # define LL_MAX_HEADER 48
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
  #else
8388e3da3   David S. Miller   net: Set LL_MAX_H...
105
  # define LL_MAX_HEADER 32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
  #endif
e81c73596   David S. Miller   [NET]: Fix MAX_HE...
107
108
109
110
  #if !defined(CONFIG_NET_IPIP) && !defined(CONFIG_NET_IPIP_MODULE) && \
      !defined(CONFIG_NET_IPGRE) &&  !defined(CONFIG_NET_IPGRE_MODULE) && \
      !defined(CONFIG_IPV6_SIT) && !defined(CONFIG_IPV6_SIT_MODULE) && \
      !defined(CONFIG_IPV6_TUNNEL) && !defined(CONFIG_IPV6_TUNNEL_MODULE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
114
  #define MAX_HEADER LL_MAX_HEADER
  #else
  #define MAX_HEADER (LL_MAX_HEADER + 48)
  #endif
c88e6f51c   Adrian Bunk   include/linux/net...
115
  #endif  /*  __KERNEL__  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
  /*
   *	Network device statistics. Akin to the 2.0 ether stats but
   *	with byte counters.
   */
   
  struct net_device_stats
  {
  	unsigned long	rx_packets;		/* total packets received	*/
  	unsigned long	tx_packets;		/* total packets transmitted	*/
  	unsigned long	rx_bytes;		/* total bytes received 	*/
  	unsigned long	tx_bytes;		/* total bytes transmitted	*/
  	unsigned long	rx_errors;		/* bad packets received		*/
  	unsigned long	tx_errors;		/* packet transmit problems	*/
  	unsigned long	rx_dropped;		/* no space in linux buffers	*/
  	unsigned long	tx_dropped;		/* no space available in linux	*/
  	unsigned long	multicast;		/* multicast packets received	*/
  	unsigned long	collisions;
  
  	/* detailed rx_errors: */
  	unsigned long	rx_length_errors;
  	unsigned long	rx_over_errors;		/* receiver ring buff overflow	*/
  	unsigned long	rx_crc_errors;		/* recved pkt with crc error	*/
  	unsigned long	rx_frame_errors;	/* recv'd frame alignment error */
  	unsigned long	rx_fifo_errors;		/* recv'r fifo overrun		*/
  	unsigned long	rx_missed_errors;	/* receiver missed packet	*/
  
  	/* detailed tx_errors */
  	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;
  	
  	/* for cslip etc */
  	unsigned long	rx_compressed;
  	unsigned long	tx_compressed;
  };
  
  
  /* 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>
  
  struct neighbour;
  struct neigh_parms;
  struct sk_buff;
  
  struct netif_rx_stats
  {
  	unsigned total;
  	unsigned dropped;
  	unsigned time_squeeze;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
181
182
183
  	unsigned cpu_collision;
  };
  
  DECLARE_PER_CPU(struct netif_rx_stats, netdev_rx_stat);
bf742482d   Patrick McHardy   [NET]: dev: intro...
184
185
186
187
188
  struct dev_addr_list
  {
  	struct dev_addr_list	*next;
  	u8			da_addr[MAX_ADDR_LEN];
  	u8			da_addrlen;
a0a400d79   Patrick McHardy   [NET]: dev_mcast:...
189
  	u8			da_synced;
bf742482d   Patrick McHardy   [NET]: dev: intro...
190
191
192
  	int			da_users;
  	int			da_gusers;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
194
195
196
  
  /*
   *	We tag multicasts with these structures.
   */
3fba5a8b1   Patrick McHardy   [NET]: dev_mcast:...
197
198
199
200
201
202
  
  #define dev_mc_list	dev_addr_list
  #define dmi_addr	da_addr
  #define dmi_addrlen	da_addrlen
  #define dmi_users	da_users
  #define dmi_gusers	da_gusers
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
204
205
206
207
  
  struct hh_cache
  {
  	struct hh_cache *hh_next;	/* Next entry			     */
  	atomic_t	hh_refcnt;	/* number of users                   */
f0490980a   Eric Dumazet   [NET]: Force a ca...
208
209
210
211
212
213
214
215
  /*
   * We want hh_output, hh_len, hh_lock and hh_data be a in a separate
   * cache line on SMP.
   * They are mostly read, but hh_refcnt may be changed quite frequently,
   * incurring cache line ping pongs.
   */
  	__be16		hh_type ____cacheline_aligned_in_smp;
  					/* protocol identifier, f.e ETH_P_IP
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216
217
218
                                           *  NOTE:  For VLANs, this will be the
                                           *  encapuslated type. --BLG
                                           */
d5c42c0ec   Arnaldo Carvalho de Melo   [NET]: Pack struc...
219
  	u16		hh_len;		/* length of header */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
  	int		(*hh_output)(struct sk_buff *skb);
3644f0cee   Stephen Hemminger   [NET]: Convert hh...
221
  	seqlock_t	hh_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
223
224
225
  
  	/* 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...
226
  	(HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
228
229
230
231
232
233
234
235
236
237
238
  #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.
f5184d267   Johannes Berg   net: Allow netdev...
239
240
241
   *
   * LL_ALLOCATED_SPACE also takes into account the tailroom the device
   * may need.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
   */
  #define LL_RESERVED_SPACE(dev) \
f5184d267   Johannes Berg   net: Allow netdev...
244
  	((((dev)->hard_header_len+(dev)->needed_headroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
  #define LL_RESERVED_SPACE_EXTRA(dev,extra) \
f5184d267   Johannes Berg   net: Allow netdev...
246
247
248
  	((((dev)->hard_header_len+(dev)->needed_headroom+(extra))&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
  #define LL_ALLOCATED_SPACE(dev) \
  	((((dev)->hard_header_len+(dev)->needed_headroom+(dev)->needed_tailroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249

3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
250
251
252
253
254
255
256
257
258
259
260
261
  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);
  #define HAVE_HEADER_CACHE
  	int	(*cache)(const struct neighbour *neigh, struct hh_cache *hh);
  	void	(*cache_update)(struct hh_cache *hh,
  				const struct net_device *dev,
  				const unsigned char *haddr);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262
263
264
265
266
267
268
  /* These flag bits are private to the generic network queueing
   * layer, they may not be explicitly referenced by any other
   * code.
   */
  
  enum netdev_state_t
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269
270
  	__LINK_STATE_START,
  	__LINK_STATE_PRESENT,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
  	__LINK_STATE_NOCARRIER,
b00055aac   Stefan Rompf   [NET] core: add R...
272
273
  	__LINK_STATE_LINKWATCH_PENDING,
  	__LINK_STATE_DORMANT,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
275
276
277
278
279
280
281
282
283
284
285
  };
  
  
  /*
   * This structure holds at boot time configured netdevice settings. They
   * are then used in the device probing. 
   */
  struct netdev_boot_setup {
  	char name[IFNAMSIZ];
  	struct ifmap map;
  };
  #define NETDEV_BOOT_SETUP_MAX 8
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
286
  extern int __init netdev_boot_setup(char *str);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
288
  
  /*
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
   * 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 ...
306
  #endif
5d38a079c   Herbert Xu   gro: Add page fra...
307
  	struct net_device	*dev;
d565b0a1a   Herbert Xu   net: Add Generic ...
308
309
  	struct list_head	dev_list;
  	struct sk_buff		*gro_list;
5d38a079c   Herbert Xu   gro: Add page fra...
310
  	struct sk_buff		*skb;
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
311
312
313
314
315
  };
  
  enum
  {
  	NAPI_STATE_SCHED,	/* Poll is scheduled */
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
316
  	NAPI_STATE_DISABLE,	/* Disable pending */
7b363e440   Neil Horman   netpoll: fix race...
317
  	NAPI_STATE_NPSVC,	/* Netpoll - don't dequeue from poll_list */
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
318
  };
b3c975286   Harvey Harrison   include/linux: Re...
319
  extern void __napi_schedule(struct napi_struct *n);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
320

a0a46196c   David S. Miller   [NET]: Add NAPI_S...
321
322
323
324
  static inline int napi_disable_pending(struct napi_struct *n)
  {
  	return test_bit(NAPI_STATE_DISABLE, &n->state);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
325
326
327
328
329
330
  /**
   *	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...
331
332
   * insure only one NAPI poll instance runs.  We also make
   * sure there is no pending NAPI disable.
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
333
334
335
   */
  static inline int napi_schedule_prep(struct napi_struct *n)
  {
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
336
337
  	return !napi_disable_pending(n) &&
  		!test_and_set_bit(NAPI_STATE_SCHED, &n->state);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
338
339
340
341
342
343
344
345
346
347
348
349
350
351
  }
  
  /**
   *	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...
352
353
354
355
356
357
358
359
360
  /* 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 ...
361
362
363
364
365
366
  /**
   *	napi_complete - NAPI processing complete
   *	@n: napi context
   *
   * Mark NAPI processing as complete.
   */
d565b0a1a   Herbert Xu   net: Add Generic ...
367
368
  extern void __napi_complete(struct napi_struct *n);
  extern void napi_complete(struct napi_struct *n);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
369
370
371
372
373
374
375
376
377
378
  
  /**
   *	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...
379
  	set_bit(NAPI_STATE_DISABLE, &n->state);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
380
  	while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
43cc7380e   Benjamin Herrenschmidt   [NET] napi: use n...
381
  		msleep(1);
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
382
  	clear_bit(NAPI_STATE_DISABLE, &n->state);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
  }
  
  /**
   *	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:...
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
  #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
79d16385c   David S. Miller   netdev: Move atom...
415
416
417
  enum netdev_queue_state_t
  {
  	__QUEUE_STATE_XOFF,
c3f26a269   David S. Miller   netdev: Fix lockd...
418
  	__QUEUE_STATE_FROZEN,
79d16385c   David S. Miller   netdev: Move atom...
419
  };
bb949fbd1   David S. Miller   netdev: Create ne...
420
421
  struct netdev_queue {
  	struct net_device	*dev;
b0e1e6462   David S. Miller   netdev: Move rest...
422
  	struct Qdisc		*qdisc;
79d16385c   David S. Miller   netdev: Move atom...
423
  	unsigned long		state;
c773e847e   David S. Miller   netdev: Move _xmi...
424
425
  	spinlock_t		_xmit_lock;
  	int			xmit_lock_owner;
b0e1e6462   David S. Miller   netdev: Move rest...
426
  	struct Qdisc		*qdisc_sleeping;
e8a0464cc   David S. Miller   netdev: Allocate ...
427
  } ____cacheline_aligned_in_smp;
bb949fbd1   David S. Miller   netdev: Create ne...
428

d314774cf   Stephen Hemminger   netdev: network d...
429
430
431
  
  /*
   * This structure defines the management hooks for network devices.
008298231   Stephen Hemminger   netdev: add more ...
432
433
   * 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...
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
   *
   * 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.
   *
008298231   Stephen Hemminger   netdev: add more ...
453
454
455
456
457
458
459
460
461
   * int (*ndo_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev);
   *	Called when a packet needs to be transmitted.
   *	Must return NETDEV_TX_OK , NETDEV_TX_BUSY, or NETDEV_TX_LOCKED,
   *	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...
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
   * 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.
   *
   * void (*ndo_set_multicast_list)(struct net_device *dev);
   *	This function is called when the multicast address list changes.
   *
   * int (*ndo_set_mac_address)(struct net_device *dev, void *addr);
   *	This function  is called when the Media Access Control address
   *	needs to be changed. If not this interface is not defined, the
   *	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 ...
495
   * void (*ndo_tx_timeout)(struct net_device *dev);
d314774cf   Stephen Hemminger   netdev: network d...
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
   *	Callback uses when the transmitter has not made any progress
   *	for dev->watchdog ticks.
   *
   * struct net_device_stats* (*get_stats)(struct net_device *dev);
   *	Called when a user wants to get the network device usage
   *	statistics. If not defined, the counters in dev->stats will
   *	be used.
   *
   * void (*ndo_vlan_rx_register)(struct net_device *dev, struct vlan_group *grp);
   *	If device support VLAN receive accleration
   *	(ie. dev->features & NETIF_F_HW_VLAN_RX), then this function is called
   *	when vlan groups for the device changes.  Note: grp is NULL
   *	if no vlan's groups are being used.
   *
   * void (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid);
   *	If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
   *	this function is called when a VLAN id is registered.
   *
   * void (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid);
   *	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);
   */
47fd5b837   Stephen Hemminger   netdev: add HAVE_...
520
  #define HAVE_NET_DEVICE_OPS
d314774cf   Stephen Hemminger   netdev: network d...
521
522
523
524
525
  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);
008298231   Stephen Hemminger   netdev: add more ...
526
527
528
529
  	int			(*ndo_start_xmit) (struct sk_buff *skb,
  						   struct net_device *dev);
  	u16			(*ndo_select_queue)(struct net_device *dev,
  						    struct sk_buff *skb);
d314774cf   Stephen Hemminger   netdev: network d...
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
  #define HAVE_CHANGE_RX_FLAGS
  	void			(*ndo_change_rx_flags)(struct net_device *dev,
  						       int flags);
  #define HAVE_SET_RX_MODE
  	void			(*ndo_set_rx_mode)(struct net_device *dev);
  #define HAVE_MULTICAST
  	void			(*ndo_set_multicast_list)(struct net_device *dev);
  #define HAVE_SET_MAC_ADDR
  	int			(*ndo_set_mac_address)(struct net_device *dev,
  						       void *addr);
  #define HAVE_VALIDATE_ADDR
  	int			(*ndo_validate_addr)(struct net_device *dev);
  #define HAVE_PRIVATE_IOCTL
  	int			(*ndo_do_ioctl)(struct net_device *dev,
  					        struct ifreq *ifr, int cmd);
  #define HAVE_SET_CONFIG
  	int			(*ndo_set_config)(struct net_device *dev,
  					          struct ifmap *map);
  #define HAVE_CHANGE_MTU
008298231   Stephen Hemminger   netdev: add more ...
549
550
551
552
  	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...
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
  #define HAVE_TX_TIMEOUT
  	void			(*ndo_tx_timeout) (struct net_device *dev);
  
  	struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
  
  	void			(*ndo_vlan_rx_register)(struct net_device *dev,
  						        struct vlan_group *grp);
  	void			(*ndo_vlan_rx_add_vid)(struct net_device *dev,
  						       unsigned short vid);
  	void			(*ndo_vlan_rx_kill_vid)(struct net_device *dev,
  						        unsigned short vid);
  #ifdef CONFIG_NET_POLL_CONTROLLER
  #define HAVE_NETDEV_POLL
  	void                    (*ndo_poll_controller)(struct net_device *dev);
  #endif
  };
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
569
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
   *	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.
   */
  
  struct net_device
  {
  
  	/*
  	 * 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
  	 * the interface.
  	 */
  	char			name[IFNAMSIZ];
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
588
589
  	/* device name hash chain */
  	struct hlist_node	name_hlist;
0b815a1a6   Stephen Hemminger   net: network devi...
590
591
  	/* snmp alias */
  	char 			*ifalias;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
  
  	/*
  	 *	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.
  	 */
  
  	unsigned char		if_port;	/* Selectable AUI, TP,..*/
  	unsigned char		dma;		/* DMA channel		*/
  
  	unsigned long		state;
7562f876c   Pavel Emelianov   [NET]: Rework dev...
611
  	struct list_head	dev_list;
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
612
  	struct list_head	napi_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
613

9356b8fc0   Eric Dumazet   [NET]: Reorder so...
614
615
616
  	/* Net device features */
  	unsigned long		features;
  #define NETIF_F_SG		1	/* Scatter/gather IO. */
d212f87b0   Stephen Hemminger   [NET]: IPV6 check...
617
  #define NETIF_F_IP_CSUM		2	/* Can checksum TCP/UDP over IPv4. */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
618
619
  #define NETIF_F_NO_CSUM		4	/* Does not require checksum. F.e. loopack. */
  #define NETIF_F_HW_CSUM		8	/* Can checksum all the packets. */
d212f87b0   Stephen Hemminger   [NET]: IPV6 check...
620
  #define NETIF_F_IPV6_CSUM	16	/* Can checksum TCP/UDP over IPV6 */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
621
622
623
624
625
626
  #define NETIF_F_HIGHDMA		32	/* Can DMA to high memory. */
  #define NETIF_F_FRAGLIST	64	/* Scatter/gather IO. */
  #define NETIF_F_HW_VLAN_TX	128	/* Transmit VLAN hw acceleration */
  #define NETIF_F_HW_VLAN_RX	256	/* Receive VLAN hw acceleration */
  #define NETIF_F_HW_VLAN_FILTER	512	/* Receive filtering on VLAN */
  #define NETIF_F_VLAN_CHALLENGED	1024	/* Device cannot handle VLAN packets */
37c3185a0   Herbert Xu   [NET]: Added GSO ...
627
  #define NETIF_F_GSO		2048	/* Enable software GSO. */
e24eb521f   Christian Borntraeger   [NET]: note that ...
628
629
  #define NETIF_F_LLTX		4096	/* LockLess TX - deprecated. Please */
  					/* do not use LLTX in new drivers */
ce286d327   Eric W. Biederman   [NET]: Implement ...
630
  #define NETIF_F_NETNS_LOCAL	8192	/* Does not change network namespaces */
d565b0a1a   Herbert Xu   net: Add Generic ...
631
  #define NETIF_F_GRO		16384	/* Generic receive offload */
3ae7c0b2e   Jeff Garzik   [ETHTOOL]: Add ET...
632
  #define NETIF_F_LRO		32768	/* large receive offload */
7967168ce   Herbert Xu   [NET]: Merge TSO/...
633
634
  
  	/* Segmentation offload features */
289c79a4b   Patrick McHardy   vlan: Use bitmask...
635
636
  #define NETIF_F_GSO_SHIFT	16
  #define NETIF_F_GSO_MASK	0xffff0000
7967168ce   Herbert Xu   [NET]: Merge TSO/...
637
  #define NETIF_F_TSO		(SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
f83ef8c0b   Herbert Xu   [IPV6]: Added GSO...
638
  #define NETIF_F_UFO		(SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
576a30eb6   Herbert Xu   [NET]: Added GSO ...
639
  #define NETIF_F_GSO_ROBUST	(SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
f83ef8c0b   Herbert Xu   [IPV6]: Added GSO...
640
641
  #define NETIF_F_TSO_ECN		(SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
  #define NETIF_F_TSO6		(SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
642

78eb88773   Herbert Xu   [BRIDGE]: Disable...
643
644
  	/* List of features with software fallbacks. */
  #define NETIF_F_GSO_SOFTWARE	(NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
d212f87b0   Stephen Hemminger   [NET]: IPV6 check...
645

8648b3053   Herbert Xu   [NET]: Add NETIF_...
646
  #define NETIF_F_GEN_CSUM	(NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
d212f87b0   Stephen Hemminger   [NET]: IPV6 check...
647
648
649
  #define NETIF_F_V4_CSUM		(NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM)
  #define NETIF_F_V6_CSUM		(NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
  #define NETIF_F_ALL_CSUM	(NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
8648b3053   Herbert Xu   [NET]: Add NETIF_...
650

b63365a2d   Herbert Xu   net: Fix disjunct...
651
652
653
654
655
  	/*
  	 * If one device supports one of these features, then enable them
  	 * for all in netdev_increment_features.
  	 */
  #define NETIF_F_ONE_FOR_ALL	(NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \
d314774cf   Stephen Hemminger   netdev: network d...
656
  				 NETIF_F_SG | NETIF_F_HIGHDMA |		\
b63365a2d   Herbert Xu   net: Fix disjunct...
657
  				 NETIF_F_FRAGLIST)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
658
659
660
  	/* Interface index. Unique device identifier	*/
  	int			ifindex;
  	int			iflink;
c45d286e7   Rusty Russell   [NET]: Inline net...
661
  	struct net_device_stats	stats;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
662

b86e0280b   Johannes Berg   [WEXT] net_device...
663
  #ifdef CONFIG_WIRELESS_EXT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
664
665
666
667
668
  	/* 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...
669
  #endif
d314774cf   Stephen Hemminger   netdev: network d...
670
671
  	/* Management operations */
  	const struct net_device_ops *netdev_ops;
76fd85937   Stephen Hemminger   [PATCH] ethtool: ...
672
  	const struct ethtool_ops *ethtool_ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
673

3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
674
675
  	/* Hardware header description */
  	const struct header_ops *header_ops;
b00055aac   Stefan Rompf   [NET] core: add R...
676
  	unsigned int		flags;	/* interface flags (a la BSD)	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
677
678
679
  	unsigned short		gflags;
          unsigned short          priv_flags; /* Like 'flags' but invisible to userspace. */
  	unsigned short		padded;	/* How much padding added by alloc_netdev() */
b00055aac   Stefan Rompf   [NET] core: add R...
680
681
  	unsigned char		operstate; /* RFC2863 operstate */
  	unsigned char		link_mode; /* mapping policy to operstate */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
682
683
684
  	unsigned		mtu;	/* interface MTU value		*/
  	unsigned short		type;	/* interface hardware type	*/
  	unsigned short		hard_header_len;	/* hardware hdr length	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685

f5184d267   Johannes Berg   net: Allow netdev...
686
687
688
689
690
691
  	/* 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
692
693
694
695
696
  	struct net_device	*master; /* Pointer to master device of a group,
  					  * which this device is member of.
  					  */
  
  	/* Interface address info. */
a6f9a7057   Jon Wetzel   [NET]: Add suppor...
697
  	unsigned char		perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
698
699
  	unsigned char		addr_len;	/* hardware address length	*/
  	unsigned short          dev_id;		/* for shared network cards */
f1f28aa35   David S. Miller   netdev: Add addr_...
700
  	spinlock_t		addr_list_lock;
4417da668   Patrick McHardy   [NET]: dev: secon...
701
702
703
  	struct dev_addr_list	*uc_list;	/* Secondary unicast mac addresses */
  	int			uc_count;	/* Number of installed ucasts	*/
  	int			uc_promisc;
3fba5a8b1   Patrick McHardy   [NET]: dev_mcast:...
704
  	struct dev_addr_list	*mc_list;	/* Multicast mac addresses	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
705
  	int			mc_count;	/* Number of installed mcasts	*/
9d45abe1c   Wang Chen   netdevice: change...
706
707
  	unsigned int		promiscuity;
  	unsigned int		allmulti;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
708

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709
710
711
  
  	/* Protocol specific pointers */
  	
91da11f87   Lennert Buytenhek   net: Distributed ...
712
713
714
  #ifdef CONFIG_NET_DSA
  	void			*dsa_ptr;	/* dsa specific data */
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
715
716
717
718
719
720
  	void 			*atalk_ptr;	/* AppleTalk link 	*/
  	void			*ip_ptr;	/* IPv4 specific data	*/  
  	void                    *dn_ptr;        /* DECnet specific data */
  	void                    *ip6_ptr;       /* IPv6 specific data */
  	void			*ec_ptr;	/* Econet specific data	*/
  	void			*ax25_ptr;	/* AX.25 specific data */
704232c27   Johannes Berg   [WIRELESS] cfg802...
721
722
  	struct wireless_dev	*ieee80211_ptr;	/* IEEE 802.11 specific data,
  						   assign before registering */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
723

9356b8fc0   Eric Dumazet   [NET]: Reorder so...
724
725
726
  /*
   * Cache line mostly used on receive path (including eth_type_trans())
   */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
727
728
729
  	unsigned long		last_rx;	/* Time of last Rx	*/
  	/* Interface address info used in eth_type_trans() */
  	unsigned char		dev_addr[MAX_ADDR_LEN];	/* hw address, (before bcast 
d314774cf   Stephen Hemminger   netdev: network d...
730
  							   because most packets are unicast) */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
731
732
  
  	unsigned char		broadcast[MAX_ADDR_LEN];	/* hw bcast add	*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
733

bb949fbd1   David S. Miller   netdev: Create ne...
734
  	struct netdev_queue	rx_queue;
e8a0464cc   David S. Miller   netdev: Allocate ...
735
736
  
  	struct netdev_queue	*_tx ____cacheline_aligned_in_smp;
fd2ea0a79   David S. Miller   net: Use queue aw...
737
738
  
  	/* Number of TX queues allocated at alloc_netdev_mq() time  */
e8a0464cc   David S. Miller   netdev: Allocate ...
739
  	unsigned int		num_tx_queues;
fd2ea0a79   David S. Miller   net: Use queue aw...
740
741
742
  
  	/* Number of TX queues currently active in device  */
  	unsigned int		real_num_tx_queues;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
743
  	unsigned long		tx_queue_len;	/* Max frames per queue allowed */
c3f26a269   David S. Miller   netdev: Fix lockd...
744
  	spinlock_t		tx_global_lock;
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
745
746
747
  /*
   * One part is mostly used on xmit path (device)
   */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
748
749
750
751
752
  	/* These may be needed for future network-power-down code. */
  	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
753
  	/* Number of references to this device */
9356b8fc0   Eric Dumazet   [NET]: Reorder so...
754
  	atomic_t		refcnt ____cacheline_aligned_in_smp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
755
756
  	/* delayed register/unregister */
  	struct list_head	todo_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
757
758
  	/* device index hash chain */
  	struct hlist_node	index_hlist;
572a103de   Herbert Xu   [NET] link_watch:...
759
  	struct net_device	*link_watch_next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
760
761
  	/* register/unregister state machine */
  	enum { NETREG_UNINITIALIZED=0,
b17a7c179   Stephen Hemminger   [NET]: Do sysfs r...
762
  	       NETREG_REGISTERED,	/* completed register_netdevice */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
763
764
765
766
  	       NETREG_UNREGISTERING,	/* called unregister_netdevice */
  	       NETREG_UNREGISTERED,	/* completed unregister todo */
  	       NETREG_RELEASED,		/* called free_netdev */
  	} reg_state;
d314774cf   Stephen Hemminger   netdev: network d...
767
768
  	/* Called from unregister, can be used to call free_netdev */
  	void (*destructor)(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
769

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

c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
774
  #ifdef CONFIG_NET_NS
4a1c53711   Eric W. Biederman   [NET]: Add a netw...
775
776
  	/* Network namespace this network device is inside */
  	struct net		*nd_net;
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
777
  #endif
4a1c53711   Eric W. Biederman   [NET]: Add a netw...
778

4951704b4   David S. Miller   syncppp: Fix cras...
779
780
  	/* mid-layer private */
  	void			*ml_priv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
781
782
  	/* bridge stuff */
  	struct net_bridge_port	*br_port;
b863ceb7d   Patrick McHardy   [NET]: Add macvla...
783
784
  	/* macvlan */
  	struct macvlan_port	*macvlan_port;
eca9ebac6   Patrick McHardy   net: Add GARP app...
785
786
  	/* GARP */
  	struct garp_port	*garp_port;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
787

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
788
  	/* class/net/name entry */
43cb76d91   Greg Kroah-Hartman   Network: convert ...
789
  	struct device		dev;
fe9925b55   Stephen Hemminger   [NET]: Create net...
790
791
  	/* space for optional statistics and wireless sysfs groups */
  	struct attribute_group  *sysfs_groups[3];
38f7b870d   Patrick McHardy   [RTNETLINK]: Link...
792
793
794
  
  	/* rtnetlink link ops */
  	const struct rtnl_link_ops *rtnl_link_ops;
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
795

289c79a4b   Patrick McHardy   vlan: Use bitmask...
796
797
  	/* VLAN feature mask */
  	unsigned long vlan_features;
82cc1a7a5   Peter P Waskiewicz Jr   [NET]: Add per-co...
798
799
800
  	/* 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...
801

7a6b6f515   Jeff Kirsher   DCB: fix kconfig ...
802
  #ifdef CONFIG_DCB
2f90b8657   Alexander Duyck   ixgbe: this patch...
803
804
805
  	/* Data Center Bridging netlink ops */
  	struct dcbnl_rtnl_ops *dcbnl_ops;
  #endif
d314774cf   Stephen Hemminger   netdev: network d...
806
807
808
809
810
811
  #ifdef CONFIG_COMPAT_NET_DEV_OPS
  	struct {
  		int			(*init)(struct net_device *dev);
  		void			(*uninit)(struct net_device *dev);
  		int			(*open)(struct net_device *dev);
  		int			(*stop)(struct net_device *dev);
008298231   Stephen Hemminger   netdev: add more ...
812
813
814
815
  		int			(*hard_start_xmit) (struct sk_buff *skb,
  							    struct net_device *dev);
  		u16			(*select_queue)(struct net_device *dev,
  							struct sk_buff *skb);
d314774cf   Stephen Hemminger   netdev: network d...
816
817
818
819
820
821
822
823
824
825
826
827
  		void			(*change_rx_flags)(struct net_device *dev,
  							   int flags);
  		void			(*set_rx_mode)(struct net_device *dev);
  		void			(*set_multicast_list)(struct net_device *dev);
  		int			(*set_mac_address)(struct net_device *dev,
  							   void *addr);
  		int			(*validate_addr)(struct net_device *dev);
  		int			(*do_ioctl)(struct net_device *dev,
  						    struct ifreq *ifr, int cmd);
  		int			(*set_config)(struct net_device *dev,
  						      struct ifmap *map);
  		int			(*change_mtu)(struct net_device *dev, int new_mtu);
008298231   Stephen Hemminger   netdev: add more ...
828
829
  		int			(*neigh_setup)(struct net_device *dev,
  						       struct neigh_parms *);
d314774cf   Stephen Hemminger   netdev: network d...
830
831
832
833
834
835
836
837
838
839
840
  		void			(*tx_timeout) (struct net_device *dev);
  		struct net_device_stats* (*get_stats)(struct net_device *dev);
  		void			(*vlan_rx_register)(struct net_device *dev,
  							    struct vlan_group *grp);
  		void			(*vlan_rx_add_vid)(struct net_device *dev,
  							   unsigned short vid);
  		void			(*vlan_rx_kill_vid)(struct net_device *dev,
  							    unsigned short vid);
  #ifdef CONFIG_NET_POLL_CONTROLLER
  		void                    (*poll_controller)(struct net_device *dev);
  #endif
d314774cf   Stephen Hemminger   netdev: network d...
841
  	};
eeda3fd64   Stephen Hemminger   netdev: introduce...
842
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
  };
43cb76d91   Greg Kroah-Hartman   Network: convert ...
844
  #define to_net_dev(d) container_of(d, struct net_device, dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
845
846
847
  
  #define	NETDEV_ALIGN		32
  #define	NETDEV_ALIGN_CONST	(NETDEV_ALIGN - 1)
e8a0464cc   David S. Miller   netdev: Allocate ...
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
  static inline
  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...
866
867
868
869
870
871
872
873
874
875
876
877
878
879
  /*
   * Net namespace inlines
   */
  static inline
  struct net *dev_net(const struct net_device *dev)
  {
  #ifdef CONFIG_NET_NS
  	return dev->nd_net;
  #else
  	return &init_net;
  #endif
  }
  
  static inline
f5aa23fd4   Denis V. Lunev   [NETNS]: Compilat...
880
  void dev_net_set(struct net_device *dev, struct net *net)
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
881
882
  {
  #ifdef CONFIG_NET_NS
f3005d7f4   Denis V. Lunev   [NETNS]: Add netn...
883
884
  	release_net(dev->nd_net);
  	dev->nd_net = hold_net(net);
c346dca10   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
885
886
  #endif
  }
cf85d08fd   Lennert Buytenhek   dsa: add support ...
887
888
889
890
891
892
893
894
895
  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;
  }
396138f03   Lennert Buytenhek   dsa: add support ...
896
897
898
899
900
901
902
903
904
  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 ...
905
906
907
908
909
910
  /**
   *	netdev_priv - access network device private data
   *	@dev: network device
   *
   * Get network device private data
   */
6472ce609   Patrick McHardy   [NET]: Mark struc...
911
  static inline void *netdev_priv(const struct net_device *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
912
  {
e3c50d5d2   David S. Miller   netdev: netdev_pr...
913
914
915
  	return (char *)dev + ((sizeof(struct net_device)
  			       + NETDEV_ALIGN_CONST)
  			      & ~NETDEV_ALIGN_CONST);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
916
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
917
918
919
  /* 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 ...
920
  #define SET_NETDEV_DEV(net, pdev)	((net)->dev.parent = (pdev))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
921

3b582cc14   Stephen Hemminger   [NET]: docbook fi...
922
923
924
925
926
927
928
929
930
931
  /**
   *	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 ...
932
933
  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 ...
934

d81565340   Alexander Duyck   net: add netif_na...
935
936
937
938
939
940
  /**
   *  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 ...
941
942
943
944
945
946
947
948
949
950
951
  void netif_napi_del(struct napi_struct *napi);
  
  struct napi_gro_cb {
  	/* 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...
952
953
954
  
  	/* Free the skb? */
  	int free;
d565b0a1a   Herbert Xu   net: Add Generic ...
955
956
957
  };
  
  #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb)
d81565340   Alexander Duyck   net: add netif_na...
958

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
959
  struct packet_type {
f2ccd8fa0   David S. Miller   [NET]: Kill skb->...
960
961
962
963
964
965
  	__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 ...
966
967
  	struct sk_buff		*(*gso_segment)(struct sk_buff *skb,
  						int features);
a430a43d0   Herbert Xu   [NET] gso: Fix up...
968
  	int			(*gso_send_check)(struct sk_buff *skb);
d565b0a1a   Herbert Xu   net: Add Generic ...
969
970
971
  	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
972
973
974
  	void			*af_packet_priv;
  	struct list_head	list;
  };
5d38a079c   Herbert Xu   gro: Add page fra...
975
976
977
978
979
980
981
  struct napi_gro_fraginfo {
  	skb_frag_t frags[MAX_SKB_FRAGS];
  	unsigned int nr_frags;
  	unsigned int ip_summed;
  	unsigned int len;
  	__wsum csum;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
982
983
  #include <linux/interrupt.h>
  #include <linux/notifier.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984
  extern rwlock_t				dev_base_lock;		/* Device list lock */
7562f876c   Pavel Emelianov   [NET]: Rework dev...
985

881d966b4   Eric W. Biederman   [NET]: Make the d...
986
987
988
989
990
991
992
  #define for_each_netdev(net, d)		\
  		list_for_each_entry(d, &(net)->dev_base_head, dev_list)
  #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)
  #define net_device_entry(lh)	list_entry(lh, struct net_device, dev_list)
7562f876c   Pavel Emelianov   [NET]: Rework dev...
993

a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
994
995
996
997
  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...
998
  	net = dev_net(dev);
a050c33f4   Daniel Lezcano   [NETNS]: Fix bad ...
999
1000
1001
1002
1003
1004
1005
1006
1007
  	lh = dev->dev_list.next;
  	return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
  }
  
  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...
1008

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009
1010
  extern int 			netdev_boot_setup_check(struct net_device *dev);
  extern unsigned long		netdev_boot_base(const char *prefix, int unit);
881d966b4   Eric W. Biederman   [NET]: Make the d...
1011
1012
1013
  extern struct net_device    *dev_getbyhwaddr(struct net *net, unsigned short type, char *hwaddr);
  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
1014
1015
1016
  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);
881d966b4   Eric W. Biederman   [NET]: Make the d...
1017
  extern struct net_device	*dev_get_by_flags(struct net *net, unsigned short flags,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1018
  						  unsigned short mask);
881d966b4   Eric W. Biederman   [NET]: Make the d...
1019
1020
  extern struct net_device	*dev_get_by_name(struct net *net, const char *name);
  extern struct net_device	*__dev_get_by_name(struct net *net, const char *name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1021
1022
1023
  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 ...
1024
  extern void		dev_disable_lro(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1025
1026
  extern int		dev_queue_xmit(struct sk_buff *skb);
  extern int		register_netdevice(struct net_device *dev);
22f8cde5b   Stephen Hemminger   [NET]: unregister...
1027
  extern void		unregister_netdevice(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1028
1029
1030
1031
  extern void		free_netdev(struct net_device *dev);
  extern void		synchronize_net(void);
  extern int 		register_netdevice_notifier(struct notifier_block *nb);
  extern int		unregister_netdevice_notifier(struct notifier_block *nb);
ad7379d49   Eric W. Biederman   [NET]: Fix the pr...
1032
  extern int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
881d966b4   Eric W. Biederman   [NET]: Make the d...
1033
1034
  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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1035
1036
1037
1038
  extern int		dev_restart(struct net_device *dev);
  #ifdef CONFIG_NETPOLL_TRAP
  extern int		netpoll_trap(void);
  #endif
0c4e85813   Stephen Hemminger   [NET]: Wrap netde...
1039
1040
  static inline int dev_hard_header(struct sk_buff *skb, struct net_device *dev,
  				  unsigned short type,
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
1041
1042
  				  const void *daddr, const void *saddr,
  				  unsigned len)
0c4e85813   Stephen Hemminger   [NET]: Wrap netde...
1043
  {
f1ecfd5d3   Ursula Braun   remove header_ops...
1044
  	if (!dev->header_ops || !dev->header_ops->create)
0c4e85813   Stephen Hemminger   [NET]: Wrap netde...
1045
  		return 0;
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
1046
1047
  
  	return dev->header_ops->create(skb, dev, type, daddr, saddr, len);
0c4e85813   Stephen Hemminger   [NET]: Wrap netde...
1048
  }
b95cce357   Stephen Hemminger   [NET]: Wrap hard_...
1049
1050
1051
1052
  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...
1053
  	if (!dev->header_ops || !dev->header_ops->parse)
b95cce357   Stephen Hemminger   [NET]: Wrap hard_...
1054
  		return 0;
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
1055
  	return dev->header_ops->parse(skb, haddr);
b95cce357   Stephen Hemminger   [NET]: Wrap hard_...
1056
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
  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);
  }
  
  /*
   * Incoming packets are placed on per-cpu queues so that
   * no locking is needed.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
1069
  struct softnet_data
  {
37437bb2e   David S. Miller   pkt_sched: Schedu...
1070
  	struct Qdisc		*output_queue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1071
1072
  	struct sk_buff_head	input_pkt_queue;
  	struct list_head	poll_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1073
  	struct sk_buff		*completion_queue;
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1074
  	struct napi_struct	backlog;
db2173348   Chris Leech   [I/OAT]: Setup th...
1075
1076
1077
  #ifdef CONFIG_NET_DMA
  	struct dma_chan		*net_dma;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1078
1079
1080
1081
1082
  };
  
  DECLARE_PER_CPU(struct softnet_data,softnet_data);
  
  #define HAVE_NETIF_QUEUE
37437bb2e   David S. Miller   pkt_sched: Schedu...
1083
  extern void __netif_schedule(struct Qdisc *q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1084

86d804e10   David S. Miller   netdev: Make neti...
1085
  static inline void netif_schedule_queue(struct netdev_queue *txq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1086
  {
79d16385c   David S. Miller   netdev: Move atom...
1087
  	if (!test_bit(__QUEUE_STATE_XOFF, &txq->state))
37437bb2e   David S. Miller   pkt_sched: Schedu...
1088
  		__netif_schedule(txq->qdisc);
86d804e10   David S. Miller   netdev: Make neti...
1089
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1090
1091
1092
1093
1094
1095
1096
  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...
1097
1098
1099
1100
  static inline void netif_tx_start_queue(struct netdev_queue *dev_queue)
  {
  	clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1101
1102
1103
1104
1105
1106
  /**
   *	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
1107
1108
  static inline void netif_start_queue(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1109
  	netif_tx_start_queue(netdev_get_tx_queue(dev, 0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1110
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1111
1112
1113
1114
1115
1116
1117
1118
1119
  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...
1120
  static inline void netif_tx_wake_queue(struct netdev_queue *dev_queue)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1121
1122
  {
  #ifdef CONFIG_NETPOLL_TRAP
5f286e113   Sergei Shtylyov   [NETPOLL]: Fix TX...
1123
  	if (netpoll_trap()) {
79d16385c   David S. Miller   netdev: Move atom...
1124
  		clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1125
  		return;
5f286e113   Sergei Shtylyov   [NETPOLL]: Fix TX...
1126
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1127
  #endif
79d16385c   David S. Miller   netdev: Move atom...
1128
  	if (test_and_clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state))
37437bb2e   David S. Miller   pkt_sched: Schedu...
1129
  		__netif_schedule(dev_queue->qdisc);
79d16385c   David S. Miller   netdev: Move atom...
1130
  }
d29f749e2   Dave Jones   net: Fix build fa...
1131
1132
1133
1134
1135
1136
1137
  /**
   *	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...
1138
1139
  static inline void netif_wake_queue(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1140
  	netif_tx_wake_queue(netdev_get_tx_queue(dev, 0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1141
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1142
1143
1144
1145
1146
1147
1148
1149
1150
  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...
1151
1152
1153
1154
  static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
  {
  	set_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1155
1156
1157
1158
1159
1160
1161
  /**
   *	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
1162
1163
  static inline void netif_stop_queue(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1164
  	netif_tx_stop_queue(netdev_get_tx_queue(dev, 0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1165
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1166
1167
1168
1169
1170
1171
1172
1173
1174
  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...
1175
1176
1177
1178
  static inline int netif_tx_queue_stopped(const struct netdev_queue *dev_queue)
  {
  	return test_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1179
1180
1181
1182
1183
1184
  /**
   *	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
1185
1186
  static inline int netif_queue_stopped(const struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1187
  	return netif_tx_queue_stopped(netdev_get_tx_queue(dev, 0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1188
  }
c3f26a269   David S. Miller   netdev: Fix lockd...
1189
1190
1191
1192
  static inline int netif_tx_queue_frozen(const struct netdev_queue *dev_queue)
  {
  	return test_bit(__QUEUE_STATE_FROZEN, &dev_queue->state);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1193
1194
1195
1196
1197
1198
  /**
   *	netif_running - test if up
   *	@dev: network device
   *
   *	Test if the device has been brought up.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1199
1200
1201
1202
  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...
1203
1204
1205
1206
1207
1208
  /*
   * 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 ...
1209
1210
1211
1212
1213
1214
1215
1216
  
  /**
   *	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...
1217
1218
  static inline void netif_start_subqueue(struct net_device *dev, u16 queue_index)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1219
1220
  	struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
  	clear_bit(__QUEUE_STATE_XOFF, &txq->state);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1221
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1222
1223
1224
1225
1226
1227
1228
  /**
   *	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...
1229
1230
  static inline void netif_stop_subqueue(struct net_device *dev, u16 queue_index)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1231
  	struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1232
1233
1234
1235
  #ifdef CONFIG_NETPOLL_TRAP
  	if (netpoll_trap())
  		return;
  #endif
fd2ea0a79   David S. Miller   net: Use queue aw...
1236
  	set_bit(__QUEUE_STATE_XOFF, &txq->state);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1237
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1238
1239
1240
1241
1242
1243
1244
  /**
   *	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...
1245
  static inline int __netif_subqueue_stopped(const struct net_device *dev,
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1246
1247
  					 u16 queue_index)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1248
1249
  	struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
  	return test_bit(__QUEUE_STATE_XOFF, &txq->state);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1250
  }
668f895a8   Pavel Emelyanov   [NET]: Hide the q...
1251
1252
1253
1254
1255
  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 ...
1256
1257
1258
1259
1260
1261
1262
1263
  
  /**
   *	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...
1264
1265
  static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1266
  	struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1267
1268
1269
1270
  #ifdef CONFIG_NETPOLL_TRAP
  	if (netpoll_trap())
  		return;
  #endif
fd2ea0a79   David S. Miller   net: Use queue aw...
1271
  	if (test_and_clear_bit(__QUEUE_STATE_XOFF, &txq->state))
37437bb2e   David S. Miller   pkt_sched: Schedu...
1272
  		__netif_schedule(txq->qdisc);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1273
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1274
1275
1276
1277
1278
  /**
   *	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 ...
1279
   */
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1280
1281
  static inline int netif_is_multiqueue(const struct net_device *dev)
  {
09e83b5d7   David S. Miller   netdev: Kill NETI...
1282
  	return (dev->num_tx_queues > 1);
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1283
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1284
1285
  
  /* Use this variant when it is known for sure that it
0ef473092   Matti Linnanvuori   net: Comment dev_...
1286
1287
   * is executing from hardware interrupt context or with hardware interrupts
   * disabled.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1288
   */
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1289
  extern void dev_kfree_skb_irq(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1290
1291
  
  /* Use this variant in places where it could be invoked
0ef473092   Matti Linnanvuori   net: Comment dev_...
1292
1293
   * from either hardware interrupt or other context, with hardware interrupts
   * either disabled or enabled.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1294
   */
56079431b   Denis Vlasenko   [NET]: Deinline s...
1295
  extern void dev_kfree_skb_any(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1296
1297
1298
1299
1300
1301
  
  #define HAVE_NETIF_RX 1
  extern int		netif_rx(struct sk_buff *skb);
  extern int		netif_rx_ni(struct sk_buff *skb);
  #define HAVE_NETIF_RECEIVE_SKB 1
  extern int		netif_receive_skb(struct sk_buff *skb);
d565b0a1a   Herbert Xu   net: Add Generic ...
1302
1303
1304
  extern void		napi_gro_flush(struct napi_struct *napi);
  extern int		napi_gro_receive(struct napi_struct *napi,
  					 struct sk_buff *skb);
5d38a079c   Herbert Xu   gro: Add page fra...
1305
1306
  extern int		napi_gro_frags(struct napi_struct *napi,
  				       struct napi_gro_fraginfo *info);
bc1d0411b   Patrick McHardy   vlan: deliver pac...
1307
  extern void		netif_nit_deliver(struct sk_buff *skb);
c2373ee98   Mitch Williams   [PATCH] net: make...
1308
  extern int		dev_valid_name(const char *name);
881d966b4   Eric W. Biederman   [NET]: Make the d...
1309
1310
  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
1311
1312
  extern unsigned		dev_get_flags(const struct net_device *);
  extern int		dev_change_flags(struct net_device *, unsigned);
cf04a4c76   Stephen Hemminger   netdev: use const...
1313
  extern int		dev_change_name(struct net_device *, const char *);
0b815a1a6   Stephen Hemminger   net: network devi...
1314
  extern int		dev_set_alias(struct net_device *, const char *, size_t);
ce286d327   Eric W. Biederman   [NET]: Implement ...
1315
1316
  extern int		dev_change_net_namespace(struct net_device *,
  						 struct net *, const char *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1317
1318
1319
  extern int		dev_set_mtu(struct net_device *, int);
  extern int		dev_set_mac_address(struct net_device *,
  					    struct sockaddr *);
f6a78bfcb   Herbert Xu   [NET]: Add generi...
1320
  extern int		dev_hard_start_xmit(struct sk_buff *skb,
fd2ea0a79   David S. Miller   net: Use queue aw...
1321
1322
  					    struct net_device *dev,
  					    struct netdev_queue *txq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1323

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1324
  extern int		netdev_budget;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1325
1326
1327
  
  /* Called by rtnetlink.c:rtnl_unlock() */
  extern void netdev_run_todo(void);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1328
1329
1330
1331
  /**
   *	dev_put - release reference to device
   *	@dev: network device
   *
9ef4429b3   Benjamin Thery   [NET]: Fix dev_pu...
1332
   * Release reference to device to allow it to be freed.
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1333
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1334
1335
1336
1337
  static inline void dev_put(struct net_device *dev)
  {
  	atomic_dec(&dev->refcnt);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1338
1339
1340
1341
  /**
   *	dev_hold - get reference to device
   *	@dev: network device
   *
9ef4429b3   Benjamin Thery   [NET]: Fix dev_pu...
1342
   * Hold reference to device to keep it from being freed.
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1343
   */
153330618   Stephen Hemminger   [NET]: dev_put/de...
1344
1345
1346
1347
  static inline void dev_hold(struct net_device *dev)
  {
  	atomic_inc(&dev->refcnt);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1348
1349
1350
1351
  
  /* 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...
1352
1353
1354
1355
   *
   * 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
1356
1357
1358
   */
  
  extern void linkwatch_fire_event(struct net_device *dev);
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1359
1360
1361
1362
1363
1364
  /**
   *	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
1365
1366
1367
1368
1369
1370
  static inline int netif_carrier_ok(const struct net_device *dev)
  {
  	return !test_bit(__LINK_STATE_NOCARRIER, &dev->state);
  }
  
  extern void __netdev_watchdog_up(struct net_device *dev);
0a242efc4   Denis Vlasenko   [NET]: Deinline n...
1371
  extern void netif_carrier_on(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1372

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

bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
  /**
   *	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...
1388
1389
1390
1391
1392
  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 ...
1393
1394
1395
1396
1397
1398
  /**
   *	netif_dormant_off - set device as not dormant.
   *	@dev: network device
   *
   * Device is not in dormant state.
   */
b00055aac   Stefan Rompf   [NET] core: add R...
1399
1400
1401
1402
1403
  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 ...
1404
1405
1406
1407
1408
1409
  /**
   *	netif_dormant - test if carrier present
   *	@dev: network device
   *
   * Check if carrier is present on device
   */
b00055aac   Stefan Rompf   [NET] core: add R...
1410
1411
1412
1413
  static inline int netif_dormant(const struct net_device *dev)
  {
  	return test_bit(__LINK_STATE_DORMANT, &dev->state);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1414
1415
1416
1417
1418
1419
  /**
   *	netif_oper_up - test if device is operational
   *	@dev: network device
   *
   * Check if carrier is operational
   */
b00055aac   Stefan Rompf   [NET] core: add R...
1420
1421
1422
1423
  static inline int netif_oper_up(const struct net_device *dev) {
  	return (dev->operstate == IF_OPER_UP ||
  		dev->operstate == IF_OPER_UNKNOWN /* backward compat */);
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1424
1425
1426
1427
1428
1429
  /**
   *	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
1430
1431
1432
1433
  static inline int netif_device_present(struct net_device *dev)
  {
  	return test_bit(__LINK_STATE_PRESENT, &dev->state);
  }
56079431b   Denis Vlasenko   [NET]: Deinline s...
1434
  extern void netif_device_detach(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435

56079431b   Denis Vlasenko   [NET]: Deinline s...
1436
  extern void netif_device_attach(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1437
1438
1439
1440
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
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
  
  /*
   * Network interface message level settings
   */
  #define HAVE_NETIF_MSG 1
  
  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;
  }
0a1225769   Stephen Hemminger   [PATCH] sky2: cha...
1487
  /* Test if receive needs to be scheduled but only if up */
908a7a16b   Neil Horman   net: Remove unuse...
1488
  static inline int netif_rx_schedule_prep(struct napi_struct *napi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1489
  {
a0a46196c   David S. Miller   [NET]: Add NAPI_S...
1490
  	return napi_schedule_prep(napi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1491
1492
1493
1494
1495
  }
  
  /* Add interface to tail of rx poll list. This assumes that _prep has
   * already been called and returned 1.
   */
908a7a16b   Neil Horman   net: Remove unuse...
1496
  static inline void __netif_rx_schedule(struct napi_struct *napi)
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1497
  {
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1498
1499
  	__napi_schedule(napi);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1500
1501
  
  /* Try to reschedule poll. Called by irq handler. */
908a7a16b   Neil Horman   net: Remove unuse...
1502
  static inline void netif_rx_schedule(struct napi_struct *napi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1503
  {
908a7a16b   Neil Horman   net: Remove unuse...
1504
1505
  	if (netif_rx_schedule_prep(napi))
  		__netif_rx_schedule(napi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1506
  }
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1507
  /* Try to reschedule poll. Called by dev->poll() after netif_rx_complete().  */
908a7a16b   Neil Horman   net: Remove unuse...
1508
  static inline int netif_rx_reschedule(struct napi_struct *napi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1509
  {
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1510
  	if (napi_schedule_prep(napi)) {
908a7a16b   Neil Horman   net: Remove unuse...
1511
  		__netif_rx_schedule(napi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1512
1513
1514
1515
  		return 1;
  	}
  	return 0;
  }
b0ba66671   Herbert Xu   [NET] napi: Call ...
1516
1517
1518
  /* same as netif_rx_complete, except that local_irq_save(flags)
   * has already been issued
   */
908a7a16b   Neil Horman   net: Remove unuse...
1519
  static inline void __netif_rx_complete(struct napi_struct *napi)
b0ba66671   Herbert Xu   [NET] napi: Call ...
1520
  {
bea3348ee   Stephen Hemminger   [NET]: Make NAPI ...
1521
  	__napi_complete(napi);
b0ba66671   Herbert Xu   [NET] napi: Call ...
1522
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1523
1524
1525
1526
1527
  /* Remove interface from poll list: it must be in the poll list
   * on current cpu. This primitive is called by dev->poll(), when
   * it completes the work. The device cannot be out of poll list at this
   * moment, it is BUG().
   */
908a7a16b   Neil Horman   net: Remove unuse...
1528
  static inline void netif_rx_complete(struct napi_struct *napi)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1529
  {
d565b0a1a   Herbert Xu   net: Add Generic ...
1530
  	napi_complete(napi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1531
  }
c773e847e   David S. Miller   netdev: Move _xmi...
1532
  static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu)
932ff279a   Herbert Xu   [NET]: Add netif_...
1533
  {
c773e847e   David S. Miller   netdev: Move _xmi...
1534
1535
  	spin_lock(&txq->_xmit_lock);
  	txq->xmit_lock_owner = cpu;
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
1536
  }
fd2ea0a79   David S. Miller   net: Use queue aw...
1537
1538
1539
1540
1541
  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...
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
  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);
  }
d29f749e2   Dave Jones   net: Fix build fa...
1561
1562
1563
  /**
   *	netif_tx_lock - grab network device transmit lock
   *	@dev: network device
d29f749e2   Dave Jones   net: Fix build fa...
1564
1565
1566
   *
   * Get network device transmit lock
   */
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
1567
1568
  static inline void netif_tx_lock(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1569
  	unsigned int i;
c3f26a269   David S. Miller   netdev: Fix lockd...
1570
  	int cpu;
c773e847e   David S. Miller   netdev: Move _xmi...
1571

c3f26a269   David S. Miller   netdev: Fix lockd...
1572
1573
  	spin_lock(&dev->tx_global_lock);
  	cpu = smp_processor_id();
e8a0464cc   David S. Miller   netdev: Allocate ...
1574
1575
  	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...
1576
1577
1578
1579
1580
1581
1582
  
  		/* 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 ...
1583
  		__netif_tx_lock(txq, cpu);
c3f26a269   David S. Miller   netdev: Fix lockd...
1584
1585
  		set_bit(__QUEUE_STATE_FROZEN, &txq->state);
  		__netif_tx_unlock(txq);
e8a0464cc   David S. Miller   netdev: Allocate ...
1586
  	}
932ff279a   Herbert Xu   [NET]: Add netif_...
1587
1588
1589
1590
  }
  
  static inline void netif_tx_lock_bh(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1591
1592
  	local_bh_disable();
  	netif_tx_lock(dev);
932ff279a   Herbert Xu   [NET]: Add netif_...
1593
  }
932ff279a   Herbert Xu   [NET]: Add netif_...
1594
1595
  static inline void netif_tx_unlock(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1596
1597
1598
1599
  	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...
1600

c3f26a269   David S. Miller   netdev: Fix lockd...
1601
1602
1603
1604
1605
1606
1607
1608
1609
  		/* 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);
  		if (!test_bit(__QUEUE_STATE_XOFF, &txq->state))
  			__netif_schedule(txq->qdisc);
  	}
  	spin_unlock(&dev->tx_global_lock);
932ff279a   Herbert Xu   [NET]: Add netif_...
1610
1611
1612
1613
  }
  
  static inline void netif_tx_unlock_bh(struct net_device *dev)
  {
e8a0464cc   David S. Miller   netdev: Allocate ...
1614
1615
  	netif_tx_unlock(dev);
  	local_bh_enable();
932ff279a   Herbert Xu   [NET]: Add netif_...
1616
  }
c773e847e   David S. Miller   netdev: Move _xmi...
1617
  #define HARD_TX_LOCK(dev, txq, cpu) {			\
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
1618
  	if ((dev->features & NETIF_F_LLTX) == 0) {	\
c773e847e   David S. Miller   netdev: Move _xmi...
1619
  		__netif_tx_lock(txq, cpu);		\
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
1620
1621
  	}						\
  }
c773e847e   David S. Miller   netdev: Move _xmi...
1622
  #define HARD_TX_UNLOCK(dev, txq) {			\
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
1623
  	if ((dev->features & NETIF_F_LLTX) == 0) {	\
c773e847e   David S. Miller   netdev: Move _xmi...
1624
  		__netif_tx_unlock(txq);			\
22dd74950   Jamal Hadi Salim   [NET]: migrate HA...
1625
1626
  	}						\
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1627
1628
  static inline void netif_tx_disable(struct net_device *dev)
  {
fd2ea0a79   David S. Miller   net: Use queue aw...
1629
  	unsigned int i;
c3f26a269   David S. Miller   netdev: Fix lockd...
1630
  	int cpu;
fd2ea0a79   David S. Miller   net: Use queue aw...
1631

c3f26a269   David S. Miller   netdev: Fix lockd...
1632
1633
  	local_bh_disable();
  	cpu = smp_processor_id();
fd2ea0a79   David S. Miller   net: Use queue aw...
1634
1635
  	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...
1636
1637
  
  		__netif_tx_lock(txq, cpu);
fd2ea0a79   David S. Miller   net: Use queue aw...
1638
  		netif_tx_stop_queue(txq);
c3f26a269   David S. Miller   netdev: Fix lockd...
1639
  		__netif_tx_unlock(txq);
fd2ea0a79   David S. Miller   net: Use queue aw...
1640
  	}
c3f26a269   David S. Miller   netdev: Fix lockd...
1641
  	local_bh_enable();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1642
  }
e308a5d80   David S. Miller   netdev: Add netde...
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
  static inline void netif_addr_lock(struct net_device *dev)
  {
  	spin_lock(&dev->addr_list_lock);
  }
  
  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);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1662
1663
1664
1665
1666
  /* These functions live elsewhere (drivers/net/net_init.c, but related) */
  
  extern void		ether_setup(struct net_device *dev);
  
  /* Support for loadable net-drivers */
f25f4e448   Peter P Waskiewicz Jr   [CORE] Stack chan...
1667
1668
1669
1670
1671
  extern struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,
  				       void (*setup)(struct net_device *),
  				       unsigned int queue_count);
  #define alloc_netdev(sizeof_priv, name, setup) \
  	alloc_netdev_mq(sizeof_priv, name, setup, 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1672
1673
  extern int		register_netdev(struct net_device *dev);
  extern void		unregister_netdev(struct net_device *dev);
4417da668   Patrick McHardy   [NET]: dev: secon...
1674
1675
1676
1677
1678
  /* 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);
  extern int		dev_unicast_delete(struct net_device *dev, void *addr, int alen);
  extern int		dev_unicast_add(struct net_device *dev, void *addr, int alen);
e83a2ea85   Chris Leech   [VLAN]: set_rx_mo...
1679
1680
  extern int		dev_unicast_sync(struct net_device *to, struct net_device *from);
  extern void		dev_unicast_unsync(struct net_device *to, struct net_device *from);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1681
1682
  extern int 		dev_mc_delete(struct net_device *dev, void *addr, int alen, int all);
  extern int		dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly);
a0a400d79   Patrick McHardy   [NET]: dev_mcast:...
1683
1684
  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);
61cbc2fca   Patrick McHardy   [NET]: Fix second...
1685
1686
  extern int 		__dev_addr_delete(struct dev_addr_list **list, int *count, void *addr, int alen, int all);
  extern int		__dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly);
e83a2ea85   Chris Leech   [VLAN]: set_rx_mo...
1687
1688
  extern int		__dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count);
  extern void		__dev_addr_unsync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count);
dad9b335c   Wang Chen   netdevice: Fix pr...
1689
1690
  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
1691
  extern void		netdev_state_change(struct net_device *dev);
c1da4ac75   Or Gerlitz   net/core: add NET...
1692
  extern void		netdev_bonding_change(struct net_device *dev);
d8a33ac43   Stephen Hemminger   [BRIDGE]: feature...
1693
  extern void		netdev_features_change(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1694
  /* Load a device via the kmod */
881d966b4   Eric W. Biederman   [NET]: Make the d...
1695
  extern void		dev_load(struct net *net, const char *name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1696
  extern void		dev_mcast_init(void);
eeda3fd64   Stephen Hemminger   netdev: introduce...
1697
  extern const struct net_device_stats *dev_get_stats(struct net_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1698
1699
1700
  extern int		netdev_max_backlog;
  extern int		weight_p;
  extern int		netdev_set_master(struct net_device *dev, struct net_device *master);
84fa7933a   Patrick McHardy   [NET]: Replace CH...
1701
  extern int skb_checksum_help(struct sk_buff *skb);
576a30eb6   Herbert Xu   [NET]: Added GSO ...
1702
  extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features);
fb286bb29   Herbert Xu   [NET]: Detect har...
1703
1704
1705
1706
1707
1708
1709
  #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
1710
1711
1712
  /* rx skb timestamps */
  extern void		net_enable_timestamp(void);
  extern void		net_disable_timestamp(void);
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1713
1714
1715
1716
1717
  #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);
  #endif
b8a9787ed   Jay Vosburgh   bonding: Allow se...
1718
1719
  extern int netdev_class_create_file(struct class_attribute *class_attr);
  extern void netdev_class_remove_file(struct class_attribute *class_attr);
cf04a4c76   Stephen Hemminger   netdev: use const...
1720
  extern char *netdev_drivername(const struct net_device *dev, char *buffer, int len);
6579e57b3   Arjan van de Ven   net: Print the mo...
1721

20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
1722
  extern void linkwatch_run_queue(void);
b63365a2d   Herbert Xu   net: Fix disjunct...
1723
1724
1725
  unsigned long netdev_increment_features(unsigned long all, unsigned long one,
  					unsigned long mask);
  unsigned long netdev_fix_features(unsigned long features, const char *name);
7f353bf29   Herbert Xu   [NET]: Share corr...
1726

bcd761111   Herbert Xu   [NET]: Generalise...
1727
  static inline int net_gso_ok(int features, int gso_type)
576a30eb6   Herbert Xu   [NET]: Added GSO ...
1728
  {
bcd761111   Herbert Xu   [NET]: Generalise...
1729
  	int feature = gso_type << NETIF_F_GSO_SHIFT;
d6b4991ad   Herbert Xu   [NET]: Fix logica...
1730
  	return (features & feature) == feature;
576a30eb6   Herbert Xu   [NET]: Added GSO ...
1731
  }
bcd761111   Herbert Xu   [NET]: Generalise...
1732
1733
  static inline int skb_gso_ok(struct sk_buff *skb, int features)
  {
a430a43d0   Herbert Xu   [NET] gso: Fix up...
1734
  	return net_gso_ok(features, skb_shinfo(skb)->gso_type);
bcd761111   Herbert Xu   [NET]: Generalise...
1735
  }
7967168ce   Herbert Xu   [NET]: Merge TSO/...
1736
1737
  static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
  {
a430a43d0   Herbert Xu   [NET] gso: Fix up...
1738
1739
  	return skb_is_gso(skb) &&
  	       (!skb_gso_ok(skb, dev->features) ||
1a881f27c   Herbert Xu   net: Add frag_lis...
1740
1741
  	        (skb_shinfo(skb)->frag_list &&
  	         !(dev->features & NETIF_F_FRAGLIST)) ||
84fa7933a   Patrick McHardy   [NET]: Replace CH...
1742
  		unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
7967168ce   Herbert Xu   [NET]: Merge TSO/...
1743
  }
82cc1a7a5   Peter P Waskiewicz Jr   [NET]: Add per-co...
1744
1745
1746
1747
1748
  static inline void netif_set_gso_max_size(struct net_device *dev,
  					  unsigned int size)
  {
  	dev->gso_max_size = size;
  }
7ea49ed73   David S. Miller   [VLAN]: Make sure...
1749
  /* On bonding slaves other than the currently active slave, suppress
f5b2b966f   Jay Vosburgh   [PATCH] bonding: ...
1750
1751
   * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and
   * ARP on active-backup slaves with arp_validate enabled.
7ea49ed73   David S. Miller   [VLAN]: Make sure...
1752
1753
1754
1755
1756
   */
  static inline int skb_bond_should_drop(struct sk_buff *skb)
  {
  	struct net_device *dev = skb->dev;
  	struct net_device *master = dev->master;
6cf3f41e6   Jay Vosburgh   bonding, net: Mov...
1757
1758
1759
1760
1761
1762
1763
  	if (master) {
  		if (master->priv_flags & IFF_MASTER_ARPMON)
  			dev->last_rx = jiffies;
  
  		if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
  			if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
  			    skb->protocol == __constant_htons(ETH_P_ARP))
7ea49ed73   David S. Miller   [VLAN]: Make sure...
1764
  				return 0;
7ea49ed73   David S. Miller   [VLAN]: Make sure...
1765

6cf3f41e6   Jay Vosburgh   bonding, net: Mov...
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
  			if (master->priv_flags & IFF_MASTER_ALB) {
  				if (skb->pkt_type != PACKET_BROADCAST &&
  				    skb->pkt_type != PACKET_MULTICAST)
  					return 0;
  			}
  			if (master->priv_flags & IFF_MASTER_8023AD &&
  			    skb->protocol == __constant_htons(ETH_P_SLOW))
  				return 0;
  
  			return 1;
  		}
7ea49ed73   David S. Miller   [VLAN]: Make sure...
1777
1778
1779
  	}
  	return 0;
  }
505d4f73d   Eric W. Biederman   net: Guaranetee t...
1780
  extern struct pernet_operations __net_initdata loopback_net_ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1781
1782
1783
  #endif /* __KERNEL__ */
  
  #endif	/* _LINUX_DEV_H */