xref: /plan9/sys/src/cmd/ip/ipconfig/ipconfig.h (revision 3de6a9c0b3d5cf34fc4090d0bf1930d83799a7fd)
1e47528f3SDavid du Colombier typedef struct Conf Conf;
2e47528f3SDavid du Colombier typedef struct Ctl Ctl;
3e47528f3SDavid du Colombier 
4e47528f3SDavid du Colombier struct Conf
5e47528f3SDavid du Colombier {
6e47528f3SDavid du Colombier 	/* locally generated */
7e47528f3SDavid du Colombier 	char	*type;
8e47528f3SDavid du Colombier 	char	*dev;
9e47528f3SDavid du Colombier 	char	mpoint[32];
10e47528f3SDavid du Colombier 	int	cfd;			/* ifc control channel */
11e47528f3SDavid du Colombier 	int	dfd;			/* ifc data channel (for ppp) */
12e47528f3SDavid du Colombier 	char	*cputype;
13e47528f3SDavid du Colombier 	uchar	hwa[32];		/* hardware address */
14e47528f3SDavid du Colombier 	int	hwatype;
15e47528f3SDavid du Colombier 	int	hwalen;
16e47528f3SDavid du Colombier 	uchar	cid[32];
17e47528f3SDavid du Colombier 	int	cidlen;
18e47528f3SDavid du Colombier 	char	*baud;
19e47528f3SDavid du Colombier 
20e47528f3SDavid du Colombier 	/* learned info */
21e47528f3SDavid du Colombier 	uchar	gaddr[IPaddrlen];
22e47528f3SDavid du Colombier 	uchar	laddr[IPaddrlen];
23e47528f3SDavid du Colombier 	uchar	mask[IPaddrlen];
24e47528f3SDavid du Colombier 	uchar	raddr[IPaddrlen];
25e47528f3SDavid du Colombier 	uchar	dns[2*IPaddrlen];
26e47528f3SDavid du Colombier 	uchar	fs[2*IPaddrlen];
27e47528f3SDavid du Colombier 	uchar	auth[2*IPaddrlen];
28e47528f3SDavid du Colombier 	uchar	ntp[IPaddrlen];
29e47528f3SDavid du Colombier 	int	mtu;
30e47528f3SDavid du Colombier 
31e47528f3SDavid du Colombier 	/* dhcp specific */
32e47528f3SDavid du Colombier 	int	state;
33e47528f3SDavid du Colombier 	int	fd;
34e47528f3SDavid du Colombier 	ulong	xid;
35e47528f3SDavid du Colombier 	ulong	starttime;
36e47528f3SDavid du Colombier 	char	sname[64];
37e47528f3SDavid du Colombier 	char	hostname[32];
38e47528f3SDavid du Colombier 	char	domainname[64];
39e47528f3SDavid du Colombier 	uchar	server[IPaddrlen];	/* server IP address */
40e47528f3SDavid du Colombier 	ulong	offered;		/* offered lease time */
41e47528f3SDavid du Colombier 	ulong	lease;			/* lease time */
42e47528f3SDavid du Colombier 	ulong	resend;			/* # of resends for current state */
43e47528f3SDavid du Colombier 	ulong	timeout;		/* time to timeout - seconds */
44e47528f3SDavid du Colombier 
45e47528f3SDavid du Colombier 	/*
46e47528f3SDavid du Colombier 	 * IPv6
47e47528f3SDavid du Colombier 	 */
48e47528f3SDavid du Colombier 
49e47528f3SDavid du Colombier 	/* solicitation specific - XXX add support for IPv6 leases */
50ccaac148SDavid du Colombier //	ulong	solicit_retries;
51e47528f3SDavid du Colombier 
52ccaac148SDavid du Colombier 	/* router-advertisement related */
53e47528f3SDavid du Colombier 	uchar	sendra;
54e47528f3SDavid du Colombier 	uchar	recvra;
55e47528f3SDavid du Colombier 	uchar	mflag;
56e47528f3SDavid du Colombier 	uchar	oflag;
57e47528f3SDavid du Colombier 	int 	maxraint; /* rfc2461, p.39: 4sec ≤ maxraint ≤ 1800sec, def 600 */
58e47528f3SDavid du Colombier 	int	minraint;	/* 3sec ≤ minraint ≤ 0.75*maxraint */
59e47528f3SDavid du Colombier 	int	linkmtu;
60e47528f3SDavid du Colombier 	int	reachtime;	/* 3,600,000 msec, default 0 */
61e47528f3SDavid du Colombier 	int	rxmitra;	/* default 0 */
62e47528f3SDavid du Colombier 	int	ttl;		/* default 0 (unspecified) */
63ccaac148SDavid du Colombier 	/* default gateway params */
64e47528f3SDavid du Colombier 	uchar	v6gaddr[IPaddrlen];
65e47528f3SDavid du Colombier 	int	routerlt;	/* router life time */
66e47528f3SDavid du Colombier 
67e47528f3SDavid du Colombier 	/* prefix related */
68e47528f3SDavid du Colombier 	uchar	v6pref[IPaddrlen];
69e47528f3SDavid du Colombier 	int	prefixlen;
70ccaac148SDavid du Colombier 	uchar	onlink;		/* flag: address is `on-link' */
71ccaac148SDavid du Colombier 	uchar	autoflag;	/* flag: autonomous */
72ccaac148SDavid du Colombier 	ulong	validlt;	/* valid lifetime (seconds) */
73ccaac148SDavid du Colombier 	ulong	preflt;		/* preferred lifetime (seconds) */
74e47528f3SDavid du Colombier };
75e47528f3SDavid du Colombier 
76e47528f3SDavid du Colombier struct Ctl
77e47528f3SDavid du Colombier {
78e47528f3SDavid du Colombier 	Ctl	*next;
79e47528f3SDavid du Colombier 	char	*ctl;
80e47528f3SDavid du Colombier };
81e47528f3SDavid du Colombier 
82e47528f3SDavid du Colombier extern Ctl *firstctl, **ctll;
83e47528f3SDavid du Colombier 
84e47528f3SDavid du Colombier extern Conf conf;
85e47528f3SDavid du Colombier 
86e47528f3SDavid du Colombier extern int	noconfig;
87e47528f3SDavid du Colombier extern int	ipv6auto;
88e47528f3SDavid du Colombier extern int	debug;
89e47528f3SDavid du Colombier extern int	dodhcp;
908c6ab946SDavid du Colombier extern int	dolog;
91e47528f3SDavid du Colombier extern int	nip;
92e47528f3SDavid du Colombier extern int	plan9;
93e47528f3SDavid du Colombier extern int	dupl_disc;
94e47528f3SDavid du Colombier 
95e47528f3SDavid du Colombier extern int	myifc;
96e47528f3SDavid du Colombier extern char	*vs;
97e47528f3SDavid du Colombier 
98e47528f3SDavid du Colombier void	adddefroute(char*, uchar*);
99e47528f3SDavid du Colombier void	binddevice(void);
100e47528f3SDavid du Colombier void	bootprequest(void);
101e47528f3SDavid du Colombier void	controldevice(void);
102e47528f3SDavid du Colombier void	dhcpquery(int, int);
103e47528f3SDavid du Colombier void	dhcprecv(void);
104e47528f3SDavid du Colombier void	dhcpsend(int);
105e47528f3SDavid du Colombier int	dhcptimer(void);
106e47528f3SDavid du Colombier void	dhcpwatch(int);
107e47528f3SDavid du Colombier void	doadd(int);
108e47528f3SDavid du Colombier void	doremove(void);
109e47528f3SDavid du Colombier void	dounbind(void);
110e47528f3SDavid du Colombier int	getndb(void);
111e47528f3SDavid du Colombier int	ipconfig4(void);
112e47528f3SDavid du Colombier int	ipconfig6(int);
113*0a84db5eSDavid du Colombier long	jitter(void);
114e47528f3SDavid du Colombier void	lookforip(char*);
115e47528f3SDavid du Colombier void	mkclientid(void);
116e47528f3SDavid du Colombier int	nipifcs(char*);
117e47528f3SDavid du Colombier int	openlisten(void);
118e47528f3SDavid du Colombier uchar	*optaddaddr(uchar*, int, uchar*);
119e47528f3SDavid du Colombier uchar	*optaddbyte(uchar*, int, int);
120e47528f3SDavid du Colombier uchar	*optaddstr(uchar*, int, char*);
121e47528f3SDavid du Colombier uchar	*optadd(uchar*, int, void*, int);
122e47528f3SDavid du Colombier uchar	*optaddulong(uchar*, int, ulong);
123e47528f3SDavid du Colombier uchar	*optaddvec(uchar*, int, uchar*, int);
124e47528f3SDavid du Colombier int	optgetaddrs(uchar*, int, uchar*, int);
125e47528f3SDavid du Colombier int	optgetaddr(uchar*, int, uchar*);
126e47528f3SDavid du Colombier int	optgetbyte(uchar*, int);
127e47528f3SDavid du Colombier int	optgetstr(uchar*, int, char*, int);
128e47528f3SDavid du Colombier uchar	*optget(uchar*, int, int*);
129e47528f3SDavid du Colombier ulong	optgetulong(uchar*, int);
130e47528f3SDavid du Colombier int	optgetvec(uchar*, int, uchar*, int);
131e47528f3SDavid du Colombier int	parseoptions(uchar *p, int n);
132e47528f3SDavid du Colombier int	parseverb(char*);
133e47528f3SDavid du Colombier void	procsetname(char *fmt, ...);
134e47528f3SDavid du Colombier void	putndb(void);
135*0a84db5eSDavid du Colombier ulong	randint(ulong low, ulong hi);
136e47528f3SDavid du Colombier void	tweakservers(void);
137e47528f3SDavid du Colombier void	usage(void);
138e47528f3SDavid du Colombier int	validip(uchar*);
1398c6ab946SDavid du Colombier void	warning(char *fmt, ...);
140e47528f3SDavid du Colombier void	writendb(char*, int, int);
141e47528f3SDavid du Colombier 
142e47528f3SDavid du Colombier /*
143e47528f3SDavid du Colombier  * IPv6
144e47528f3SDavid du Colombier  */
145e47528f3SDavid du Colombier 
146ccaac148SDavid du Colombier void	doipv6(int);
147e47528f3SDavid du Colombier int	ipconfig6(int);
148e47528f3SDavid du Colombier void	recvra6(void);
149e47528f3SDavid du Colombier void	sendra6(void);
150ccaac148SDavid du Colombier void	v6paraminit(Conf *);
151e47528f3SDavid du Colombier 
152e47528f3SDavid du Colombier typedef struct Headers Headers;
153e47528f3SDavid du Colombier typedef struct Ip4hdr  Ip4hdr;
154e47528f3SDavid du Colombier typedef struct Lladdropt Lladdropt;
155e47528f3SDavid du Colombier typedef struct Mtuopt Mtuopt;
156e47528f3SDavid du Colombier typedef struct Prefixopt Prefixopt;
157e47528f3SDavid du Colombier typedef struct Routeradv Routeradv;
158e47528f3SDavid du Colombier typedef struct Routersol Routersol;
159e47528f3SDavid du Colombier 
160e47528f3SDavid du Colombier enum {
161e47528f3SDavid du Colombier 	IsRouter 	= 1,
162e47528f3SDavid du Colombier 	IsHostRecv	= 2,
163e47528f3SDavid du Colombier 	IsHostNoRecv	= 3,
164e47528f3SDavid du Colombier 
165e47528f3SDavid du Colombier 	MAClen		= 6,
166e47528f3SDavid du Colombier 
167e47528f3SDavid du Colombier 	IPv4		= 4,
168e47528f3SDavid du Colombier 	IPv6		= 6,
169e47528f3SDavid du Colombier 	Defmtu		= 1400,
170e47528f3SDavid du Colombier 
171e47528f3SDavid du Colombier 	IP_HOPBYHOP	= 0,
172e47528f3SDavid du Colombier 	ICMPv4		= 1,
173e47528f3SDavid du Colombier 	IP_IGMPPROTO	= 2,
174e47528f3SDavid du Colombier 	IP_TCPPROTO	= 6,
175e47528f3SDavid du Colombier 	IP_UDPPROTO	= 17,
176e47528f3SDavid du Colombier 	IP_ILPROTO	= 40,
177e47528f3SDavid du Colombier 	IP_v6ROUTE	= 43,
178e47528f3SDavid du Colombier 	IP_v6FRAG	= 44,
179e47528f3SDavid du Colombier 	IP_IPsecESP	= 50,
180e47528f3SDavid du Colombier 	IP_IPsecAH	= 51,
181e47528f3SDavid du Colombier 	IP_v6NOMORE	= 59,
182e47528f3SDavid du Colombier 	ICMP6_RS	= 133,
183e47528f3SDavid du Colombier 	ICMP6_RA	= 134,
184e47528f3SDavid du Colombier 
185e47528f3SDavid du Colombier 	IP_IN_IP	= 41,
186e47528f3SDavid du Colombier };
187e47528f3SDavid du Colombier 
188e47528f3SDavid du Colombier enum {
189e47528f3SDavid du Colombier 	MFMASK = 1 << 7,
190e47528f3SDavid du Colombier 	OCMASK = 1 << 6,
191e47528f3SDavid du Colombier 	OLMASK = 1 << 7,
192e47528f3SDavid du Colombier 	AFMASK = 1 << 6,
193e47528f3SDavid du Colombier };
194e47528f3SDavid du Colombier 
195e47528f3SDavid du Colombier enum {
196e47528f3SDavid du Colombier 	MAXTTL		= 255,
197e47528f3SDavid du Colombier 	D64HLEN		= IPV6HDR_LEN - IPV4HDR_LEN,
198e47528f3SDavid du Colombier 	IP_MAX		= 32*1024,
199e47528f3SDavid du Colombier };
200e47528f3SDavid du Colombier 
201e47528f3SDavid du Colombier struct Headers {
202e47528f3SDavid du Colombier 	uchar	dst[IPaddrlen];
203e47528f3SDavid du Colombier 	uchar	src[IPaddrlen];
204e47528f3SDavid du Colombier };
205e47528f3SDavid du Colombier 
206e47528f3SDavid du Colombier struct Routersol {
207e47528f3SDavid du Colombier 	uchar	vcf[4];		/* version:4, traffic class:8, flow label:20 */
208e47528f3SDavid du Colombier 	uchar	ploadlen[2];	/* payload length: packet length - 40 */
209e47528f3SDavid du Colombier 	uchar	proto;		/* next header	type */
210e47528f3SDavid du Colombier 	uchar	ttl;		/* hop limit */
211e47528f3SDavid du Colombier 	uchar	src[IPaddrlen];
212e47528f3SDavid du Colombier 	uchar	dst[IPaddrlen];
213e47528f3SDavid du Colombier 	uchar	type;
214e47528f3SDavid du Colombier 	uchar	code;
215e47528f3SDavid du Colombier 	uchar	cksum[2];
216e47528f3SDavid du Colombier 	uchar	res[4];
217e47528f3SDavid du Colombier };
218e47528f3SDavid du Colombier 
219e47528f3SDavid du Colombier struct Routeradv {
220e47528f3SDavid du Colombier 	uchar	vcf[4];		/* version:4, traffic class:8, flow label:20 */
221e47528f3SDavid du Colombier 	uchar	ploadlen[2];	/* payload length: packet length - 40 */
222e47528f3SDavid du Colombier 	uchar	proto;		/* next header	type */
223e47528f3SDavid du Colombier 	uchar	ttl;		/* hop limit */
224e47528f3SDavid du Colombier 	uchar	src[IPaddrlen];
225e47528f3SDavid du Colombier 	uchar	dst[IPaddrlen];
226e47528f3SDavid du Colombier 	uchar	type;
227e47528f3SDavid du Colombier 	uchar	code;
228e47528f3SDavid du Colombier 	uchar	cksum[2];
229e47528f3SDavid du Colombier 	uchar	cttl;
230e47528f3SDavid du Colombier 	uchar	mor;
231e47528f3SDavid du Colombier 	uchar	routerlt[2];
232e47528f3SDavid du Colombier 	uchar	rchbltime[4];
233e47528f3SDavid du Colombier 	uchar	rxmtimer[4];
234e47528f3SDavid du Colombier };
235e47528f3SDavid du Colombier 
236e47528f3SDavid du Colombier struct Lladdropt {
237e47528f3SDavid du Colombier 	uchar	type;
238e47528f3SDavid du Colombier 	uchar	len;
239e47528f3SDavid du Colombier 	uchar	lladdr[MAClen];
240e47528f3SDavid du Colombier };
241e47528f3SDavid du Colombier 
242e47528f3SDavid du Colombier struct Prefixopt {
243e47528f3SDavid du Colombier 	uchar	type;
244e47528f3SDavid du Colombier 	uchar	len;
245e47528f3SDavid du Colombier 	uchar	plen;
246e47528f3SDavid du Colombier 	uchar	lar;
247e47528f3SDavid du Colombier 	uchar	validlt[4];
248e47528f3SDavid du Colombier 	uchar	preflt[4];
249e47528f3SDavid du Colombier 	uchar	reserv[4];
250e47528f3SDavid du Colombier 	uchar	pref[IPaddrlen];
251e47528f3SDavid du Colombier };
252e47528f3SDavid du Colombier 
253e47528f3SDavid du Colombier struct Mtuopt {
254e47528f3SDavid du Colombier 	uchar	type;
255e47528f3SDavid du Colombier 	uchar	len;
256e47528f3SDavid du Colombier 	uchar	reserv[2];
257e47528f3SDavid du Colombier 	uchar	mtu[4];
258e47528f3SDavid du Colombier };
259e47528f3SDavid du Colombier 
260e47528f3SDavid du Colombier void	ea2lla(uchar *lla, uchar *ea);
261e47528f3SDavid du Colombier void	ipv62smcast(uchar *smcast, uchar *a);
262