Branch data 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 : : static inline void netpoll_poll_disable(struct net_device *dev) { return; } 55 : : 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 : : void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, 67 : : struct net_device *dev); 68 : 0 : static inline void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) 69 : : { 70 : : unsigned long flags; 71 : 0 : local_irq_save(flags); 72 : 0 : netpoll_send_skb_on_dev(np, skb, np->dev); 73 : 0 : local_irq_restore(flags); 74 : 0 : } 75 : : 76 : : #ifdef CONFIG_NETPOLL 77 : 3 : static inline void *netpoll_poll_lock(struct napi_struct *napi) 78 : : { 79 : 3 : struct net_device *dev = napi->dev; 80 : : 81 : 3 : if (dev && dev->npinfo) { 82 : 0 : int owner = smp_processor_id(); 83 : : 84 : 0 : while (cmpxchg(&napi->poll_owner, -1, owner) != -1) 85 : 0 : cpu_relax(); 86 : : 87 : : return napi; 88 : : } 89 : : return NULL; 90 : : } 91 : : 92 : : static inline void netpoll_poll_unlock(void *have) 93 : : { 94 : : struct napi_struct *napi = have; 95 : : 96 : 3 : if (napi) 97 : 0 : smp_store_release(&napi->poll_owner, -1); 98 : : } 99 : : 100 : : static inline bool netpoll_tx_running(struct net_device *dev) 101 : : { 102 : 0 : return irqs_disabled(); 103 : : } 104 : : 105 : : #else 106 : : static inline void *netpoll_poll_lock(struct napi_struct *napi) 107 : : { 108 : : return NULL; 109 : : } 110 : : static inline void netpoll_poll_unlock(void *have) 111 : : { 112 : : } 113 : : static inline void netpoll_netdev_init(struct net_device *dev) 114 : : { 115 : : } 116 : : static inline bool netpoll_tx_running(struct net_device *dev) 117 : : { 118 : : return false; 119 : : } 120 : : #endif 121 : : 122 : : #endif