1 /* 2 * Common code for low-level network console, dump, and debugger code 3 * 4 * Derived from netconsole, kgdb-over-ethernet, and netdump patches 5 */ 6 7 #ifndef _LINUX_NETPOLL_H 8 #define _LINUX_NETPOLL_H 9 10 #include <linux/netdevice.h> 11 #include <linux/interrupt.h> 12 #include <linux/rcupdate.h> 13 #include <linux/list.h> 14 #include <linux/refcount.h> 15 16 union inet_addr { 17 __u32 all[4]; 18 __be32 ip; 19 __be32 ip6[4]; 20 struct in_addr in; 21 struct in6_addr in6; 22 }; 23 24 struct netpoll { 25 struct net_device *dev; 26 char dev_name[IFNAMSIZ]; 27 const char *name; 28 29 union inet_addr local_ip, remote_ip; 30 bool ipv6; 31 u16 local_port, remote_port; 32 u8 remote_mac[ETH_ALEN]; 33 34 struct work_struct cleanup_work; 35 }; 36 37 struct netpoll_info { 38 refcount_t refcnt; 39 40 struct semaphore dev_lock; 41 42 struct sk_buff_head txq; 43 44 struct delayed_work tx_work; 45 46 struct netpoll *netpoll; 47 struct rcu_head rcu; 48 }; 49 50 #ifdef CONFIG_NETPOLL 51 extern void netpoll_poll_disable(struct net_device *dev); 52 extern void netpoll_poll_enable(struct net_device *dev); 53 #else 54 static inline void netpoll_poll_disable(struct net_device *dev) { return; } 55 static inline void netpoll_poll_enable(struct net_device *dev) { return; } 56 #endif 57 58 void netpoll_send_udp(struct netpoll *np, const char *msg, int len); 59 void netpoll_print_options(struct netpoll *np); 60 int netpoll_parse_options(struct netpoll *np, char *opt); 61 int __netpoll_setup(struct netpoll *np, struct net_device *ndev); 62 int netpoll_setup(struct netpoll *np); 63 void __netpoll_cleanup(struct netpoll *np); 64 void __netpoll_free_async(struct netpoll *np); 65 void netpoll_cleanup(struct netpoll *np); 66 void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, 67 struct net_device *dev); 68 static inline void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) 69 { 70 unsigned long flags; 71 local_irq_save(flags); 72 netpoll_send_skb_on_dev(np, skb, np->dev); 73 local_irq_restore(flags); 74 } 75 76 #ifdef CONFIG_NETPOLL 77 static inline void *netpoll_poll_lock(struct napi_struct *napi) 78 { 79 struct net_device *dev = napi->dev; 80 81 if (dev && dev->npinfo) { 82 int owner = smp_processor_id(); 83 84 while (cmpxchg(&napi->poll_owner, -1, owner) != -1) 85 cpu_relax(); 86 87 return napi; 88 } 89 return NULL; 90 } 91 92 static inline void netpoll_poll_unlock(void *have) 93 { 94 struct napi_struct *napi = have; 95 96 if (napi) 97 smp_store_release(&napi->poll_owner, -1); 98 } 99 100 static inline bool netpoll_tx_running(struct net_device *dev) 101 { 102 return irqs_disabled(); 103 } 104 105 #else 106 static inline void *netpoll_poll_lock(struct napi_struct *napi) 107 { 108 return NULL; 109 } 110 static inline void netpoll_poll_unlock(void *have) 111 { 112 } 113 static inline void netpoll_netdev_init(struct net_device *dev) 114 { 115 } 116 static inline bool netpoll_tx_running(struct net_device *dev) 117 { 118 return false; 119 } 120 #endif 121 122 #endif 123