xref: /plan9/sys/include/ip.h (revision ea58ad6fbee60d5a3fca57ac646881779dd8f0ea)
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,
110774058cSDavid du Colombier 
120774058cSDavid du Colombier 	/* vihl & vcf[0] values */
130774058cSDavid du Colombier 	IP_VER4= 	0x40,
140774058cSDavid du Colombier 	IP_VER6=	0x60,
157dd7cddfSDavid du Colombier };
16219b2ee8SDavid du Colombier 
17219b2ee8SDavid du Colombier /*
187dd7cddfSDavid du Colombier  *  for reading /net/ipifc
197dd7cddfSDavid du Colombier  */
207dd7cddfSDavid du Colombier typedef struct Ipifc Ipifc;
219a747e4fSDavid du Colombier typedef struct Iplifc Iplifc;
229a747e4fSDavid du Colombier typedef struct Ipv6rp Ipv6rp;
237dd7cddfSDavid du Colombier 
249a747e4fSDavid du Colombier /* local address */
259a747e4fSDavid du Colombier struct Iplifc
267dd7cddfSDavid du Colombier {
279a747e4fSDavid du Colombier 	Iplifc	*next;
289a747e4fSDavid du Colombier 
299a747e4fSDavid du Colombier 	/* per address on the ip interface */
307dd7cddfSDavid du Colombier 	uchar	ip[IPaddrlen];
317dd7cddfSDavid du Colombier 	uchar	mask[IPaddrlen];
327dd7cddfSDavid du Colombier 	uchar	net[IPaddrlen];		/* ip & mask */
339a747e4fSDavid du Colombier 	ulong	preflt;			/* preferred lifetime */
349a747e4fSDavid du Colombier 	ulong	validlt;		/* valid lifetime */
359a747e4fSDavid du Colombier };
369a747e4fSDavid du Colombier 
379a747e4fSDavid du Colombier /* default values, one per stack */
389a747e4fSDavid du Colombier struct Ipv6rp
399a747e4fSDavid du Colombier {
409a747e4fSDavid du Colombier 	int	mflag;
419a747e4fSDavid du Colombier 	int	oflag;
429a747e4fSDavid du Colombier 	int 	maxraint;
439a747e4fSDavid du Colombier 	int	minraint;
449a747e4fSDavid du Colombier 	int	linkmtu;
459a747e4fSDavid du Colombier 	int	reachtime;
469a747e4fSDavid du Colombier 	int	rxmitra;
479a747e4fSDavid du Colombier 	int	ttl;
489a747e4fSDavid du Colombier 	int	routerlt;
499a747e4fSDavid du Colombier };
509a747e4fSDavid du Colombier 
519a747e4fSDavid du Colombier /* actual interface */
529a747e4fSDavid du Colombier struct Ipifc
539a747e4fSDavid du Colombier {
547dd7cddfSDavid du Colombier 	Ipifc	*next;
559a747e4fSDavid du Colombier 	Iplifc	*lifc;
569a747e4fSDavid du Colombier 
579a747e4fSDavid du Colombier 	/* per ip interface */
589a747e4fSDavid du Colombier 	int	index;			/* number of interface in ipifc dir */
599a747e4fSDavid du Colombier 	char	dev[64];
609a747e4fSDavid du Colombier 	uchar	sendra6;		/* on == send router adv */
619a747e4fSDavid du Colombier 	uchar	recvra6;		/* on == rcv router adv */
629a747e4fSDavid du Colombier 	int	mtu;
639a747e4fSDavid du Colombier 	ulong	pktin;
649a747e4fSDavid du Colombier 	ulong	pktout;
659a747e4fSDavid du Colombier 	ulong	errin;
669a747e4fSDavid du Colombier 	ulong	errout;
679a747e4fSDavid du Colombier 	Ipv6rp	rp;
687dd7cddfSDavid du Colombier };
697dd7cddfSDavid du Colombier 
705e1edbcaSDavid du Colombier #define ISIPV6MCAST(addr)	((addr)[0] == 0xff)
715e1edbcaSDavid du Colombier #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
725e1edbcaSDavid du Colombier 
735e1edbcaSDavid du Colombier /*
745e1edbcaSDavid du Colombier  * ipv6 constants
755e1edbcaSDavid du Colombier  * `ra' is `router advertisement', `rs' is `router solicitation'.
765e1edbcaSDavid du Colombier  * `na' is `neighbour advertisement'.
775e1edbcaSDavid du Colombier  */
785e1edbcaSDavid du Colombier enum {
795e1edbcaSDavid du Colombier 	IPV6HDR_LEN	= 40,
805e1edbcaSDavid du Colombier 
818c6ab946SDavid du Colombier 	/* neighbour discovery option types */
828c6ab946SDavid du Colombier 	V6nd_srclladdr	= 1,
838c6ab946SDavid du Colombier 	V6nd_targlladdr	= 2,
848c6ab946SDavid du Colombier 	V6nd_pfxinfo	= 3,
858c6ab946SDavid du Colombier 	V6nd_redirhdr	= 4,
868c6ab946SDavid du Colombier 	V6nd_mtu	= 5,
878c6ab946SDavid du Colombier 	/* new since rfc2461; see iana.org/assignments/icmpv6-parameters */
888c6ab946SDavid du Colombier 	V6nd_home	= 8,
898c6ab946SDavid du Colombier 	V6nd_srcaddrs	= 9,		/* rfc3122 */
908c6ab946SDavid du Colombier 	V6nd_ip		= 17,
918c6ab946SDavid du Colombier 	/* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */
928c6ab946SDavid du Colombier 	V6nd_rdns	= 25,
938c6ab946SDavid du Colombier 	/* plan 9 extensions */
948c6ab946SDavid du Colombier 	V6nd_9fs	= 250,
958c6ab946SDavid du Colombier 	V6nd_9auth	= 251,
965e1edbcaSDavid du Colombier 
975e1edbcaSDavid du Colombier 	/* Router constants (all times in ms.) */
985e1edbcaSDavid du Colombier 	Maxv6initraintvl= 16000,
995e1edbcaSDavid du Colombier 	Maxv6initras	= 3,
1005e1edbcaSDavid du Colombier 	Maxv6finalras	= 3,
1015e1edbcaSDavid du Colombier 	Minv6interradelay= 3000,
1025e1edbcaSDavid du Colombier 	Maxv6radelay	= 500,
1035e1edbcaSDavid du Colombier 
1045e1edbcaSDavid du Colombier 	/* Host constants */
1055e1edbcaSDavid du Colombier 	Maxv6rsdelay	= 1000,
1065e1edbcaSDavid du Colombier 	V6rsintvl	= 4000,
1075e1edbcaSDavid du Colombier 	Maxv6rss	= 3,
1085e1edbcaSDavid du Colombier 
1095e1edbcaSDavid du Colombier 	/* Node constants */
1105e1edbcaSDavid du Colombier 	Maxv6mcastrss	= 3,
1115e1edbcaSDavid du Colombier 	Maxv6unicastrss	= 3,
1125e1edbcaSDavid du Colombier 	Maxv6anycastdelay= 1000,
1135e1edbcaSDavid du Colombier 	Maxv6na		= 3,
1145e1edbcaSDavid du Colombier 	V6reachabletime	= 30000,
1155e1edbcaSDavid du Colombier 	V6retranstimer	= 1000,
1165e1edbcaSDavid du Colombier 	V6initprobedelay= 5000,
1175e1edbcaSDavid du Colombier };
1185e1edbcaSDavid du Colombier 
1195e1edbcaSDavid du Colombier /* V6 header on the wire */
1205e1edbcaSDavid du Colombier typedef struct Ip6hdr Ip6hdr;
1215e1edbcaSDavid du Colombier struct Ip6hdr {
1225e1edbcaSDavid du Colombier 	uchar	vcf[4];		/* version:4, traffic class:8, flow label:20 */
1235e1edbcaSDavid du Colombier 	uchar	ploadlen[2];	/* payload length: packet length - 40 */
1245e1edbcaSDavid du Colombier 	uchar	proto;		/* next header type */
1255e1edbcaSDavid du Colombier 	uchar	ttl;		/* hop limit */
1265e1edbcaSDavid du Colombier 	uchar	src[IPaddrlen];	/* source address */
1275e1edbcaSDavid du Colombier 	uchar	dst[IPaddrlen];	/* destination address */
12894aa1c4cSDavid du Colombier 	uchar	payload[];
1295e1edbcaSDavid du Colombier };
1305e1edbcaSDavid du Colombier 
1315e1edbcaSDavid du Colombier /*
1325e1edbcaSDavid du Colombier  *  user-level icmpv6 with control message "headers"
1335e1edbcaSDavid du Colombier  */
1345e1edbcaSDavid du Colombier typedef struct Icmp6hdr Icmp6hdr;
1355e1edbcaSDavid du Colombier struct Icmp6hdr {
1360774058cSDavid du Colombier 	uchar	_0_[8];
1375e1edbcaSDavid du Colombier 	uchar	laddr[IPaddrlen];	/* local address */
1385e1edbcaSDavid du Colombier 	uchar	raddr[IPaddrlen];	/* remote address */
1395e1edbcaSDavid du Colombier };
1405e1edbcaSDavid du Colombier 
1417dd7cddfSDavid du Colombier /*
142223a0358SDavid du Colombier  *  user level udp headers with control message "headers"
143d9dc5dd1SDavid du Colombier  */
144d9dc5dd1SDavid du Colombier enum
145d9dc5dd1SDavid du Colombier {
146d9dc5dd1SDavid du Colombier 	Udphdrsize=	52,	/* size of a Udphdr */
147d9dc5dd1SDavid du Colombier };
148d9dc5dd1SDavid du Colombier 
149d9dc5dd1SDavid du Colombier typedef struct Udphdr Udphdr;
150d9dc5dd1SDavid du Colombier struct Udphdr
151d9dc5dd1SDavid du Colombier {
152223a0358SDavid du Colombier 	uchar	raddr[IPaddrlen];	/* V6 remote address */
153223a0358SDavid du Colombier 	uchar	laddr[IPaddrlen];	/* V6 local address */
154223a0358SDavid du Colombier 	uchar	ifcaddr[IPaddrlen];	/* V6 ifc addr msg was received on */
155223a0358SDavid du Colombier 	uchar	rport[2];		/* remote port */
156d9dc5dd1SDavid du Colombier 	uchar	lport[2];		/* local port */
157d9dc5dd1SDavid du Colombier };
158d9dc5dd1SDavid du Colombier 
1597dd7cddfSDavid du Colombier uchar*	defmask(uchar*);
1607dd7cddfSDavid du Colombier void	maskip(uchar*, uchar*, uchar*);
1619a747e4fSDavid du Colombier int	eipfmt(Fmt*);
1627dd7cddfSDavid du Colombier int	isv4(uchar*);
163*ea58ad6fSDavid du Colombier vlong	parseip(uchar*, char*);
164*ea58ad6fSDavid du Colombier vlong	parseipmask(uchar*, char*);
1657dd7cddfSDavid du Colombier char*	v4parseip(uchar*, char*);
1667dd7cddfSDavid du Colombier char*	v4parsecidr(uchar*, uchar*, char*);
1677dd7cddfSDavid du Colombier int	parseether(uchar*, char*);
1687dd7cddfSDavid du Colombier int	myipaddr(uchar*, char*);
1697dd7cddfSDavid du Colombier int	myetheraddr(uchar*, char*);
1706d0d1481SDavid du Colombier int	equivip4(uchar*, uchar*);
1716d0d1481SDavid du Colombier int	equivip6(uchar*, uchar*);
1727dd7cddfSDavid du Colombier 
1739a747e4fSDavid du Colombier Ipifc*	readipifc(char*, Ipifc*, int);
1747dd7cddfSDavid du Colombier 
175375daca8SDavid du Colombier void	hnputv(void*, uvlong);
1767dd7cddfSDavid du Colombier void	hnputl(void*, uint);
1777dd7cddfSDavid du Colombier void	hnputs(void*, ushort);
178375daca8SDavid du Colombier uvlong	nhgetv(void*);
1797dd7cddfSDavid du Colombier uint	nhgetl(void*);
1807dd7cddfSDavid du Colombier ushort	nhgets(void*);
1819a747e4fSDavid du Colombier ushort	ptclbsum(uchar*, int);
1827dd7cddfSDavid du Colombier 
1837dd7cddfSDavid du Colombier int	v6tov4(uchar*, uchar*);
1847dd7cddfSDavid du Colombier void	v4tov6(uchar*, uchar*);
1857dd7cddfSDavid du Colombier 
1867dd7cddfSDavid du Colombier #define	ipcmp(x, y) memcmp(x, y, IPaddrlen)
1877dd7cddfSDavid du Colombier #define	ipmove(x, y) memmove(x, y, IPaddrlen)
1887dd7cddfSDavid du Colombier 
1897dd7cddfSDavid du Colombier extern uchar IPv4bcast[IPaddrlen];
1907dd7cddfSDavid du Colombier extern uchar IPv4bcastobs[IPaddrlen];
1917dd7cddfSDavid du Colombier extern uchar IPv4allsys[IPaddrlen];
1927dd7cddfSDavid du Colombier extern uchar IPv4allrouter[IPaddrlen];
1937dd7cddfSDavid du Colombier extern uchar IPnoaddr[IPaddrlen];
1947dd7cddfSDavid du Colombier extern uchar v4prefix[IPaddrlen];
1957dd7cddfSDavid du Colombier extern uchar IPallbits[IPaddrlen];
1967dd7cddfSDavid du Colombier 
1977dd7cddfSDavid du Colombier #define CLASS(p) ((*(uchar*)(p))>>6)
1987dd7cddfSDavid du Colombier 
1997dd7cddfSDavid du Colombier #pragma	varargck	type	"I"	uchar*
2007dd7cddfSDavid du Colombier #pragma	varargck	type	"V"	uchar*
2017dd7cddfSDavid du Colombier #pragma	varargck	type	"E"	uchar*
2027dd7cddfSDavid du Colombier #pragma	varargck	type	"M"	uchar*
203