| /* | 
 |  * 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. | 
 |  */ | 
 |  | 
 | 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; | 
 | 	uint8_t hwa[32];		// hardware address | 
 | 	int hwatype; | 
 | 	int hwalen; | 
 | 	uint8_t cid[32]; | 
 | 	int cidlen; | 
 | 	char *baud; | 
 |  | 
 | 	// learned info | 
 | 	uint8_t gaddr[IPaddrlen]; | 
 | 	uint8_t laddr[IPaddrlen]; | 
 | 	uint8_t mask[IPaddrlen]; | 
 | 	uint8_t raddr[IPaddrlen]; | 
 | 	uint8_t dns[2 * IPaddrlen]; | 
 | 	uint8_t fs[2 * IPaddrlen]; | 
 | 	uint8_t auth[2 * IPaddrlen]; | 
 | 	uint8_t ntp[IPaddrlen]; | 
 | 	int mtu; | 
 |  | 
 | 	// dhcp specific | 
 | 	int state; | 
 | 	int fd; | 
 | 	uint32_t xid; | 
 | 	uint32_t starttime; | 
 | 	char sname[64]; | 
 | 	char hostname[32]; | 
 | 	char domainname[64]; | 
 | 	uint8_t server[IPaddrlen];	// server IP address | 
 | 	uint32_t offered;		// offered lease time | 
 | 	uint32_t lease;			// lease time | 
 | 	uint32_t resend;		// # of resends for current state | 
 | 	uint32_t timeout;		// time to timeout - seconds | 
 |  | 
 | 	// | 
 | 	// IPv6 | 
 | 	// | 
 |  | 
 | 	// solicitation specific - XXX add support for IPv6 leases | 
 | 	// ulong	solicit_retries; | 
 |  | 
 | 	// router-advertisement related | 
 | 	uint8_t sendra; | 
 | 	uint8_t recvra; | 
 | 	uint8_t mflag; | 
 | 	uint8_t 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 | 
 | 	uint8_t v6gaddr[IPaddrlen]; | 
 | 	int routerlt;			// router life time | 
 |  | 
 | 	// prefix related | 
 | 	uint8_t v6pref[IPaddrlen]; | 
 | 	int prefixlen; | 
 | 	uint8_t onlink;			// flag: address is `on-link' | 
 | 	uint8_t autoflag;		// flag: autonomous | 
 | 	uint32_t validlt;		// valid lifetime (seconds) | 
 | 	uint32_t preflt;		// preferred lifetime (seconds) | 
 | }; | 
 |  | 
 | struct ctl { | 
 | 	struct ctl *next; | 
 | 	char *ctl; | 
 | }; | 
 |  | 
 | extern struct ctl *firstctl, **ctll; | 
 | extern struct 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 int myifc; | 
 | extern char *vs; | 
 |  | 
 | void adddefroute(char *, uint8_t *); | 
 | int addoption(char *opt); | 
 | 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); | 
 | void ea2lla(uint8_t *lla, uint8_t *ea); | 
 | void evexit(int rc); | 
 | int getndb(void); | 
 | void getoptions(uint8_t *p); | 
 | int ip4cfg(void); | 
 | int ip6cfg(int autoconf); | 
 | int ipconfig4(void); | 
 | int ipconfig6(int); | 
 | void ipv62smcast(uint8_t *smcast, uint8_t *a); | 
 | long jitter(void); | 
 | void lookforip(char *); | 
 | void mkclientid(void); | 
 | void ndbconfig(void); | 
 | int nipifcs(char *); | 
 | int openlisten(void); | 
 | uint8_t *optadd(uint8_t *, int, void *, int); | 
 | uint8_t *optaddaddr(uint8_t *, int, uint8_t *); | 
 | uint8_t *optaddbyte(uint8_t *, int, int); | 
 | uint8_t *optaddstr(uint8_t *, int, char *); | 
 | uint8_t *optaddulong(uint8_t *, int, uint32_t); | 
 | uint8_t *optaddvec(uint8_t *, int, uint8_t *, int); | 
 | uint8_t *optget(uint8_t *, int, int *); | 
 | int optgetaddr(uint8_t *, int, uint8_t *); | 
 | int optgetaddrs(uint8_t *, int, uint8_t *, int); | 
 | int optgetbyte(uint8_t *, int); | 
 | int optgetp9addrs(uint8_t *ap, int op, uint8_t *ip, int n); | 
 | int optgetstr(uint8_t *, int, char *, int); | 
 | uint32_t optgetulong(uint8_t *, int); | 
 | int optgetvec(uint8_t *, int, uint8_t *, int); | 
 | struct bootp *parsebootp(uint8_t *p, int n); | 
 | int parseoptions(uint8_t *p, int n); | 
 | int parseverb(char *); | 
 | void procsetname(char *fmt, ...); | 
 | void putndb(void); | 
 | uint32_t randint(uint32_t low, uint32_t hi); | 
 | void tweakservers(void); | 
 | void usage(void); | 
 | int validip(uint8_t *); | 
 | void warning(char *fmt, ...); | 
 | void writendb(char *, int, int); | 
 |  | 
 | /* | 
 |  * IPv6 | 
 |  */ | 
 | void doipv6(int); | 
 | int ipconfig6(int); | 
 | void recvra6(void); | 
 | void sendra6(void); | 
 | void v6paraminit(struct conf *); | 
 |  | 
 | enum { | 
 | 	IsRouter = 1, | 
 | 	IsHostRecv = 2, | 
 | 	IsHostNoRecv = 3, | 
 |  | 
 | 	MAClen = 6, | 
 |  | 
 | 	IPv4 = 4, | 
 | 	IPv6 = 6, | 
 | 	Defmtu = 1400, | 
 |  | 
 | 	IP_HOPBYHOP = 0, | 
 | 	ICMPv4 = 1, | 
 | 	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 routersol { | 
 | 	uint8_t vcf[4];		// version:4, traffic class:8, flow label:20 | 
 | 	uint8_t ploadlen[2];	// payload length: packet length - 40 | 
 | 	uint8_t proto;		// next header	type | 
 | 	uint8_t ttl;		// hop limit | 
 | 	uint8_t src[IPaddrlen]; | 
 | 	uint8_t dst[IPaddrlen]; | 
 | 	uint8_t type; | 
 | 	uint8_t code; | 
 | 	uint8_t cksum[2]; | 
 | 	uint8_t res[4]; | 
 | }; | 
 |  | 
 | struct routeradv { | 
 | 	uint8_t vcf[4];		// version:4, traffic class:8, flow label:20 | 
 | 	uint8_t ploadlen[2];	// payload length: packet length - 40 | 
 | 	uint8_t proto;		// next header type | 
 | 	uint8_t ttl;		// hop limit | 
 | 	uint8_t src[IPaddrlen]; | 
 | 	uint8_t dst[IPaddrlen]; | 
 | 	uint8_t type; | 
 | 	uint8_t code; | 
 | 	uint8_t cksum[2]; | 
 | 	uint8_t cttl; | 
 | 	uint8_t mor; | 
 | 	uint8_t routerlt[2]; | 
 | 	uint8_t rchbltime[4]; | 
 | 	uint8_t rxmtimer[4]; | 
 | }; | 
 |  | 
 | struct lladdropt { | 
 | 	uint8_t type; | 
 | 	uint8_t len; | 
 | 	uint8_t lladdr[MAClen]; | 
 | }; | 
 |  | 
 | struct prefixopt { | 
 | 	uint8_t type; | 
 | 	uint8_t len; | 
 | 	uint8_t plen; | 
 | 	uint8_t lar; | 
 | 	uint8_t validlt[4]; | 
 | 	uint8_t preflt[4]; | 
 | 	uint8_t reserv[4]; | 
 | 	uint8_t pref[IPaddrlen]; | 
 | }; | 
 |  | 
 | struct mtuopt { | 
 | 	uint8_t type; | 
 | 	uint8_t len; | 
 | 	uint8_t reserv[2]; | 
 | 	uint8_t mtu[4]; | 
 | }; |