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