ipconfig.h 6.3 KB

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