211 lines · 4.7 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #pragma	src	"/sys/src/libip"#pragma	lib	"libip.a" enum {	IPaddrlen=	16,	IPv4addrlen=	4,	IPv4off=	12,	IPllen=		4,	IPV4HDR_LEN=	20, 	/* vihl & vcf[0] values */	IP_VER4= 	0x40,	IP_VER6=	0x60,}; /* *  for reading /net/ipifc */typedef struct Ipifc Ipifc;typedef struct Iplifc Iplifc;typedef struct Ipv6rp Ipv6rp; /* local address */struct Iplifc{	Iplifc	*next; 	/* per address on the ip interface */	uchar	ip[IPaddrlen];	uchar	mask[IPaddrlen];	uchar	net[IPaddrlen];		/* ip & mask */	ulong	preflt;			/* preferred lifetime */	ulong	validlt;		/* valid lifetime */}; /* default values, one per stack */struct Ipv6rp{	int	mflag;	int	oflag;	int 	maxraint;	int	minraint;	int	linkmtu;	int	reachtime;	int	rxmitra;	int	ttl;	int	routerlt;	}; /* actual interface */struct Ipifc{	Ipifc	*next;	Iplifc	*lifc; 	/* per ip interface */	int	index;			/* number of interface in ipifc dir */	char	dev[64];	uchar	sendra6;		/* on == send router adv */	uchar	recvra6;		/* on == rcv router adv */	int	mtu;	ulong	pktin;	ulong	pktout;	ulong	errin;	ulong	errout;	Ipv6rp	rp;}; #define ISIPV6MCAST(addr)	((addr)[0] == 0xff)#define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80) /* * ipv6 constants * `ra' is `router advertisement', `rs' is `router solicitation'. * `na' is `neighbour advertisement'. */enum {	IPV6HDR_LEN	= 40, 	/* neighbour discovery option types */	V6nd_srclladdr	= 1,	V6nd_targlladdr	= 2,	V6nd_pfxinfo	= 3,	V6nd_redirhdr	= 4,	V6nd_mtu	= 5,	/* new since rfc2461; see iana.org/assignments/icmpv6-parameters */	V6nd_home	= 8,	V6nd_srcaddrs	= 9,		/* rfc3122 */	V6nd_ip		= 17,	/* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */	V6nd_rdns	= 25,	/* plan 9 extensions */	V6nd_9fs	= 250,	V6nd_9auth	= 251, 	/* Router constants (all times in ms.) */	Maxv6initraintvl= 16000,	Maxv6initras	= 3,	Maxv6finalras	= 3,	Minv6interradelay= 3000,	Maxv6radelay	= 500, 	/* Host constants */	Maxv6rsdelay	= 1000,	V6rsintvl	= 4000,	Maxv6rss	= 3, 	/* Node constants */	Maxv6mcastrss	= 3,	Maxv6unicastrss	= 3,	Maxv6anycastdelay= 1000,	Maxv6na		= 3,	V6reachabletime	= 30000,	V6retranstimer	= 1000,	V6initprobedelay= 5000,}; /* V6 header on the wire */typedef struct Ip6hdr Ip6hdr;struct Ip6hdr {	uchar	vcf[4];		/* version:4, traffic class:8, flow label:20 */	uchar	ploadlen[2];	/* payload length: packet length - 40 */	uchar	proto;		/* next header type */	uchar	ttl;		/* hop limit */	uchar	src[IPaddrlen];	/* source address */	uchar	dst[IPaddrlen];	/* destination address */	uchar	payload[];}; /* *  user-level icmpv6 with control message "headers" */typedef struct Icmp6hdr Icmp6hdr;struct Icmp6hdr {	uchar	_0_[8];	uchar	laddr[IPaddrlen];	/* local address */	uchar	raddr[IPaddrlen];	/* remote address */}; /* *  user level udp headers with control message "headers" */enum {	Udphdrsize=	52,	/* size of a Udphdr */}; typedef struct Udphdr Udphdr;struct Udphdr{	uchar	raddr[IPaddrlen];	/* V6 remote address */	uchar	laddr[IPaddrlen];	/* V6 local address */	uchar	ifcaddr[IPaddrlen];	/* V6 ifc addr msg was received on */	uchar	rport[2];		/* remote port */	uchar	lport[2];		/* local port */}; uchar*	defmask(uchar*);void	maskip(uchar*, uchar*, uchar*);int	eipfmt(Fmt*);int	isv4(uchar*);vlong	parseip(uchar*, char*);vlong	parseipmask(uchar*, char*);char*	v4parseip(uchar*, char*);char*	v4parsecidr(uchar*, uchar*, char*);int	parseether(uchar*, char*);int	myipaddr(uchar*, char*);int	myetheraddr(uchar*, char*);int	equivip4(uchar*, uchar*);int	equivip6(uchar*, uchar*); Ipifc*	readipifc(char*, Ipifc*, int); void	hnputv(void*, uvlong);void	hnputl(void*, uint);void	hnputs(void*, ushort);uvlong	nhgetv(void*);uint	nhgetl(void*);ushort	nhgets(void*);ushort	ptclbsum(uchar*, int); int	v6tov4(uchar*, uchar*);void	v4tov6(uchar*, uchar*); #define	ipcmp(x, y) memcmp(x, y, IPaddrlen)#define	ipmove(x, y) memmove(x, y, IPaddrlen) extern uchar IPv4bcast[IPaddrlen];extern uchar IPv4bcastobs[IPaddrlen];extern uchar IPv4allsys[IPaddrlen];extern uchar IPv4allrouter[IPaddrlen];extern uchar IPnoaddr[IPaddrlen];extern uchar v4prefix[IPaddrlen];extern uchar IPallbits[IPaddrlen]; #define CLASS(p) ((*(uchar*)(p))>>6) #pragma	varargck	type	"I"	uchar*#pragma	varargck	type	"V"	uchar*#pragma	varargck	type	"E"	uchar*#pragma	varargck	type	"M"	uchar*