blob: 658c01f91a5e694728ee8e291b0102907145d908 [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,
rsccbeb0b22006-04-01 19:24:03 +000021 IPllen= 4
rsc97a5e5f2003-11-23 18:25:35 +000022};
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];
rsc07683d02005-12-31 19:34:53 +000067 uchar ether[6];
rsc97a5e5f2003-11-23 18:25:35 +000068 uchar sendra6; /* on == send router adv */
69 uchar recvra6; /* on == rcv router adv */
70 int mtu;
71 ulong pktin;
72 ulong pktout;
73 ulong errin;
74 ulong errout;
75 Ipv6rp rp;
76};
77
78/*
79 * user level udp headers
80 */
81enum
82{
rsccbeb0b22006-04-01 19:24:03 +000083 Udphdrsize= 52 /* size of a Udphdr */
rsc97a5e5f2003-11-23 18:25:35 +000084};
85
86typedef struct Udphdr Udphdr;
87struct Udphdr
88{
89 uchar raddr[IPaddrlen]; /* remote address and port */
90 uchar laddr[IPaddrlen]; /* local address and port */
rsc07683d02005-12-31 19:34:53 +000091 uchar ifcaddr[IPaddrlen]; /* address of ifc message was received from */
rsc97a5e5f2003-11-23 18:25:35 +000092 uchar rport[2];
93 uchar lport[2];
94};
95
96uchar* defmask(uchar*);
97void maskip(uchar*, uchar*, uchar*);
98int eipfmt(Fmt*);
99int isv4(uchar*);
100ulong parseip(uchar*, char*);
101ulong parseipmask(uchar*, char*);
102char* v4parseip(uchar*, char*);
103char* v4parsecidr(uchar*, uchar*, char*);
104int parseether(uchar*, char*);
105int myipaddr(uchar*, char*);
106int myetheraddr(uchar*, char*);
107int equivip(uchar*, uchar*);
rsceacbfb22004-03-15 01:58:31 +0000108long udpread(int, Udphdr*, void*, long);
109long udpwrite(int, Udphdr*, void*, long);
rsc97a5e5f2003-11-23 18:25:35 +0000110
111Ipifc* readipifc(char*, Ipifc*, int);
rsc07683d02005-12-31 19:34:53 +0000112void freeipifc(Ipifc*);
rsc97a5e5f2003-11-23 18:25:35 +0000113
rsc678ede72004-12-27 00:14:43 +0000114void hnputv(void*, uvlong);
rsc97a5e5f2003-11-23 18:25:35 +0000115void hnputl(void*, uint);
116void hnputs(void*, ushort);
117uint nhgetl(void*);
rsc678ede72004-12-27 00:14:43 +0000118uvlong nhgetv(void*);
rsc97a5e5f2003-11-23 18:25:35 +0000119ushort nhgets(void*);
120ushort ptclbsum(uchar*, int);
121
122int v6tov4(uchar*, uchar*);
123void v4tov6(uchar*, uchar*);
124
125#define ipcmp(x, y) memcmp(x, y, IPaddrlen)
126#define ipmove(x, y) memmove(x, y, IPaddrlen)
127
128extern uchar IPv4bcast[IPaddrlen];
129extern uchar IPv4bcastobs[IPaddrlen];
130extern uchar IPv4allsys[IPaddrlen];
131extern uchar IPv4allrouter[IPaddrlen];
132extern uchar IPnoaddr[IPaddrlen];
133extern uchar v4prefix[IPaddrlen];
134extern uchar IPallbits[IPaddrlen];
135
136#define CLASS(p) ((*(uchar*)(p))>>6)
137
rscf7012582003-11-25 01:40:27 +0000138#if defined(__cplusplus)
139}
140#endif
141#endif