netdevice.h

来自「此工具是arm-linux-GCC交叉编译工具(cross-3.4.4)」· C头文件 代码 · 共 946 行 · 第 1/2 页

H
946
字号
/* * 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 * * Authors:	Ross Biro *		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> *		Alan Cox, <Alan.Cox@linux.org> *		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__#include <asm/atomic.h>#include <asm/cache.h>#include <asm/byteorder.h>#include <linux/config.h>#include <linux/device.h>#include <linux/percpu.h>struct divert_blk;struct vlan_group;struct ethtool_ops;struct netpoll_info;					/* 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	*/#define NET_XMIT_BYPASS		4	/* packet does not leave via dequeue;					   (TC use only - dev_queue_xmit					   returns this as NET_XMIT_SUCCESS) *//* 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 */#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 *//* *	Compute the worst case header length according to the protocols *	used. */ #if !defined(CONFIG_AX25) && !defined(CONFIG_AX25_MODULE) && !defined(CONFIG_TR)#define LL_MAX_HEADER	32#else#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)#define LL_MAX_HEADER	96#else#define LL_MAX_HEADER	48#endif#endif#if !defined(CONFIG_NET_IPIP) && \    !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)#define MAX_HEADER LL_MAX_HEADER#else#define MAX_HEADER (LL_MAX_HEADER + 48)#endif/* *	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;	unsigned cpu_collision;};DECLARE_PER_CPU(struct netif_rx_stats, netdev_rx_stat);/* *	We tag multicasts with these structures. */ struct dev_mc_list{		struct dev_mc_list	*next;	__u8			dmi_addr[MAX_ADDR_LEN];	unsigned char		dmi_addrlen;	int			dmi_users;	int			dmi_gusers;};struct hh_cache{	struct hh_cache *hh_next;	/* Next entry			     */	atomic_t	hh_refcnt;	/* number of users                   */	unsigned short  hh_type;	/* protocol identifier, f.e ETH_P_IP                                         *  NOTE:  For VLANs, this will be the                                         *  encapuslated type. --BLG                                         */	int		hh_len;		/* length of header */	int		(*hh_output)(struct sk_buff *skb);	rwlock_t	hh_lock;	/* cached hardware header; allow for machine alignment needs.        */#define HH_DATA_MOD	16#define HH_DATA_OFF(__len) \	(HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1))#define HH_DATA_ALIGN(__len) \	(((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))	unsigned long	hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)];};/* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much. * Alternative is: *   dev->hard_header_len ? (dev->hard_header_len + *                           (HH_DATA_MOD - 1)) & ~(HH_DATA_MOD - 1) : 0 * * We could use other alignment values, but we must maintain the * relationship HH alignment <= LL alignment. */#define LL_RESERVED_SPACE(dev) \	(((dev)->hard_header_len&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)#define LL_RESERVED_SPACE_EXTRA(dev,extra) \	((((dev)->hard_header_len+extra)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)/* 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{	__LINK_STATE_XOFF=0,	__LINK_STATE_START,	__LINK_STATE_PRESENT,	__LINK_STATE_SCHED,	__LINK_STATE_NOCARRIER,	__LINK_STATE_RX_SCHED,	__LINK_STATE_LINKWATCH_PENDING};/* * 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 8extern int __init netdev_boot_setup(char *str);/* *	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];	/* device name hash chain */	struct hlist_node	name_hlist;	/*	 *	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;	struct net_device	*next;		/* The device initialization function. Called only once. */	int			(*init)(struct net_device *dev);	/* ------- Fields preinitialized in Space.c finish here ------- */	/* Net device features */	unsigned long		features;#define NETIF_F_SG		1	/* Scatter/gather IO. */#define NETIF_F_IP_CSUM		2	/* Can checksum only TCP/UDP over IPv4. */#define NETIF_F_NO_CSUM		4	/* Does not require checksum. F.e. loopack. */#define NETIF_F_HW_CSUM		8	/* Can checksum all the packets. */#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 */#define NETIF_F_TSO		2048	/* Can offload TCP/IP segmentation */#define NETIF_F_LLTX		4096	/* LockLess TX */	struct net_device	*next_sched;	/* Interface index. Unique device identifier	*/	int			ifindex;	int			iflink;	struct net_device_stats* (*get_stats)(struct net_device *dev);	struct iw_statistics*	(*get_wireless_stats)(struct net_device *dev);	/* 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;	struct ethtool_ops *ethtool_ops;	/*	 * This marks the end of the "visible" part of the structure. All	 * fields hereafter are internal to the system, and may change at	 * will (read: may be cleaned up at will).	 */	unsigned short		flags;	/* interface flags (a la BSD)	*/	unsigned short		gflags;        unsigned short          priv_flags; /* Like 'flags' but invisible to userspace. */	unsigned short		padded;	/* How much padding added by alloc_netdev() */	unsigned		mtu;	/* interface MTU value		*/	unsigned short		type;	/* interface hardware type	*/	unsigned short		hard_header_len;	/* hardware hdr length	*/	struct net_device	*master; /* Pointer to master device of a group,					  * which this device is member of.					  */	/* Interface address info. */	unsigned char		perm_addr[MAX_ADDR_LEN]; /* permanent hw address */	unsigned char		addr_len;	/* hardware address length	*/	unsigned short          dev_id;		/* for shared network cards */	struct dev_mc_list	*mc_list;	/* Multicast mac addresses	*/	int			mc_count;	/* Number of installed mcasts	*/	int			promiscuity;	int			allmulti;	/* Protocol specific pointers */		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 *//* * Cache line mostly used on receive path (including eth_type_trans()) */	struct list_head	poll_list ____cacheline_aligned_in_smp;					/* Link to poll list	*/	int			(*poll) (struct net_device *dev, int *quota);	int			quota;	int			weight;	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 							because most packets are unicast) */	unsigned char		broadcast[MAX_ADDR_LEN];	/* hw bcast add	*//* * Cache line mostly used on queue transmit path (qdisc) */	/* device queue lock */	spinlock_t		queue_lock ____cacheline_aligned_in_smp;	struct Qdisc		*qdisc;	struct Qdisc		*qdisc_sleeping;	struct list_head	qdisc_list;	unsigned long		tx_queue_len;	/* Max frames per queue allowed */	/* ingress path synchronizer */	spinlock_t		ingress_lock;	struct Qdisc		*qdisc_ingress;/* * One part is mostly used on xmit path (device) */	/* hard_start_xmit synchronizer */	spinlock_t		xmit_lock ____cacheline_aligned_in_smp;	/* cpu id of processor entered to hard_start_xmit or -1,	   if nobody entered there.	 */	int			xmit_lock_owner;	void			*priv;	/* pointer to private data	*/	int			(*hard_start_xmit) (struct sk_buff *skb,						    struct net_device *dev);	/* 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;/* * refcnt is a very hot point, so align it on SMP */	/* Number of references to this device */	atomic_t		refcnt ____cacheline_aligned_in_smp;	/* delayed register/unregister */	struct list_head	todo_list;	/* device index hash chain */	struct hlist_node	index_hlist;	/* register/unregister state machine */	enum { NETREG_UNINITIALIZED=0,	       NETREG_REGISTERING,	/* called register_netdevice */	       NETREG_REGISTERED,	/* completed register todo */	       NETREG_UNREGISTERING,	/* called unregister_netdevice */	       NETREG_UNREGISTERED,	/* completed unregister todo */	       NETREG_RELEASED,		/* called free_netdev */	} reg_state;	/* Called after device is detached from network. */	void			(*uninit)(struct net_device *dev);	/* Called after last user reference disappears. */	void			(*destructor)(struct net_device *dev);	/* Pointers to interface service routines.	*/	int			(*open)(struct net_device *dev);	int			(*stop)(struct net_device *dev);#define HAVE_NETDEV_POLL	int			(*hard_header) (struct sk_buff *skb,						struct net_device *dev,						unsigned short type,						void *daddr,						void *saddr,						unsigned len);	int			(*rebuild_header)(struct sk_buff *skb);#define HAVE_MULTICAST			 	void			(*set_multicast_list)(struct net_device *dev);#define HAVE_SET_MAC_ADDR  		 	int			(*set_mac_address)(struct net_device *dev,						   void *addr);#define HAVE_PRIVATE_IOCTL	int			(*do_ioctl)(struct net_device *dev,					    struct ifreq *ifr, int cmd);#define HAVE_SET_CONFIG	int			(*set_config)(struct net_device *dev,					      struct ifmap *map);#define HAVE_HEADER_CACHE	int			(*hard_header_cache)(struct neighbour *neigh,						     struct hh_cache *hh);	void			(*header_cache_update)(struct hh_cache *hh,						       struct net_device *dev,						       unsigned char *  haddr);#define HAVE_CHANGE_MTU	int			(*change_mtu)(struct net_device *dev, int new_mtu);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?