ipconfig.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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 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. /* def gateway params */
  58. uchar v6gaddr[IPaddrlen];
  59. int routerlt; /* router life time */
  60. int force;
  61. /* prefix related */
  62. uchar v6pref[IPaddrlen];
  63. int prefixlen;
  64. uchar onlink;
  65. uchar autoflag;
  66. ulong validlt;
  67. ulong preflt;
  68. };
  69. struct Ctl
  70. {
  71. Ctl *next;
  72. char *ctl;
  73. };
  74. extern Ctl *firstctl, **ctll;
  75. extern Conf conf;
  76. extern int noconfig;
  77. extern int ipv6auto;
  78. extern int debug;
  79. extern int dodhcp;
  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. void lookforip(char*);
  102. void mkclientid(void);
  103. int nipifcs(char*);
  104. int openlisten(void);
  105. uchar *optaddaddr(uchar*, int, uchar*);
  106. uchar *optaddbyte(uchar*, int, int);
  107. uchar *optaddstr(uchar*, int, char*);
  108. uchar *optadd(uchar*, int, void*, int);
  109. uchar *optaddulong(uchar*, int, ulong);
  110. uchar *optaddvec(uchar*, int, uchar*, int);
  111. int optgetaddrs(uchar*, int, uchar*, int);
  112. int optgetaddr(uchar*, int, uchar*);
  113. int optgetbyte(uchar*, int);
  114. int optgetstr(uchar*, int, char*, int);
  115. uchar *optget(uchar*, int, int*);
  116. ulong optgetulong(uchar*, int);
  117. int optgetvec(uchar*, int, uchar*, int);
  118. int parseoptions(uchar *p, int n);
  119. int parseverb(char*);
  120. void procsetname(char *fmt, ...);
  121. void putndb(void);
  122. void tweakservers(void);
  123. void usage(void);
  124. int validip(uchar*);
  125. void writendb(char*, int, int);
  126. /*
  127. * IPv6
  128. */
  129. void dov6stuff(int);
  130. int ipconfig6(int);
  131. void recvra6(void);
  132. void sendra6(void);
  133. void v6paraminit(void);
  134. typedef struct Headers Headers;
  135. typedef struct Ip4hdr Ip4hdr;
  136. typedef struct Ip6hdr Ip6hdr;
  137. typedef struct Lladdropt Lladdropt;
  138. typedef struct Mtuopt Mtuopt;
  139. typedef struct Prefixopt Prefixopt;
  140. typedef struct Routeradv Routeradv;
  141. typedef struct Routersol Routersol;
  142. enum {
  143. IsRouter = 1,
  144. IsHostRecv = 2,
  145. IsHostNoRecv = 3,
  146. MAClen = 6,
  147. IPv4 = 4,
  148. IPv6 = 6,
  149. Defmtu = 1400,
  150. IP_HOPBYHOP = 0,
  151. ICMPv4 = 1,
  152. IP_IGMPPROTO = 2,
  153. IP_TCPPROTO = 6,
  154. IP_UDPPROTO = 17,
  155. IP_ILPROTO = 40,
  156. IP_v6ROUTE = 43,
  157. IP_v6FRAG = 44,
  158. IP_IPsecESP = 50,
  159. IP_IPsecAH = 51,
  160. IP_v6NOMORE = 59,
  161. ICMP6_RS = 133,
  162. ICMP6_RA = 134,
  163. IP_IN_IP = 41,
  164. };
  165. enum {
  166. MFMASK = 1 << 7,
  167. OCMASK = 1 << 6,
  168. OLMASK = 1 << 7,
  169. AFMASK = 1 << 6,
  170. };
  171. enum {
  172. MAXTTL = 255,
  173. IP4_VER = 0x40,
  174. IP6_VER = 0x60,
  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 Ip4hdr{
  183. uchar vihl; /* Version and header length */
  184. uchar tos; /* Type of service */
  185. uchar length[2]; /* packet length */
  186. uchar id[2]; /* ip->identification */
  187. uchar frag[2]; /* Fragment information */
  188. uchar ttl; /* Time to live */
  189. uchar proto; /* Protocol */
  190. uchar cksum[2]; /* Header checksum */
  191. uchar src[4]; /* IP source */
  192. uchar dst[4]; /* IP destination */
  193. };
  194. struct Routersol {
  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 res[4];
  205. };
  206. struct Routeradv {
  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 cttl;
  217. uchar mor;
  218. uchar routerlt[2];
  219. uchar rchbltime[4];
  220. uchar rxmtimer[4];
  221. };
  222. struct Lladdropt {
  223. uchar type;
  224. uchar len;
  225. uchar lladdr[MAClen];
  226. };
  227. struct Prefixopt {
  228. uchar type;
  229. uchar len;
  230. uchar plen;
  231. uchar lar;
  232. uchar validlt[4];
  233. uchar preflt[4];
  234. uchar reserv[4];
  235. uchar pref[IPaddrlen];
  236. };
  237. struct Mtuopt {
  238. uchar type;
  239. uchar len;
  240. uchar reserv[2];
  241. uchar mtu[4];
  242. };
  243. void ea2lla(uchar *lla, uchar *ea);
  244. void ipv62smcast(uchar *smcast, uchar *a);