blob: b593aca506b20833b887a8ee5fbe938456850f80 [file] [log] [blame]
/*
* 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];
};