Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
	/* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */
92
	V6nd_rdns	= 25,
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*);
165
char*	v4parseip(uchar*, char*);
166
char*	v4parsecidr(uchar*, 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*