11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Common code for low-level network console, dump, and debugger code 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Derived from netconsole, kgdb-over-ethernet, and netdump patches 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds 71da177e4SLinus Torvalds #ifndef _LINUX_NETPOLL_H 81da177e4SLinus Torvalds #define _LINUX_NETPOLL_H 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include <linux/netdevice.h> 111da177e4SLinus Torvalds #include <linux/interrupt.h> 12*53fb95d3SMatt Mackall #include <linux/rcupdate.h> 131da177e4SLinus Torvalds #include <linux/list.h> 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds struct netpoll; 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds struct netpoll { 181da177e4SLinus Torvalds struct net_device *dev; 191da177e4SLinus Torvalds char dev_name[16], *name; 201da177e4SLinus Torvalds void (*rx_hook)(struct netpoll *, int, char *, int); 211da177e4SLinus Torvalds void (*drop)(struct sk_buff *skb); 221da177e4SLinus Torvalds u32 local_ip, remote_ip; 231da177e4SLinus Torvalds u16 local_port, remote_port; 241da177e4SLinus Torvalds unsigned char local_mac[6], remote_mac[6]; 25115c1d6eSJeff Moyer }; 26115c1d6eSJeff Moyer 27115c1d6eSJeff Moyer struct netpoll_info { 281da177e4SLinus Torvalds spinlock_t poll_lock; 291da177e4SLinus Torvalds int poll_owner; 300db1d6fcSMatt Mackall int tries; 31115c1d6eSJeff Moyer int rx_flags; 32fbeec2e1SJeff Moyer spinlock_t rx_lock; 33fbeec2e1SJeff Moyer struct netpoll *rx_np; /* netpoll that registered an rx_hook */ 341da177e4SLinus Torvalds }; 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds void netpoll_poll(struct netpoll *np); 371da177e4SLinus Torvalds void netpoll_send_udp(struct netpoll *np, const char *msg, int len); 381da177e4SLinus Torvalds int netpoll_parse_options(struct netpoll *np, char *opt); 391da177e4SLinus Torvalds int netpoll_setup(struct netpoll *np); 401da177e4SLinus Torvalds int netpoll_trap(void); 411da177e4SLinus Torvalds void netpoll_set_trap(int trap); 421da177e4SLinus Torvalds void netpoll_cleanup(struct netpoll *np); 431da177e4SLinus Torvalds int __netpoll_rx(struct sk_buff *skb); 441da177e4SLinus Torvalds void netpoll_queue(struct sk_buff *skb); 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds #ifdef CONFIG_NETPOLL 471da177e4SLinus Torvalds static inline int netpoll_rx(struct sk_buff *skb) 481da177e4SLinus Torvalds { 49115c1d6eSJeff Moyer struct netpoll_info *npinfo = skb->dev->npinfo; 50fbeec2e1SJeff Moyer unsigned long flags; 51fbeec2e1SJeff Moyer int ret = 0; 52115c1d6eSJeff Moyer 53fbeec2e1SJeff Moyer if (!npinfo || (!npinfo->rx_np && !npinfo->rx_flags)) 54115c1d6eSJeff Moyer return 0; 55115c1d6eSJeff Moyer 56fbeec2e1SJeff Moyer spin_lock_irqsave(&npinfo->rx_lock, flags); 57fbeec2e1SJeff Moyer /* check rx_flags again with the lock held */ 58fbeec2e1SJeff Moyer if (npinfo->rx_flags && __netpoll_rx(skb)) 59fbeec2e1SJeff Moyer ret = 1; 60fbeec2e1SJeff Moyer spin_unlock_irqrestore(&npinfo->rx_lock, flags); 61fbeec2e1SJeff Moyer 62fbeec2e1SJeff Moyer return ret; 631da177e4SLinus Torvalds } 641da177e4SLinus Torvalds 65*53fb95d3SMatt Mackall static inline void *netpoll_poll_lock(struct net_device *dev) 661da177e4SLinus Torvalds { 67*53fb95d3SMatt Mackall rcu_read_lock(); /* deal with race on ->npinfo */ 68115c1d6eSJeff Moyer if (dev->npinfo) { 69115c1d6eSJeff Moyer spin_lock(&dev->npinfo->poll_lock); 70115c1d6eSJeff Moyer dev->npinfo->poll_owner = smp_processor_id(); 71*53fb95d3SMatt Mackall return dev->npinfo; 721da177e4SLinus Torvalds } 73*53fb95d3SMatt Mackall return NULL; 741da177e4SLinus Torvalds } 751da177e4SLinus Torvalds 76*53fb95d3SMatt Mackall static inline void netpoll_poll_unlock(void *have) 771da177e4SLinus Torvalds { 78*53fb95d3SMatt Mackall struct netpoll_info *npi = have; 79*53fb95d3SMatt Mackall 80*53fb95d3SMatt Mackall if (npi) { 81*53fb95d3SMatt Mackall npi->poll_owner = -1; 82*53fb95d3SMatt Mackall spin_unlock(&npi->poll_lock); 831da177e4SLinus Torvalds } 84*53fb95d3SMatt Mackall rcu_read_unlock(); 851da177e4SLinus Torvalds } 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds #else 881da177e4SLinus Torvalds #define netpoll_rx(a) 0 89*53fb95d3SMatt Mackall #define netpoll_poll_lock(a) 0 901da177e4SLinus Torvalds #define netpoll_poll_unlock(a) 911da177e4SLinus Torvalds #endif 921da177e4SLinus Torvalds 931da177e4SLinus Torvalds #endif 94