linux/include/linux/netpoll.h
<<
>>
Prefs
   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
  15struct netpoll {
  16        struct net_device *dev;
  17        char dev_name[IFNAMSIZ];
  18        const char *name;
  19        void (*rx_hook)(struct netpoll *, int, char *, int);
  20
  21        u32 local_ip, remote_ip;
  22        u16 local_port, remote_port;
  23        u8 local_mac[ETH_ALEN], remote_mac[ETH_ALEN];
  24};
  25
  26struct netpoll_info {
  27        atomic_t refcnt;
  28        spinlock_t poll_lock;
  29        int poll_owner;
  30        int rx_flags;
  31        spinlock_t rx_lock;
  32        struct netpoll *rx_np; /* netpoll that registered an rx_hook */
  33        struct sk_buff_head arp_tx; /* list of arp requests to reply to */
  34        struct sk_buff_head txq;
  35        struct delayed_work tx_work;
  36};
  37
  38void netpoll_poll(struct netpoll *np);
  39void netpoll_send_udp(struct netpoll *np, const char *msg, int len);
  40int netpoll_parse_options(struct netpoll *np, char *opt);
  41int netpoll_setup(struct netpoll *np);
  42int netpoll_trap(void);
  43void netpoll_set_trap(int trap);
  44void netpoll_cleanup(struct netpoll *np);
  45int __netpoll_rx(struct sk_buff *skb);
  46
  47
  48#ifdef CONFIG_NETPOLL
  49static inline int netpoll_rx(struct sk_buff *skb)
  50{
  51        struct netpoll_info *npinfo = skb->dev->npinfo;
  52        unsigned long flags;
  53        int ret = 0;
  54
  55        if (!npinfo || (!npinfo->rx_np && !npinfo->rx_flags))
  56                return 0;
  57
  58        spin_lock_irqsave(&npinfo->rx_lock, flags);
  59        /* check rx_flags again with the lock held */
  60        if (npinfo->rx_flags && __netpoll_rx(skb))
  61                ret = 1;
  62        spin_unlock_irqrestore(&npinfo->rx_lock, flags);
  63
  64        return ret;
  65}
  66
  67static inline void *netpoll_poll_lock(struct net_device *dev)
  68{
  69        rcu_read_lock(); /* deal with race on ->npinfo */
  70        if (dev->npinfo) {
  71                spin_lock(&dev->npinfo->poll_lock);
  72                dev->npinfo->poll_owner = smp_processor_id();
  73                return dev->npinfo;
  74        }
  75        return NULL;
  76}
  77
  78static inline void netpoll_poll_unlock(void *have)
  79{
  80        struct netpoll_info *npi = have;
  81
  82        if (npi) {
  83                npi->poll_owner = -1;
  84                spin_unlock(&npi->poll_lock);
  85        }
  86        rcu_read_unlock();
  87}
  88
  89#else
  90#define netpoll_rx(a) 0
  91#define netpoll_poll_lock(a) NULL
  92#define netpoll_poll_unlock(a)
  93#endif
  94
  95#endif
  96
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.