ipv6.h 4.2 KB

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