xref: /plan9/sys/include/ip.h (revision ea58ad6fbee60d5a3fca57ac646881779dd8f0ea)
1 #pragma	src	"/sys/src/libip"
2 #pragma	lib	"libip.a"
3 
4 enum
5 {
6 	IPaddrlen=	16,
7 	IPv4addrlen=	4,
8 	IPv4off=	12,
9 	IPllen=		4,
10 	IPV4HDR_LEN=	20,
11 
12 	/* vihl & vcf[0] values */
13 	IP_VER4= 	0x40,
14 	IP_VER6=	0x60,
15 };
16 
17 /*
18  *  for reading /net/ipifc
19  */
20 typedef struct Ipifc Ipifc;
21 typedef struct Iplifc Iplifc;
22 typedef struct Ipv6rp Ipv6rp;
23 
24 /* local address */
25 struct Iplifc
26 {
27 	Iplifc	*next;
28 
29 	/* per address on the ip interface */
30 	uchar	ip[IPaddrlen];
31 	uchar	mask[IPaddrlen];
32 	uchar	net[IPaddrlen];		/* ip & mask */
33 	ulong	preflt;			/* preferred lifetime */
34 	ulong	validlt;		/* valid lifetime */
35 };
36 
37 /* default values, one per stack */
38 struct Ipv6rp
39 {
40 	int	mflag;
41 	int	oflag;
42 	int 	maxraint;
43 	int	minraint;
44 	int	linkmtu;
45 	int	reachtime;
46 	int	rxmitra;
47 	int	ttl;
48 	int	routerlt;
49 };
50 
51 /* actual interface */
52 struct Ipifc
53 {
54 	Ipifc	*next;
55 	Iplifc	*lifc;
56 
57 	/* per ip interface */
58 	int	index;			/* number of interface in ipifc dir */
59 	char	dev[64];
60 	uchar	sendra6;		/* on == send router adv */
61 	uchar	recvra6;		/* on == rcv router adv */
62 	int	mtu;
63 	ulong	pktin;
64 	ulong	pktout;
65 	ulong	errin;
66 	ulong	errout;
67 	Ipv6rp	rp;
68 };
69 
70 #define ISIPV6MCAST(addr)	((addr)[0] == 0xff)
71 #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
72 
73 /*
74  * ipv6 constants
75  * `ra' is `router advertisement', `rs' is `router solicitation'.
76  * `na' is `neighbour advertisement'.
77  */
78 enum {
79 	IPV6HDR_LEN	= 40,
80 
81 	/* neighbour discovery option types */
82 	V6nd_srclladdr	= 1,
83 	V6nd_targlladdr	= 2,
84 	V6nd_pfxinfo	= 3,
85 	V6nd_redirhdr	= 4,
86 	V6nd_mtu	= 5,
87 	/* new since rfc2461; see iana.org/assignments/icmpv6-parameters */
88 	V6nd_home	= 8,
89 	V6nd_srcaddrs	= 9,		/* rfc3122 */
90 	V6nd_ip		= 17,
91 	/* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */
92 	V6nd_rdns	= 25,
93 	/* plan 9 extensions */
94 	V6nd_9fs	= 250,
95 	V6nd_9auth	= 251,
96 
97 	/* Router constants (all times in ms.) */
98 	Maxv6initraintvl= 16000,
99 	Maxv6initras	= 3,
100 	Maxv6finalras	= 3,
101 	Minv6interradelay= 3000,
102 	Maxv6radelay	= 500,
103 
104 	/* Host constants */
105 	Maxv6rsdelay	= 1000,
106 	V6rsintvl	= 4000,
107 	Maxv6rss	= 3,
108 
109 	/* Node constants */
110 	Maxv6mcastrss	= 3,
111 	Maxv6unicastrss	= 3,
112 	Maxv6anycastdelay= 1000,
113 	Maxv6na		= 3,
114 	V6reachabletime	= 30000,
115 	V6retranstimer	= 1000,
116 	V6initprobedelay= 5000,
117 };
118 
119 /* V6 header on the wire */
120 typedef struct Ip6hdr Ip6hdr;
121 struct Ip6hdr {
122 	uchar	vcf[4];		/* version:4, traffic class:8, flow label:20 */
123 	uchar	ploadlen[2];	/* payload length: packet length - 40 */
124 	uchar	proto;		/* next header type */
125 	uchar	ttl;		/* hop limit */
126 	uchar	src[IPaddrlen];	/* source address */
127 	uchar	dst[IPaddrlen];	/* destination address */
128 	uchar	payload[];
129 };
130 
131 /*
132  *  user-level icmpv6 with control message "headers"
133  */
134 typedef struct Icmp6hdr Icmp6hdr;
135 struct Icmp6hdr {
136 	uchar	_0_[8];
137 	uchar	laddr[IPaddrlen];	/* local address */
138 	uchar	raddr[IPaddrlen];	/* remote address */
139 };
140 
141 /*
142  *  user level udp headers with control message "headers"
143  */
144 enum
145 {
146 	Udphdrsize=	52,	/* size of a Udphdr */
147 };
148 
149 typedef struct Udphdr Udphdr;
150 struct Udphdr
151 {
152 	uchar	raddr[IPaddrlen];	/* V6 remote address */
153 	uchar	laddr[IPaddrlen];	/* V6 local address */
154 	uchar	ifcaddr[IPaddrlen];	/* V6 ifc addr msg was received on */
155 	uchar	rport[2];		/* remote port */
156 	uchar	lport[2];		/* local port */
157 };
158 
159 uchar*	defmask(uchar*);
160 void	maskip(uchar*, uchar*, uchar*);
161 int	eipfmt(Fmt*);
162 int	isv4(uchar*);
163 vlong	parseip(uchar*, char*);
164 vlong	parseipmask(uchar*, char*);
165 char*	v4parseip(uchar*, char*);
166 char*	v4parsecidr(uchar*, uchar*, char*);
167 int	parseether(uchar*, char*);
168 int	myipaddr(uchar*, char*);
169 int	myetheraddr(uchar*, char*);
170 int	equivip4(uchar*, uchar*);
171 int	equivip6(uchar*, uchar*);
172 
173 Ipifc*	readipifc(char*, Ipifc*, int);
174 
175 void	hnputv(void*, uvlong);
176 void	hnputl(void*, uint);
177 void	hnputs(void*, ushort);
178 uvlong	nhgetv(void*);
179 uint	nhgetl(void*);
180 ushort	nhgets(void*);
181 ushort	ptclbsum(uchar*, int);
182 
183 int	v6tov4(uchar*, uchar*);
184 void	v4tov6(uchar*, uchar*);
185 
186 #define	ipcmp(x, y) memcmp(x, y, IPaddrlen)
187 #define	ipmove(x, y) memmove(x, y, IPaddrlen)
188 
189 extern uchar IPv4bcast[IPaddrlen];
190 extern uchar IPv4bcastobs[IPaddrlen];
191 extern uchar IPv4allsys[IPaddrlen];
192 extern uchar IPv4allrouter[IPaddrlen];
193 extern uchar IPnoaddr[IPaddrlen];
194 extern uchar v4prefix[IPaddrlen];
195 extern uchar IPallbits[IPaddrlen];
196 
197 #define CLASS(p) ((*(uchar*)(p))>>6)
198 
199 #pragma	varargck	type	"I"	uchar*
200 #pragma	varargck	type	"V"	uchar*
201 #pragma	varargck	type	"E"	uchar*
202 #pragma	varargck	type	"M"	uchar*
203