netdevice.h

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

H
946
字号
#define HAVE_TX_TIMEOUT	void			(*tx_timeout) (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);	int			(*hard_header_parse)(struct sk_buff *skb,						     unsigned char *haddr);	int			(*neigh_setup)(struct net_device *dev, struct neigh_parms *);#ifdef CONFIG_NETPOLL	struct netpoll_info	*npinfo;#endif#ifdef CONFIG_NET_POLL_CONTROLLER	void                    (*poll_controller)(struct net_device *dev);#endif	/* bridge stuff */	struct net_bridge_port	*br_port;#ifdef CONFIG_NET_DIVERT	/* this will get initialized at each interface type init routine */	struct divert_blk	*divert;#endif /* CONFIG_NET_DIVERT */	/* class/net/name entry */	struct class_device	class_dev;};#define	NETDEV_ALIGN		32#define	NETDEV_ALIGN_CONST	(NETDEV_ALIGN - 1)static inline void *netdev_priv(struct net_device *dev){	return (char *)dev + ((sizeof(struct net_device)					+ NETDEV_ALIGN_CONST)				& ~NETDEV_ALIGN_CONST);}#define SET_MODULE_OWNER(dev) do { } while (0)/* Set the sysfs physical device reference for the network logical device * if set prior to registration will cause a symlink during initialization. */#define SET_NETDEV_DEV(net, pdev)	((net)->class_dev.dev = (pdev))struct packet_type {	__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 *);	void			*af_packet_priv;	struct list_head	list;};#include <linux/interrupt.h>#include <linux/notifier.h>extern struct net_device		loopback_dev;		/* The loopback */extern struct net_device		*dev_base;		/* All devices */extern rwlock_t				dev_base_lock;		/* Device list lock */extern int 			netdev_boot_setup_check(struct net_device *dev);extern unsigned long		netdev_boot_base(const char *prefix, int unit);extern struct net_device    *dev_getbyhwaddr(unsigned short type, char *hwaddr);extern struct net_device *dev_getfirstbyhwtype(unsigned short type);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);extern struct net_device	*dev_get_by_flags(unsigned short flags,						  unsigned short mask);extern struct net_device	*dev_get_by_name(const char *name);extern struct net_device	*__dev_get_by_name(const char *name);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);extern int		dev_queue_xmit(struct sk_buff *skb);extern int		register_netdevice(struct net_device *dev);extern int		unregister_netdevice(struct net_device *dev);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);extern int		call_netdevice_notifiers(unsigned long val, void *v);extern struct net_device	*dev_get_by_index(int ifindex);extern struct net_device	*__dev_get_by_index(int ifindex);extern int		dev_restart(struct net_device *dev);#ifdef CONFIG_NETPOLL_TRAPextern int		netpoll_trap(void);#endiftypedef 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. */struct softnet_data{	struct net_device	*output_queue;	struct sk_buff_head	input_pkt_queue;	struct list_head	poll_list;	struct sk_buff		*completion_queue;	struct net_device	backlog_dev;	/* Sorry. 8) */};DECLARE_PER_CPU(struct softnet_data,softnet_data);#define HAVE_NETIF_QUEUEstatic inline void __netif_schedule(struct net_device *dev){	if (!test_and_set_bit(__LINK_STATE_SCHED, &dev->state)) {		unsigned long flags;		struct softnet_data *sd;		local_irq_save(flags);		sd = &__get_cpu_var(softnet_data);		dev->next_sched = sd->output_queue;		sd->output_queue = dev;		raise_softirq_irqoff(NET_TX_SOFTIRQ);		local_irq_restore(flags);	}}static inline void netif_schedule(struct net_device *dev){	if (!test_bit(__LINK_STATE_XOFF, &dev->state))		__netif_schedule(dev);}static inline void netif_start_queue(struct net_device *dev){	clear_bit(__LINK_STATE_XOFF, &dev->state);}static inline void netif_wake_queue(struct net_device *dev){#ifdef CONFIG_NETPOLL_TRAP	if (netpoll_trap())		return;#endif	if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state))		__netif_schedule(dev);}static inline void netif_stop_queue(struct net_device *dev){#ifdef CONFIG_NETPOLL_TRAP	if (netpoll_trap())		return;#endif	set_bit(__LINK_STATE_XOFF, &dev->state);}static inline int netif_queue_stopped(const struct net_device *dev){	return test_bit(__LINK_STATE_XOFF, &dev->state);}static inline int netif_running(const struct net_device *dev){	return test_bit(__LINK_STATE_START, &dev->state);}/* Use this variant when it is known for sure that it * is executing from interrupt context. */static inline void dev_kfree_skb_irq(struct sk_buff *skb){	if (atomic_dec_and_test(&skb->users)) {		struct softnet_data *sd;		unsigned long flags;		local_irq_save(flags);		sd = &__get_cpu_var(softnet_data);		skb->next = sd->completion_queue;		sd->completion_queue = skb;		raise_softirq_irqoff(NET_TX_SOFTIRQ);		local_irq_restore(flags);	}}/* Use this variant in places where it could be invoked * either from interrupt or non-interrupt context. */static inline void dev_kfree_skb_any(struct sk_buff *skb){	if (in_irq() || irqs_disabled())		dev_kfree_skb_irq(skb);	else		dev_kfree_skb(skb);}#define HAVE_NETIF_RX 1extern int		netif_rx(struct sk_buff *skb);extern int		netif_rx_ni(struct sk_buff *skb);#define HAVE_NETIF_RECEIVE_SKB 1extern int		netif_receive_skb(struct sk_buff *skb);extern int		dev_ioctl(unsigned int cmd, void __user *);extern int		dev_ethtool(struct ifreq *);extern unsigned		dev_get_flags(const struct net_device *);extern int		dev_change_flags(struct net_device *, unsigned);extern int		dev_change_name(struct net_device *, char *);extern int		dev_set_mtu(struct net_device *, int);extern int		dev_set_mac_address(struct net_device *,					    struct sockaddr *);extern void		dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev);extern void		dev_init(void);extern int		netdev_nit;extern int		netdev_budget;/* Called by rtnetlink.c:rtnl_unlock() */extern void netdev_run_todo(void);static inline void dev_put(struct net_device *dev){	atomic_dec(&dev->refcnt);}#define __dev_put(dev) atomic_dec(&(dev)->refcnt)#define dev_hold(dev) atomic_inc(&(dev)->refcnt)/* 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. */extern void linkwatch_fire_event(struct net_device *dev);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);extern void netif_carrier_on(struct net_device *dev);extern void netif_carrier_off(struct net_device *dev);/* Hot-plugging. */static inline int netif_device_present(struct net_device *dev){	return test_bit(__LINK_STATE_PRESENT, &dev->state);}static inline void netif_device_detach(struct net_device *dev){	if (test_and_clear_bit(__LINK_STATE_PRESENT, &dev->state) &&	    netif_running(dev)) {		netif_stop_queue(dev);	}}static inline void netif_device_attach(struct net_device *dev){	if (!test_and_set_bit(__LINK_STATE_PRESENT, &dev->state) &&	    netif_running(dev)) {		netif_wake_queue(dev); 		__netdev_watchdog_up(dev);	}}/* * Network interface message level settings */#define HAVE_NETIF_MSG 1enum {	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;}/* Schedule rx intr now? */static inline int netif_rx_schedule_prep(struct net_device *dev){	return netif_running(dev) &&		!test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state);}/* Add interface to tail of rx poll list. This assumes that _prep has * already been called and returned 1. */static inline void __netif_rx_schedule(struct net_device *dev){	unsigned long flags;	local_irq_save(flags);	dev_hold(dev);	list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);	if (dev->quota < 0)		dev->quota += dev->weight;	else		dev->quota = dev->weight;	__raise_softirq_irqoff(NET_RX_SOFTIRQ);	local_irq_restore(flags);}/* Try to reschedule poll. Called by irq handler. */static inline void netif_rx_schedule(struct net_device *dev){	if (netif_rx_schedule_prep(dev))		__netif_rx_schedule(dev);}/* Try to reschedule poll. Called by dev->poll() after netif_rx_complete(). * Do not inline this? */static inline int netif_rx_reschedule(struct net_device *dev, int undo){	if (netif_rx_schedule_prep(dev)) {		unsigned long flags;		dev->quota += undo;		local_irq_save(flags);		list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);		__raise_softirq_irqoff(NET_RX_SOFTIRQ);		local_irq_restore(flags);		return 1;	}	return 0;}/* 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(). */static inline void netif_rx_complete(struct net_device *dev){	unsigned long flags;	local_irq_save(flags);	BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state));	list_del(&dev->poll_list);	smp_mb__before_clear_bit();	clear_bit(__LINK_STATE_RX_SCHED, &dev->state);	local_irq_restore(flags);}static inline void netif_poll_disable(struct net_device *dev){	while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) {		/* No hurry. */		current->state = TASK_INTERRUPTIBLE;		schedule_timeout(1);	}}static inline void netif_poll_enable(struct net_device *dev){	clear_bit(__LINK_STATE_RX_SCHED, &dev->state);}/* same as netif_rx_complete, except that local_irq_save(flags) * has already been issued */static inline void __netif_rx_complete(struct net_device *dev){	BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state));	list_del(&dev->poll_list);	smp_mb__before_clear_bit();	clear_bit(__LINK_STATE_RX_SCHED, &dev->state);}static inline void netif_tx_disable(struct net_device *dev){	spin_lock_bh(&dev->xmit_lock);	netif_stop_queue(dev);	spin_unlock_bh(&dev->xmit_lock);}/* These functions live elsewhere (drivers/net/net_init.c, but related) */extern void		ether_setup(struct net_device *dev);/* Support for loadable net-drivers */extern struct net_device *alloc_netdev(int sizeof_priv, const char *name,				       void (*setup)(struct net_device *));extern int		register_netdev(struct net_device *dev);extern void		unregister_netdev(struct net_device *dev);/* Functions used for multicast support */extern void		dev_mc_upload(struct net_device *dev);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);extern void		dev_mc_discard(struct net_device *dev);extern void		dev_set_promiscuity(struct net_device *dev, int inc);extern void		dev_set_allmulti(struct net_device *dev, int inc);extern void		netdev_state_change(struct net_device *dev);extern void		netdev_features_change(struct net_device *dev);/* Load a device via the kmod */extern void		dev_load(const char *name);extern void		dev_mcast_init(void);extern int		netdev_max_backlog;extern int		weight_p;extern int		netdev_set_master(struct net_device *dev, struct net_device *master);extern int skb_checksum_help(struct sk_buff *skb, int inward);/* rx skb timestamps */extern void		net_enable_timestamp(void);extern void		net_disable_timestamp(void);#ifdef CONFIG_PROC_FSextern 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);#endifextern void linkwatch_run_queue(void);#endif /* __KERNEL__ */#endif	/* _LINUX_DEV_H */

⌨️ 快捷键说明

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