xref: /plan9-contrib/sys/src/9/ip/ip.h (revision fc7ec80a0b02a0a6ffd7536a57abe32b3a178ada)
17dd7cddfSDavid du Colombier typedef struct	Conv	Conv;
25e27dea9SDavid du Colombier typedef struct	Fragment4 Fragment4;
35e27dea9SDavid du Colombier typedef struct	Fragment6 Fragment6;
47dd7cddfSDavid du Colombier typedef struct	Fs	Fs;
57dd7cddfSDavid du Colombier typedef union	Hwaddr	Hwaddr;
67dd7cddfSDavid du Colombier typedef struct	IP	IP;
79a747e4fSDavid du Colombier typedef struct	IPaux	IPaux;
85e27dea9SDavid du Colombier typedef struct	Ip4hdr	Ip4hdr;
95e27dea9SDavid du Colombier typedef struct	Ipfrag	Ipfrag;
107dd7cddfSDavid du Colombier typedef struct	Ipself	Ipself;
117dd7cddfSDavid du Colombier typedef struct	Ipselftab	Ipselftab;
127dd7cddfSDavid du Colombier typedef struct	Iplink	Iplink;
137dd7cddfSDavid du Colombier typedef struct	Iplifc	Iplifc;
147dd7cddfSDavid du Colombier typedef struct	Ipmulti	Ipmulti;
157dd7cddfSDavid du Colombier typedef struct	Ipifc	Ipifc;
1680ee5cbfSDavid du Colombier typedef struct	Iphash	Iphash;
1780ee5cbfSDavid du Colombier typedef struct	Ipht	Ipht;
187dd7cddfSDavid du Colombier typedef struct	Netlog	Netlog;
197dd7cddfSDavid du Colombier typedef struct	Medium	Medium;
207dd7cddfSDavid du Colombier typedef struct	Proto	Proto;
217dd7cddfSDavid du Colombier typedef struct	Arpent	Arpent;
227dd7cddfSDavid du Colombier typedef struct	Arp Arp;
237dd7cddfSDavid du Colombier typedef struct	Route	Route;
247dd7cddfSDavid du Colombier 
253ff48bf5SDavid du Colombier typedef struct	Routerparams	Routerparams;
263ff48bf5SDavid du Colombier typedef struct	Hostparams	Hostparams;
273ff48bf5SDavid du Colombier typedef struct	v6router	v6router;
283ff48bf5SDavid du Colombier typedef struct	v6params	v6params;
293ff48bf5SDavid du Colombier 
3012fd1c83SDavid du Colombier #pragma incomplete Arp
3112fd1c83SDavid du Colombier #pragma incomplete Ipself
3212fd1c83SDavid du Colombier #pragma incomplete Ipselftab
3312fd1c83SDavid du Colombier #pragma incomplete IP
3412fd1c83SDavid du Colombier #pragma incomplete Netlog
3512fd1c83SDavid du Colombier 
367dd7cddfSDavid du Colombier enum
377dd7cddfSDavid du Colombier {
387dd7cddfSDavid du Colombier 	Addrlen=	64,
397dd7cddfSDavid du Colombier 	Maxproto=	20,
40588d0145SDavid du Colombier 	Maxincall=	64,	/* max. conn.s in listen q not accepted yet */
41a6a9e072SDavid du Colombier 	Nchans=		1024,
427dd7cddfSDavid du Colombier 	MAClen=		16,		/* longest mac address */
437dd7cddfSDavid du Colombier 
447dd7cddfSDavid du Colombier 	MAXTTL=		255,
457dd7cddfSDavid du Colombier 	DFLTTOS=	0,
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier 	IPaddrlen=	16,
487dd7cddfSDavid du Colombier 	IPv4addrlen=	4,
497dd7cddfSDavid du Colombier 	IPv4off=	12,
507dd7cddfSDavid du Colombier 	IPllen=		4,
517dd7cddfSDavid du Colombier 
527dd7cddfSDavid du Colombier 	/* ip versions */
537dd7cddfSDavid du Colombier 	V4=		4,
547dd7cddfSDavid du Colombier 	V6=		6,
553ff48bf5SDavid du Colombier 	IP_VER4=	0x40,
563ff48bf5SDavid du Colombier 	IP_VER6=	0x60,
57ac020a8fSDavid du Colombier 	IP_HLEN4=	5,		/* v4: Header length in words */
58ac020a8fSDavid du Colombier 	IP_DF=		0x4000,		/* v4: Don't fragment */
59ac020a8fSDavid du Colombier 	IP_MF=		0x2000,		/* v4: More fragments */
600774058cSDavid du Colombier 	IP4HDR=		20,		/* sizeof(Ip4hdr) */
61ac020a8fSDavid du Colombier 	IP_MAX=		64*1024,	/* Max. Internet packet size, v4 & v6 */
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier 	/* 2^Lroot trees in the root table */
647dd7cddfSDavid du Colombier 	Lroot=		10,
659a747e4fSDavid du Colombier 
669a747e4fSDavid du Colombier 	Maxpath =	64,
677dd7cddfSDavid du Colombier };
687dd7cddfSDavid du Colombier 
697dd7cddfSDavid du Colombier enum
707dd7cddfSDavid du Colombier {
7180ee5cbfSDavid du Colombier 	Idle=		0,
727dd7cddfSDavid du Colombier 	Announcing=	1,
737dd7cddfSDavid du Colombier 	Announced=	2,
747dd7cddfSDavid du Colombier 	Connecting=	3,
757dd7cddfSDavid du Colombier 	Connected=	4,
767dd7cddfSDavid du Colombier };
777dd7cddfSDavid du Colombier 
785e27dea9SDavid du Colombier /* MIB II counters */
795e27dea9SDavid du Colombier enum
805e27dea9SDavid du Colombier {
815e27dea9SDavid du Colombier 	Forwarding,
825e27dea9SDavid du Colombier 	DefaultTTL,
835e27dea9SDavid du Colombier 	InReceives,
845e27dea9SDavid du Colombier 	InHdrErrors,
855e27dea9SDavid du Colombier 	InAddrErrors,
865e27dea9SDavid du Colombier 	ForwDatagrams,
875e27dea9SDavid du Colombier 	InUnknownProtos,
885e27dea9SDavid du Colombier 	InDiscards,
895e27dea9SDavid du Colombier 	InDelivers,
905e27dea9SDavid du Colombier 	OutRequests,
915e27dea9SDavid du Colombier 	OutDiscards,
925e27dea9SDavid du Colombier 	OutNoRoutes,
935e27dea9SDavid du Colombier 	ReasmTimeout,
945e27dea9SDavid du Colombier 	ReasmReqds,
955e27dea9SDavid du Colombier 	ReasmOKs,
965e27dea9SDavid du Colombier 	ReasmFails,
975e27dea9SDavid du Colombier 	FragOKs,
985e27dea9SDavid du Colombier 	FragFails,
995e27dea9SDavid du Colombier 	FragCreates,
1005e27dea9SDavid du Colombier 
1015e27dea9SDavid du Colombier 	Nipstats,
1025e27dea9SDavid du Colombier };
1035e27dea9SDavid du Colombier 
1045e27dea9SDavid du Colombier struct Fragment4
1055e27dea9SDavid du Colombier {
1065e27dea9SDavid du Colombier 	Block*	blist;
1075e27dea9SDavid du Colombier 	Fragment4*	next;
1085e27dea9SDavid du Colombier 	ulong	src;
1095e27dea9SDavid du Colombier 	ulong	dst;
1105e27dea9SDavid du Colombier 	ushort	id;
1115e27dea9SDavid du Colombier 	ulong	age;
1125e27dea9SDavid du Colombier };
1135e27dea9SDavid du Colombier 
1145e27dea9SDavid du Colombier struct Fragment6
1155e27dea9SDavid du Colombier {
1165e27dea9SDavid du Colombier 	Block*	blist;
1175e27dea9SDavid du Colombier 	Fragment6*	next;
1185e27dea9SDavid du Colombier 	uchar	src[IPaddrlen];
1195e27dea9SDavid du Colombier 	uchar	dst[IPaddrlen];
1205e27dea9SDavid du Colombier 	uint	id;
1215e27dea9SDavid du Colombier 	ulong	age;
1225e27dea9SDavid du Colombier };
1235e27dea9SDavid du Colombier 
1245e27dea9SDavid du Colombier struct Ipfrag
1255e27dea9SDavid du Colombier {
1265e27dea9SDavid du Colombier 	ushort	foff;
1275e27dea9SDavid du Colombier 	ushort	flen;
1285e27dea9SDavid du Colombier 
1295e27dea9SDavid du Colombier 	uchar	payload[];
1305e27dea9SDavid du Colombier };
1315e27dea9SDavid du Colombier 
1325e27dea9SDavid du Colombier #define IPFRAGSZ offsetof(Ipfrag, payload[0])
1335e27dea9SDavid du Colombier 
1345e27dea9SDavid du Colombier /* an instance of IP */
1355e27dea9SDavid du Colombier struct IP
1365e27dea9SDavid du Colombier {
1375e27dea9SDavid du Colombier 	uvlong		stats[Nipstats];
1385e27dea9SDavid du Colombier 
1395e27dea9SDavid du Colombier 	QLock		fraglock4;
1405e27dea9SDavid du Colombier 	Fragment4*	flisthead4;
1415e27dea9SDavid du Colombier 	Fragment4*	fragfree4;
1425e27dea9SDavid du Colombier 	Ref		id4;
1435e27dea9SDavid du Colombier 
1445e27dea9SDavid du Colombier 	QLock		fraglock6;
1455e27dea9SDavid du Colombier 	Fragment6*	flisthead6;
1465e27dea9SDavid du Colombier 	Fragment6*	fragfree6;
1475e27dea9SDavid du Colombier 	Ref		id6;
1485e27dea9SDavid du Colombier 
1495e27dea9SDavid du Colombier 	int		iprouting;	/* true if we route like a gateway */
1505e27dea9SDavid du Colombier };
1515e27dea9SDavid du Colombier 
1520774058cSDavid du Colombier /* on the wire packet header */
1530774058cSDavid du Colombier struct Ip4hdr
1540774058cSDavid du Colombier {
1550774058cSDavid du Colombier 	uchar	vihl;		/* Version and header length */
1560774058cSDavid du Colombier 	uchar	tos;		/* Type of service */
1570774058cSDavid du Colombier 	uchar	length[2];	/* packet length */
1580774058cSDavid du Colombier 	uchar	id[2];		/* ip->identification */
1590774058cSDavid du Colombier 	uchar	frag[2];	/* Fragment information */
1600774058cSDavid du Colombier 	uchar	ttl;		/* Time to live */
1610774058cSDavid du Colombier 	uchar	proto;		/* Protocol */
1620774058cSDavid du Colombier 	uchar	cksum[2];	/* Header checksum */
1630774058cSDavid du Colombier 	uchar	src[4];		/* IP source */
1640774058cSDavid du Colombier 	uchar	dst[4];		/* IP destination */
1650774058cSDavid du Colombier };
1660774058cSDavid du Colombier 
1677dd7cddfSDavid du Colombier /*
1683ff48bf5SDavid du Colombier  *  one per conversation directory
1697dd7cddfSDavid du Colombier  */
1707dd7cddfSDavid du Colombier struct Conv
1717dd7cddfSDavid du Colombier {
1727dd7cddfSDavid du Colombier 	QLock;
1737dd7cddfSDavid du Colombier 
1747dd7cddfSDavid du Colombier 	int	x;			/* conversation index */
1757dd7cddfSDavid du Colombier 	Proto*	p;
1767dd7cddfSDavid du Colombier 
1777dd7cddfSDavid du Colombier 	int	restricted;		/* remote port is restricted */
1787dd7cddfSDavid du Colombier 	uint	ttl;			/* max time to live */
1797dd7cddfSDavid du Colombier 	uint	tos;			/* type of service */
1803ff48bf5SDavid du Colombier 	int	ignoreadvice;		/* don't terminate connection on icmp errors */
1813ff48bf5SDavid du Colombier 
1823ff48bf5SDavid du Colombier 	uchar	ipversion;
1833ff48bf5SDavid du Colombier 	uchar	laddr[IPaddrlen];	/* local IP address */
1843ff48bf5SDavid du Colombier 	uchar	raddr[IPaddrlen];	/* remote IP address */
1853ff48bf5SDavid du Colombier 	ushort	lport;			/* local port number */
1863ff48bf5SDavid du Colombier 	ushort	rport;			/* remote port number */
1873ff48bf5SDavid du Colombier 
1889a747e4fSDavid du Colombier 	char	*owner;			/* protections */
1897dd7cddfSDavid du Colombier 	int	perm;
1907dd7cddfSDavid du Colombier 	int	inuse;			/* opens of listen/data/ctl */
1917dd7cddfSDavid du Colombier 	int	length;
1927dd7cddfSDavid du Colombier 	int	state;
1937dd7cddfSDavid du Colombier 
1942b5cb72cSDavid du Colombier 	int	maxfragsize;		/* If set, used for fragmentation */
1952b5cb72cSDavid du Colombier 
1967dd7cddfSDavid du Colombier 	/* udp specific */
1977dd7cddfSDavid du Colombier 	int	headers;		/* data src/dst headers in udp */
1987dd7cddfSDavid du Colombier 	int	reliable;		/* true if reliable udp */
1997dd7cddfSDavid du Colombier 
2007dd7cddfSDavid du Colombier 	Conv*	incall;			/* calls waiting to be listened for */
2017dd7cddfSDavid du Colombier 	Conv*	next;
2027dd7cddfSDavid du Colombier 
2037dd7cddfSDavid du Colombier 	Queue*	rq;			/* queued data waiting to be read */
2047dd7cddfSDavid du Colombier 	Queue*	wq;			/* queued data waiting to be written */
2057dd7cddfSDavid du Colombier 	Queue*	eq;			/* returned error packets */
206d9306527SDavid du Colombier 	Queue*	sq;			/* snooping queue */
207d9306527SDavid du Colombier 	Ref	snoopers;		/* number of processes with snoop open */
2087dd7cddfSDavid du Colombier 
2097dd7cddfSDavid du Colombier 	QLock	car;
2107dd7cddfSDavid du Colombier 	Rendez	cr;
2119a747e4fSDavid du Colombier 	char	cerr[ERRMAX];
2127dd7cddfSDavid du Colombier 
2137dd7cddfSDavid du Colombier 	QLock	listenq;
2147dd7cddfSDavid du Colombier 	Rendez	listenr;
2157dd7cddfSDavid du Colombier 
2167dd7cddfSDavid du Colombier 	Ipmulti	*multi;			/* multicast bindings for this interface */
2177dd7cddfSDavid du Colombier 
2187dd7cddfSDavid du Colombier 	void*	ptcl;			/* protocol specific stuff */
219a6a9e072SDavid du Colombier 
220a6a9e072SDavid du Colombier 	Route	*r;			/* last route used */
221a6a9e072SDavid du Colombier 	ulong	rgen;			/* routetable generation for *r */
2227dd7cddfSDavid du Colombier };
2237dd7cddfSDavid du Colombier 
2247dd7cddfSDavid du Colombier struct Medium
2257dd7cddfSDavid du Colombier {
2267dd7cddfSDavid du Colombier 	char	*name;
2277dd7cddfSDavid du Colombier 	int	hsize;		/* medium header size */
2283f695129SDavid du Colombier 	int	mintu;		/* default min mtu */
2293f695129SDavid du Colombier 	int	maxtu;		/* default max mtu */
2307dd7cddfSDavid du Colombier 	int	maclen;		/* mac address length */
2317dd7cddfSDavid du Colombier 	void	(*bind)(Ipifc*, int, char**);
2327dd7cddfSDavid du Colombier 	void	(*unbind)(Ipifc*);
2337dd7cddfSDavid du Colombier 	void	(*bwrite)(Ipifc *ifc, Block *b, int version, uchar *ip);
2347dd7cddfSDavid du Colombier 
2357dd7cddfSDavid du Colombier 	/* for arming interfaces to receive multicast */
2367dd7cddfSDavid du Colombier 	void	(*addmulti)(Ipifc *ifc, uchar *a, uchar *ia);
2377dd7cddfSDavid du Colombier 	void	(*remmulti)(Ipifc *ifc, uchar *a, uchar *ia);
2387dd7cddfSDavid du Colombier 
2397dd7cddfSDavid du Colombier 	/* process packets written to 'data' */
2407dd7cddfSDavid du Colombier 	void	(*pktin)(Fs *f, Ipifc *ifc, Block *bp);
2417dd7cddfSDavid du Colombier 
2427dd7cddfSDavid du Colombier 	/* routes for router boards */
2437dd7cddfSDavid du Colombier 	void	(*addroute)(Ipifc *ifc, int, uchar*, uchar*, uchar*, int);
2447dd7cddfSDavid du Colombier 	void	(*remroute)(Ipifc *ifc, int, uchar*, uchar*);
2457dd7cddfSDavid du Colombier 	void	(*flushroutes)(Ipifc *ifc);
2467dd7cddfSDavid du Colombier 
2477dd7cddfSDavid du Colombier 	/* for routing multicast groups */
2487dd7cddfSDavid du Colombier 	void	(*joinmulti)(Ipifc *ifc, uchar *a, uchar *ia);
2497dd7cddfSDavid du Colombier 	void	(*leavemulti)(Ipifc *ifc, uchar *a, uchar *ia);
2507dd7cddfSDavid du Colombier 
2517dd7cddfSDavid du Colombier 	/* address resolution */
2527dd7cddfSDavid du Colombier 	void	(*ares)(Fs*, int, uchar*, uchar*, int, int);	/* resolve */
2537dd7cddfSDavid du Colombier 	void	(*areg)(Ipifc*, uchar*);			/* register */
2547dd7cddfSDavid du Colombier 
2553ff48bf5SDavid du Colombier 	/* v6 address generation */
2563ff48bf5SDavid du Colombier 	void	(*pref2addr)(uchar *pref, uchar *ea);
2573ff48bf5SDavid du Colombier 
2587dd7cddfSDavid du Colombier 	int	unbindonclose;	/* if non-zero, unbind on last close */
2597dd7cddfSDavid du Colombier };
2607dd7cddfSDavid du Colombier 
2617dd7cddfSDavid du Colombier /* logical interface associated with a physical one */
2627dd7cddfSDavid du Colombier struct Iplifc
2637dd7cddfSDavid du Colombier {
2647dd7cddfSDavid du Colombier 	uchar	local[IPaddrlen];
2657dd7cddfSDavid du Colombier 	uchar	mask[IPaddrlen];
2667dd7cddfSDavid du Colombier 	uchar	remote[IPaddrlen];
2677dd7cddfSDavid du Colombier 	uchar	net[IPaddrlen];
2683ff48bf5SDavid du Colombier 	uchar	tentative;	/* =1 => v6 dup disc on, =0 => confirmed unique */
2693ff48bf5SDavid du Colombier 	uchar	onlink;		/* =1 => onlink, =0 offlink. */
2703ff48bf5SDavid du Colombier 	uchar	autoflag;	/* v6 autonomous flag */
2713ff48bf5SDavid du Colombier 	long	validlt;	/* v6 valid lifetime */
2723ff48bf5SDavid du Colombier 	long	preflt;		/* v6 preferred lifetime */
2733ff48bf5SDavid du Colombier 	long	origint;	/* time when addr was added */
2747dd7cddfSDavid du Colombier 	Iplink	*link;		/* addresses linked to this lifc */
2757dd7cddfSDavid du Colombier 	Iplifc	*next;
2767dd7cddfSDavid du Colombier };
2777dd7cddfSDavid du Colombier 
27880ee5cbfSDavid du Colombier /* binding twixt Ipself and Iplifc */
2797dd7cddfSDavid du Colombier struct Iplink
2807dd7cddfSDavid du Colombier {
2817dd7cddfSDavid du Colombier 	Ipself	*self;
2827dd7cddfSDavid du Colombier 	Iplifc	*lifc;
2837dd7cddfSDavid du Colombier 	Iplink	*selflink;	/* next link for this local address */
2847dd7cddfSDavid du Colombier 	Iplink	*lifclink;	/* next link for this ifc */
2857dd7cddfSDavid du Colombier 	ulong	expire;
2867dd7cddfSDavid du Colombier 	Iplink	*next;		/* free list */
2877dd7cddfSDavid du Colombier 	int	ref;
2887dd7cddfSDavid du Colombier };
2897dd7cddfSDavid du Colombier 
2903179bee6SDavid du Colombier /* rfc 2461, pp.40—43. */
2913ff48bf5SDavid du Colombier 
2923ff48bf5SDavid du Colombier /* default values, one per stack */
2933ff48bf5SDavid du Colombier struct Routerparams {
2943179bee6SDavid du Colombier 	int	mflag;		/* flag: managed address configuration */
2953179bee6SDavid du Colombier 	int	oflag;		/* flag: other stateful configuration */
2963179bee6SDavid du Colombier 	int	maxraint;	/* max. router adv interval (ms) */
2973179bee6SDavid du Colombier 	int	minraint;	/* min. router adv interval (ms) */
2983179bee6SDavid du Colombier 	int	linkmtu;	/* mtu options */
2993179bee6SDavid du Colombier 	int	reachtime;	/* reachable time */
3003179bee6SDavid du Colombier 	int	rxmitra;	/* retransmit interval */
3013179bee6SDavid du Colombier 	int	ttl;		/* cur hop count limit */
3023179bee6SDavid du Colombier 	int	routerlt;	/* router lifetime */
3033ff48bf5SDavid du Colombier };
3043ff48bf5SDavid du Colombier 
3053ff48bf5SDavid du Colombier struct Hostparams {
3063ff48bf5SDavid du Colombier 	int	rxmithost;
3073ff48bf5SDavid du Colombier };
3083ff48bf5SDavid du Colombier 
3097dd7cddfSDavid du Colombier struct Ipifc
3107dd7cddfSDavid du Colombier {
3117dd7cddfSDavid du Colombier 	RWlock;
3127dd7cddfSDavid du Colombier 
3137dd7cddfSDavid du Colombier 	Conv	*conv;		/* link to its conversation structure */
3147dd7cddfSDavid du Colombier 	char	dev[64];	/* device we're attached to */
315*cc057a51SDavid du Colombier 	Medium	*medium;	/* Media pointer */
3163f695129SDavid du Colombier 	int	maxtu;		/* Maximum transfer unit */
3173f695129SDavid du Colombier 	int	mintu;		/* Minumum tranfer unit */
3183f695129SDavid du Colombier 	int	mbps;		/* megabits per second */
3197dd7cddfSDavid du Colombier 	void	*arg;		/* medium specific */
3209a747e4fSDavid du Colombier 	int	reassemble;	/* reassemble IP packets before forwarding */
3217dd7cddfSDavid du Colombier 
3227dd7cddfSDavid du Colombier 	/* these are used so that we can unbind on the fly */
3237dd7cddfSDavid du Colombier 	Lock	idlock;
3247dd7cddfSDavid du Colombier 	uchar	ifcid;		/* incremented each 'bind/unbind/add/remove' */
3257dd7cddfSDavid du Colombier 	int	ref;		/* number of proc's using this ipifc */
3267dd7cddfSDavid du Colombier 	Rendez	wait;		/* where unbinder waits for ref == 0 */
3277dd7cddfSDavid du Colombier 	int	unbinding;
3287dd7cddfSDavid du Colombier 
3297dd7cddfSDavid du Colombier 	uchar	mac[MAClen];	/* MAC address */
3307dd7cddfSDavid du Colombier 
3317dd7cddfSDavid du Colombier 	Iplifc	*lifc;		/* logical interfaces on this physical one */
3327dd7cddfSDavid du Colombier 
3337dd7cddfSDavid du Colombier 	ulong	in, out;	/* message statistics */
3347dd7cddfSDavid du Colombier 	ulong	inerr, outerr;	/* ... */
3353ff48bf5SDavid du Colombier 
3363179bee6SDavid du Colombier 	uchar	sendra6;	/* flag: send router advs on this ifc */
3373179bee6SDavid du Colombier 	uchar	recvra6;	/* flag: recv router advs on this ifc */
3383179bee6SDavid du Colombier 	Routerparams rp;	/* router parameters as in RFC 2461, pp.40—43.
3393ff48bf5SDavid du Colombier 					used only if node is router */
3407dd7cddfSDavid du Colombier };
3417dd7cddfSDavid du Colombier 
3427dd7cddfSDavid du Colombier /*
3437dd7cddfSDavid du Colombier  *  one per multicast-lifc pair used by a Conv
3447dd7cddfSDavid du Colombier  */
3457dd7cddfSDavid du Colombier struct Ipmulti
3467dd7cddfSDavid du Colombier {
3477dd7cddfSDavid du Colombier 	uchar	ma[IPaddrlen];
3487dd7cddfSDavid du Colombier 	uchar	ia[IPaddrlen];
3497dd7cddfSDavid du Colombier 	Ipmulti	*next;
3507dd7cddfSDavid du Colombier };
3517dd7cddfSDavid du Colombier 
3527dd7cddfSDavid du Colombier /*
35380ee5cbfSDavid du Colombier  *  hash table for 2 ip addresses + 2 ports
35480ee5cbfSDavid du Colombier  */
35580ee5cbfSDavid du Colombier enum
35680ee5cbfSDavid du Colombier {
35780ee5cbfSDavid du Colombier 	Nipht=		521,	/* convenient prime */
35880ee5cbfSDavid du Colombier 
35980ee5cbfSDavid du Colombier 	IPmatchexact=	0,	/* match on 4 tuple */
36080ee5cbfSDavid du Colombier 	IPmatchany,		/* *!* */
36180ee5cbfSDavid du Colombier 	IPmatchport,		/* *!port */
36280ee5cbfSDavid du Colombier 	IPmatchaddr,		/* addr!* */
36380ee5cbfSDavid du Colombier 	IPmatchpa,		/* addr!port */
36480ee5cbfSDavid du Colombier };
36580ee5cbfSDavid du Colombier struct Iphash
36680ee5cbfSDavid du Colombier {
36780ee5cbfSDavid du Colombier 	Iphash	*next;
36880ee5cbfSDavid du Colombier 	Conv	*c;
36980ee5cbfSDavid du Colombier 	int	match;
37080ee5cbfSDavid du Colombier };
37180ee5cbfSDavid du Colombier struct Ipht
37280ee5cbfSDavid du Colombier {
37380ee5cbfSDavid du Colombier 	Lock;
37480ee5cbfSDavid du Colombier 	Iphash	*tab[Nipht];
37580ee5cbfSDavid du Colombier };
37680ee5cbfSDavid du Colombier void iphtadd(Ipht*, Conv*);
37780ee5cbfSDavid du Colombier void iphtrem(Ipht*, Conv*);
37880ee5cbfSDavid du Colombier Conv* iphtlook(Ipht *ht, uchar *sa, ushort sp, uchar *da, ushort dp);
37980ee5cbfSDavid du Colombier 
38080ee5cbfSDavid du Colombier /*
3817dd7cddfSDavid du Colombier  *  one per multiplexed protocol
3827dd7cddfSDavid du Colombier  */
3837dd7cddfSDavid du Colombier struct Proto
3847dd7cddfSDavid du Colombier {
3857dd7cddfSDavid du Colombier 	QLock;
3867dd7cddfSDavid du Colombier 	char*		name;		/* protocol name */
3877dd7cddfSDavid du Colombier 	int		x;		/* protocol index */
3887dd7cddfSDavid du Colombier 	int		ipproto;	/* ip protocol type */
3897dd7cddfSDavid du Colombier 
3907dd7cddfSDavid du Colombier 	char*		(*connect)(Conv*, char**, int);
3917dd7cddfSDavid du Colombier 	char*		(*announce)(Conv*, char**, int);
3927dd7cddfSDavid du Colombier 	char*		(*bind)(Conv*, char**, int);
3937dd7cddfSDavid du Colombier 	int		(*state)(Conv*, char*, int);
3947dd7cddfSDavid du Colombier 	void		(*create)(Conv*);
3957dd7cddfSDavid du Colombier 	void		(*close)(Conv*);
3969a747e4fSDavid du Colombier 	void		(*rcv)(Proto*, Ipifc*, Block*);
3977dd7cddfSDavid du Colombier 	char*		(*ctl)(Conv*, char**, int);
3987dd7cddfSDavid du Colombier 	void		(*advise)(Proto*, Block*, char*);
3997dd7cddfSDavid du Colombier 	int		(*stats)(Proto*, char*, int);
4007dd7cddfSDavid du Colombier 	int		(*local)(Conv*, char*, int);
4017dd7cddfSDavid du Colombier 	int		(*remote)(Conv*, char*, int);
4027dd7cddfSDavid du Colombier 	int		(*inuse)(Conv*);
4037dd7cddfSDavid du Colombier 	int		(*gc)(Proto*);	/* returns true if any conversations are freed */
4047dd7cddfSDavid du Colombier 
4057dd7cddfSDavid du Colombier 	Fs		*f;		/* file system this proto is part of */
4067dd7cddfSDavid du Colombier 	Conv		**conv;		/* array of conversations */
4077dd7cddfSDavid du Colombier 	int		ptclsize;	/* size of per protocol ctl block */
4087dd7cddfSDavid du Colombier 	int		nc;		/* number of conversations */
4097dd7cddfSDavid du Colombier 	int		ac;
4107dd7cddfSDavid du Colombier 	Qid		qid;		/* qid for protocol directory */
4117dd7cddfSDavid du Colombier 	ushort		nextrport;
4127dd7cddfSDavid du Colombier 
4137dd7cddfSDavid du Colombier 	void		*priv;
4147dd7cddfSDavid du Colombier };
4157dd7cddfSDavid du Colombier 
4163ff48bf5SDavid du Colombier 
4177dd7cddfSDavid du Colombier /*
4187dd7cddfSDavid du Colombier  *  one per IP protocol stack
4197dd7cddfSDavid du Colombier  */
4207dd7cddfSDavid du Colombier struct Fs
4217dd7cddfSDavid du Colombier {
4227dd7cddfSDavid du Colombier 	RWlock;
4237dd7cddfSDavid du Colombier 	int	dev;
4247dd7cddfSDavid du Colombier 
4257dd7cddfSDavid du Colombier 	int	np;
4267dd7cddfSDavid du Colombier 	Proto*	p[Maxproto+1];		/* list of supported protocols */
4277dd7cddfSDavid du Colombier 	Proto*	t2p[256];		/* vector of all protocols */
4287dd7cddfSDavid du Colombier 	Proto*	ipifc;			/* kludge for ipifcremroute & ipifcaddroute */
4297dd7cddfSDavid du Colombier 	Proto*	ipmux;			/* kludge for finding an ip multiplexor */
4307dd7cddfSDavid du Colombier 
4317dd7cddfSDavid du Colombier 	IP	*ip;
4327dd7cddfSDavid du Colombier 	Ipselftab	*self;
4337dd7cddfSDavid du Colombier 	Arp	*arp;
4343ff48bf5SDavid du Colombier 	v6params	*v6p;
4357dd7cddfSDavid du Colombier 
4367dd7cddfSDavid du Colombier 	Route	*v4root[1<<Lroot];	/* v4 routing forest */
4377dd7cddfSDavid du Colombier 	Route	*v6root[1<<Lroot];	/* v6 routing forest */
4387dd7cddfSDavid du Colombier 	Route	*queue;			/* used as temp when reinjecting routes */
4397dd7cddfSDavid du Colombier 
4407dd7cddfSDavid du Colombier 	Netlog	*alog;
4417dd7cddfSDavid du Colombier 
4427dd7cddfSDavid du Colombier 	char	ndb[1024];		/* an ndb entry for this interface */
4439a747e4fSDavid du Colombier 	int	ndbvers;
4449a747e4fSDavid du Colombier 	long	ndbmtime;
4457dd7cddfSDavid du Colombier };
4467dd7cddfSDavid du Colombier 
4473ff48bf5SDavid du Colombier /* one per default router known to host */
4483ff48bf5SDavid du Colombier struct v6router {
4493ff48bf5SDavid du Colombier 	uchar	inuse;
4503ff48bf5SDavid du Colombier 	Ipifc	*ifc;
4513ff48bf5SDavid du Colombier 	int	ifcid;
4523ff48bf5SDavid du Colombier 	uchar	routeraddr[IPaddrlen];
4533ff48bf5SDavid du Colombier 	long	ltorigin;
4543ff48bf5SDavid du Colombier 	Routerparams	rp;
4553ff48bf5SDavid du Colombier };
4563ff48bf5SDavid du Colombier 
4573ff48bf5SDavid du Colombier struct v6params
4583ff48bf5SDavid du Colombier {
4593ff48bf5SDavid du Colombier 	Routerparams	rp;		/* v6 params, one copy per node now */
4603ff48bf5SDavid du Colombier 	Hostparams	hp;
4613ff48bf5SDavid du Colombier 	v6router	v6rlist[3];	/* max 3 default routers, currently */
4623ff48bf5SDavid du Colombier 	int		cdrouter;	/* uses only v6rlist[cdrouter] if */
4633ff48bf5SDavid du Colombier 					/* cdrouter >= 0. */
4643ff48bf5SDavid du Colombier };
4653ff48bf5SDavid du Colombier 
4663ff48bf5SDavid du Colombier 
4677dd7cddfSDavid du Colombier int	Fsconnected(Conv*, char*);
4683ff48bf5SDavid du Colombier Conv*	Fsnewcall(Conv*, uchar*, ushort, uchar*, ushort, uchar);
4697dd7cddfSDavid du Colombier int	Fspcolstats(char*, int);
4707dd7cddfSDavid du Colombier int	Fsproto(Fs*, Proto*);
4717dd7cddfSDavid du Colombier int	Fsbuiltinproto(Fs*, uchar);
4727dd7cddfSDavid du Colombier Conv*	Fsprotoclone(Proto*, char*);
4737dd7cddfSDavid du Colombier Proto*	Fsrcvpcol(Fs*, uchar);
4747dd7cddfSDavid du Colombier Proto*	Fsrcvpcolx(Fs*, uchar);
4757dd7cddfSDavid du Colombier char*	Fsstdconnect(Conv*, char**, int);
4767dd7cddfSDavid du Colombier char*	Fsstdannounce(Conv*, char**, int);
4777dd7cddfSDavid du Colombier char*	Fsstdbind(Conv*, char**, int);
4789a747e4fSDavid du Colombier ulong	scalednconv(void);
4797dd7cddfSDavid du Colombier void	closeconv(Conv*);
4807dd7cddfSDavid du Colombier /*
4817dd7cddfSDavid du Colombier  *  logging
4827dd7cddfSDavid du Colombier  */
4837dd7cddfSDavid du Colombier enum
4847dd7cddfSDavid du Colombier {
4857dd7cddfSDavid du Colombier 	Logip=		1<<1,
4867dd7cddfSDavid du Colombier 	Logtcp=		1<<2,
4877dd7cddfSDavid du Colombier 	Logfs=		1<<3,
4887dd7cddfSDavid du Colombier 	Logicmp=	1<<5,
4897dd7cddfSDavid du Colombier 	Logudp=		1<<6,
4907dd7cddfSDavid du Colombier 	Logcompress=	1<<7,
4917dd7cddfSDavid du Colombier 	Loggre=		1<<9,
4927dd7cddfSDavid du Colombier 	Logppp=		1<<10,
4933ff48bf5SDavid du Colombier 	Logtcprxmt=	1<<11,
4947dd7cddfSDavid du Colombier 	Logigmp=	1<<12,
4957dd7cddfSDavid du Colombier 	Logudpmsg=	1<<13,
4967dd7cddfSDavid du Colombier 	Logipmsg=	1<<14,
4977dd7cddfSDavid du Colombier 	Logrudp=	1<<15,
4987dd7cddfSDavid du Colombier 	Logrudpmsg=	1<<16,
4997dd7cddfSDavid du Colombier 	Logesp=		1<<17,
5003ff48bf5SDavid du Colombier 	Logtcpwin=	1<<18,
5017dd7cddfSDavid du Colombier };
5027dd7cddfSDavid du Colombier 
5037dd7cddfSDavid du Colombier void	netloginit(Fs*);
5047dd7cddfSDavid du Colombier void	netlogopen(Fs*);
5057dd7cddfSDavid du Colombier void	netlogclose(Fs*);
5069a747e4fSDavid du Colombier void	netlogctl(Fs*, char*, int);
5077dd7cddfSDavid du Colombier long	netlogread(Fs*, void*, ulong, long);
5087dd7cddfSDavid du Colombier void	netlog(Fs*, int, char*, ...);
5097dd7cddfSDavid du Colombier void	ifcloginit(Fs*);
5107dd7cddfSDavid du Colombier long	ifclogread(Fs*, Chan *,void*, ulong, long);
5117dd7cddfSDavid du Colombier void	ifclog(Fs*, uchar *, int);
5127dd7cddfSDavid du Colombier void	ifclogopen(Fs*, Chan*);
5137dd7cddfSDavid du Colombier void	ifclogclose(Fs*, Chan*);
5147dd7cddfSDavid du Colombier 
5157133e0eeSDavid du Colombier #pragma varargck argpos netlog	3
5167133e0eeSDavid du Colombier 
5177dd7cddfSDavid du Colombier /*
5187dd7cddfSDavid du Colombier  *  iproute.c
5197dd7cddfSDavid du Colombier  */
5207dd7cddfSDavid du Colombier typedef	struct RouteTree RouteTree;
5217dd7cddfSDavid du Colombier typedef struct Routewalk Routewalk;
5227dd7cddfSDavid du Colombier typedef struct V4route V4route;
5237dd7cddfSDavid du Colombier typedef struct V6route V6route;
5247dd7cddfSDavid du Colombier 
5257dd7cddfSDavid du Colombier enum
5267dd7cddfSDavid du Colombier {
5277dd7cddfSDavid du Colombier 
5287dd7cddfSDavid du Colombier 	/* type bits */
5297dd7cddfSDavid du Colombier 	Rv4=		(1<<0),		/* this is a version 4 route */
5307dd7cddfSDavid du Colombier 	Rifc=		(1<<1),		/* this route is a directly connected interface */
5317dd7cddfSDavid du Colombier 	Rptpt=		(1<<2),		/* this route is a pt to pt interface */
5327dd7cddfSDavid du Colombier 	Runi=		(1<<3),		/* a unicast self address */
5337dd7cddfSDavid du Colombier 	Rbcast=		(1<<4),		/* a broadcast self address */
5347dd7cddfSDavid du Colombier 	Rmulti=		(1<<5),		/* a multicast self address */
5357dd7cddfSDavid du Colombier 	Rproxy=		(1<<6),		/* this route should be proxied */
5367dd7cddfSDavid du Colombier };
5377dd7cddfSDavid du Colombier 
5387dd7cddfSDavid du Colombier struct Routewalk
5397dd7cddfSDavid du Colombier {
5407dd7cddfSDavid du Colombier 	int	o;
5417dd7cddfSDavid du Colombier 	int	h;
5427dd7cddfSDavid du Colombier 	char*	p;
543679c15e8SDavid du Colombier 	char*	e;
5447dd7cddfSDavid du Colombier 	void*	state;
5457dd7cddfSDavid du Colombier 	void	(*walk)(Route*, Routewalk*);
5467dd7cddfSDavid du Colombier };
5477dd7cddfSDavid du Colombier 
5487dd7cddfSDavid du Colombier struct	RouteTree
5497dd7cddfSDavid du Colombier {
5507dd7cddfSDavid du Colombier 	Route*	right;
5517dd7cddfSDavid du Colombier 	Route*	left;
5527dd7cddfSDavid du Colombier 	Route*	mid;
5537dd7cddfSDavid du Colombier 	uchar	depth;
5547dd7cddfSDavid du Colombier 	uchar	type;
5557dd7cddfSDavid du Colombier 	uchar	ifcid;		/* must match ifc->id */
5567dd7cddfSDavid du Colombier 	Ipifc	*ifc;
5577dd7cddfSDavid du Colombier 	char	tag[4];
5589a747e4fSDavid du Colombier 	int	ref;
5597dd7cddfSDavid du Colombier };
5607dd7cddfSDavid du Colombier 
5617dd7cddfSDavid du Colombier struct V4route
5627dd7cddfSDavid du Colombier {
5637dd7cddfSDavid du Colombier 	ulong	address;
5647dd7cddfSDavid du Colombier 	ulong	endaddress;
5657dd7cddfSDavid du Colombier 	uchar	gate[IPv4addrlen];
5667dd7cddfSDavid du Colombier };
5677dd7cddfSDavid du Colombier 
5687dd7cddfSDavid du Colombier struct V6route
5697dd7cddfSDavid du Colombier {
5707dd7cddfSDavid du Colombier 	ulong	address[IPllen];
5717dd7cddfSDavid du Colombier 	ulong	endaddress[IPllen];
5727dd7cddfSDavid du Colombier 	uchar	gate[IPaddrlen];
5737dd7cddfSDavid du Colombier };
5747dd7cddfSDavid du Colombier 
5757dd7cddfSDavid du Colombier struct Route
5767dd7cddfSDavid du Colombier {
5777dd7cddfSDavid du Colombier 	RouteTree;
5787dd7cddfSDavid du Colombier 
5797dd7cddfSDavid du Colombier 	union {
5807dd7cddfSDavid du Colombier 		V6route	v6;
5817dd7cddfSDavid du Colombier 		V4route v4;
5827dd7cddfSDavid du Colombier 	};
5837dd7cddfSDavid du Colombier };
5847dd7cddfSDavid du Colombier extern void	v4addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type);
5857dd7cddfSDavid du Colombier extern void	v6addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type);
5867dd7cddfSDavid du Colombier extern void	v4delroute(Fs *f, uchar *a, uchar *mask, int dolock);
5877dd7cddfSDavid du Colombier extern void	v6delroute(Fs *f, uchar *a, uchar *mask, int dolock);
588a6a9e072SDavid du Colombier extern Route*	v4lookup(Fs *f, uchar *a, Conv *c);
589a6a9e072SDavid du Colombier extern Route*	v6lookup(Fs *f, uchar *a, Conv *c);
5907dd7cddfSDavid du Colombier extern long	routeread(Fs *f, char*, ulong, int);
5917dd7cddfSDavid du Colombier extern long	routewrite(Fs *f, Chan*, char*, int);
5927dd7cddfSDavid du Colombier extern void	routetype(int, char*);
5937dd7cddfSDavid du Colombier extern void	ipwalkroutes(Fs*, Routewalk*);
5947dd7cddfSDavid du Colombier extern void	convroute(Route*, uchar*, uchar*, uchar*, char*, int*);
5957dd7cddfSDavid du Colombier 
5967dd7cddfSDavid du Colombier /*
5979a747e4fSDavid du Colombier  *  devip.c
5989a747e4fSDavid du Colombier  */
5999a747e4fSDavid du Colombier 
6009a747e4fSDavid du Colombier /*
6019a747e4fSDavid du Colombier  *  Hanging off every ip channel's ->aux is the following structure.
6029a747e4fSDavid du Colombier  *  It maintains the state used by devip and iproute.
6039a747e4fSDavid du Colombier  */
6049a747e4fSDavid du Colombier struct IPaux
6059a747e4fSDavid du Colombier {
6069a747e4fSDavid du Colombier 	char	*owner;		/* the user that did the attach */
6079a747e4fSDavid du Colombier 	char	tag[4];
6089a747e4fSDavid du Colombier };
6099a747e4fSDavid du Colombier 
6109a747e4fSDavid du Colombier extern IPaux*	newipaux(char*, char*);
6119a747e4fSDavid du Colombier 
6129a747e4fSDavid du Colombier /*
6137dd7cddfSDavid du Colombier  *  arp.c
6147dd7cddfSDavid du Colombier  */
6157dd7cddfSDavid du Colombier struct Arpent
6167dd7cddfSDavid du Colombier {
6177dd7cddfSDavid du Colombier 	uchar	ip[IPaddrlen];
6187dd7cddfSDavid du Colombier 	uchar	mac[MAClen];
6197dd7cddfSDavid du Colombier 	Medium	*type;			/* media type */
6207dd7cddfSDavid du Colombier 	Arpent*	hash;
6217dd7cddfSDavid du Colombier 	Block*	hold;
6227dd7cddfSDavid du Colombier 	Block*	last;
623a6a9e072SDavid du Colombier 	uint	ctime;			/* time entry was created or refreshed */
624a6a9e072SDavid du Colombier 	uint	utime;			/* time entry was last used */
6257dd7cddfSDavid du Colombier 	uchar	state;
6263ff48bf5SDavid du Colombier 	Arpent	*nextrxt;		/* re-transmit chain */
627a6a9e072SDavid du Colombier 	uint	rtime;			/* time for next retransmission */
6283ff48bf5SDavid du Colombier 	uchar	rxtsrem;
6293ff48bf5SDavid du Colombier 	Ipifc	*ifc;
6303ff48bf5SDavid du Colombier 	uchar	ifcid;			/* must match ifc->id */
6317dd7cddfSDavid du Colombier };
6327dd7cddfSDavid du Colombier 
6337dd7cddfSDavid du Colombier extern void	arpinit(Fs*);
6347dd7cddfSDavid du Colombier extern int	arpread(Arp*, char*, ulong, int);
6357dd7cddfSDavid du Colombier extern int	arpwrite(Fs*, char*, int);
6363ff48bf5SDavid du Colombier extern Arpent*	arpget(Arp*, Block *bp, int version, Ipifc *ifc, uchar *ip, uchar *h);
6377dd7cddfSDavid du Colombier extern void	arprelease(Arp*, Arpent *a);
6387dd7cddfSDavid du Colombier extern Block*	arpresolve(Arp*, Arpent *a, Medium *type, uchar *mac);
6397dd7cddfSDavid du Colombier extern void	arpenter(Fs*, int version, uchar *ip, uchar *mac, int len, int norefresh);
6407dd7cddfSDavid du Colombier 
6417dd7cddfSDavid du Colombier /*
6427dd7cddfSDavid du Colombier  * ipaux.c
6437dd7cddfSDavid du Colombier  */
6447dd7cddfSDavid du Colombier 
6457dd7cddfSDavid du Colombier extern int	myetheraddr(uchar*, char*);
646ea58ad6fSDavid du Colombier extern vlong	parseip(uchar*, char*);
647ea58ad6fSDavid du Colombier extern vlong	parseipmask(uchar*, char*);
6487dd7cddfSDavid du Colombier extern char*	v4parseip(uchar*, char*);
6497dd7cddfSDavid du Colombier extern void	maskip(uchar *from, uchar *mask, uchar *to);
6507dd7cddfSDavid du Colombier extern int	parsemac(uchar *to, char *from, int len);
6517dd7cddfSDavid du Colombier extern uchar*	defmask(uchar*);
6527dd7cddfSDavid du Colombier extern int	isv4(uchar*);
6537dd7cddfSDavid du Colombier extern void	v4tov6(uchar *v6, uchar *v4);
6547dd7cddfSDavid du Colombier extern int	v6tov4(uchar *v4, uchar *v6);
6559a747e4fSDavid du Colombier extern int	eipfmt(Fmt*);
6567dd7cddfSDavid du Colombier 
6577dd7cddfSDavid du Colombier #define	ipmove(x, y) memmove(x, y, IPaddrlen)
6583ff48bf5SDavid du Colombier #define	ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) )
6597dd7cddfSDavid du Colombier 
6607dd7cddfSDavid du Colombier extern uchar IPv4bcast[IPaddrlen];
6617dd7cddfSDavid du Colombier extern uchar IPv4bcastobs[IPaddrlen];
6627dd7cddfSDavid du Colombier extern uchar IPv4allsys[IPaddrlen];
6637dd7cddfSDavid du Colombier extern uchar IPv4allrouter[IPaddrlen];
6647dd7cddfSDavid du Colombier extern uchar IPnoaddr[IPaddrlen];
6657dd7cddfSDavid du Colombier extern uchar v4prefix[IPaddrlen];
6667dd7cddfSDavid du Colombier extern uchar IPallbits[IPaddrlen];
6677dd7cddfSDavid du Colombier 
6683ff48bf5SDavid du Colombier #define	NOW	TK2MS(MACHP(0)->ticks)
6697dd7cddfSDavid du Colombier 
6707dd7cddfSDavid du Colombier /*
6717dd7cddfSDavid du Colombier  *  media
6727dd7cddfSDavid du Colombier  */
6737dd7cddfSDavid du Colombier extern Medium	ethermedium;
6747dd7cddfSDavid du Colombier extern Medium	nullmedium;
6757dd7cddfSDavid du Colombier extern Medium	pktmedium;
6767dd7cddfSDavid du Colombier 
6777dd7cddfSDavid du Colombier /*
6787dd7cddfSDavid du Colombier  *  ipifc.c
6797dd7cddfSDavid du Colombier  */
6807dd7cddfSDavid du Colombier extern Medium*	ipfindmedium(char *name);
6817dd7cddfSDavid du Colombier extern void	addipmedium(Medium *med);
6827dd7cddfSDavid du Colombier extern int	ipforme(Fs*, uchar *addr);
6833ff48bf5SDavid du Colombier extern int	iptentative(Fs*, uchar *addr);
6847dd7cddfSDavid du Colombier extern int	ipisbm(uchar *);
6857dd7cddfSDavid du Colombier extern int	ipismulticast(uchar *);
6867dd7cddfSDavid du Colombier extern Ipifc*	findipifc(Fs*, uchar *remote, int type);
6877dd7cddfSDavid du Colombier extern void	findlocalip(Fs*, uchar *local, uchar *remote);
6887dd7cddfSDavid du Colombier extern int	ipv4local(Ipifc *ifc, uchar *addr);
6897dd7cddfSDavid du Colombier extern int	ipv6local(Ipifc *ifc, uchar *addr);
6903ff48bf5SDavid du Colombier extern int	ipv6anylocal(Ipifc *ifc, uchar *addr);
6917dd7cddfSDavid du Colombier extern Iplifc*	iplocalonifc(Ipifc *ifc, uchar *ip);
6927dd7cddfSDavid du Colombier extern int	ipproxyifc(Fs *f, Ipifc *ifc, uchar *ip);
6937dd7cddfSDavid du Colombier extern int	ipismulticast(uchar *ip);
6947dd7cddfSDavid du Colombier extern int	ipisbooting(void);
6957dd7cddfSDavid du Colombier extern int	ipifccheckin(Ipifc *ifc, Medium *med);
6967dd7cddfSDavid du Colombier extern void	ipifccheckout(Ipifc *ifc);
6977dd7cddfSDavid du Colombier extern int	ipifcgrab(Ipifc *ifc);
6987dd7cddfSDavid du Colombier extern void	ipifcaddroute(Fs*, int, uchar*, uchar*, uchar*, int);
6997dd7cddfSDavid du Colombier extern void	ipifcremroute(Fs*, int, uchar*, uchar*);
7007dd7cddfSDavid du Colombier extern void	ipifcremmulti(Conv *c, uchar *ma, uchar *ia);
7017dd7cddfSDavid du Colombier extern void	ipifcaddmulti(Conv *c, uchar *ma, uchar *ia);
70239734e7eSDavid du Colombier extern char*	ipifcrem(Ipifc *ifc, char **argv, int argc);
7033ff48bf5SDavid du Colombier extern char*	ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp);
7047dd7cddfSDavid du Colombier extern long	ipselftabread(Fs*, char *a, ulong offset, int n);
7053179bee6SDavid du Colombier extern char*	ipifcadd6(Ipifc *ifc, char**argv, int argc);
7067dd7cddfSDavid du Colombier /*
7077dd7cddfSDavid du Colombier  *  ip.c
7087dd7cddfSDavid du Colombier  */
7097dd7cddfSDavid du Colombier extern void	iprouting(Fs*, int);
7107dd7cddfSDavid du Colombier extern void	icmpnoconv(Fs*, Block*);
711d9306527SDavid du Colombier extern void	icmpcantfrag(Fs*, Block*, int);
7123ff48bf5SDavid du Colombier extern void	icmpttlexceeded(Fs*, uchar*, Block*);
7137dd7cddfSDavid du Colombier extern ushort	ipcsum(uchar*);
7143ff48bf5SDavid du Colombier extern void	ipiput4(Fs*, Ipifc*, Block*);
7153ff48bf5SDavid du Colombier extern void	ipiput6(Fs*, Ipifc*, Block*);
716a6a9e072SDavid du Colombier extern int	ipoput4(Fs*, Block*, int, int, int, Conv*);
717a6a9e072SDavid du Colombier extern int	ipoput6(Fs*, Block*, int, int, int, Conv*);
7187dd7cddfSDavid du Colombier extern int	ipstats(Fs*, char*, int);
7197dd7cddfSDavid du Colombier extern ushort	ptclbsum(uchar*, int);
7207dd7cddfSDavid du Colombier extern ushort	ptclcsum(Block*, int, int);
7217dd7cddfSDavid du Colombier extern void	ip_init(Fs*);
7229a747e4fSDavid du Colombier extern void	update_mtucache(uchar*, ulong);
7239a747e4fSDavid du Colombier extern ulong	restrict_mtu(uchar*, ulong);
7247dd7cddfSDavid du Colombier /*
7257dd7cddfSDavid du Colombier  * bootp.c
7267dd7cddfSDavid du Colombier  */
7277dd7cddfSDavid du Colombier extern int	bootpread(char*, ulong, int);
7287dd7cddfSDavid du Colombier 
7297dd7cddfSDavid du Colombier /*
7307dd7cddfSDavid du Colombier  *  resolving inferno/plan9 differences
7317dd7cddfSDavid du Colombier  */
7327dd7cddfSDavid du Colombier char*		commonuser(void);
7337dd7cddfSDavid du Colombier char*		commonerror(void);
7347dd7cddfSDavid du Colombier 
7357dd7cddfSDavid du Colombier /*
73680ee5cbfSDavid du Colombier  * chandial.c
73780ee5cbfSDavid du Colombier  */
73880ee5cbfSDavid du Colombier extern Chan*	chandial(char*, char*, char*, Chan**);
73980ee5cbfSDavid du Colombier 
74080ee5cbfSDavid du Colombier /*
7417dd7cddfSDavid du Colombier  *  global to all of the stack
7427dd7cddfSDavid du Colombier  */
7437dd7cddfSDavid du Colombier extern void	(*igmpreportfn)(Ipifc*, uchar*);
744