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