|  | /* | 
|  | * 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]; | 
|  | }; |