ipv6.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*
  2. * Internet Protocol Version 6
  3. *
  4. * rfc2460 defines the protocol, rfc2461 neighbour discovery, and
  5. * rfc2462 address autoconfiguration. rfc4443 defines ICMP; was rfc2463.
  6. * rfc4291 defines the address architecture (including prefices), was rfc3513.
  7. * rfc4007 defines the scoped address architecture.
  8. *
  9. * global unicast is anything but unspecified (::), loopback (::1),
  10. * multicast (ff00::/8), and link-local unicast (fe80::/10).
  11. *
  12. * site-local (fec0::/10) is now deprecated, originally by rfc3879.
  13. *
  14. * Unique Local IPv6 Unicast Addresses are defined by rfc4193.
  15. * prefix is fc00::/7, scope is global, routing is limited to roughly a site.
  16. */
  17. #define isv6mcast(addr) ((addr)[0] == 0xff)
  18. #define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
  19. #define optexsts(np) (nhgets((np)->ploadlen) > 24)
  20. #define issmcast(addr) (memcmp((addr), v6solicitednode, 13) == 0)
  21. #ifndef MIN
  22. #define MIN(a, b) ((a) <= (b)? (a): (b))
  23. #endif
  24. enum { /* Header Types */
  25. HBH = 0, /* hop-by-hop multicast routing protocol */
  26. ICMP = 1,
  27. IGMP = 2,
  28. GGP = 3,
  29. IPINIP = 4,
  30. ST = 5,
  31. TCP = 6,
  32. UDP = 17,
  33. ISO_TP4 = 29,
  34. RH = 43,
  35. FH = 44,
  36. IDRP = 45,
  37. RSVP = 46,
  38. AH = 51,
  39. ESP = 52,
  40. ICMPv6 = 58,
  41. NNH = 59,
  42. DOH = 60,
  43. ISO_IP = 80,
  44. IGRP = 88,
  45. OSPF = 89,
  46. Maxhdrtype = 256,
  47. };
  48. enum {
  49. /* multicast flags and scopes */
  50. // Well_known_flg = 0,
  51. // Transient_flg = 1,
  52. // Interface_local_scop = 1,
  53. Link_local_scop = 2,
  54. // Site_local_scop = 5,
  55. // Org_local_scop = 8,
  56. Global_scop = 14,
  57. /* various prefix lengths */
  58. SOLN_PREF_LEN = 13,
  59. /* icmpv6 unreachability codes */
  60. Icmp6_no_route = 0,
  61. Icmp6_ad_prohib = 1,
  62. Icmp6_out_src_scope = 2,
  63. Icmp6_adr_unreach = 3,
  64. Icmp6_port_unreach = 4,
  65. Icmp6_gress_src_fail = 5,
  66. Icmp6_rej_route = 6,
  67. Icmp6_unknown = 7, /* our own invention for internal use */
  68. /* various flags & constants */
  69. v6MINTU = 1280,
  70. HOP_LIMIT = 255,
  71. ETHERHDR_LEN = 14,
  72. IPV6HDR_LEN = 40,
  73. IPV4HDR_LEN = 20,
  74. /* option types */
  75. SRC_LLADDR = 1,
  76. TARGET_LLADDR = 2,
  77. PREFIX_INFO = 3,
  78. REDIR_HEADER = 4,
  79. MTU_OPTION = 5,
  80. SRC_UNSPEC = 0,
  81. SRC_UNI = 1,
  82. TARG_UNI = 2,
  83. TARG_MULTI = 3,
  84. Tunitent = 1,
  85. Tuniproxy = 2,
  86. Tunirany = 3,
  87. /* Router constants (all times in milliseconds) */
  88. MAX_INIT_RTR_ADVERT_INTVL = 16000,
  89. MAX_INIT_RTR_ADVERTS = 3,
  90. MAX_FINAL_RTR_ADVERTS = 3,
  91. MIN_DELAY_BETWEEN_RAS = 3000,
  92. MAX_RA_DELAY_TIME = 500,
  93. /* Host constants */
  94. MAX_RTR_SOLICIT_DELAY = 1000,
  95. RTR_SOLICIT_INTVL = 4000,
  96. MAX_RTR_SOLICITS = 3,
  97. /* Node constants */
  98. MAX_MULTICAST_SOLICIT = 3,
  99. MAX_UNICAST_SOLICIT = 3,
  100. MAX_ANYCAST_DELAY_TIME = 1000,
  101. MAX_NEIGHBOR_ADVERT = 3,
  102. REACHABLE_TIME = 30000,
  103. RETRANS_TIMER = 1000,
  104. DELAY_FIRST_PROBE_TIME = 5000,
  105. };
  106. typedef struct Ip6hdr Ip6hdr;
  107. typedef struct Opthdr Opthdr;
  108. typedef struct Routinghdr Routinghdr;
  109. typedef struct Fraghdr6 Fraghdr6;
  110. struct Ip6hdr {
  111. uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */
  112. uchar ploadlen[2]; /* payload length: packet length - 40 */
  113. uchar proto; /* next header type */
  114. uchar ttl; /* hop limit */
  115. uchar src[IPaddrlen];
  116. uchar dst[IPaddrlen];
  117. };
  118. struct Opthdr {
  119. uchar nexthdr;
  120. uchar len;
  121. };
  122. struct Routinghdr {
  123. uchar nexthdr;
  124. uchar len;
  125. uchar rtetype;
  126. uchar segrem;
  127. };
  128. struct Fraghdr6 {
  129. uchar nexthdr;
  130. uchar res;
  131. uchar offsetRM[2]; /* Offset, Res, M flag */
  132. uchar id[4];
  133. };
  134. extern uchar v6allnodesN[IPaddrlen];
  135. extern uchar v6allnodesL[IPaddrlen];
  136. extern uchar v6allroutersN[IPaddrlen];
  137. extern uchar v6allroutersL[IPaddrlen];
  138. extern uchar v6allnodesNmask[IPaddrlen];
  139. extern uchar v6allnodesLmask[IPaddrlen];
  140. extern uchar v6allroutersS[IPaddrlen];
  141. extern uchar v6solicitednode[IPaddrlen];
  142. extern uchar v6solicitednodemask[IPaddrlen];
  143. extern uchar v6Unspecified[IPaddrlen];
  144. extern uchar v6loopback[IPaddrlen];
  145. extern uchar v6loopbackmask[IPaddrlen];
  146. extern uchar v6linklocal[IPaddrlen];
  147. extern uchar v6linklocalmask[IPaddrlen];
  148. extern uchar v6glunicast[IPaddrlen];
  149. extern uchar v6multicast[IPaddrlen];
  150. extern uchar v6multicastmask[IPaddrlen];
  151. extern int v6llpreflen;
  152. extern int v6lbpreflen;
  153. extern int v6mcpreflen;
  154. extern int v6snpreflen;
  155. extern int v6aNpreflen;
  156. extern int v6aLpreflen;
  157. extern int ReTransTimer;
  158. void ipv62smcast(uchar *, uchar *);
  159. void icmpns(Fs *f, uchar* src, int suni, uchar* targ, int tuni, uchar* mac);
  160. void icmpna(Fs *f, uchar* src, uchar* dst, uchar* targ, uchar* mac, uchar flags);
  161. void icmpttlexceeded6(Fs *f, Ipifc *ifc, Block *bp);
  162. void icmppkttoobig6(Fs *f, Ipifc *ifc, Block *bp);
  163. void icmphostunr(Fs *f, Ipifc *ifc, Block *bp, int code, int free);