ipconfig.h 5.2 KB

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