| #ifndef _IP_H_ | 
 | #define _IP_H_ 1 | 
 | #if defined(__cplusplus) | 
 | extern "C" {  | 
 | #endif | 
 |  | 
 | AUTOLIB(ip) | 
 | /* | 
 | #pragma	src	"/sys/src/libip" | 
 | #pragma	lib	"libip.a" | 
 | #pragma	varargck	type	"I"	uchar* | 
 | #pragma	varargck	type	"V"	uchar* | 
 | #pragma	varargck	type	"E"	uchar* | 
 | #pragma	varargck	type	"M"	uchar* | 
 | */ | 
 | enum  | 
 | { | 
 | 	IPaddrlen=	16, | 
 | 	IPv4addrlen=	4, | 
 | 	IPv4off=	12, | 
 | 	IPllen=		4 | 
 | }; | 
 |  | 
 | /* | 
 |  *  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	ether[6]; | 
 | 	uchar	sendra6;		/* on == send router adv */ | 
 | 	uchar	recvra6;		/* on == rcv router adv */ | 
 | 	int	mtu; | 
 | 	ulong	pktin; | 
 | 	ulong	pktout; | 
 | 	ulong	errin; | 
 | 	ulong	errout; | 
 | 	Ipv6rp	rp; | 
 | }; | 
 |  | 
 | /* | 
 |  *  user level udp headers | 
 |  */ | 
 | enum  | 
 | { | 
 | 	Udphdrsize=	52	/* size of a Udphdr */ | 
 | }; | 
 |  | 
 | typedef struct Udphdr Udphdr; | 
 | struct Udphdr | 
 | { | 
 | 	uchar	raddr[IPaddrlen];	/* remote address and port */ | 
 | 	uchar	laddr[IPaddrlen];	/* local address and port */ | 
 | 	uchar	ifcaddr[IPaddrlen];	/* address of ifc message was received from */ | 
 | 	uchar	rport[2]; | 
 | 	uchar	lport[2]; | 
 | }; | 
 |  | 
 | uchar*	defmask(uchar*); | 
 | void	maskip(uchar*, uchar*, uchar*); | 
 | int	eipfmt(Fmt*); | 
 | int	isv4(uchar*); | 
 | ulong	parseip(uchar*, char*); | 
 | ulong	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	equivip(uchar*, uchar*); | 
 | long	udpread(int, Udphdr*, void*, long); | 
 | long	udpwrite(int, Udphdr*, void*, long); | 
 |  | 
 | Ipifc*	readipifc(char*, Ipifc*, int); | 
 | void	freeipifc(Ipifc*); | 
 |  | 
 | void	hnputv(void*, uvlong); | 
 | void	hnputl(void*, uint); | 
 | void	hnputs(void*, ushort); | 
 | uint	nhgetl(void*); | 
 | uvlong	nhgetv(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) | 
 |  | 
 | #if defined(__cplusplus) | 
 | } | 
 | #endif | 
 | #endif |