Add parlib/common.h
[akaros.git] / user / iplib / include / iplib.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 #ifndef IPLIB_IPLIB_H
10 #define IPLIB_IPLIB_H
11
12 #include <parlib/common.h>
13
14 __BEGIN_DECLS
15
16 enum 
17 {
18         IPaddrlen=      16,
19         IPv4addrlen=    4,
20         IPv4off=        12,
21         IPllen=         4,
22         IPV4HDR_LEN=    20,
23
24         /* vihl & vcf[0] values */
25         IP_VER4=        0x40,
26         IP_VER6=        0x60,
27         NETPATHLEN=     40,
28 };
29
30 /*
31  *  for reading /net/ipifc
32  */
33
34 /* local address */
35 struct iplifc
36 {
37         struct iplifc   *next;
38
39         /* per address on the ip interface */
40         uint8_t ip[IPaddrlen];
41         uint8_t mask[IPaddrlen];
42         uint8_t net[IPaddrlen];         /* ip & mask */
43         uint32_t        preflt;                 /* preferred lifetime */
44         uint32_t        validlt;                /* valid lifetime */
45 };
46
47 /* default values, one per stack */
48 struct ipv6rp
49 {
50         int     mflag;
51         int     oflag;
52         int     maxraint;
53         int     minraint;
54         int     linkmtu;
55         int     reachtime;
56         int     rxmitra;
57         int     ttl;
58         int     routerlt;       
59 };
60
61 /* actual interface */
62 struct ipifc
63 {
64         struct ipifc    *next;
65         struct iplifc   *lifc;
66
67         /* per ip interface */
68         int     index;                  /* number of interface in ipifc dir */
69         char    dev[64];
70         uint8_t sendra6;                /* on == send router adv */
71         uint8_t recvra6;                /* on == rcv router adv */
72         int     mtu;
73         uint32_t        pktin;
74         uint32_t        pktout;
75         uint32_t        errin;
76         uint32_t        errout;
77         struct ipv6rp   rp;
78 };
79
80 #define ISIPV6MCAST(addr)       ((addr)[0] == 0xff)
81 #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
82
83 /*
84  * ipv6 constants
85  * `ra' is `router advertisement', `rs' is `router solicitation'.
86  * `na' is `neighbour advertisement'.
87  */
88 enum {
89         IPV6HDR_LEN     = 40,
90
91         /* neighbour discovery option types */
92         V6nd_srclladdr  = 1,
93         V6nd_targlladdr = 2,
94         V6nd_pfxinfo    = 3,
95         V6nd_redirhdr   = 4,
96         V6nd_mtu        = 5,
97         /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */
98         V6nd_home       = 8,
99         V6nd_srcaddrs   = 9,            /* rfc3122 */
100         V6nd_ip         = 17,
101         /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */
102         V6nd_rdns       = 25,
103         /* plan 9 extensions */
104         V6nd_9fs        = 250,
105         V6nd_9auth      = 251,
106
107         /* Router constants (all times in ms.) */
108         Maxv6initraintvl= 16000,
109         Maxv6initras    = 3,
110         Maxv6finalras   = 3,
111         Minv6interradelay= 3000,
112         Maxv6radelay    = 500,
113
114         /* Host constants */
115         Maxv6rsdelay    = 1000,
116         V6rsintvl       = 4000,
117         Maxv6rss        = 3,
118
119         /* Node constants */
120         Maxv6mcastrss   = 3,
121         Maxv6unicastrss = 3,
122         Maxv6anycastdelay= 1000,
123         Maxv6na         = 3,
124         V6reachabletime = 30000,
125         V6retranstimer  = 1000,
126         V6initprobedelay= 5000,
127 };
128
129 # if 0
130 /* in icmp.h? */
131 struct ip4hdr
132 {
133         uint8_t vihl;           /* Version and header length */
134         uint8_t tos;            /* Type of service */
135         uint8_t length[2];      /* packet length */
136         uint8_t id[2];          /* ip->identification */
137         uint8_t frag[2];        /* Fragment information */
138         uint8_t ttl;            /* Time to live */
139         uint8_t proto;          /* Protocol */
140         uint8_t cksum[2];       /* Header checksum */
141         uint8_t src[4];         /* IP source */
142         uint8_t dst[4];         /* IP destination */
143 };
144 #endif
145
146 /* V6 header on the wire */
147
148 struct ip6hdr {
149         uint8_t vcf[4];         /* version:4, traffic class:8, flow label:20 */
150         uint8_t ploadlen[2];    /* payload length: packet length - 40 */
151         uint8_t proto;          /* next header type */
152         uint8_t ttl;            /* hop limit */
153         uint8_t src[IPaddrlen]; /* source address */
154         uint8_t dst[IPaddrlen]; /* destination address */
155         uint8_t payload[];
156 };
157
158 /*
159  *  user-level icmpv6 with control message "headers"
160  */
161
162 struct icmp6hdr {
163         uint8_t _0_[8];
164         uint8_t laddr[IPaddrlen];       /* local address */
165         uint8_t raddr[IPaddrlen];       /* remote address */
166 };
167
168 /*
169  *  user level udp headers with control message "headers"
170  */
171 enum 
172 {
173         Udphdrsize=     52,     /* size of a Udphdr */
174 };
175
176 struct udphdr
177 {
178         uint8_t raddr[IPaddrlen];       /* V6 remote address */
179         uint8_t laddr[IPaddrlen];       /* V6 local address */
180         uint8_t ifcaddr[IPaddrlen];     /* V6 ifc addr msg was received on */
181         uint8_t rport[2];               /* remote port */
182         uint8_t lport[2];               /* local port */
183 };
184
185 uint8_t*        defmask(uint8_t*);
186 void    maskip(uint8_t*, uint8_t*, uint8_t*);
187 //int   eipfmt(Fmt*);
188 int     isv4(uint8_t*);
189 int64_t parseip(uint8_t*, char*);
190 int64_t parseipmask(uint8_t*, char*);
191 char*   v4parseip(uint8_t*, char*);
192 char*   v4parsecidr(uint8_t*, uint8_t*, char*);
193 int     parseether(uint8_t*, char*);
194 int     myipaddr(uint8_t*, char*);
195 int     myetheraddr(uint8_t*, char*);
196 int     equivip4(uint8_t*, uint8_t*);
197 int     equivip6(uint8_t*, uint8_t*);
198
199 struct ipifc*   readipifc(char*, struct ipifc*, int);
200
201 void    hnputv(void*, uint64_t);
202 void    hnputl(void*, unsigned int);
203 void    hnputs(void*, uint16_t);
204 uint64_t        nhgetv(void*);
205 unsigned int    nhgetl(void*);
206 uint16_t        nhgets(void*);
207 uint16_t        ptclbsum(uint8_t*, int);
208
209 int     v6tov4(uint8_t*, uint8_t*);
210 void    v4tov6(uint8_t*, uint8_t*);
211
212 #define ipcmp(x, y) memcmp(x, y, IPaddrlen)
213 #define ipmove(x, y) memmove(x, y, IPaddrlen)
214
215 extern uint8_t IPv4bcast[IPaddrlen];
216 extern uint8_t IPv4bcastobs[IPaddrlen];
217 extern uint8_t IPv4allsys[IPaddrlen];
218 extern uint8_t IPv4allrouter[IPaddrlen];
219 extern uint8_t IPnoaddr[IPaddrlen];
220 extern uint8_t v4prefix[IPaddrlen];
221 extern uint8_t IPallbits[IPaddrlen];
222
223 #define CLASS(p) ((*(uint8_t*)(p))>>6)
224
225 int tokenize(char *s, char **args, int maxargs);
226 int getfields(char *str, char **args, int max, int mflag, char *unused_set);
227 char *netmkaddr(char *linear, char *defnet, char *defsrv);
228 int dial9(char *dest, char *local, char *dir, int *cfdp, int flags);
229 int announce9(char *addr, char *dir, int flags);
230 int listen9(char *dir, char *newdir, int flags);
231 int accept9(int ctl, char *dir);
232 int reject9(int ctl, char *dir, char *cause);
233
234 __END_DECLS
235
236 #endif /* IPLIB_IPLIB_H */