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