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