|
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 |
|
15 struct 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 remote_mac[ETH_ALEN]; |
|
24 }; |
|
25 |
|
26 struct netpoll_info { |
|
27 atomic_t refcnt; |
|
28 int rx_flags; |
|
29 spinlock_t rx_lock; |
|
30 struct netpoll *rx_np; /* netpoll that registered an rx_hook */ |
|
31 struct sk_buff_head arp_tx; /* list of arp requests to reply to */ |
|
32 struct sk_buff_head txq; |
|
33 struct delayed_work tx_work; |
|
34 }; |
|
35 |
|
36 void netpoll_poll(struct netpoll *np); |
|
37 void netpoll_send_udp(struct netpoll *np, const char *msg, int len); |
|
38 void netpoll_print_options(struct netpoll *np); |
|
39 int netpoll_parse_options(struct netpoll *np, char *opt); |
|
40 int netpoll_setup(struct netpoll *np); |
|
41 int netpoll_trap(void); |
|
42 void netpoll_set_trap(int trap); |
|
43 void netpoll_cleanup(struct netpoll *np); |
|
44 int __netpoll_rx(struct sk_buff *skb); |
|
45 |
|
46 |
|
47 #ifdef CONFIG_NETPOLL |
|
48 static inline int netpoll_rx(struct sk_buff *skb) |
|
49 { |
|
50 struct netpoll_info *npinfo = skb->dev->npinfo; |
|
51 unsigned long flags; |
|
52 int ret = 0; |
|
53 |
|
54 if (!npinfo || (!npinfo->rx_np && !npinfo->rx_flags)) |
|
55 return 0; |
|
56 |
|
57 spin_lock_irqsave(&npinfo->rx_lock, flags); |
|
58 /* check rx_flags again with the lock held */ |
|
59 if (npinfo->rx_flags && __netpoll_rx(skb)) |
|
60 ret = 1; |
|
61 spin_unlock_irqrestore(&npinfo->rx_lock, flags); |
|
62 |
|
63 return ret; |
|
64 } |
|
65 |
|
66 static inline int netpoll_receive_skb(struct sk_buff *skb) |
|
67 { |
|
68 if (!list_empty(&skb->dev->napi_list)) |
|
69 return netpoll_rx(skb); |
|
70 return 0; |
|
71 } |
|
72 |
|
73 static inline void *netpoll_poll_lock(struct napi_struct *napi) |
|
74 { |
|
75 struct net_device *dev = napi->dev; |
|
76 |
|
77 rcu_read_lock(); /* deal with race on ->npinfo */ |
|
78 if (dev && dev->npinfo) { |
|
79 spin_lock(&napi->poll_lock); |
|
80 napi->poll_owner = smp_processor_id(); |
|
81 return napi; |
|
82 } |
|
83 return NULL; |
|
84 } |
|
85 |
|
86 static inline void netpoll_poll_unlock(void *have) |
|
87 { |
|
88 struct napi_struct *napi = have; |
|
89 |
|
90 if (napi) { |
|
91 napi->poll_owner = -1; |
|
92 spin_unlock(&napi->poll_lock); |
|
93 } |
|
94 rcu_read_unlock(); |
|
95 } |
|
96 |
|
97 static inline void netpoll_netdev_init(struct net_device *dev) |
|
98 { |
|
99 INIT_LIST_HEAD(&dev->napi_list); |
|
100 } |
|
101 |
|
102 #else |
|
103 static inline int netpoll_rx(struct sk_buff *skb) |
|
104 { |
|
105 return 0; |
|
106 } |
|
107 static inline int netpoll_receive_skb(struct sk_buff *skb) |
|
108 { |
|
109 return 0; |
|
110 } |
|
111 static inline void *netpoll_poll_lock(struct napi_struct *napi) |
|
112 { |
|
113 return NULL; |
|
114 } |
|
115 static inline void netpoll_poll_unlock(void *have) |
|
116 { |
|
117 } |
|
118 static inline void netpoll_netdev_init(struct net_device *dev) |
|
119 { |
|
120 } |
|
121 #endif |
|
122 |
|
123 #endif |