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