ipv6.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #ifndef MIN
  2. #define MIN(a, b) ((a) <= (b)? (a): (b))
  3. #endif
  4. /* rfc 3513 defines the address prefices */
  5. #define isv6mcast(addr) ((addr)[0] == 0xff)
  6. #define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
  7. #define issitelocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0xc0)
  8. #define isv6global(addr) (((addr)[0] & 0xe0) == 0x20)
  9. #define optexsts(np) (nhgets((np)->ploadlen) > 24)
  10. #define issmcast(addr) (memcmp((addr), v6solicitednode, 13) == 0)
  11. /* from RFC 2460 */
  12. enum { /* Header Types */
  13. HBH = 0, /* hop-by-hop multicast routing protocol */
  14. ICMP = 1,
  15. IGMP = 2,
  16. GGP = 3,
  17. IPINIP = 4,
  18. ST = 5,
  19. TCP = 6,
  20. UDP = 17,
  21. ISO_TP4 = 29,
  22. RH = 43,
  23. FH = 44,
  24. IDRP = 45,
  25. RSVP = 46,
  26. AH = 51,
  27. ESP = 52,
  28. ICMPv6 = 58,
  29. NNH = 59,
  30. DOH = 60,
  31. ISO_IP = 80,
  32. IGRP = 88,
  33. OSPF = 89,
  34. Maxhdrtype = 256,
  35. };
  36. enum {
  37. /* multicast flags and scopes */
  38. Well_known_flg = 0,
  39. Transient_flg = 1,
  40. Node_local_scop = 1,
  41. Link_local_scop = 2,
  42. Site_local_scop = 5,
  43. Org_local_scop = 8,
  44. Global_scop = 14,
  45. /* various prefix lengths */
  46. SOLN_PREF_LEN = 13,
  47. /* icmpv6 unreach codes */
  48. icmp6_no_route = 0,
  49. icmp6_ad_prohib = 1,
  50. icmp6_unassigned = 2,
  51. icmp6_adr_unreach = 3,
  52. icmp6_port_unreach = 4,
  53. icmp6_unkn_code = 5,
  54. /* various flags & constants */
  55. v6MINTU = 1280,
  56. HOP_LIMIT = 255,
  57. ETHERHDR_LEN = 14,
  58. IPV6HDR_LEN = 40,
  59. IPV4HDR_LEN = 20,
  60. /* option types */
  61. SRC_LLADDR = 1,
  62. TARGET_LLADDR = 2,
  63. PREFIX_INFO = 3,
  64. REDIR_HEADER = 4,
  65. MTU_OPTION = 5,
  66. SRC_UNSPEC = 0,
  67. SRC_UNI = 1,
  68. TARG_UNI = 2,
  69. TARG_MULTI = 3,
  70. t_unitent = 1,
  71. t_uniproxy = 2,
  72. t_unirany = 3,
  73. /* Router constants (all times in milliseconds) */
  74. MAX_INIT_RTR_ADVERT_INTVL = 16000,
  75. MAX_INIT_RTR_ADVERTS = 3,
  76. MAX_FINAL_RTR_ADVERTS = 3,
  77. MIN_DELAY_BETWEEN_RAS = 3000,
  78. MAX_RA_DELAY_TIME = 500,
  79. /* Host constants */
  80. MAX_RTR_SOLICIT_DELAY = 1000,
  81. RTR_SOLICIT_INTVL = 4000,
  82. MAX_RTR_SOLICITS = 3,
  83. /* Node constants */
  84. MAX_MULTICAST_SOLICIT = 3,
  85. MAX_UNICAST_SOLICIT = 3,
  86. MAX_ANYCAST_DELAY_TIME = 1000,
  87. MAX_NEIGHBOR_ADVERT = 3,
  88. REACHABLE_TIME = 30000,
  89. RETRANS_TIMER = 1000,
  90. DELAY_FIRST_PROBE_TIME = 5000,
  91. };
  92. typedef struct Ip6hdr Ip6hdr;
  93. typedef struct Opthdr Opthdr;
  94. typedef struct Routinghdr Routinghdr;
  95. typedef struct Fraghdr6 Fraghdr6;
  96. struct Ip6hdr {
  97. uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */
  98. uchar ploadlen[2]; /* payload length: packet length - 40 */
  99. uchar proto; /* next header type */
  100. uchar ttl; /* hop limit */
  101. uchar src[IPaddrlen];
  102. uchar dst[IPaddrlen];
  103. };
  104. struct Opthdr {
  105. uchar nexthdr;
  106. uchar len;
  107. };
  108. struct Routinghdr {
  109. uchar nexthdr;
  110. uchar len;
  111. uchar rtetype;
  112. uchar segrem;
  113. };
  114. struct Fraghdr6 {
  115. uchar nexthdr;
  116. uchar res;
  117. uchar offsetRM[2]; /* Offset, Res, M flag */
  118. uchar id[4];
  119. };
  120. extern uchar v6allnodesN[IPaddrlen];
  121. extern uchar v6allnodesL[IPaddrlen];
  122. extern uchar v6allroutersN[IPaddrlen];
  123. extern uchar v6allroutersL[IPaddrlen];
  124. extern uchar v6allnodesNmask[IPaddrlen];
  125. extern uchar v6allnodesLmask[IPaddrlen];
  126. extern uchar v6allroutersS[IPaddrlen];
  127. extern uchar v6solicitednode[IPaddrlen];
  128. extern uchar v6solicitednodemask[IPaddrlen];
  129. extern uchar v6Unspecified[IPaddrlen];
  130. extern uchar v6loopback[IPaddrlen];
  131. extern uchar v6loopbackmask[IPaddrlen];
  132. extern uchar v6linklocal[IPaddrlen];
  133. extern uchar v6linklocalmask[IPaddrlen];
  134. extern uchar v6sitelocal[IPaddrlen];
  135. extern uchar v6sitelocalmask[IPaddrlen];
  136. extern uchar v6glunicast[IPaddrlen];
  137. extern uchar v6multicast[IPaddrlen];
  138. extern uchar v6multicastmask[IPaddrlen];
  139. extern int v6llpreflen;
  140. extern int v6slpreflen;
  141. extern int v6lbpreflen;
  142. extern int v6mcpreflen;
  143. extern int v6snpreflen;
  144. extern int v6aNpreflen;
  145. extern int v6aLpreflen;
  146. extern int ReTransTimer;
  147. void ipv62smcast(uchar *, uchar *);
  148. void icmpns(Fs *f, uchar* src, int suni, uchar* targ, int tuni, uchar* mac);
  149. void icmpna(Fs *f, uchar* src, uchar* dst, uchar* targ, uchar* mac, uchar flags);
  150. void icmpttlexceeded6(Fs *f, Ipifc *ifc, Block *bp);
  151. void icmppkttoobig6(Fs *f, Ipifc *ifc, Block *bp);
  152. void icmphostunr(Fs *f, Ipifc *ifc, Block *bp, int code, int free);