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