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