1e47528f3SDavid du Colombier typedef struct Conf Conf; 2e47528f3SDavid du Colombier typedef struct Ctl Ctl; 3e47528f3SDavid du Colombier 4e47528f3SDavid du Colombier struct Conf 5e47528f3SDavid du Colombier { 6e47528f3SDavid du Colombier /* locally generated */ 7e47528f3SDavid du Colombier char *type; 8e47528f3SDavid du Colombier char *dev; 9e47528f3SDavid du Colombier char mpoint[32]; 10e47528f3SDavid du Colombier int cfd; /* ifc control channel */ 11e47528f3SDavid du Colombier int dfd; /* ifc data channel (for ppp) */ 12e47528f3SDavid du Colombier char *cputype; 13e47528f3SDavid du Colombier uchar hwa[32]; /* hardware address */ 14e47528f3SDavid du Colombier int hwatype; 15e47528f3SDavid du Colombier int hwalen; 16e47528f3SDavid du Colombier uchar cid[32]; 17e47528f3SDavid du Colombier int cidlen; 18e47528f3SDavid du Colombier char *baud; 19e47528f3SDavid du Colombier 20e47528f3SDavid du Colombier /* learned info */ 21e47528f3SDavid du Colombier uchar gaddr[IPaddrlen]; 22e47528f3SDavid du Colombier uchar laddr[IPaddrlen]; 23e47528f3SDavid du Colombier uchar mask[IPaddrlen]; 24e47528f3SDavid du Colombier uchar raddr[IPaddrlen]; 25e47528f3SDavid du Colombier uchar dns[2*IPaddrlen]; 26e47528f3SDavid du Colombier uchar fs[2*IPaddrlen]; 27e47528f3SDavid du Colombier uchar auth[2*IPaddrlen]; 28e47528f3SDavid du Colombier uchar ntp[IPaddrlen]; 29e47528f3SDavid du Colombier int mtu; 30e47528f3SDavid du Colombier 31e47528f3SDavid du Colombier /* dhcp specific */ 32e47528f3SDavid du Colombier int state; 33e47528f3SDavid du Colombier int fd; 34e47528f3SDavid du Colombier ulong xid; 35e47528f3SDavid du Colombier ulong starttime; 36e47528f3SDavid du Colombier char sname[64]; 37e47528f3SDavid du Colombier char hostname[32]; 38e47528f3SDavid du Colombier char domainname[64]; 39e47528f3SDavid du Colombier uchar server[IPaddrlen]; /* server IP address */ 40e47528f3SDavid du Colombier ulong offered; /* offered lease time */ 41e47528f3SDavid du Colombier ulong lease; /* lease time */ 42e47528f3SDavid du Colombier ulong resend; /* # of resends for current state */ 43e47528f3SDavid du Colombier ulong timeout; /* time to timeout - seconds */ 44e47528f3SDavid du Colombier 45e47528f3SDavid du Colombier /* 46e47528f3SDavid du Colombier * IPv6 47e47528f3SDavid du Colombier */ 48e47528f3SDavid du Colombier 49e47528f3SDavid du Colombier /* solicitation specific - XXX add support for IPv6 leases */ 50ccaac148SDavid du Colombier // ulong solicit_retries; 51e47528f3SDavid du Colombier 52ccaac148SDavid du Colombier /* router-advertisement related */ 53e47528f3SDavid du Colombier uchar sendra; 54e47528f3SDavid du Colombier uchar recvra; 55e47528f3SDavid du Colombier uchar mflag; 56e47528f3SDavid du Colombier uchar oflag; 57e47528f3SDavid du Colombier int maxraint; /* rfc2461, p.39: 4sec ≤ maxraint ≤ 1800sec, def 600 */ 58e47528f3SDavid du Colombier int minraint; /* 3sec ≤ minraint ≤ 0.75*maxraint */ 59e47528f3SDavid du Colombier int linkmtu; 60e47528f3SDavid du Colombier int reachtime; /* 3,600,000 msec, default 0 */ 61e47528f3SDavid du Colombier int rxmitra; /* default 0 */ 62e47528f3SDavid du Colombier int ttl; /* default 0 (unspecified) */ 63ccaac148SDavid du Colombier /* default gateway params */ 64e47528f3SDavid du Colombier uchar v6gaddr[IPaddrlen]; 65e47528f3SDavid du Colombier int routerlt; /* router life time */ 66e47528f3SDavid du Colombier 67e47528f3SDavid du Colombier /* prefix related */ 68e47528f3SDavid du Colombier uchar v6pref[IPaddrlen]; 69e47528f3SDavid du Colombier int prefixlen; 70ccaac148SDavid du Colombier uchar onlink; /* flag: address is `on-link' */ 71ccaac148SDavid du Colombier uchar autoflag; /* flag: autonomous */ 72ccaac148SDavid du Colombier ulong validlt; /* valid lifetime (seconds) */ 73ccaac148SDavid du Colombier ulong preflt; /* preferred lifetime (seconds) */ 74e47528f3SDavid du Colombier }; 75e47528f3SDavid du Colombier 76e47528f3SDavid du Colombier struct Ctl 77e47528f3SDavid du Colombier { 78e47528f3SDavid du Colombier Ctl *next; 79e47528f3SDavid du Colombier char *ctl; 80e47528f3SDavid du Colombier }; 81e47528f3SDavid du Colombier 82e47528f3SDavid du Colombier extern Ctl *firstctl, **ctll; 83e47528f3SDavid du Colombier 84e47528f3SDavid du Colombier extern Conf conf; 85e47528f3SDavid du Colombier 86e47528f3SDavid du Colombier extern int noconfig; 87e47528f3SDavid du Colombier extern int ipv6auto; 88e47528f3SDavid du Colombier extern int debug; 89e47528f3SDavid du Colombier extern int dodhcp; 908c6ab946SDavid du Colombier extern int dolog; 91e47528f3SDavid du Colombier extern int nip; 92e47528f3SDavid du Colombier extern int plan9; 93e47528f3SDavid du Colombier extern int dupl_disc; 94e47528f3SDavid du Colombier 95e47528f3SDavid du Colombier extern int myifc; 96e47528f3SDavid du Colombier extern char *vs; 97e47528f3SDavid du Colombier 98e47528f3SDavid du Colombier void adddefroute(char*, uchar*); 99e47528f3SDavid du Colombier void binddevice(void); 100e47528f3SDavid du Colombier void bootprequest(void); 101e47528f3SDavid du Colombier void controldevice(void); 102e47528f3SDavid du Colombier void dhcpquery(int, int); 103e47528f3SDavid du Colombier void dhcprecv(void); 104e47528f3SDavid du Colombier void dhcpsend(int); 105e47528f3SDavid du Colombier int dhcptimer(void); 106e47528f3SDavid du Colombier void dhcpwatch(int); 107e47528f3SDavid du Colombier void doadd(int); 108e47528f3SDavid du Colombier void doremove(void); 109e47528f3SDavid du Colombier void dounbind(void); 110e47528f3SDavid du Colombier int getndb(void); 111e47528f3SDavid du Colombier int ipconfig4(void); 112e47528f3SDavid du Colombier int ipconfig6(int); 113*0a84db5eSDavid du Colombier long jitter(void); 114e47528f3SDavid du Colombier void lookforip(char*); 115e47528f3SDavid du Colombier void mkclientid(void); 116e47528f3SDavid du Colombier int nipifcs(char*); 117e47528f3SDavid du Colombier int openlisten(void); 118e47528f3SDavid du Colombier uchar *optaddaddr(uchar*, int, uchar*); 119e47528f3SDavid du Colombier uchar *optaddbyte(uchar*, int, int); 120e47528f3SDavid du Colombier uchar *optaddstr(uchar*, int, char*); 121e47528f3SDavid du Colombier uchar *optadd(uchar*, int, void*, int); 122e47528f3SDavid du Colombier uchar *optaddulong(uchar*, int, ulong); 123e47528f3SDavid du Colombier uchar *optaddvec(uchar*, int, uchar*, int); 124e47528f3SDavid du Colombier int optgetaddrs(uchar*, int, uchar*, int); 125e47528f3SDavid du Colombier int optgetaddr(uchar*, int, uchar*); 126e47528f3SDavid du Colombier int optgetbyte(uchar*, int); 127e47528f3SDavid du Colombier int optgetstr(uchar*, int, char*, int); 128e47528f3SDavid du Colombier uchar *optget(uchar*, int, int*); 129e47528f3SDavid du Colombier ulong optgetulong(uchar*, int); 130e47528f3SDavid du Colombier int optgetvec(uchar*, int, uchar*, int); 131e47528f3SDavid du Colombier int parseoptions(uchar *p, int n); 132e47528f3SDavid du Colombier int parseverb(char*); 133e47528f3SDavid du Colombier void procsetname(char *fmt, ...); 134e47528f3SDavid du Colombier void putndb(void); 135*0a84db5eSDavid du Colombier ulong randint(ulong low, ulong hi); 136e47528f3SDavid du Colombier void tweakservers(void); 137e47528f3SDavid du Colombier void usage(void); 138e47528f3SDavid du Colombier int validip(uchar*); 1398c6ab946SDavid du Colombier void warning(char *fmt, ...); 140e47528f3SDavid du Colombier void writendb(char*, int, int); 141e47528f3SDavid du Colombier 142e47528f3SDavid du Colombier /* 143e47528f3SDavid du Colombier * IPv6 144e47528f3SDavid du Colombier */ 145e47528f3SDavid du Colombier 146ccaac148SDavid du Colombier void doipv6(int); 147e47528f3SDavid du Colombier int ipconfig6(int); 148e47528f3SDavid du Colombier void recvra6(void); 149e47528f3SDavid du Colombier void sendra6(void); 150ccaac148SDavid du Colombier void v6paraminit(Conf *); 151e47528f3SDavid du Colombier 152e47528f3SDavid du Colombier typedef struct Headers Headers; 153e47528f3SDavid du Colombier typedef struct Ip4hdr Ip4hdr; 154e47528f3SDavid du Colombier typedef struct Lladdropt Lladdropt; 155e47528f3SDavid du Colombier typedef struct Mtuopt Mtuopt; 156e47528f3SDavid du Colombier typedef struct Prefixopt Prefixopt; 157e47528f3SDavid du Colombier typedef struct Routeradv Routeradv; 158e47528f3SDavid du Colombier typedef struct Routersol Routersol; 159e47528f3SDavid du Colombier 160e47528f3SDavid du Colombier enum { 161e47528f3SDavid du Colombier IsRouter = 1, 162e47528f3SDavid du Colombier IsHostRecv = 2, 163e47528f3SDavid du Colombier IsHostNoRecv = 3, 164e47528f3SDavid du Colombier 165e47528f3SDavid du Colombier MAClen = 6, 166e47528f3SDavid du Colombier 167e47528f3SDavid du Colombier IPv4 = 4, 168e47528f3SDavid du Colombier IPv6 = 6, 169e47528f3SDavid du Colombier Defmtu = 1400, 170e47528f3SDavid du Colombier 171e47528f3SDavid du Colombier IP_HOPBYHOP = 0, 172e47528f3SDavid du Colombier ICMPv4 = 1, 173e47528f3SDavid du Colombier IP_IGMPPROTO = 2, 174e47528f3SDavid du Colombier IP_TCPPROTO = 6, 175e47528f3SDavid du Colombier IP_UDPPROTO = 17, 176e47528f3SDavid du Colombier IP_ILPROTO = 40, 177e47528f3SDavid du Colombier IP_v6ROUTE = 43, 178e47528f3SDavid du Colombier IP_v6FRAG = 44, 179e47528f3SDavid du Colombier IP_IPsecESP = 50, 180e47528f3SDavid du Colombier IP_IPsecAH = 51, 181e47528f3SDavid du Colombier IP_v6NOMORE = 59, 182e47528f3SDavid du Colombier ICMP6_RS = 133, 183e47528f3SDavid du Colombier ICMP6_RA = 134, 184e47528f3SDavid du Colombier 185e47528f3SDavid du Colombier IP_IN_IP = 41, 186e47528f3SDavid du Colombier }; 187e47528f3SDavid du Colombier 188e47528f3SDavid du Colombier enum { 189e47528f3SDavid du Colombier MFMASK = 1 << 7, 190e47528f3SDavid du Colombier OCMASK = 1 << 6, 191e47528f3SDavid du Colombier OLMASK = 1 << 7, 192e47528f3SDavid du Colombier AFMASK = 1 << 6, 193e47528f3SDavid du Colombier }; 194e47528f3SDavid du Colombier 195e47528f3SDavid du Colombier enum { 196e47528f3SDavid du Colombier MAXTTL = 255, 197e47528f3SDavid du Colombier D64HLEN = IPV6HDR_LEN - IPV4HDR_LEN, 198e47528f3SDavid du Colombier IP_MAX = 32*1024, 199e47528f3SDavid du Colombier }; 200e47528f3SDavid du Colombier 201e47528f3SDavid du Colombier struct Headers { 202e47528f3SDavid du Colombier uchar dst[IPaddrlen]; 203e47528f3SDavid du Colombier uchar src[IPaddrlen]; 204e47528f3SDavid du Colombier }; 205e47528f3SDavid du Colombier 206e47528f3SDavid du Colombier struct Routersol { 207e47528f3SDavid du Colombier uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */ 208e47528f3SDavid du Colombier uchar ploadlen[2]; /* payload length: packet length - 40 */ 209e47528f3SDavid du Colombier uchar proto; /* next header type */ 210e47528f3SDavid du Colombier uchar ttl; /* hop limit */ 211e47528f3SDavid du Colombier uchar src[IPaddrlen]; 212e47528f3SDavid du Colombier uchar dst[IPaddrlen]; 213e47528f3SDavid du Colombier uchar type; 214e47528f3SDavid du Colombier uchar code; 215e47528f3SDavid du Colombier uchar cksum[2]; 216e47528f3SDavid du Colombier uchar res[4]; 217e47528f3SDavid du Colombier }; 218e47528f3SDavid du Colombier 219e47528f3SDavid du Colombier struct Routeradv { 220e47528f3SDavid du Colombier uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */ 221e47528f3SDavid du Colombier uchar ploadlen[2]; /* payload length: packet length - 40 */ 222e47528f3SDavid du Colombier uchar proto; /* next header type */ 223e47528f3SDavid du Colombier uchar ttl; /* hop limit */ 224e47528f3SDavid du Colombier uchar src[IPaddrlen]; 225e47528f3SDavid du Colombier uchar dst[IPaddrlen]; 226e47528f3SDavid du Colombier uchar type; 227e47528f3SDavid du Colombier uchar code; 228e47528f3SDavid du Colombier uchar cksum[2]; 229e47528f3SDavid du Colombier uchar cttl; 230e47528f3SDavid du Colombier uchar mor; 231e47528f3SDavid du Colombier uchar routerlt[2]; 232e47528f3SDavid du Colombier uchar rchbltime[4]; 233e47528f3SDavid du Colombier uchar rxmtimer[4]; 234e47528f3SDavid du Colombier }; 235e47528f3SDavid du Colombier 236e47528f3SDavid du Colombier struct Lladdropt { 237e47528f3SDavid du Colombier uchar type; 238e47528f3SDavid du Colombier uchar len; 239e47528f3SDavid du Colombier uchar lladdr[MAClen]; 240e47528f3SDavid du Colombier }; 241e47528f3SDavid du Colombier 242e47528f3SDavid du Colombier struct Prefixopt { 243e47528f3SDavid du Colombier uchar type; 244e47528f3SDavid du Colombier uchar len; 245e47528f3SDavid du Colombier uchar plen; 246e47528f3SDavid du Colombier uchar lar; 247e47528f3SDavid du Colombier uchar validlt[4]; 248e47528f3SDavid du Colombier uchar preflt[4]; 249e47528f3SDavid du Colombier uchar reserv[4]; 250e47528f3SDavid du Colombier uchar pref[IPaddrlen]; 251e47528f3SDavid du Colombier }; 252e47528f3SDavid du Colombier 253e47528f3SDavid du Colombier struct Mtuopt { 254e47528f3SDavid du Colombier uchar type; 255e47528f3SDavid du Colombier uchar len; 256e47528f3SDavid du Colombier uchar reserv[2]; 257e47528f3SDavid du Colombier uchar mtu[4]; 258e47528f3SDavid du Colombier }; 259e47528f3SDavid du Colombier 260e47528f3SDavid du Colombier void ea2lla(uchar *lla, uchar *ea); 261e47528f3SDavid du Colombier void ipv62smcast(uchar *smcast, uchar *a); 262