]> git.lizzy.rs Git - plan9front.git/blob - sys/include/ip.h
libc, seconds: new time and date apis (try 2)
[plan9front.git] / sys / include / ip.h
1 #pragma src     "/sys/src/libip"
2 #pragma lib     "libip.a"
3
4 enum 
5 {
6         IPaddrlen=      16,
7         IPv4addrlen=    4,
8         IPv4off=        12,
9         IPllen=         4,
10         IPV4HDR_LEN=    20,
11
12         /* vihl & vcf[0] values */
13         IP_VER4=        0x40,
14         IP_VER6=        0x60,
15 };
16
17 /*
18  *  for reading /net/ipifc
19  */
20 typedef struct Ipifc Ipifc;
21 typedef struct Iplifc Iplifc;
22 typedef struct Ipv6rp Ipv6rp;
23
24 /* local address */
25 struct Iplifc
26 {
27         Iplifc  *next;
28
29         /* per address on the ip interface */
30         uchar   ip[IPaddrlen];
31         uchar   mask[IPaddrlen];
32         uchar   net[IPaddrlen];         /* ip & mask */
33         ulong   preflt;                 /* preferred lifetime */
34         ulong   validlt;                /* valid lifetime */
35 };
36
37 /* default values, one per stack */
38 struct Ipv6rp
39 {
40         int     mflag;
41         int     oflag;
42         int     maxraint;
43         int     minraint;
44         int     linkmtu;
45         int     reachtime;
46         int     rxmitra;
47         int     ttl;
48         int     routerlt;       
49 };
50
51 /* actual interface */
52 struct Ipifc
53 {
54         Ipifc   *next;
55         Iplifc  *lifc;
56
57         /* per ip interface */
58         int     index;                  /* number of interface in ipifc dir */
59         char    dev[64];
60         uchar   sendra6;                /* on == send router adv */
61         uchar   recvra6;                /* on == rcv router adv */
62         int     mtu;
63         ulong   pktin;
64         ulong   pktout;
65         ulong   errin;
66         ulong   errout;
67         Ipv6rp  rp;
68 };
69
70 #define ISIPV6MCAST(addr)       ((addr)[0] == 0xff)
71 #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
72
73 /*
74  * ipv6 constants
75  * `ra' is `router advertisement', `rs' is `router solicitation'.
76  * `na' is `neighbour advertisement'.
77  */
78 enum {
79         IPV6HDR_LEN     = 40,
80
81         /* neighbour discovery option types */
82         V6nd_srclladdr  = 1,
83         V6nd_targlladdr = 2,
84         V6nd_pfxinfo    = 3,
85         V6nd_redirhdr   = 4,
86         V6nd_mtu        = 5,
87         /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */
88         V6nd_home       = 8,
89         V6nd_srcaddrs   = 9,            /* rfc3122 */
90         V6nd_ip         = 17,
91         V6nd_rdns       = 25,           /* rfc6106 */
92         V6nd_rdnssl     = 31,
93         /* plan 9 extensions */
94         V6nd_9fs        = 250,
95         V6nd_9auth      = 251,
96
97         /* Router constants (all times in ms.) */
98         Maxv6initraintvl= 16000,
99         Maxv6initras    = 3,
100         Maxv6finalras   = 3,
101         Minv6interradelay= 3000,
102         Maxv6radelay    = 500,
103
104         /* Host constants */
105         Maxv6rsdelay    = 1000,
106         V6rsintvl       = 4000,
107         Maxv6rss        = 3,
108
109         /* Node constants */
110         Maxv6mcastrss   = 3,
111         Maxv6unicastrss = 3,
112         Maxv6anycastdelay= 1000,
113         Maxv6na         = 3,
114         V6reachabletime = 30000,
115         V6retranstimer  = 1000,
116         V6initprobedelay= 5000,
117 };
118
119 /* V6 header on the wire */
120 typedef struct Ip6hdr Ip6hdr;
121 struct Ip6hdr {
122         uchar   vcf[4];         /* version:4, traffic class:8, flow label:20 */
123         uchar   ploadlen[2];    /* payload length: packet length - 40 */
124         uchar   proto;          /* next header type */
125         uchar   ttl;            /* hop limit */
126         uchar   src[IPaddrlen]; /* source address */
127         uchar   dst[IPaddrlen]; /* destination address */
128         uchar   payload[];
129 };
130
131 /*
132  *  user-level icmpv6 with control message "headers"
133  */
134 typedef struct Icmp6hdr Icmp6hdr;
135 struct Icmp6hdr {
136         uchar   _0_[8];
137         uchar   laddr[IPaddrlen];       /* local address */
138         uchar   raddr[IPaddrlen];       /* remote address */
139 };
140
141 /*
142  *  user level udp headers with control message "headers"
143  */
144 enum 
145 {
146         Udphdrsize=     52,     /* size of a Udphdr */
147 };
148
149 typedef struct Udphdr Udphdr;
150 struct Udphdr
151 {
152         uchar   raddr[IPaddrlen];       /* V6 remote address */
153         uchar   laddr[IPaddrlen];       /* V6 local address */
154         uchar   ifcaddr[IPaddrlen];     /* V6 ifc addr msg was received on */
155         uchar   rport[2];               /* remote port */
156         uchar   lport[2];               /* local port */
157 };
158
159 uchar*  defmask(uchar*);
160 void    maskip(uchar*, uchar*, uchar*);
161 int     eipfmt(Fmt*);
162 int     isv4(uchar*);
163 vlong   parseip(uchar*, char*);
164 vlong   parseipmask(uchar*, char*, int);
165 vlong   parseipandmask(uchar*, uchar*, char*, char*);
166 char*   v4parseip(uchar*, char*);
167 int     parseether(uchar*, char*);
168 int     myipaddr(uchar*, char*);
169 int     myetheraddr(uchar*, char*);
170 int     equivip4(uchar*, uchar*);
171 int     equivip6(uchar*, uchar*);
172
173 Ipifc*  readipifc(char*, Ipifc*, int);
174
175 void    hnputv(void*, uvlong);
176 void    hnputl(void*, uint);
177 void    hnputs(void*, ushort);
178 uvlong  nhgetv(void*);
179 uint    nhgetl(void*);
180 ushort  nhgets(void*);
181 ushort  ptclbsum(uchar*, int);
182
183 int     v6tov4(uchar*, uchar*);
184 void    v4tov6(uchar*, uchar*);
185
186 #define ipcmp(x, y) memcmp(x, y, IPaddrlen)
187 #define ipmove(x, y) memmove(x, y, IPaddrlen)
188
189 extern uchar IPv4bcast[IPaddrlen];
190 extern uchar IPv4bcastobs[IPaddrlen];
191 extern uchar IPv4allsys[IPaddrlen];
192 extern uchar IPv4allrouter[IPaddrlen];
193 extern uchar IPnoaddr[IPaddrlen];
194 extern uchar v4prefix[IPaddrlen];
195 extern uchar IPallbits[IPaddrlen];
196
197 #define CLASS(p) ((*(uchar*)(p))>>6)
198
199 #pragma varargck        type    "I"     uchar*
200 #pragma varargck        type    "V"     uchar*
201 #pragma varargck        type    "E"     uchar*
202 #pragma varargck        type    "M"     uchar*