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