262 lines · 5.2 KB · C
RawDownload
typedef struct Conf Conf;typedef struct Ctl Ctl; struct Conf{	/* locally generated */	char	*type;	char	*dev;	char	mpoint[32];	int	cfd;			/* ifc control channel */	int	dfd;			/* ifc data channel (for ppp) */	char	*cputype;	uchar	hwa[32];		/* hardware address */	int	hwatype;	int	hwalen;	uchar	cid[32];	int	cidlen;	char	*baud; 	/* learned info */	uchar	gaddr[IPaddrlen];	uchar	laddr[IPaddrlen];	uchar	mask[IPaddrlen];	uchar	raddr[IPaddrlen];	uchar	dns[2*IPaddrlen];	uchar	fs[2*IPaddrlen];	uchar	auth[2*IPaddrlen];	uchar	ntp[IPaddrlen];	int	mtu; 	/* dhcp specific */	int	state;	int	fd;	ulong	xid;	ulong	starttime;	char	sname[64];	char	hostname[32];	char	domainname[64];	uchar	server[IPaddrlen];	/* server IP address */	ulong	offered;		/* offered lease time */	ulong	lease;			/* lease time */	ulong	resend;			/* # of resends for current state */	ulong	timeout;		/* time to timeout - seconds */ 	/*	 * IPv6	 */ 	/* solicitation specific - XXX add support for IPv6 leases *///	ulong	solicit_retries; 	/* router-advertisement related */	uchar	sendra;	uchar	recvra;	uchar	mflag;	uchar	oflag;	int 	maxraint; /* rfc2461, p.39: 4sec ≤ maxraint ≤ 1800sec, def 600 */	int	minraint;	/* 3sec ≤ minraint ≤ 0.75*maxraint */	int	linkmtu;	int	reachtime;	/* 3,600,000 msec, default 0 */	int	rxmitra;	/* default 0 */	int	ttl;		/* default 0 (unspecified) */	/* default gateway params */	uchar	v6gaddr[IPaddrlen];	int	routerlt;	/* router life time */ 	/* prefix related */	uchar	v6pref[IPaddrlen];	int	prefixlen;	uchar	onlink;		/* flag: address is `on-link' */	uchar	autoflag;	/* flag: autonomous */	ulong	validlt;	/* valid lifetime (seconds) */	ulong	preflt;		/* preferred lifetime (seconds) */}; struct Ctl{	Ctl	*next;	char	*ctl;}; extern Ctl *firstctl, **ctll; extern Conf conf; extern int	noconfig;extern int	ipv6auto;extern int	debug;extern int	dodhcp;extern int	dolog;extern int	nip;extern int	plan9;extern int	dupl_disc; extern Conf	conf;extern int	myifc;extern char	*vs; void	adddefroute(char*, uchar*);void	binddevice(void);void	bootprequest(void);void	controldevice(void);void	dhcpquery(int, int);void	dhcprecv(void);void	dhcpsend(int);int	dhcptimer(void);void	dhcpwatch(int);void	doadd(int);void	doremove(void);void	dounbind(void);int	getndb(void);int	ipconfig4(void);int	ipconfig6(int);long	jitter(void);void	lookforip(char*);void	mkclientid(void);int	nipifcs(char*);int	openlisten(void);uchar	*optaddaddr(uchar*, int, uchar*);uchar	*optaddbyte(uchar*, int, int);uchar	*optaddstr(uchar*, int, char*);uchar	*optadd(uchar*, int, void*, int);uchar	*optaddulong(uchar*, int, ulong);uchar	*optaddvec(uchar*, int, uchar*, int);int	optgetaddrs(uchar*, int, uchar*, int);int	optgetaddr(uchar*, int, uchar*);int	optgetbyte(uchar*, int);int	optgetstr(uchar*, int, char*, int);uchar	*optget(uchar*, int, int*);ulong	optgetulong(uchar*, int);int	optgetvec(uchar*, int, uchar*, int);int	parseoptions(uchar *p, int n);int	parseverb(char*);void	procsetname(char *fmt, ...);void	putndb(void);ulong	randint(ulong low, ulong hi);void	tweakservers(void);void	usage(void);int	validip(uchar*);void	warning(char *fmt, ...);void	writendb(char*, int, int); /* * IPv6 */ void	doipv6(int);int	ipconfig6(int);void	recvra6(void);void	sendra6(void);void	v6paraminit(Conf *); typedef struct Headers Headers;typedef struct Ip4hdr  Ip4hdr;typedef struct Lladdropt Lladdropt;typedef struct Mtuopt Mtuopt;typedef struct Prefixopt Prefixopt;typedef struct Routeradv Routeradv;typedef struct Routersol Routersol; enum {	IsRouter 	= 1,	IsHostRecv	= 2,	IsHostNoRecv	= 3, 	MAClen		= 6, 	IPv4		= 4,	IPv6		= 6,	Defmtu		= 1400, 	IP_HOPBYHOP	= 0,	ICMPv4		= 1,	IP_IGMPPROTO	= 2,	IP_TCPPROTO	= 6,	IP_UDPPROTO	= 17,	IP_ILPROTO	= 40,	IP_v6ROUTE	= 43,	IP_v6FRAG	= 44,	IP_IPsecESP	= 50,	IP_IPsecAH	= 51,	IP_v6NOMORE	= 59,	ICMP6_RS	= 133,	ICMP6_RA	= 134, 	IP_IN_IP	= 41,}; enum {	MFMASK = 1 << 7,	OCMASK = 1 << 6,	OLMASK = 1 << 7,	AFMASK = 1 << 6,}; enum {	MAXTTL		= 255,	D64HLEN		= IPV6HDR_LEN - IPV4HDR_LEN,	IP_MAX		= 32*1024,}; struct Headers {	uchar	dst[IPaddrlen];	uchar	src[IPaddrlen];}; struct Routersol {	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];	uchar	dst[IPaddrlen];	uchar	type;	uchar	code;	uchar	cksum[2];	uchar	res[4];}; struct Routeradv {	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];	uchar	dst[IPaddrlen];	uchar	type;	uchar	code;	uchar	cksum[2];	uchar	cttl;	uchar	mor;	uchar	routerlt[2];	uchar	rchbltime[4];	uchar	rxmtimer[4];}; struct Lladdropt {	uchar	type;	uchar	len;	uchar	lladdr[MAClen];}; struct Prefixopt {	uchar	type;	uchar	len;	uchar	plen;	uchar	lar;	uchar	validlt[4];	uchar	preflt[4];	uchar	reserv[4];	uchar	pref[IPaddrlen];}; struct Mtuopt {	uchar	type;	uchar	len;	uchar	reserv[2];	uchar	mtu[4];}; void	ea2lla(uchar *lla, uchar *ea);void	ipv62smcast(uchar *smcast, uchar *a);