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 + -
显示快捷键?