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