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