ipconfig.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  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 nip;
  80. extern int plan9;
  81. extern int dupl_disc;
  82. extern Conf conf;
  83. extern int myifc;
  84. extern char *vs;
  85. void adddefroute(char*, uchar*);
  86. void binddevice(void);
  87. void bootprequest(void);
  88. void controldevice(void);
  89. void dhcpquery(int, int);
  90. void dhcprecv(void);
  91. void dhcpsend(int);
  92. int dhcptimer(void);
  93. void dhcpwatch(int);
  94. void doadd(int);
  95. void doremove(void);
  96. void dounbind(void);
  97. int getndb(void);
  98. int ipconfig4(void);
  99. int ipconfig6(int);
  100. void lookforip(char*);
  101. void mkclientid(void);
  102. int nipifcs(char*);
  103. int openlisten(void);
  104. uchar *optaddaddr(uchar*, int, uchar*);
  105. uchar *optaddbyte(uchar*, int, int);
  106. uchar *optaddstr(uchar*, int, char*);
  107. uchar *optadd(uchar*, int, void*, int);
  108. uchar *optaddulong(uchar*, int, ulong);
  109. uchar *optaddvec(uchar*, int, uchar*, int);
  110. int optgetaddrs(uchar*, int, uchar*, int);
  111. int optgetaddr(uchar*, int, uchar*);
  112. int optgetbyte(uchar*, int);
  113. int optgetstr(uchar*, int, char*, int);
  114. uchar *optget(uchar*, int, int*);
  115. ulong optgetulong(uchar*, int);
  116. int optgetvec(uchar*, int, uchar*, int);
  117. int parseoptions(uchar *p, int n);
  118. int parseverb(char*);
  119. void procsetname(char *fmt, ...);
  120. void putndb(void);
  121. void tweakservers(void);
  122. void usage(void);
  123. int validip(uchar*);
  124. void writendb(char*, int, int);
  125. /*
  126. * IPv6
  127. */
  128. void doipv6(int);
  129. int ipconfig6(int);
  130. void recvra6(void);
  131. void sendra6(void);
  132. void v6paraminit(Conf *);
  133. typedef struct Headers Headers;
  134. typedef struct Ip4hdr Ip4hdr;
  135. typedef struct Ip6hdr Ip6hdr;
  136. typedef struct Lladdropt Lladdropt;
  137. typedef struct Mtuopt Mtuopt;
  138. typedef struct Prefixopt Prefixopt;
  139. typedef struct Routeradv Routeradv;
  140. typedef struct Routersol Routersol;
  141. enum {
  142. IsRouter = 1,
  143. IsHostRecv = 2,
  144. IsHostNoRecv = 3,
  145. MAClen = 6,
  146. IPv4 = 4,
  147. IPv6 = 6,
  148. Defmtu = 1400,
  149. IP_HOPBYHOP = 0,
  150. ICMPv4 = 1,
  151. IP_IGMPPROTO = 2,
  152. IP_TCPPROTO = 6,
  153. IP_UDPPROTO = 17,
  154. IP_ILPROTO = 40,
  155. IP_v6ROUTE = 43,
  156. IP_v6FRAG = 44,
  157. IP_IPsecESP = 50,
  158. IP_IPsecAH = 51,
  159. IP_v6NOMORE = 59,
  160. ICMP6_RS = 133,
  161. ICMP6_RA = 134,
  162. IP_IN_IP = 41,
  163. };
  164. enum {
  165. MFMASK = 1 << 7,
  166. OCMASK = 1 << 6,
  167. OLMASK = 1 << 7,
  168. AFMASK = 1 << 6,
  169. };
  170. enum {
  171. MAXTTL = 255,
  172. IP4_VER = 0x40,
  173. IP6_VER = 0x60,
  174. D64HLEN = IPV6HDR_LEN - IPV4HDR_LEN,
  175. IP_MAX = 32*1024,
  176. };
  177. struct Headers {
  178. uchar dst[IPaddrlen];
  179. uchar src[IPaddrlen];
  180. };
  181. struct Ip4hdr{
  182. uchar vihl; /* Version and header length */
  183. uchar tos; /* Type of service */
  184. uchar length[2]; /* packet length */
  185. uchar id[2]; /* ip->identification */
  186. uchar frag[2]; /* Fragment information */
  187. uchar ttl; /* Time to live */
  188. uchar proto; /* Protocol */
  189. uchar cksum[2]; /* Header checksum */
  190. uchar src[4]; /* IP source */
  191. uchar dst[4]; /* IP destination */
  192. };
  193. struct Routersol {
  194. uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */
  195. uchar ploadlen[2]; /* payload length: packet length - 40 */
  196. uchar proto; /* next header type */
  197. uchar ttl; /* hop limit */
  198. uchar src[IPaddrlen];
  199. uchar dst[IPaddrlen];
  200. uchar type;
  201. uchar code;
  202. uchar cksum[2];
  203. uchar res[4];
  204. };
  205. struct Routeradv {
  206. uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */
  207. uchar ploadlen[2]; /* payload length: packet length - 40 */
  208. uchar proto; /* next header type */
  209. uchar ttl; /* hop limit */
  210. uchar src[IPaddrlen];
  211. uchar dst[IPaddrlen];
  212. uchar type;
  213. uchar code;
  214. uchar cksum[2];
  215. uchar cttl;
  216. uchar mor;
  217. uchar routerlt[2];
  218. uchar rchbltime[4];
  219. uchar rxmtimer[4];
  220. };
  221. struct Lladdropt {
  222. uchar type;
  223. uchar len;
  224. uchar lladdr[MAClen];
  225. };
  226. struct Prefixopt {
  227. uchar type;
  228. uchar len;
  229. uchar plen;
  230. uchar lar;
  231. uchar validlt[4];
  232. uchar preflt[4];
  233. uchar reserv[4];
  234. uchar pref[IPaddrlen];
  235. };
  236. struct Mtuopt {
  237. uchar type;
  238. uchar len;
  239. uchar reserv[2];
  240. uchar mtu[4];
  241. };
  242. void ea2lla(uchar *lla, uchar *ea);
  243. void ipv62smcast(uchar *smcast, uchar *a);