blob: b6843e7062ff2365672ab8ec3331d9c3791019be [file] [log] [blame]
rscf7012582003-11-25 01:40:27 +00001#ifndef _IP_H_
2#define _IP_H_ 1
3#if defined(__cplusplus)
4extern "C" {
5#endif
rsc678ede72004-12-27 00:14:43 +00006
rsc1a0954a2005-01-04 21:18:08 +00007AUTOLIB(ip)
rsc97a5e5f2003-11-23 18:25:35 +00008/*
9#pragma src "/sys/src/libip"
10#pragma lib "libip.a"
11#pragma varargck type "I" uchar*
12#pragma varargck type "V" uchar*
13#pragma varargck type "E" uchar*
14#pragma varargck type "M" uchar*
15*/
16enum
17{
18 IPaddrlen= 16,
19 IPv4addrlen= 4,
20 IPv4off= 12,
21 IPllen= 4,
22};
23
24/*
25 * for reading /net/ipifc
26 */
27typedef struct Ipifc Ipifc;
28typedef struct Iplifc Iplifc;
29typedef struct Ipv6rp Ipv6rp;
30
31/* local address */
32struct Iplifc
33{
34 Iplifc *next;
35
36 /* per address on the ip interface */
37 uchar ip[IPaddrlen];
38 uchar mask[IPaddrlen];
39 uchar net[IPaddrlen]; /* ip & mask */
40 ulong preflt; /* preferred lifetime */
41 ulong validlt; /* valid lifetime */
42};
43
44/* default values, one per stack */
45struct Ipv6rp
46{
47 int mflag;
48 int oflag;
49 int maxraint;
50 int minraint;
51 int linkmtu;
52 int reachtime;
53 int rxmitra;
54 int ttl;
55 int routerlt;
56};
57
58/* actual interface */
59struct Ipifc
60{
61 Ipifc *next;
62 Iplifc *lifc;
63
64 /* per ip interface */
65 int index; /* number of interface in ipifc dir */
66 char dev[64];
67 uchar sendra6; /* on == send router adv */
68 uchar recvra6; /* on == rcv router adv */
69 int mtu;
70 ulong pktin;
71 ulong pktout;
72 ulong errin;
73 ulong errout;
74 Ipv6rp rp;
75};
76
77/*
78 * user level udp headers
79 */
80enum
81{
82 Udphdrsize= 36, /* size of a Udphdr */
83};
84
85typedef struct Udphdr Udphdr;
86struct Udphdr
87{
88 uchar raddr[IPaddrlen]; /* remote address and port */
89 uchar laddr[IPaddrlen]; /* local address and port */
90 uchar rport[2];
91 uchar lport[2];
92};
93
94uchar* defmask(uchar*);
95void maskip(uchar*, uchar*, uchar*);
96int eipfmt(Fmt*);
97int isv4(uchar*);
98ulong parseip(uchar*, char*);
99ulong parseipmask(uchar*, char*);
100char* v4parseip(uchar*, char*);
101char* v4parsecidr(uchar*, uchar*, char*);
102int parseether(uchar*, char*);
103int myipaddr(uchar*, char*);
104int myetheraddr(uchar*, char*);
105int equivip(uchar*, uchar*);
rsceacbfb22004-03-15 01:58:31 +0000106long udpread(int, Udphdr*, void*, long);
107long udpwrite(int, Udphdr*, void*, long);
rsc97a5e5f2003-11-23 18:25:35 +0000108
109Ipifc* readipifc(char*, Ipifc*, int);
110
rsc678ede72004-12-27 00:14:43 +0000111void hnputv(void*, uvlong);
rsc97a5e5f2003-11-23 18:25:35 +0000112void hnputl(void*, uint);
113void hnputs(void*, ushort);
114uint nhgetl(void*);
rsc678ede72004-12-27 00:14:43 +0000115uvlong nhgetv(void*);
rsc97a5e5f2003-11-23 18:25:35 +0000116ushort nhgets(void*);
117ushort ptclbsum(uchar*, int);
118
119int v6tov4(uchar*, uchar*);
120void v4tov6(uchar*, uchar*);
121
122#define ipcmp(x, y) memcmp(x, y, IPaddrlen)
123#define ipmove(x, y) memmove(x, y, IPaddrlen)
124
125extern uchar IPv4bcast[IPaddrlen];
126extern uchar IPv4bcastobs[IPaddrlen];
127extern uchar IPv4allsys[IPaddrlen];
128extern uchar IPv4allrouter[IPaddrlen];
129extern uchar IPnoaddr[IPaddrlen];
130extern uchar v4prefix[IPaddrlen];
131extern uchar IPallbits[IPaddrlen];
132
133#define CLASS(p) ((*(uchar*)(p))>>6)
134
rscf7012582003-11-25 01:40:27 +0000135#if defined(__cplusplus)
136}
137#endif
138#endif