Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : /* 3 : * Common code for low-level network console, dump, and debugger code 4 : * 5 : * Derived from netconsole, kgdb-over-ethernet, and netdump patches 6 : */ 7 : 8 : #ifndef _LINUX_NETPOLL_H 9 : #define _LINUX_NETPOLL_H 10 : 11 : #include <linux/netdevice.h> 12 : #include <linux/interrupt.h> 13 : #include <linux/rcupdate.h> 14 : #include <linux/list.h> 15 : #include <linux/refcount.h> 16 : 17 : union inet_addr { 18 : __u32 all[4]; 19 : __be32 ip; 20 : __be32 ip6[4]; 21 : struct in_addr in; 22 : struct in6_addr in6; 23 : }; 24 : 25 : struct netpoll { 26 : struct net_device *dev; 27 : char dev_name[IFNAMSIZ]; 28 : const char *name; 29 : 30 : union inet_addr local_ip, remote_ip; 31 : bool ipv6; 32 : u16 local_port, remote_port; 33 : u8 remote_mac[ETH_ALEN]; 34 : }; 35 : 36 : struct netpoll_info { 37 : refcount_t refcnt; 38 : 39 : struct semaphore dev_lock; 40 : 41 : struct sk_buff_head txq; 42 : 43 : struct delayed_work tx_work; 44 : 45 : struct netpoll *netpoll; 46 : struct rcu_head rcu; 47 : }; 48 : 49 : #ifdef CONFIG_NETPOLL 50 : void netpoll_poll_dev(struct net_device *dev); 51 : void netpoll_poll_disable(struct net_device *dev); 52 : void netpoll_poll_enable(struct net_device *dev); 53 : #else 54 2 : static inline void netpoll_poll_disable(struct net_device *dev) { return; } 55 2 : 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(struct netpoll *np); 65 : void netpoll_cleanup(struct netpoll *np); 66 : netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb); 67 : 68 : #ifdef CONFIG_NETPOLL 69 : static inline void *netpoll_poll_lock(struct napi_struct *napi) 70 : { 71 : struct net_device *dev = napi->dev; 72 : 73 : if (dev && dev->npinfo) { 74 : int owner = smp_processor_id(); 75 : 76 : while (cmpxchg(&napi->poll_owner, -1, owner) != -1) 77 : cpu_relax(); 78 : 79 : return napi; 80 : } 81 : return NULL; 82 : } 83 : 84 : static inline void netpoll_poll_unlock(void *have) 85 : { 86 : struct napi_struct *napi = have; 87 : 88 : if (napi) 89 : smp_store_release(&napi->poll_owner, -1); 90 : } 91 : 92 : static inline bool netpoll_tx_running(struct net_device *dev) 93 : { 94 : return irqs_disabled(); 95 : } 96 : 97 : #else 98 855 : static inline void *netpoll_poll_lock(struct napi_struct *napi) 99 : { 100 855 : return NULL; 101 : } 102 0 : static inline void netpoll_poll_unlock(void *have) 103 : { 104 0 : } 105 : static inline bool netpoll_tx_running(struct net_device *dev) 106 : { 107 : return false; 108 : } 109 : #endif 110 : 111 : #endif