0
      ˆl–Ü4ý()¨‰P@Šû�nã.)‹Fÿ¿0ÂÁ     �ÃÂÁ      File not found.
  *   	ˆl–Ü4ý( ©³( 	Å€fàB¦-ÿÀƒO7_†I|¥�+ÄÃ 	µ    	/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Common code for low-level network console, dump, and debugger code
 *
 * Derived from netconsole, kgdb-over-ethernet, and netdump patches
 */

#ifndef _LINUX_NETPOLL_H
#define _LINUX_NETPOLL_H

#include <linux/netdevice.h>
#include <linux/interrupt.h>
#include <linux/rcupdate.h>
#include <linux/list.h>
#include <linux/refcount.h>

union inet_addr {
	__u32		all[4];
	__be32		ip;
	__be32		ip6[4];
	struct in_addr	in;
	struct in6_addr	in6;
};

struct netpoll {
	struct net_device *dev;
	netdevice_tracker dev_tracker;
	char dev_name[IFNAMSIZ];
	const char *name;

	union inet_addr local_ip, remote_ip;
	bool ipv6;
	u16 local_port, remote_port;
	u8 remote_mac[ETH_ALEN];
};

struct netpoll_info {
	refcount_t refcnt;

	struct semaphore dev_lock;

	struct sk_buff_head txq;

	struct delayed_work tx_work;

	struct netpoll *netpoll;
	struct rcu_head rcu;
};

#ifdef CONFIG_NETPOLL
void netpoll_poll_dev(struct net_device *dev);
void netpoll_poll_disable(struct net_device *dev);
void netpoll_poll_enable(struct net_device *dev);
#else
static inline void netpoll_poll_disable(struct net_device *dev) { return; }
static inline void netpoll_poll_enable(struct net_device *dev) { return; }
#endif

void netpoll_send_udp(struct netpoll *np, const char *msg, int len);
void netpoll_print_options(struct netpoll *np);
int netpoll_parse_options(struct netpoll *np, char *opt);
int __netpoll_setup(struct netpoll *np, struct net_device *ndev);
int netpoll_setup(struct netpoll *np);
void __netpoll_cleanup(struct netpoll *np);
void __netpoll_free(struct netpoll *np);
void netpoll_cleanup(struct netpoll *np);
netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb);

#ifdef CONFIG_NETPOLL
static inline void *netpoll_poll_lock(struct napi_struct *napi)
{
	struct net_device *dev = napi->dev;

	if (dev && dev->npinfo) {
		int owner = smp_processor_id();

		while (cmpxchg(&napi->poll_owner, -1, owner) != -1)
			cpu_relax();

		return napi;
	}
	return NULL;
}

static inline void netpoll_poll_unlock(void *have)
{
	struct napi_struct *napi = have;

	if (napi)
		smp_store_release(&napi->poll_owner, -1);
}

static inline bool netpoll_tx_running(struct net_device *dev)
{
	return irqs_disabled();
}

#else
static inline void *netpoll_poll_lock(struct napi_struct *napi)
{
	return NULL;
}
static inline void netpoll_poll_unlock(void *have)
{
}
static inline bool netpoll_tx_running(struct net_device *dev)
{
	return false;
}
#endif

#endif
  1   ˆl–ßi~”êh¥8 Eq‘\eÅ1hßÂ„o�¯_ŒuÐb&=Ly[Ï¿ÆÅ ?÷     ý7zXZ  i"Þ6 !   t/å£àÇ#dò] /�É¦°PþT“­(Ó/2fçCºŠ9XÓ’T­ë3S$S¾ï­"ëA„¼¦½EY8µ»kí_ääÝÖ>æc«¡;ãv~ÿ‘À“Á¹fœ1Ã‰pRUÛjÉ_/mDH¥­°„2´ªæÁZB¤ƒg*¨Û µÿØ>¾
¬0 ÝÜr»I]Îyj%³/Üzg-Ï`r&sºƒ�ÑÄ\•ÌÃob}TßŠqho(1ùW;†"PCM“‰‘ÀmÒ
Zz\Nõ8B¸X@ãQ±V|‰Ê¬¡÷ñL¦¡?�”8úñ™¦\å‡eðÖ™¬/ÿ­6­�·±cŒÞfúC¼t•žWAåèêÌî~{¼âk©z?{�ºãQ}ûJTØ£.ÄÎW˜_Gô�£\?ˆŸUíÁˆˆ€Ïøú³ÜTëžÞkVN%óé°ºej»V?«ôl·”÷*–X[þpj[m¬š‘‹Zvª|1¦p¢¬ÃÙ:kˆdƒ'X·•nÜ¦—·�,ÖX¹!å²BbÇpŠì^ÝhjHÀÛûG ¥/K_Pí´ž‰%ŒÁ†UÅ%5íˆHÿîbÖà²pPuêJs±&÷	Ïá®:àP�\S '\4!3÷«ê—j\©‘»ÄüÁE¼‘EÀ’&“ì¶Ç>‡ô0ÉöÐ^;õÉH¦ªí8¥÷Es+GíŸ$K½]z9¾$É ÈíûÖj�Mõy6d­‰�7¾ç*Š\¬œ|ž×¶ÁùUríß&ÒTôd<I ÍË…ùÕ\ÔaŠ±–óo›¦õ£Á½�†õ@’\xçÂHáš�™Œs±{ÐîpˆoqºàÄNÂ÷2g!nI?¨ a‹UUxí,@Ü	~râj9ÓKœCœõÜDg–WØ‚™*£’Á€ãµ8Ü}p«ƒÛõ„ÿˆãQI�Ç2 Ü1Ð@ÖTÖGõ »‰nçœßmh¿¥:lÕÄ»(MZ ×õ®&žlÑr^öÃ~&‚¸ƒü°û¬R(qQ«q�›k§âÄÿñN´½^KGd«‘7Ûr"8>ÇÓÒ¬8" ©í1HÐôAƒ01l˜±ŒH
Õ÷QBõ	ÉònqdåÝëB<ÃPvñ(§§ð‘%ù[®¿Ýòé®=¦hõ–4¦é2	Ž%»yÄø7Üé¤jAòŽïB,’£g=‰M�ˆá Xñ˜¯ê/QÍü	·|iHNÏS­¢Œ'Çcæ-ÍÖý¬Í(¾^C-^=¢Û¥±ð'±h…vÕcK°€v8[ê¦¹]¤"ªÂLºÄ–9ÿ6Úð4ŽD�Úˆ³æWýúJmKû½D2�î5s?Øme”ð¦1k¼LXd–‰iº,8pæüU”º$HÓƒp~)‘²b8\²N;þºEÙ1Ñ¼1úæãàÿ”D?Àh¦`d  ÃëÓ5©Ê‚“<ðò¼ÿƒ“œ‚õ	C-¨„OÄN#ý|6›0;K»%�
ê®Q šKsf,ÛÞÑ»ªR†4}Ù{ªÃÑÝÌlÑä^òy[Ðf,ç›ºi»å°¦*Qgè÷»kÝÍé^H“4û<˜�_Ÿ}®NB¿Wš³õ‡Ó†™9f‘Hm tyî�;i:~4mÍ5ÓHÚV‚à³Èøµäñô1ö_M/Ð¸–�pÂ¢gèWyÊ¥´R'ô’ÁáüW†¢h‘±K•(ceo®æ4vÅ9§.½Wò}
Áx]X5¶É_ÂÇ| ‘9Ü ¥ùÐyéÚh¡Ë£ãhGl6³š_Í!Y%±UÃ¡/	¡/Ú}„¡yñ\‡ãÏà—hXÄ
³§>ÔÏMäF4Úytý