xref: /plan9/sys/include/ip.h (revision 8c6ab946b0fd181b5c33b439a0914e51c528f14f)
1219b2ee8SDavid du Colombier #pragma	src	"/sys/src/libip"
23e12c5d1SDavid du Colombier #pragma	lib	"libip.a"
33e12c5d1SDavid du Colombier 
47dd7cddfSDavid du Colombier enum
57dd7cddfSDavid du Colombier {
67dd7cddfSDavid du Colombier 	IPaddrlen=	16,
77dd7cddfSDavid du Colombier 	IPv4addrlen=	4,
87dd7cddfSDavid du Colombier 	IPv4off=	12,
97dd7cddfSDavid du Colombier 	IPllen=		4,
105e1edbcaSDavid du Colombier 	IPV4HDR_LEN=	20,
117dd7cddfSDavid du Colombier };
12219b2ee8SDavid du Colombier 
13219b2ee8SDavid du Colombier /*
147dd7cddfSDavid du Colombier  *  for reading /net/ipifc
157dd7cddfSDavid du Colombier  */
167dd7cddfSDavid du Colombier typedef struct Ipifc Ipifc;
179a747e4fSDavid du Colombier typedef struct Iplifc Iplifc;
189a747e4fSDavid du Colombier typedef struct Ipv6rp Ipv6rp;
197dd7cddfSDavid du Colombier 
209a747e4fSDavid du Colombier /* local address */
219a747e4fSDavid du Colombier struct Iplifc
227dd7cddfSDavid du Colombier {
239a747e4fSDavid du Colombier 	Iplifc	*next;
249a747e4fSDavid du Colombier 
259a747e4fSDavid du Colombier 	/* per address on the ip interface */
267dd7cddfSDavid du Colombier 	uchar	ip[IPaddrlen];
277dd7cddfSDavid du Colombier 	uchar	mask[IPaddrlen];
287dd7cddfSDavid du Colombier 	uchar	net[IPaddrlen];		/* ip & mask */
299a747e4fSDavid du Colombier 	ulong	preflt;			/* preferred lifetime */
309a747e4fSDavid du Colombier 	ulong	validlt;		/* valid lifetime */
319a747e4fSDavid du Colombier };
329a747e4fSDavid du Colombier 
339a747e4fSDavid du Colombier /* default values, one per stack */
349a747e4fSDavid du Colombier struct Ipv6rp
359a747e4fSDavid du Colombier {
369a747e4fSDavid du Colombier 	int	mflag;
379a747e4fSDavid du Colombier 	int	oflag;
389a747e4fSDavid du Colombier 	int 	maxraint;
399a747e4fSDavid du Colombier 	int	minraint;
409a747e4fSDavid du Colombier 	int	linkmtu;
419a747e4fSDavid du Colombier 	int	reachtime;
429a747e4fSDavid du Colombier 	int	rxmitra;
439a747e4fSDavid du Colombier 	int	ttl;
449a747e4fSDavid du Colombier 	int	routerlt;
459a747e4fSDavid du Colombier };
469a747e4fSDavid du Colombier 
479a747e4fSDavid du Colombier /* actual interface */
489a747e4fSDavid du Colombier struct Ipifc
499a747e4fSDavid du Colombier {
507dd7cddfSDavid du Colombier 	Ipifc	*next;
519a747e4fSDavid du Colombier 	Iplifc	*lifc;
529a747e4fSDavid du Colombier 
539a747e4fSDavid du Colombier 	/* per ip interface */
549a747e4fSDavid du Colombier 	int	index;			/* number of interface in ipifc dir */
559a747e4fSDavid du Colombier 	char	dev[64];
569a747e4fSDavid du Colombier 	uchar	sendra6;		/* on == send router adv */
579a747e4fSDavid du Colombier 	uchar	recvra6;		/* on == rcv router adv */
589a747e4fSDavid du Colombier 	int	mtu;
599a747e4fSDavid du Colombier 	ulong	pktin;
609a747e4fSDavid du Colombier 	ulong	pktout;
619a747e4fSDavid du Colombier 	ulong	errin;
629a747e4fSDavid du Colombier 	ulong	errout;
639a747e4fSDavid du Colombier 	Ipv6rp	rp;
647dd7cddfSDavid du Colombier };
657dd7cddfSDavid du Colombier 
665e1edbcaSDavid du Colombier #define ISIPV6MCAST(addr)	((addr)[0] == 0xff)
675e1edbcaSDavid du Colombier #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
685e1edbcaSDavid du Colombier 
695e1edbcaSDavid du Colombier /*
705e1edbcaSDavid du Colombier  * ipv6 constants
715e1edbcaSDavid du Colombier  * `ra' is `router advertisement', `rs' is `router solicitation'.
725e1edbcaSDavid du Colombier  * `na' is `neighbour advertisement'.
735e1edbcaSDavid du Colombier  */
745e1edbcaSDavid du Colombier enum {
755e1edbcaSDavid du Colombier 	IPV6HDR_LEN	= 40,
765e1edbcaSDavid du Colombier 
77*8c6ab946SDavid du Colombier 	/* neighbour discovery option types */
78*8c6ab946SDavid du Colombier 	V6nd_srclladdr	= 1,
79*8c6ab946SDavid du Colombier 	V6nd_targlladdr	= 2,
80*8c6ab946SDavid du Colombier 	V6nd_pfxinfo	= 3,
81*8c6ab946SDavid du Colombier 	V6nd_redirhdr	= 4,
82*8c6ab946SDavid du Colombier 	V6nd_mtu	= 5,
83*8c6ab946SDavid du Colombier 	/* new since rfc2461; see iana.org/assignments/icmpv6-parameters */
84*8c6ab946SDavid du Colombier 	V6nd_home	= 8,
85*8c6ab946SDavid du Colombier 	V6nd_srcaddrs	= 9,		/* rfc3122 */
86*8c6ab946SDavid du Colombier 	V6nd_ip		= 17,
87*8c6ab946SDavid du Colombier 	/* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */
88*8c6ab946SDavid du Colombier 	V6nd_rdns	= 25,
89*8c6ab946SDavid du Colombier 	/* plan 9 extensions */
90*8c6ab946SDavid du Colombier 	V6nd_9fs	= 250,
91*8c6ab946SDavid du Colombier 	V6nd_9auth	= 251,
925e1edbcaSDavid du Colombier 
935e1edbcaSDavid du Colombier 	/* Router constants (all times in ms.) */
945e1edbcaSDavid du Colombier 	Maxv6initraintvl= 16000,
955e1edbcaSDavid du Colombier 	Maxv6initras	= 3,
965e1edbcaSDavid du Colombier 	Maxv6finalras	= 3,
975e1edbcaSDavid du Colombier 	Minv6interradelay= 3000,
985e1edbcaSDavid du Colombier 	Maxv6radelay	= 500,
995e1edbcaSDavid du Colombier 
1005e1edbcaSDavid du Colombier 	/* Host constants */
1015e1edbcaSDavid du Colombier 	Maxv6rsdelay	= 1000,
1025e1edbcaSDavid du Colombier 	V6rsintvl	= 4000,
1035e1edbcaSDavid du Colombier 	Maxv6rss	= 3,
1045e1edbcaSDavid du Colombier 
1055e1edbcaSDavid du Colombier 	/* Node constants */
1065e1edbcaSDavid du Colombier 	Maxv6mcastrss	= 3,
1075e1edbcaSDavid du Colombier 	Maxv6unicastrss	= 3,
1085e1edbcaSDavid du Colombier 	Maxv6anycastdelay= 1000,
1095e1edbcaSDavid du Colombier 	Maxv6na		= 3,
1105e1edbcaSDavid du Colombier 	V6reachabletime	= 30000,
1115e1edbcaSDavid du Colombier 	V6retranstimer	= 1000,
1125e1edbcaSDavid du Colombier 	V6initprobedelay= 5000,
1135e1edbcaSDavid du Colombier };
1145e1edbcaSDavid du Colombier 
1155e1edbcaSDavid du Colombier /* V6 header on the wire */
1165e1edbcaSDavid du Colombier typedef struct Ip6hdr Ip6hdr;
1175e1edbcaSDavid du Colombier struct Ip6hdr {
1185e1edbcaSDavid du Colombier 	uchar	vcf[4];		/* version:4, traffic class:8, flow label:20 */
1195e1edbcaSDavid du Colombier 	uchar	ploadlen[2];	/* payload length: packet length - 40 */
1205e1edbcaSDavid du Colombier 	uchar	proto;		/* next header type */
1215e1edbcaSDavid du Colombier 	uchar	ttl;		/* hop limit */
1225e1edbcaSDavid du Colombier 	uchar	src[IPaddrlen];	/* source address */
1235e1edbcaSDavid du Colombier 	uchar	dst[IPaddrlen];	/* destination address */
1245e1edbcaSDavid du Colombier };
1255e1edbcaSDavid du Colombier 
1265e1edbcaSDavid du Colombier /*
1275e1edbcaSDavid du Colombier  *  user-level icmpv6 with control message "headers"
1285e1edbcaSDavid du Colombier  */
1295e1edbcaSDavid du Colombier typedef struct Icmp6hdr Icmp6hdr;
1305e1edbcaSDavid du Colombier struct Icmp6hdr {
1315e1edbcaSDavid du Colombier 	uchar	unused[8];
1325e1edbcaSDavid du Colombier 	uchar	laddr[IPaddrlen];	/* local address */
1335e1edbcaSDavid du Colombier 	uchar	raddr[IPaddrlen];	/* remote address */
1345e1edbcaSDavid du Colombier };
1355e1edbcaSDavid du Colombier 
1367dd7cddfSDavid du Colombier /*
137223a0358SDavid du Colombier  *  user level udp headers with control message "headers"
138d9dc5dd1SDavid du Colombier  */
139d9dc5dd1SDavid du Colombier enum
140d9dc5dd1SDavid du Colombier {
141d9dc5dd1SDavid du Colombier 	Udphdrsize=	52,	/* size of a Udphdr */
142d9dc5dd1SDavid du Colombier };
143d9dc5dd1SDavid du Colombier 
144d9dc5dd1SDavid du Colombier typedef struct Udphdr Udphdr;
145d9dc5dd1SDavid du Colombier struct Udphdr
146d9dc5dd1SDavid du Colombier {
147223a0358SDavid du Colombier 	uchar	raddr[IPaddrlen];	/* V6 remote address */
148223a0358SDavid du Colombier 	uchar	laddr[IPaddrlen];	/* V6 local address */
149223a0358SDavid du Colombier 	uchar	ifcaddr[IPaddrlen];	/* V6 ifc addr msg was received on */
150223a0358SDavid du Colombier 	uchar	rport[2];		/* remote port */
151d9dc5dd1SDavid du Colombier 	uchar	lport[2];		/* local port */
152d9dc5dd1SDavid du Colombier };
153d9dc5dd1SDavid du Colombier 
1547dd7cddfSDavid du Colombier uchar*	defmask(uchar*);
1557dd7cddfSDavid du Colombier void	maskip(uchar*, uchar*, uchar*);
1569a747e4fSDavid du Colombier int	eipfmt(Fmt*);
1577dd7cddfSDavid du Colombier int	isv4(uchar*);
1587dd7cddfSDavid du Colombier ulong	parseip(uchar*, char*);
1597dd7cddfSDavid du Colombier ulong	parseipmask(uchar*, char*);
1607dd7cddfSDavid du Colombier char*	v4parseip(uchar*, char*);
1617dd7cddfSDavid du Colombier char*	v4parsecidr(uchar*, uchar*, char*);
1627dd7cddfSDavid du Colombier int	parseether(uchar*, char*);
1637dd7cddfSDavid du Colombier int	myipaddr(uchar*, char*);
1647dd7cddfSDavid du Colombier int	myetheraddr(uchar*, char*);
1656d0d1481SDavid du Colombier int	equivip4(uchar*, uchar*);
1666d0d1481SDavid du Colombier int	equivip6(uchar*, uchar*);
1677dd7cddfSDavid du Colombier 
1689a747e4fSDavid du Colombier Ipifc*	readipifc(char*, Ipifc*, int);
1697dd7cddfSDavid du Colombier 
170375daca8SDavid du Colombier void	hnputv(void*, uvlong);
1717dd7cddfSDavid du Colombier void	hnputl(void*, uint);
1727dd7cddfSDavid du Colombier void	hnputs(void*, ushort);
173375daca8SDavid du Colombier uvlong	nhgetv(void*);
1747dd7cddfSDavid du Colombier uint	nhgetl(void*);
1757dd7cddfSDavid du Colombier ushort	nhgets(void*);
1769a747e4fSDavid du Colombier ushort	ptclbsum(uchar*, int);
1777dd7cddfSDavid du Colombier 
1787dd7cddfSDavid du Colombier int	v6tov4(uchar*, uchar*);
1797dd7cddfSDavid du Colombier void	v4tov6(uchar*, uchar*);
1807dd7cddfSDavid du Colombier 
1817dd7cddfSDavid du Colombier #define	ipcmp(x, y) memcmp(x, y, IPaddrlen)
1827dd7cddfSDavid du Colombier #define	ipmove(x, y) memmove(x, y, IPaddrlen)
1837dd7cddfSDavid du Colombier 
1847dd7cddfSDavid du Colombier extern uchar IPv4bcast[IPaddrlen];
1857dd7cddfSDavid du Colombier extern uchar IPv4bcastobs[IPaddrlen];
1867dd7cddfSDavid du Colombier extern uchar IPv4allsys[IPaddrlen];
1877dd7cddfSDavid du Colombier extern uchar IPv4allrouter[IPaddrlen];
1887dd7cddfSDavid du Colombier extern uchar IPnoaddr[IPaddrlen];
1897dd7cddfSDavid du Colombier extern uchar v4prefix[IPaddrlen];
1907dd7cddfSDavid du Colombier extern uchar IPallbits[IPaddrlen];
1917dd7cddfSDavid du Colombier 
1927dd7cddfSDavid du Colombier #define CLASS(p) ((*(uchar*)(p))>>6)
1937dd7cddfSDavid du Colombier 
1947dd7cddfSDavid du Colombier #pragma	varargck	type	"I"	uchar*
1957dd7cddfSDavid du Colombier #pragma	varargck	type	"V"	uchar*
1967dd7cddfSDavid du Colombier #pragma	varargck	type	"E"	uchar*
1977dd7cddfSDavid du Colombier #pragma	varargck	type	"M"	uchar*
198