xref: /plan9-contrib/sys/src/9k/ip/ip.h (revision af94aef917f4ab0b0d706f43dac2fd4a78640131)
19ef1f84bSDavid du Colombier typedef struct	Conv	Conv;
29ef1f84bSDavid du Colombier typedef struct	Fragment4 Fragment4;
39ef1f84bSDavid du Colombier typedef struct	Fragment6 Fragment6;
49ef1f84bSDavid du Colombier typedef struct	Fs	Fs;
59ef1f84bSDavid du Colombier typedef union	Hwaddr	Hwaddr;
69ef1f84bSDavid du Colombier typedef struct	IP	IP;
79ef1f84bSDavid du Colombier typedef struct	IPaux	IPaux;
89ef1f84bSDavid du Colombier typedef struct	Ip4hdr	Ip4hdr;
99ef1f84bSDavid du Colombier typedef struct	Ipfrag	Ipfrag;
109ef1f84bSDavid du Colombier typedef struct	Ipself	Ipself;
119ef1f84bSDavid du Colombier typedef struct	Ipselftab	Ipselftab;
129ef1f84bSDavid du Colombier typedef struct	Iplink	Iplink;
139ef1f84bSDavid du Colombier typedef struct	Iplifc	Iplifc;
149ef1f84bSDavid du Colombier typedef struct	Ipmulti	Ipmulti;
159ef1f84bSDavid du Colombier typedef struct	Ipifc	Ipifc;
169ef1f84bSDavid du Colombier typedef struct	Iphash	Iphash;
179ef1f84bSDavid du Colombier typedef struct	Ipht	Ipht;
189ef1f84bSDavid du Colombier typedef struct	Netlog	Netlog;
199ef1f84bSDavid du Colombier typedef struct	Medium	Medium;
209ef1f84bSDavid du Colombier typedef struct	Proto	Proto;
219ef1f84bSDavid du Colombier typedef struct	Arpent	Arpent;
229ef1f84bSDavid du Colombier typedef struct	Arp Arp;
239ef1f84bSDavid du Colombier typedef struct	Route	Route;
249ef1f84bSDavid du Colombier 
259ef1f84bSDavid du Colombier typedef struct	Routerparams	Routerparams;
269ef1f84bSDavid du Colombier typedef struct	Hostparams	Hostparams;
279ef1f84bSDavid du Colombier typedef struct	v6router	v6router;
289ef1f84bSDavid du Colombier typedef struct	v6params	v6params;
299ef1f84bSDavid du Colombier 
309ef1f84bSDavid du Colombier #pragma incomplete Arp
319ef1f84bSDavid du Colombier #pragma incomplete Ipself
329ef1f84bSDavid du Colombier #pragma incomplete Ipselftab
339ef1f84bSDavid du Colombier #pragma incomplete IP
349ef1f84bSDavid du Colombier #pragma incomplete Netlog
359ef1f84bSDavid du Colombier 
369ef1f84bSDavid du Colombier enum
379ef1f84bSDavid du Colombier {
389ef1f84bSDavid du Colombier 	Addrlen=	64,
399ef1f84bSDavid du Colombier 	Maxproto=	20,
40*a3323688SDavid du Colombier 	Maxincall=	128,	/* max. conn.s in listen q not accepted yet */
419ef1f84bSDavid du Colombier 	Nchans=		1024,
429ef1f84bSDavid du Colombier 	MAClen=		16,		/* longest mac address */
439ef1f84bSDavid du Colombier 
449ef1f84bSDavid du Colombier 	MAXTTL=		255,
459ef1f84bSDavid du Colombier 	DFLTTOS=	0,
469ef1f84bSDavid du Colombier 
479ef1f84bSDavid du Colombier 	IPaddrlen=	16,
489ef1f84bSDavid du Colombier 	IPv4addrlen=	4,
499ef1f84bSDavid du Colombier 	IPv4off=	12,
509ef1f84bSDavid du Colombier 	IPllen=		4,
519ef1f84bSDavid du Colombier 
529ef1f84bSDavid du Colombier 	/* ip versions */
539ef1f84bSDavid du Colombier 	V4=		4,
549ef1f84bSDavid du Colombier 	V6=		6,
559ef1f84bSDavid du Colombier 	IP_VER4=	0x40,
569ef1f84bSDavid du Colombier 	IP_VER6=	0x60,
579ef1f84bSDavid du Colombier 	IP_HLEN4=	5,		/* v4: Header length in words */
589ef1f84bSDavid du Colombier 	IP_DF=		0x4000,		/* v4: Don't fragment */
599ef1f84bSDavid du Colombier 	IP_MF=		0x2000,		/* v4: More fragments */
609ef1f84bSDavid du Colombier 	IP4HDR=		20,		/* sizeof(Ip4hdr) */
619ef1f84bSDavid du Colombier 	IP_MAX=		64*1024,	/* Max. Internet packet size, v4 & v6 */
629ef1f84bSDavid du Colombier 
639ef1f84bSDavid du Colombier 	/* 2^Lroot trees in the root table */
649ef1f84bSDavid du Colombier 	Lroot=		10,
659ef1f84bSDavid du Colombier 
669ef1f84bSDavid du Colombier 	Maxpath =	64,
679ef1f84bSDavid du Colombier };
689ef1f84bSDavid du Colombier 
699ef1f84bSDavid du Colombier enum
709ef1f84bSDavid du Colombier {
719ef1f84bSDavid du Colombier 	Idle=		0,
729ef1f84bSDavid du Colombier 	Announcing=	1,
739ef1f84bSDavid du Colombier 	Announced=	2,
749ef1f84bSDavid du Colombier 	Connecting=	3,
759ef1f84bSDavid du Colombier 	Connected=	4,
769ef1f84bSDavid du Colombier };
779ef1f84bSDavid du Colombier 
789ef1f84bSDavid du Colombier /* MIB II counters */
799ef1f84bSDavid du Colombier enum
809ef1f84bSDavid du Colombier {
819ef1f84bSDavid du Colombier 	Forwarding,
829ef1f84bSDavid du Colombier 	DefaultTTL,
839ef1f84bSDavid du Colombier 	InReceives,
849ef1f84bSDavid du Colombier 	InHdrErrors,
859ef1f84bSDavid du Colombier 	InAddrErrors,
869ef1f84bSDavid du Colombier 	ForwDatagrams,
879ef1f84bSDavid du Colombier 	InUnknownProtos,
889ef1f84bSDavid du Colombier 	InDiscards,
899ef1f84bSDavid du Colombier 	InDelivers,
909ef1f84bSDavid du Colombier 	OutRequests,
919ef1f84bSDavid du Colombier 	OutDiscards,
929ef1f84bSDavid du Colombier 	OutNoRoutes,
939ef1f84bSDavid du Colombier 	ReasmTimeout,
949ef1f84bSDavid du Colombier 	ReasmReqds,
959ef1f84bSDavid du Colombier 	ReasmOKs,
969ef1f84bSDavid du Colombier 	ReasmFails,
979ef1f84bSDavid du Colombier 	FragOKs,
989ef1f84bSDavid du Colombier 	FragFails,
999ef1f84bSDavid du Colombier 	FragCreates,
1009ef1f84bSDavid du Colombier 
1019ef1f84bSDavid du Colombier 	Nipstats,
1029ef1f84bSDavid du Colombier };
1039ef1f84bSDavid du Colombier 
1049ef1f84bSDavid du Colombier struct Fragment4
1059ef1f84bSDavid du Colombier {
1069ef1f84bSDavid du Colombier 	Block*	blist;
1079ef1f84bSDavid du Colombier 	Fragment4*	next;
1089ef1f84bSDavid du Colombier 	ulong	src;
1099ef1f84bSDavid du Colombier 	ulong	dst;
1109ef1f84bSDavid du Colombier 	ushort	id;
1119ef1f84bSDavid du Colombier 	ulong	age;
1129ef1f84bSDavid du Colombier };
1139ef1f84bSDavid du Colombier 
1149ef1f84bSDavid du Colombier struct Fragment6
1159ef1f84bSDavid du Colombier {
1169ef1f84bSDavid du Colombier 	Block*	blist;
1179ef1f84bSDavid du Colombier 	Fragment6*	next;
1189ef1f84bSDavid du Colombier 	uchar	src[IPaddrlen];
1199ef1f84bSDavid du Colombier 	uchar	dst[IPaddrlen];
1209ef1f84bSDavid du Colombier 	uint	id;
1219ef1f84bSDavid du Colombier 	ulong	age;
1229ef1f84bSDavid du Colombier };
1239ef1f84bSDavid du Colombier 
1249ef1f84bSDavid du Colombier struct Ipfrag
1259ef1f84bSDavid du Colombier {
1269ef1f84bSDavid du Colombier 	ushort	foff;
1279ef1f84bSDavid du Colombier 	ushort	flen;
1289ef1f84bSDavid du Colombier 
1299ef1f84bSDavid du Colombier 	uchar	payload[];
1309ef1f84bSDavid du Colombier };
1319ef1f84bSDavid du Colombier 
1329ef1f84bSDavid du Colombier #define IPFRAGSZ offsetof(Ipfrag, payload[0])
1339ef1f84bSDavid du Colombier 
1349ef1f84bSDavid du Colombier /* an instance of IP */
1359ef1f84bSDavid du Colombier struct IP
1369ef1f84bSDavid du Colombier {
1379ef1f84bSDavid du Colombier 	uvlong		stats[Nipstats];
1389ef1f84bSDavid du Colombier 
1399ef1f84bSDavid du Colombier 	QLock		fraglock4;
1409ef1f84bSDavid du Colombier 	Fragment4*	flisthead4;
1419ef1f84bSDavid du Colombier 	Fragment4*	fragfree4;
1429ef1f84bSDavid du Colombier 	Ref		id4;
1439ef1f84bSDavid du Colombier 
1449ef1f84bSDavid du Colombier 	QLock		fraglock6;
1459ef1f84bSDavid du Colombier 	Fragment6*	flisthead6;
1469ef1f84bSDavid du Colombier 	Fragment6*	fragfree6;
1479ef1f84bSDavid du Colombier 	Ref		id6;
1489ef1f84bSDavid du Colombier 
1499ef1f84bSDavid du Colombier 	int		iprouting;	/* true if we route like a gateway */
1509ef1f84bSDavid du Colombier };
1519ef1f84bSDavid du Colombier 
1529ef1f84bSDavid du Colombier /* on the wire packet header */
1539ef1f84bSDavid du Colombier struct Ip4hdr
1549ef1f84bSDavid du Colombier {
1559ef1f84bSDavid du Colombier 	uchar	vihl;		/* Version and header length */
1569ef1f84bSDavid du Colombier 	uchar	tos;		/* Type of service */
1579ef1f84bSDavid du Colombier 	uchar	length[2];	/* packet length */
1589ef1f84bSDavid du Colombier 	uchar	id[2];		/* ip->identification */
1599ef1f84bSDavid du Colombier 	uchar	frag[2];	/* Fragment information */
1609ef1f84bSDavid du Colombier 	uchar	ttl;		/* Time to live */
1619ef1f84bSDavid du Colombier 	uchar	proto;		/* Protocol */
1629ef1f84bSDavid du Colombier 	uchar	cksum[2];	/* Header checksum */
1639ef1f84bSDavid du Colombier 	uchar	src[4];		/* IP source */
1649ef1f84bSDavid du Colombier 	uchar	dst[4];		/* IP destination */
1659ef1f84bSDavid du Colombier };
1669ef1f84bSDavid du Colombier 
1679ef1f84bSDavid du Colombier /*
1689ef1f84bSDavid du Colombier  *  one per conversation directory
1699ef1f84bSDavid du Colombier  */
1709ef1f84bSDavid du Colombier struct Conv
1719ef1f84bSDavid du Colombier {
1729ef1f84bSDavid du Colombier 	QLock;
1739ef1f84bSDavid du Colombier 
1749ef1f84bSDavid du Colombier 	int	x;			/* conversation index */
1759ef1f84bSDavid du Colombier 	Proto*	p;
1769ef1f84bSDavid du Colombier 
1779ef1f84bSDavid du Colombier 	int	restricted;		/* remote port is restricted */
1789ef1f84bSDavid du Colombier 	uint	ttl;			/* max time to live */
1799ef1f84bSDavid du Colombier 	uint	tos;			/* type of service */
1809ef1f84bSDavid du Colombier 	int	ignoreadvice;		/* don't terminate connection on icmp errors */
1819ef1f84bSDavid du Colombier 
1829ef1f84bSDavid du Colombier 	uchar	ipversion;
1839ef1f84bSDavid du Colombier 	uchar	laddr[IPaddrlen];	/* local IP address */
1849ef1f84bSDavid du Colombier 	uchar	raddr[IPaddrlen];	/* remote IP address */
1859ef1f84bSDavid du Colombier 	ushort	lport;			/* local port number */
1869ef1f84bSDavid du Colombier 	ushort	rport;			/* remote port number */
1879ef1f84bSDavid du Colombier 
1889ef1f84bSDavid du Colombier 	char	*owner;			/* protections */
1899ef1f84bSDavid du Colombier 	int	perm;
1909ef1f84bSDavid du Colombier 	int	inuse;			/* opens of listen/data/ctl */
1919ef1f84bSDavid du Colombier 	int	length;
1929ef1f84bSDavid du Colombier 	int	state;
1939ef1f84bSDavid du Colombier 
1949ef1f84bSDavid du Colombier 	int	maxfragsize;		/* If set, used for fragmentation */
1959ef1f84bSDavid du Colombier 
1969ef1f84bSDavid du Colombier 	/* udp specific */
1979ef1f84bSDavid du Colombier 	int	headers;		/* data src/dst headers in udp */
1989ef1f84bSDavid du Colombier 	int	reliable;		/* true if reliable udp */
1999ef1f84bSDavid du Colombier 
2009ef1f84bSDavid du Colombier 	Conv*	incall;			/* calls waiting to be listened for */
2019ef1f84bSDavid du Colombier 	Conv*	next;
2029ef1f84bSDavid du Colombier 
2039ef1f84bSDavid du Colombier 	Queue*	rq;			/* queued data waiting to be read */
2049ef1f84bSDavid du Colombier 	Queue*	wq;			/* queued data waiting to be written */
2059ef1f84bSDavid du Colombier 	Queue*	eq;			/* returned error packets */
2069ef1f84bSDavid du Colombier 	Queue*	sq;			/* snooping queue */
2079ef1f84bSDavid du Colombier 	Ref	snoopers;		/* number of processes with snoop open */
2089ef1f84bSDavid du Colombier 
2099ef1f84bSDavid du Colombier 	QLock	car;
2109ef1f84bSDavid du Colombier 	Rendez	cr;
2119ef1f84bSDavid du Colombier 	char	cerr[ERRMAX];
2129ef1f84bSDavid du Colombier 
2139ef1f84bSDavid du Colombier 	QLock	listenq;
2149ef1f84bSDavid du Colombier 	Rendez	listenr;
2159ef1f84bSDavid du Colombier 
2169ef1f84bSDavid du Colombier 	Ipmulti	*multi;			/* multicast bindings for this interface */
2179ef1f84bSDavid du Colombier 
2189ef1f84bSDavid du Colombier 	void*	ptcl;			/* protocol specific stuff */
2199ef1f84bSDavid du Colombier 
2209ef1f84bSDavid du Colombier 	Route	*r;			/* last route used */
2219ef1f84bSDavid du Colombier 	ulong	rgen;			/* routetable generation for *r */
2229ef1f84bSDavid du Colombier };
2239ef1f84bSDavid du Colombier 
2249ef1f84bSDavid du Colombier struct Medium
2259ef1f84bSDavid du Colombier {
2269ef1f84bSDavid du Colombier 	char	*name;
2279ef1f84bSDavid du Colombier 	int	hsize;		/* medium header size */
2289ef1f84bSDavid du Colombier 	int	mintu;		/* default min mtu */
2299ef1f84bSDavid du Colombier 	int	maxtu;		/* default max mtu */
2309ef1f84bSDavid du Colombier 	int	maclen;		/* mac address length */
2319ef1f84bSDavid du Colombier 	void	(*bind)(Ipifc*, int, char**);
2329ef1f84bSDavid du Colombier 	void	(*unbind)(Ipifc*);
2339ef1f84bSDavid du Colombier 	void	(*bwrite)(Ipifc *ifc, Block *b, int version, uchar *ip);
2349ef1f84bSDavid du Colombier 
2359ef1f84bSDavid du Colombier 	/* for arming interfaces to receive multicast */
2369ef1f84bSDavid du Colombier 	void	(*addmulti)(Ipifc *ifc, uchar *a, uchar *ia);
2379ef1f84bSDavid du Colombier 	void	(*remmulti)(Ipifc *ifc, uchar *a, uchar *ia);
2389ef1f84bSDavid du Colombier 
2399ef1f84bSDavid du Colombier 	/* process packets written to 'data' */
2409ef1f84bSDavid du Colombier 	void	(*pktin)(Fs *f, Ipifc *ifc, Block *bp);
2419ef1f84bSDavid du Colombier 
2429ef1f84bSDavid du Colombier 	/* routes for router boards */
2439ef1f84bSDavid du Colombier 	void	(*addroute)(Ipifc *ifc, int, uchar*, uchar*, uchar*, int);
2449ef1f84bSDavid du Colombier 	void	(*remroute)(Ipifc *ifc, int, uchar*, uchar*);
2459ef1f84bSDavid du Colombier 	void	(*flushroutes)(Ipifc *ifc);
2469ef1f84bSDavid du Colombier 
2479ef1f84bSDavid du Colombier 	/* for routing multicast groups */
2489ef1f84bSDavid du Colombier 	void	(*joinmulti)(Ipifc *ifc, uchar *a, uchar *ia);
2499ef1f84bSDavid du Colombier 	void	(*leavemulti)(Ipifc *ifc, uchar *a, uchar *ia);
2509ef1f84bSDavid du Colombier 
2519ef1f84bSDavid du Colombier 	/* address resolution */
2529ef1f84bSDavid du Colombier 	void	(*ares)(Fs*, int, uchar*, uchar*, int, int);	/* resolve */
2539ef1f84bSDavid du Colombier 	void	(*areg)(Ipifc*, uchar*);			/* register */
2549ef1f84bSDavid du Colombier 
2559ef1f84bSDavid du Colombier 	/* v6 address generation */
2569ef1f84bSDavid du Colombier 	void	(*pref2addr)(uchar *pref, uchar *ea);
2579ef1f84bSDavid du Colombier 
2589ef1f84bSDavid du Colombier 	int	unbindonclose;	/* if non-zero, unbind on last close */
2599ef1f84bSDavid du Colombier };
2609ef1f84bSDavid du Colombier 
2619ef1f84bSDavid du Colombier /* logical interface associated with a physical one */
2629ef1f84bSDavid du Colombier struct Iplifc
2639ef1f84bSDavid du Colombier {
2649ef1f84bSDavid du Colombier 	uchar	local[IPaddrlen];
2659ef1f84bSDavid du Colombier 	uchar	mask[IPaddrlen];
2669ef1f84bSDavid du Colombier 	uchar	remote[IPaddrlen];
2679ef1f84bSDavid du Colombier 	uchar	net[IPaddrlen];
2689ef1f84bSDavid du Colombier 	uchar	tentative;	/* =1 => v6 dup disc on, =0 => confirmed unique */
2699ef1f84bSDavid du Colombier 	uchar	onlink;		/* =1 => onlink, =0 offlink. */
2709ef1f84bSDavid du Colombier 	uchar	autoflag;	/* v6 autonomous flag */
2719ef1f84bSDavid du Colombier 	long	validlt;	/* v6 valid lifetime */
2729ef1f84bSDavid du Colombier 	long	preflt;		/* v6 preferred lifetime */
2739ef1f84bSDavid du Colombier 	long	origint;	/* time when addr was added */
2749ef1f84bSDavid du Colombier 	Iplink	*link;		/* addresses linked to this lifc */
2759ef1f84bSDavid du Colombier 	Iplifc	*next;
2769ef1f84bSDavid du Colombier };
2779ef1f84bSDavid du Colombier 
2789ef1f84bSDavid du Colombier /* binding twixt Ipself and Iplifc */
2799ef1f84bSDavid du Colombier struct Iplink
2809ef1f84bSDavid du Colombier {
2819ef1f84bSDavid du Colombier 	Ipself	*self;
2829ef1f84bSDavid du Colombier 	Iplifc	*lifc;
2839ef1f84bSDavid du Colombier 	Iplink	*selflink;	/* next link for this local address */
2849ef1f84bSDavid du Colombier 	Iplink	*lifclink;	/* next link for this ifc */
2859ef1f84bSDavid du Colombier 	ulong	expire;
2869ef1f84bSDavid du Colombier 	Iplink	*next;		/* free list */
2879ef1f84bSDavid du Colombier 	int	ref;
2889ef1f84bSDavid du Colombier };
2899ef1f84bSDavid du Colombier 
2909ef1f84bSDavid du Colombier /* rfc 2461, pp.40—43. */
2919ef1f84bSDavid du Colombier 
2929ef1f84bSDavid du Colombier /* default values, one per stack */
2939ef1f84bSDavid du Colombier struct Routerparams {
2949ef1f84bSDavid du Colombier 	int	mflag;		/* flag: managed address configuration */
2959ef1f84bSDavid du Colombier 	int	oflag;		/* flag: other stateful configuration */
2969ef1f84bSDavid du Colombier 	int	maxraint;	/* max. router adv interval (ms) */
2979ef1f84bSDavid du Colombier 	int	minraint;	/* min. router adv interval (ms) */
2989ef1f84bSDavid du Colombier 	int	linkmtu;	/* mtu options */
2999ef1f84bSDavid du Colombier 	int	reachtime;	/* reachable time */
3009ef1f84bSDavid du Colombier 	int	rxmitra;	/* retransmit interval */
3019ef1f84bSDavid du Colombier 	int	ttl;		/* cur hop count limit */
3029ef1f84bSDavid du Colombier 	int	routerlt;	/* router lifetime */
3039ef1f84bSDavid du Colombier };
3049ef1f84bSDavid du Colombier 
3059ef1f84bSDavid du Colombier struct Hostparams {
3069ef1f84bSDavid du Colombier 	int	rxmithost;
3079ef1f84bSDavid du Colombier };
3089ef1f84bSDavid du Colombier 
3099ef1f84bSDavid du Colombier struct Ipifc
3109ef1f84bSDavid du Colombier {
3119ef1f84bSDavid du Colombier 	RWlock;
3129ef1f84bSDavid du Colombier 
3139ef1f84bSDavid du Colombier 	Conv	*conv;		/* link to its conversation structure */
3149ef1f84bSDavid du Colombier 	char	dev[64];	/* device we're attached to */
3159ef1f84bSDavid du Colombier 	Medium	*medium;	/* Media pointer */
3169ef1f84bSDavid du Colombier 	int	maxtu;		/* Maximum transfer unit */
3179ef1f84bSDavid du Colombier 	int	mintu;		/* Minumum tranfer unit */
3189ef1f84bSDavid du Colombier 	int	mbps;		/* megabits per second */
3199ef1f84bSDavid du Colombier 	void	*arg;		/* medium specific */
3209ef1f84bSDavid du Colombier 	int	reassemble;	/* reassemble IP packets before forwarding */
3219ef1f84bSDavid du Colombier 
3229ef1f84bSDavid du Colombier 	/* these are used so that we can unbind on the fly */
3239ef1f84bSDavid du Colombier 	Lock	idlock;
3249ef1f84bSDavid du Colombier 	uchar	ifcid;		/* incremented each 'bind/unbind/add/remove' */
3259ef1f84bSDavid du Colombier 	int	ref;		/* number of proc's using this ipifc */
3269ef1f84bSDavid du Colombier 	Rendez	wait;		/* where unbinder waits for ref == 0 */
3279ef1f84bSDavid du Colombier 	int	unbinding;
3289ef1f84bSDavid du Colombier 
3299ef1f84bSDavid du Colombier 	uchar	mac[MAClen];	/* MAC address */
3309ef1f84bSDavid du Colombier 
3319ef1f84bSDavid du Colombier 	Iplifc	*lifc;		/* logical interfaces on this physical one */
3329ef1f84bSDavid du Colombier 
3339ef1f84bSDavid du Colombier 	ulong	in, out;	/* message statistics */
3349ef1f84bSDavid du Colombier 	ulong	inerr, outerr;	/* ... */
3359ef1f84bSDavid du Colombier 
3369ef1f84bSDavid du Colombier 	uchar	sendra6;	/* flag: send router advs on this ifc */
3379ef1f84bSDavid du Colombier 	uchar	recvra6;	/* flag: recv router advs on this ifc */
3389ef1f84bSDavid du Colombier 	Routerparams rp;	/* router parameters as in RFC 2461, pp.40—43.
3399ef1f84bSDavid du Colombier 					used only if node is router */
3409ef1f84bSDavid du Colombier };
3419ef1f84bSDavid du Colombier 
3429ef1f84bSDavid du Colombier /*
3439ef1f84bSDavid du Colombier  *  one per multicast-lifc pair used by a Conv
3449ef1f84bSDavid du Colombier  */
3459ef1f84bSDavid du Colombier struct Ipmulti
3469ef1f84bSDavid du Colombier {
3479ef1f84bSDavid du Colombier 	uchar	ma[IPaddrlen];
3489ef1f84bSDavid du Colombier 	uchar	ia[IPaddrlen];
3499ef1f84bSDavid du Colombier 	Ipmulti	*next;
3509ef1f84bSDavid du Colombier };
3519ef1f84bSDavid du Colombier 
3529ef1f84bSDavid du Colombier /*
3539ef1f84bSDavid du Colombier  *  hash table for 2 ip addresses + 2 ports
3549ef1f84bSDavid du Colombier  */
3559ef1f84bSDavid du Colombier enum
3569ef1f84bSDavid du Colombier {
3579ef1f84bSDavid du Colombier 	Nipht=		521,	/* convenient prime */
3589ef1f84bSDavid du Colombier 
3599ef1f84bSDavid du Colombier 	IPmatchexact=	0,	/* match on 4 tuple */
3609ef1f84bSDavid du Colombier 	IPmatchany,		/* *!* */
3619ef1f84bSDavid du Colombier 	IPmatchport,		/* *!port */
3629ef1f84bSDavid du Colombier 	IPmatchaddr,		/* addr!* */
3639ef1f84bSDavid du Colombier 	IPmatchpa,		/* addr!port */
3649ef1f84bSDavid du Colombier };
3659ef1f84bSDavid du Colombier struct Iphash
3669ef1f84bSDavid du Colombier {
3679ef1f84bSDavid du Colombier 	Iphash	*next;
3689ef1f84bSDavid du Colombier 	Conv	*c;
3699ef1f84bSDavid du Colombier 	int	match;
3709ef1f84bSDavid du Colombier };
3719ef1f84bSDavid du Colombier struct Ipht
3729ef1f84bSDavid du Colombier {
3739ef1f84bSDavid du Colombier 	Lock;
3749ef1f84bSDavid du Colombier 	Iphash	*tab[Nipht];
3759ef1f84bSDavid du Colombier };
3769ef1f84bSDavid du Colombier void iphtadd(Ipht*, Conv*);
3779ef1f84bSDavid du Colombier void iphtrem(Ipht*, Conv*);
3789ef1f84bSDavid du Colombier Conv* iphtlook(Ipht *ht, uchar *sa, ushort sp, uchar *da, ushort dp);
3799ef1f84bSDavid du Colombier 
3809ef1f84bSDavid du Colombier /*
3819ef1f84bSDavid du Colombier  *  one per multiplexed protocol
3829ef1f84bSDavid du Colombier  */
3839ef1f84bSDavid du Colombier struct Proto
3849ef1f84bSDavid du Colombier {
3859ef1f84bSDavid du Colombier 	QLock;
3869ef1f84bSDavid du Colombier 	char*		name;		/* protocol name */
3879ef1f84bSDavid du Colombier 	int		x;		/* protocol index */
3889ef1f84bSDavid du Colombier 	int		ipproto;	/* ip protocol type */
3899ef1f84bSDavid du Colombier 
3909ef1f84bSDavid du Colombier 	char*		(*connect)(Conv*, char**, int);
3919ef1f84bSDavid du Colombier 	char*		(*announce)(Conv*, char**, int);
3929ef1f84bSDavid du Colombier 	char*		(*bind)(Conv*, char**, int);
3939ef1f84bSDavid du Colombier 	int		(*state)(Conv*, char*, int);
3949ef1f84bSDavid du Colombier 	void		(*create)(Conv*);
3959ef1f84bSDavid du Colombier 	void		(*close)(Conv*);
3969ef1f84bSDavid du Colombier 	void		(*rcv)(Proto*, Ipifc*, Block*);
3979ef1f84bSDavid du Colombier 	char*		(*ctl)(Conv*, char**, int);
3989ef1f84bSDavid du Colombier 	void		(*advise)(Proto*, Block*, char*);
3999ef1f84bSDavid du Colombier 	int		(*stats)(Proto*, char*, int);
4009ef1f84bSDavid du Colombier 	int		(*local)(Conv*, char*, int);
4019ef1f84bSDavid du Colombier 	int		(*remote)(Conv*, char*, int);
4029ef1f84bSDavid du Colombier 	int		(*inuse)(Conv*);
4039ef1f84bSDavid du Colombier 	int		(*gc)(Proto*);	/* returns true if any conversations are freed */
4049ef1f84bSDavid du Colombier 
4059ef1f84bSDavid du Colombier 	Fs		*f;		/* file system this proto is part of */
4069ef1f84bSDavid du Colombier 	Conv		**conv;		/* array of conversations */
4079ef1f84bSDavid du Colombier 	int		ptclsize;	/* size of per protocol ctl block */
4089ef1f84bSDavid du Colombier 	int		nc;		/* number of conversations */
4099ef1f84bSDavid du Colombier 	int		ac;
4109ef1f84bSDavid du Colombier 	Qid		qid;		/* qid for protocol directory */
4119ef1f84bSDavid du Colombier 	ushort		nextrport;
4129ef1f84bSDavid du Colombier 
4139ef1f84bSDavid du Colombier 	void		*priv;
4149ef1f84bSDavid du Colombier };
4159ef1f84bSDavid du Colombier 
4169ef1f84bSDavid du Colombier 
4179ef1f84bSDavid du Colombier /*
4189ef1f84bSDavid du Colombier  *  one per IP protocol stack
4199ef1f84bSDavid du Colombier  */
4209ef1f84bSDavid du Colombier struct Fs
4219ef1f84bSDavid du Colombier {
4229ef1f84bSDavid du Colombier 	RWlock;
4239ef1f84bSDavid du Colombier 	int	dev;
4249ef1f84bSDavid du Colombier 
4259ef1f84bSDavid du Colombier 	int	np;
4269ef1f84bSDavid du Colombier 	Proto*	p[Maxproto+1];		/* list of supported protocols */
4279ef1f84bSDavid du Colombier 	Proto*	t2p[256];		/* vector of all protocols */
4289ef1f84bSDavid du Colombier 	Proto*	ipifc;			/* kludge for ipifcremroute & ipifcaddroute */
4299ef1f84bSDavid du Colombier 	Proto*	ipmux;			/* kludge for finding an ip multiplexor */
4309ef1f84bSDavid du Colombier 
4319ef1f84bSDavid du Colombier 	IP	*ip;
4329ef1f84bSDavid du Colombier 	Ipselftab	*self;
4339ef1f84bSDavid du Colombier 	Arp	*arp;
4349ef1f84bSDavid du Colombier 	v6params	*v6p;
4359ef1f84bSDavid du Colombier 
4369ef1f84bSDavid du Colombier 	Route	*v4root[1<<Lroot];	/* v4 routing forest */
4379ef1f84bSDavid du Colombier 	Route	*v6root[1<<Lroot];	/* v6 routing forest */
4389ef1f84bSDavid du Colombier 	Route	*queue;			/* used as temp when reinjecting routes */
4399ef1f84bSDavid du Colombier 
4409ef1f84bSDavid du Colombier 	Netlog	*alog;
4419ef1f84bSDavid du Colombier 
4429ef1f84bSDavid du Colombier 	char	ndb[1024];		/* an ndb entry for this interface */
4439ef1f84bSDavid du Colombier 	int	ndbvers;
4449ef1f84bSDavid du Colombier 	long	ndbmtime;
4459ef1f84bSDavid du Colombier };
4469ef1f84bSDavid du Colombier 
4479ef1f84bSDavid du Colombier /* one per default router known to host */
4489ef1f84bSDavid du Colombier struct v6router {
4499ef1f84bSDavid du Colombier 	uchar	inuse;
4509ef1f84bSDavid du Colombier 	Ipifc	*ifc;
4519ef1f84bSDavid du Colombier 	int	ifcid;
4529ef1f84bSDavid du Colombier 	uchar	routeraddr[IPaddrlen];
4539ef1f84bSDavid du Colombier 	long	ltorigin;
4549ef1f84bSDavid du Colombier 	Routerparams	rp;
4559ef1f84bSDavid du Colombier };
4569ef1f84bSDavid du Colombier 
4579ef1f84bSDavid du Colombier struct v6params
4589ef1f84bSDavid du Colombier {
4599ef1f84bSDavid du Colombier 	Routerparams	rp;		/* v6 params, one copy per node now */
4609ef1f84bSDavid du Colombier 	Hostparams	hp;
4619ef1f84bSDavid du Colombier 	v6router	v6rlist[3];	/* max 3 default routers, currently */
4629ef1f84bSDavid du Colombier 	int		cdrouter;	/* uses only v6rlist[cdrouter] if */
4639ef1f84bSDavid du Colombier 					/* cdrouter >= 0. */
4649ef1f84bSDavid du Colombier };
4659ef1f84bSDavid du Colombier 
4669ef1f84bSDavid du Colombier 
4679ef1f84bSDavid du Colombier int	Fsconnected(Conv*, char*);
4689ef1f84bSDavid du Colombier Conv*	Fsnewcall(Conv*, uchar*, ushort, uchar*, ushort, uchar);
4699ef1f84bSDavid du Colombier int	Fspcolstats(char*, int);
4709ef1f84bSDavid du Colombier int	Fsproto(Fs*, Proto*);
4719ef1f84bSDavid du Colombier int	Fsbuiltinproto(Fs*, uchar);
4729ef1f84bSDavid du Colombier Conv*	Fsprotoclone(Proto*, char*);
4739ef1f84bSDavid du Colombier Proto*	Fsrcvpcol(Fs*, uchar);
4749ef1f84bSDavid du Colombier Proto*	Fsrcvpcolx(Fs*, uchar);
4759ef1f84bSDavid du Colombier char*	Fsstdconnect(Conv*, char**, int);
4769ef1f84bSDavid du Colombier char*	Fsstdannounce(Conv*, char**, int);
4779ef1f84bSDavid du Colombier char*	Fsstdbind(Conv*, char**, int);
4789ef1f84bSDavid du Colombier ulong	scalednconv(void);
4799ef1f84bSDavid du Colombier void	closeconv(Conv*);
4809ef1f84bSDavid du Colombier /*
4819ef1f84bSDavid du Colombier  *  logging
4829ef1f84bSDavid du Colombier  */
4839ef1f84bSDavid du Colombier enum
4849ef1f84bSDavid du Colombier {
4859ef1f84bSDavid du Colombier 	Logip=		1<<1,
4869ef1f84bSDavid du Colombier 	Logtcp=		1<<2,
4879ef1f84bSDavid du Colombier 	Logfs=		1<<3,
4889ef1f84bSDavid du Colombier 	Logicmp=	1<<5,
4899ef1f84bSDavid du Colombier 	Logudp=		1<<6,
4909ef1f84bSDavid du Colombier 	Logcompress=	1<<7,
4919ef1f84bSDavid du Colombier 	Loggre=		1<<9,
4929ef1f84bSDavid du Colombier 	Logppp=		1<<10,
4939ef1f84bSDavid du Colombier 	Logtcprxmt=	1<<11,
4949ef1f84bSDavid du Colombier 	Logigmp=	1<<12,
4959ef1f84bSDavid du Colombier 	Logudpmsg=	1<<13,
4969ef1f84bSDavid du Colombier 	Logipmsg=	1<<14,
4979ef1f84bSDavid du Colombier 	Logrudp=	1<<15,
4989ef1f84bSDavid du Colombier 	Logrudpmsg=	1<<16,
4999ef1f84bSDavid du Colombier 	Logesp=		1<<17,
5009ef1f84bSDavid du Colombier 	Logtcpwin=	1<<18,
5019ef1f84bSDavid du Colombier };
5029ef1f84bSDavid du Colombier 
5039ef1f84bSDavid du Colombier void	netloginit(Fs*);
5049ef1f84bSDavid du Colombier void	netlogopen(Fs*);
5059ef1f84bSDavid du Colombier void	netlogclose(Fs*);
5069ef1f84bSDavid du Colombier void	netlogctl(Fs*, char*, int);
5079ef1f84bSDavid du Colombier long	netlogread(Fs*, void*, ulong, long);
5089ef1f84bSDavid du Colombier void	netlog(Fs*, int, char*, ...);
5099ef1f84bSDavid du Colombier void	ifcloginit(Fs*);
5109ef1f84bSDavid du Colombier long	ifclogread(Fs*, Chan *,void*, ulong, long);
5119ef1f84bSDavid du Colombier void	ifclog(Fs*, uchar *, int);
5129ef1f84bSDavid du Colombier void	ifclogopen(Fs*, Chan*);
5139ef1f84bSDavid du Colombier void	ifclogclose(Fs*, Chan*);
5149ef1f84bSDavid du Colombier 
5159ef1f84bSDavid du Colombier #pragma varargck argpos netlog	3
5169ef1f84bSDavid du Colombier 
5179ef1f84bSDavid du Colombier /*
5189ef1f84bSDavid du Colombier  *  iproute.c
5199ef1f84bSDavid du Colombier  */
5209ef1f84bSDavid du Colombier typedef	struct RouteTree RouteTree;
5219ef1f84bSDavid du Colombier typedef struct Routewalk Routewalk;
5229ef1f84bSDavid du Colombier typedef struct V4route V4route;
5239ef1f84bSDavid du Colombier typedef struct V6route V6route;
5249ef1f84bSDavid du Colombier 
5259ef1f84bSDavid du Colombier enum
5269ef1f84bSDavid du Colombier {
5279ef1f84bSDavid du Colombier 
5289ef1f84bSDavid du Colombier 	/* type bits */
5299ef1f84bSDavid du Colombier 	Rv4=		(1<<0),		/* this is a version 4 route */
5309ef1f84bSDavid du Colombier 	Rifc=		(1<<1),		/* this route is a directly connected interface */
5319ef1f84bSDavid du Colombier 	Rptpt=		(1<<2),		/* this route is a pt to pt interface */
5329ef1f84bSDavid du Colombier 	Runi=		(1<<3),		/* a unicast self address */
5339ef1f84bSDavid du Colombier 	Rbcast=		(1<<4),		/* a broadcast self address */
5349ef1f84bSDavid du Colombier 	Rmulti=		(1<<5),		/* a multicast self address */
5359ef1f84bSDavid du Colombier 	Rproxy=		(1<<6),		/* this route should be proxied */
5369ef1f84bSDavid du Colombier };
5379ef1f84bSDavid du Colombier 
5389ef1f84bSDavid du Colombier struct Routewalk
5399ef1f84bSDavid du Colombier {
5409ef1f84bSDavid du Colombier 	int	o;
5419ef1f84bSDavid du Colombier 	int	h;
5429ef1f84bSDavid du Colombier 	char*	p;
5439ef1f84bSDavid du Colombier 	char*	e;
5449ef1f84bSDavid du Colombier 	void*	state;
5459ef1f84bSDavid du Colombier 	void	(*walk)(Route*, Routewalk*);
5469ef1f84bSDavid du Colombier };
5479ef1f84bSDavid du Colombier 
5489ef1f84bSDavid du Colombier struct	RouteTree
5499ef1f84bSDavid du Colombier {
5509ef1f84bSDavid du Colombier 	Route*	right;
5519ef1f84bSDavid du Colombier 	Route*	left;
5529ef1f84bSDavid du Colombier 	Route*	mid;
5539ef1f84bSDavid du Colombier 	uchar	depth;
5549ef1f84bSDavid du Colombier 	uchar	type;
5559ef1f84bSDavid du Colombier 	uchar	ifcid;		/* must match ifc->id */
5569ef1f84bSDavid du Colombier 	Ipifc	*ifc;
5579ef1f84bSDavid du Colombier 	char	tag[4];
5589ef1f84bSDavid du Colombier 	int	ref;
5599ef1f84bSDavid du Colombier };
5609ef1f84bSDavid du Colombier 
5619ef1f84bSDavid du Colombier struct V4route
5629ef1f84bSDavid du Colombier {
5639ef1f84bSDavid du Colombier 	ulong	address;
5649ef1f84bSDavid du Colombier 	ulong	endaddress;
5659ef1f84bSDavid du Colombier 	uchar	gate[IPv4addrlen];
5669ef1f84bSDavid du Colombier };
5679ef1f84bSDavid du Colombier 
5689ef1f84bSDavid du Colombier struct V6route
5699ef1f84bSDavid du Colombier {
5709ef1f84bSDavid du Colombier 	ulong	address[IPllen];
5719ef1f84bSDavid du Colombier 	ulong	endaddress[IPllen];
5729ef1f84bSDavid du Colombier 	uchar	gate[IPaddrlen];
5739ef1f84bSDavid du Colombier };
5749ef1f84bSDavid du Colombier 
5759ef1f84bSDavid du Colombier struct Route
5769ef1f84bSDavid du Colombier {
5779ef1f84bSDavid du Colombier 	RouteTree;
5789ef1f84bSDavid du Colombier 
5799ef1f84bSDavid du Colombier 	union {
5809ef1f84bSDavid du Colombier 		V6route	v6;
5819ef1f84bSDavid du Colombier 		V4route v4;
5829ef1f84bSDavid du Colombier 	};
5839ef1f84bSDavid du Colombier };
5849ef1f84bSDavid du Colombier extern void	v4addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type);
5859ef1f84bSDavid du Colombier extern void	v6addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type);
5869ef1f84bSDavid du Colombier extern void	v4delroute(Fs *f, uchar *a, uchar *mask, int dolock);
5879ef1f84bSDavid du Colombier extern void	v6delroute(Fs *f, uchar *a, uchar *mask, int dolock);
5889ef1f84bSDavid du Colombier extern Route*	v4lookup(Fs *f, uchar *a, Conv *c);
5899ef1f84bSDavid du Colombier extern Route*	v6lookup(Fs *f, uchar *a, Conv *c);
5909ef1f84bSDavid du Colombier extern long	routeread(Fs *f, char*, ulong, int);
5919ef1f84bSDavid du Colombier extern long	routewrite(Fs *f, Chan*, char*, int);
5929ef1f84bSDavid du Colombier extern void	routetype(int, char*);
5939ef1f84bSDavid du Colombier extern void	ipwalkroutes(Fs*, Routewalk*);
5949ef1f84bSDavid du Colombier extern void	convroute(Route*, uchar*, uchar*, uchar*, char*, int*);
5959ef1f84bSDavid du Colombier 
5969ef1f84bSDavid du Colombier /*
5979ef1f84bSDavid du Colombier  *  devip.c
5989ef1f84bSDavid du Colombier  */
5999ef1f84bSDavid du Colombier 
6009ef1f84bSDavid du Colombier /*
6019ef1f84bSDavid du Colombier  *  Hanging off every ip channel's ->aux is the following structure.
6029ef1f84bSDavid du Colombier  *  It maintains the state used by devip and iproute.
6039ef1f84bSDavid du Colombier  */
6049ef1f84bSDavid du Colombier struct IPaux
6059ef1f84bSDavid du Colombier {
6069ef1f84bSDavid du Colombier 	char	*owner;		/* the user that did the attach */
6079ef1f84bSDavid du Colombier 	char	tag[4];
6089ef1f84bSDavid du Colombier };
6099ef1f84bSDavid du Colombier 
6109ef1f84bSDavid du Colombier extern IPaux*	newipaux(char*, char*);
6119ef1f84bSDavid du Colombier 
6129ef1f84bSDavid du Colombier /*
6139ef1f84bSDavid du Colombier  *  arp.c
6149ef1f84bSDavid du Colombier  */
6159ef1f84bSDavid du Colombier struct Arpent
6169ef1f84bSDavid du Colombier {
6179ef1f84bSDavid du Colombier 	uchar	ip[IPaddrlen];
6189ef1f84bSDavid du Colombier 	uchar	mac[MAClen];
6199ef1f84bSDavid du Colombier 	Medium	*type;			/* media type */
6209ef1f84bSDavid du Colombier 	Arpent*	hash;
6219ef1f84bSDavid du Colombier 	Block*	hold;
6229ef1f84bSDavid du Colombier 	Block*	last;
6239ef1f84bSDavid du Colombier 	uint	ctime;			/* time entry was created or refreshed */
6249ef1f84bSDavid du Colombier 	uint	utime;			/* time entry was last used */
6259ef1f84bSDavid du Colombier 	uchar	state;
6269ef1f84bSDavid du Colombier 	Arpent	*nextrxt;		/* re-transmit chain */
6279ef1f84bSDavid du Colombier 	uint	rtime;			/* time for next retransmission */
6289ef1f84bSDavid du Colombier 	uchar	rxtsrem;
6299ef1f84bSDavid du Colombier 	Ipifc	*ifc;
6309ef1f84bSDavid du Colombier 	uchar	ifcid;			/* must match ifc->id */
6319ef1f84bSDavid du Colombier };
6329ef1f84bSDavid du Colombier 
6339ef1f84bSDavid du Colombier extern void	arpinit(Fs*);
6349ef1f84bSDavid du Colombier extern int	arpread(Arp*, char*, ulong, int);
6359ef1f84bSDavid du Colombier extern int	arpwrite(Fs*, char*, int);
6369ef1f84bSDavid du Colombier extern Arpent*	arpget(Arp*, Block *bp, int version, Ipifc *ifc, uchar *ip, uchar *h);
6379ef1f84bSDavid du Colombier extern void	arprelease(Arp*, Arpent *a);
6389ef1f84bSDavid du Colombier extern Block*	arpresolve(Arp*, Arpent *a, Medium *type, uchar *mac);
6399ef1f84bSDavid du Colombier extern void	arpenter(Fs*, int version, uchar *ip, uchar *mac, int len, int norefresh);
6409ef1f84bSDavid du Colombier 
6419ef1f84bSDavid du Colombier /*
6429ef1f84bSDavid du Colombier  * ipaux.c
6439ef1f84bSDavid du Colombier  */
6449ef1f84bSDavid du Colombier 
6459ef1f84bSDavid du Colombier extern int	myetheraddr(uchar*, char*);
6469ef1f84bSDavid du Colombier extern vlong	parseip(uchar*, char*);
6479ef1f84bSDavid du Colombier extern vlong	parseipmask(uchar*, char*);
6489ef1f84bSDavid du Colombier extern char*	v4parseip(uchar*, char*);
6499ef1f84bSDavid du Colombier extern void	maskip(uchar *from, uchar *mask, uchar *to);
6509ef1f84bSDavid du Colombier extern int	parsemac(uchar *to, char *from, int len);
6519ef1f84bSDavid du Colombier extern uchar*	defmask(uchar*);
6529ef1f84bSDavid du Colombier extern int	isv4(uchar*);
6539ef1f84bSDavid du Colombier extern void	v4tov6(uchar *v6, uchar *v4);
6549ef1f84bSDavid du Colombier extern int	v6tov4(uchar *v4, uchar *v6);
6559ef1f84bSDavid du Colombier extern int	eipfmt(Fmt*);
6569ef1f84bSDavid du Colombier 
6579ef1f84bSDavid du Colombier #define	ipmove(x, y) memmove(x, y, IPaddrlen)
6589ef1f84bSDavid du Colombier #define	ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) )
6599ef1f84bSDavid du Colombier 
6609ef1f84bSDavid du Colombier extern uchar IPv4bcast[IPaddrlen];
6619ef1f84bSDavid du Colombier extern uchar IPv4bcastobs[IPaddrlen];
6629ef1f84bSDavid du Colombier extern uchar IPv4allsys[IPaddrlen];
6639ef1f84bSDavid du Colombier extern uchar IPv4allrouter[IPaddrlen];
6649ef1f84bSDavid du Colombier extern uchar IPnoaddr[IPaddrlen];
6659ef1f84bSDavid du Colombier extern uchar v4prefix[IPaddrlen];
6669ef1f84bSDavid du Colombier extern uchar IPallbits[IPaddrlen];
6679ef1f84bSDavid du Colombier 
6689ef1f84bSDavid du Colombier #define	NOW	TK2MS(sys->ticks)
6699ef1f84bSDavid du Colombier 
6709ef1f84bSDavid du Colombier /*
6719ef1f84bSDavid du Colombier  *  media
6729ef1f84bSDavid du Colombier  */
6739ef1f84bSDavid du Colombier extern Medium	ethermedium;
6749ef1f84bSDavid du Colombier extern Medium	nullmedium;
6759ef1f84bSDavid du Colombier extern Medium	pktmedium;
6769ef1f84bSDavid du Colombier 
6779ef1f84bSDavid du Colombier /*
6789ef1f84bSDavid du Colombier  *  ipifc.c
6799ef1f84bSDavid du Colombier  */
6809ef1f84bSDavid du Colombier extern Medium*	ipfindmedium(char *name);
6819ef1f84bSDavid du Colombier extern void	addipmedium(Medium *med);
6829ef1f84bSDavid du Colombier extern int	ipforme(Fs*, uchar *addr);
6839ef1f84bSDavid du Colombier extern int	iptentative(Fs*, uchar *addr);
6849ef1f84bSDavid du Colombier extern int	ipisbm(uchar *);
6859ef1f84bSDavid du Colombier extern int	ipismulticast(uchar *);
6869ef1f84bSDavid du Colombier extern Ipifc*	findipifc(Fs*, uchar *remote, int type);
6879ef1f84bSDavid du Colombier extern void	findlocalip(Fs*, uchar *local, uchar *remote);
6889ef1f84bSDavid du Colombier extern int	ipv4local(Ipifc *ifc, uchar *addr);
6899ef1f84bSDavid du Colombier extern int	ipv6local(Ipifc *ifc, uchar *addr);
6909ef1f84bSDavid du Colombier extern int	ipv6anylocal(Ipifc *ifc, uchar *addr);
6919ef1f84bSDavid du Colombier extern Iplifc*	iplocalonifc(Ipifc *ifc, uchar *ip);
6929ef1f84bSDavid du Colombier extern int	ipproxyifc(Fs *f, Ipifc *ifc, uchar *ip);
6939ef1f84bSDavid du Colombier extern int	ipismulticast(uchar *ip);
6949ef1f84bSDavid du Colombier extern int	ipisbooting(void);
6959ef1f84bSDavid du Colombier extern int	ipifccheckin(Ipifc *ifc, Medium *med);
6969ef1f84bSDavid du Colombier extern void	ipifccheckout(Ipifc *ifc);
6979ef1f84bSDavid du Colombier extern int	ipifcgrab(Ipifc *ifc);
6989ef1f84bSDavid du Colombier extern void	ipifcaddroute(Fs*, int, uchar*, uchar*, uchar*, int);
6999ef1f84bSDavid du Colombier extern void	ipifcremroute(Fs*, int, uchar*, uchar*);
7009ef1f84bSDavid du Colombier extern void	ipifcremmulti(Conv *c, uchar *ma, uchar *ia);
7019ef1f84bSDavid du Colombier extern void	ipifcaddmulti(Conv *c, uchar *ma, uchar *ia);
7029ef1f84bSDavid du Colombier extern char*	ipifcrem(Ipifc *ifc, char **argv, int argc);
7039ef1f84bSDavid du Colombier extern char*	ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp);
7049ef1f84bSDavid du Colombier extern long	ipselftabread(Fs*, char *a, ulong offset, int n);
7059ef1f84bSDavid du Colombier extern char*	ipifcadd6(Ipifc *ifc, char**argv, int argc);
7069ef1f84bSDavid du Colombier /*
7079ef1f84bSDavid du Colombier  *  ip.c
7089ef1f84bSDavid du Colombier  */
7099ef1f84bSDavid du Colombier extern void	iprouting(Fs*, int);
7109ef1f84bSDavid du Colombier extern void	icmpnoconv(Fs*, Block*);
7119ef1f84bSDavid du Colombier extern void	icmpcantfrag(Fs*, Block*, int);
7129ef1f84bSDavid du Colombier extern void	icmpttlexceeded(Fs*, uchar*, Block*);
7139ef1f84bSDavid du Colombier extern ushort	ipcsum(uchar*);
7149ef1f84bSDavid du Colombier extern void	ipiput4(Fs*, Ipifc*, Block*);
7159ef1f84bSDavid du Colombier extern void	ipiput6(Fs*, Ipifc*, Block*);
7169ef1f84bSDavid du Colombier extern int	ipoput4(Fs*, Block*, int, int, int, Conv*);
7179ef1f84bSDavid du Colombier extern int	ipoput6(Fs*, Block*, int, int, int, Conv*);
7189ef1f84bSDavid du Colombier extern int	ipstats(Fs*, char*, int);
7199ef1f84bSDavid du Colombier extern ushort	ptclbsum(uchar*, int);
7209ef1f84bSDavid du Colombier extern ushort	ptclcsum(Block*, int, int);
7219ef1f84bSDavid du Colombier extern void	ip_init(Fs*);
7229ef1f84bSDavid du Colombier extern void	update_mtucache(uchar*, ulong);
7239ef1f84bSDavid du Colombier extern ulong	restrict_mtu(uchar*, ulong);
7249ef1f84bSDavid du Colombier /*
7259ef1f84bSDavid du Colombier  * bootp.c
7269ef1f84bSDavid du Colombier  */
7279ef1f84bSDavid du Colombier extern int	bootpread(char*, ulong, int);
7289ef1f84bSDavid du Colombier 
7299ef1f84bSDavid du Colombier /*
7309ef1f84bSDavid du Colombier  *  resolving inferno/plan9 differences
7319ef1f84bSDavid du Colombier  */
7329ef1f84bSDavid du Colombier char*		commonuser(void);
7339ef1f84bSDavid du Colombier char*		commonerror(void);
7349ef1f84bSDavid du Colombier 
7359ef1f84bSDavid du Colombier /*
7369ef1f84bSDavid du Colombier  * chandial.c
7379ef1f84bSDavid du Colombier  */
7389ef1f84bSDavid du Colombier extern Chan*	chandial(char*, char*, char*, Chan**);
7399ef1f84bSDavid du Colombier 
7409ef1f84bSDavid du Colombier /*
7419ef1f84bSDavid du Colombier  *  global to all of the stack
7429ef1f84bSDavid du Colombier  */
7439ef1f84bSDavid du Colombier extern void	(*igmpreportfn)(Ipifc*, uchar*);
744