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> 1253fb95d3SMatt Mackall #include <linux/rcupdate.h> 131da177e4SLinus Torvalds #include <linux/list.h> 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds struct netpoll { 161da177e4SLinus Torvalds struct net_device *dev; 17*bf6bce71SStephen Hemminger char dev_name[IFNAMSIZ]; 18*bf6bce71SStephen Hemminger const char *name; 191da177e4SLinus Torvalds void (*rx_hook)(struct netpoll *, int, char *, int); 205de4a473SStephen Hemminger 211da177e4SLinus Torvalds u32 local_ip, remote_ip; 221da177e4SLinus Torvalds u16 local_port, remote_port; 23*bf6bce71SStephen Hemminger u8 local_mac[ETH_ALEN], remote_mac[ETH_ALEN]; 24115c1d6eSJeff Moyer }; 25115c1d6eSJeff Moyer 26115c1d6eSJeff Moyer struct netpoll_info { 2793ec2c72SStephen Hemminger atomic_t refcnt; 281da177e4SLinus Torvalds spinlock_t poll_lock; 291da177e4SLinus Torvalds int poll_owner; 30115c1d6eSJeff Moyer int rx_flags; 31fbeec2e1SJeff Moyer spinlock_t rx_lock; 32fbeec2e1SJeff Moyer struct netpoll *rx_np; /* netpoll that registered an rx_hook */ 33068c6e98SNeil Horman struct sk_buff_head arp_tx; /* list of arp requests to reply to */ 34b6cd27edSStephen Hemminger struct sk_buff_head txq; 35b6cd27edSStephen Hemminger struct work_struct tx_work; 361da177e4SLinus Torvalds }; 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds void netpoll_poll(struct netpoll *np); 391da177e4SLinus Torvalds void netpoll_send_udp(struct netpoll *np, const char *msg, int len); 401da177e4SLinus Torvalds int netpoll_parse_options(struct netpoll *np, char *opt); 411da177e4SLinus Torvalds int netpoll_setup(struct netpoll *np); 421da177e4SLinus Torvalds int netpoll_trap(void); 431da177e4SLinus Torvalds void netpoll_set_trap(int trap); 441da177e4SLinus Torvalds void netpoll_cleanup(struct netpoll *np); 451da177e4SLinus Torvalds int __netpoll_rx(struct sk_buff *skb); 465de4a473SStephen Hemminger 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds #ifdef CONFIG_NETPOLL 491da177e4SLinus Torvalds static inline int netpoll_rx(struct sk_buff *skb) 501da177e4SLinus Torvalds { 51115c1d6eSJeff Moyer struct netpoll_info *npinfo = skb->dev->npinfo; 52fbeec2e1SJeff Moyer unsigned long flags; 53fbeec2e1SJeff Moyer int ret = 0; 54115c1d6eSJeff Moyer 55fbeec2e1SJeff Moyer if (!npinfo || (!npinfo->rx_np && !npinfo->rx_flags)) 56115c1d6eSJeff Moyer return 0; 57115c1d6eSJeff Moyer 58fbeec2e1SJeff Moyer spin_lock_irqsave(&npinfo->rx_lock, flags); 59fbeec2e1SJeff Moyer /* check rx_flags again with the lock held */ 60fbeec2e1SJeff Moyer if (npinfo->rx_flags && __netpoll_rx(skb)) 61fbeec2e1SJeff Moyer ret = 1; 62fbeec2e1SJeff Moyer spin_unlock_irqrestore(&npinfo->rx_lock, flags); 63fbeec2e1SJeff Moyer 64fbeec2e1SJeff Moyer return ret; 651da177e4SLinus Torvalds } 661da177e4SLinus Torvalds 6753fb95d3SMatt Mackall static inline void *netpoll_poll_lock(struct net_device *dev) 681da177e4SLinus Torvalds { 6953fb95d3SMatt Mackall rcu_read_lock(); /* deal with race on ->npinfo */ 70115c1d6eSJeff Moyer if (dev->npinfo) { 71115c1d6eSJeff Moyer spin_lock(&dev->npinfo->poll_lock); 72115c1d6eSJeff Moyer dev->npinfo->poll_owner = smp_processor_id(); 7353fb95d3SMatt Mackall return dev->npinfo; 741da177e4SLinus Torvalds } 7553fb95d3SMatt Mackall return NULL; 761da177e4SLinus Torvalds } 771da177e4SLinus Torvalds 7853fb95d3SMatt Mackall static inline void netpoll_poll_unlock(void *have) 791da177e4SLinus Torvalds { 8053fb95d3SMatt Mackall struct netpoll_info *npi = have; 8153fb95d3SMatt Mackall 8253fb95d3SMatt Mackall if (npi) { 8353fb95d3SMatt Mackall npi->poll_owner = -1; 8453fb95d3SMatt Mackall spin_unlock(&npi->poll_lock); 851da177e4SLinus Torvalds } 8653fb95d3SMatt Mackall rcu_read_unlock(); 871da177e4SLinus Torvalds } 881da177e4SLinus Torvalds 891da177e4SLinus Torvalds #else 901da177e4SLinus Torvalds #define netpoll_rx(a) 0 91afb997c6SBen Dooks #define netpoll_poll_lock(a) NULL 921da177e4SLinus Torvalds #define netpoll_poll_unlock(a) 931da177e4SLinus Torvalds #endif 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds #endif 96