pkt_captures6.cc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. // Copyright (C) 2013-2017 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this
  5. // file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6. #include <config.h>
  7. #include <dhcp/pkt6.h>
  8. #include <util/encode/hex.h>
  9. #include <dhcp/tests/pkt_captures.h>
  10. #include <string>
  11. /// @file pkt_captures6.cc
  12. ///
  13. /// @brief contains packet captures imported from Wireshark
  14. ///
  15. /// These are actual packets captured over wire. They are used in various
  16. /// tests.
  17. ///
  18. /// The procedure to export Wireshark -> unit-tests is manual, but rather
  19. /// easy to follow:
  20. /// 1. Open a file in wireshark
  21. /// 2. Find the packet you want to export
  22. /// 3. There's a protocol stack (Frame, Ethernet, IPv6, UDP, DHCPv6, ...)
  23. /// 4. Right click on DHCPv6 -> Copy -> Bytes -> Hex Stream
  24. /// 5. Paste it as: string hex_string="[paste here]";
  25. /// 6. Coding guidelines line restrictions apply, so wrap your code as necessary
  26. /// 7. Make sure you describe the capture appropriately
  27. /// 8. Follow whatever rest of the methods are doing (set ports, ifaces etc.)
  28. /// 9. To easily copy packet description, click File... -> Extract packet
  29. /// dissections -> as plain text file...
  30. /// (Make sure that the packet is expanded in the view. The text file will
  31. /// contain whatever expansion level you have in the graphical tree.)
  32. using namespace isc::dhcp;
  33. using namespace isc::asiolink;
  34. using namespace std;
  35. namespace isc {
  36. namespace dhcp {
  37. namespace test {
  38. void PktCaptures::captureSetDefaultFields(const Pkt6Ptr& pkt) {
  39. pkt->setRemotePort(546);
  40. pkt->setRemoteAddr(IOAddress("fe80::1"));
  41. pkt->setLocalPort(0);
  42. pkt->setLocalAddr(IOAddress("ff02::1:2"));
  43. pkt->setIndex(2);
  44. pkt->setIface("eth0");
  45. }
  46. // This function returns buffer for very simple Solicit
  47. Pkt6Ptr PktCaptures::captureSimpleSolicit() {
  48. uint8_t data[] = {
  49. 1, // type 1 = SOLICIT
  50. 0xca, 0xfe, 0x01, // trans-id = 0xcafe01
  51. 0, 1, // option type 1 (client-id)
  52. 0, 10, // option length 10
  53. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // DUID
  54. 0, 3, // option type 3 (IA_NA)
  55. 0, 12, // option length 12
  56. 0, 0, 0, 1, // iaid = 1
  57. 0, 0, 0, 0, // T1 = 0
  58. 0, 0, 0, 0 // T2 = 0
  59. };
  60. Pkt6Ptr pkt(new Pkt6(data, sizeof(data)));
  61. captureSetDefaultFields(pkt);
  62. return (pkt);
  63. }
  64. Pkt6Ptr PktCaptures::captureRelayedSolicit() {
  65. // This is a very simple relayed SOLICIT message:
  66. // RELAY-FORW
  67. // - interface-id
  68. // - relay-message
  69. // - SOLICIT
  70. // - client-id
  71. // - IA_NA (iaid=1, t1=0, t2=0)
  72. // - ORO (7)
  73. // string exported from Wireshark
  74. string hex_string =
  75. "0c0500000000000000000000000000000000fc00000000000000000000000000000900"
  76. "12000231350009002c010517100001000e0001000151b5e46208002758f1e80003000c"
  77. "000000010000000000000000000600020007";
  78. std::vector<uint8_t> bin;
  79. // Decode the hex string and store it in bin (which happens
  80. // to be OptionBuffer format)
  81. isc::util::encode::decodeHex(hex_string, bin);
  82. Pkt6Ptr pkt(new Pkt6(&bin[0], bin.size()));
  83. captureSetDefaultFields(pkt);
  84. return (pkt);
  85. }
  86. /// returns a buffer with relayed SOLICIT (from DOCSIS3.0 cable modem)
  87. Pkt6Ptr PktCaptures::captureDocsisRelayedSolicit() {
  88. // This is an actual DOCSIS packet
  89. // RELAY-FORW (12)
  90. // - Relay Message
  91. // - SOLICIT (1)
  92. // - client-id
  93. // - IA_NA (iaid=7f000788, t2=0, t2=0)
  94. // - IAAddress (::, pref=0,valid=0)
  95. // - rapid-commit
  96. // - elapsed
  97. // - ORO
  98. // - Reconfigure-accept
  99. // - Vendor-Class ("docsis3.0")
  100. // - Vendor-specific Info
  101. // - subopt 1: Option request = 32,33,34,37,38
  102. // - subopt 36: Device identifier
  103. // - subopt 35: TLV5
  104. // - subopt 2: Device type = ECM
  105. // - subopt 3: Embedded components
  106. // - subopt 4: Serial Number
  107. // - subopt 5: Hardware version
  108. // - subopt 6: Software version
  109. // - subopt 7: Boot ROM Version
  110. // - subopt 8: Organization Unique Identifier
  111. // - subopt 9: Model Number
  112. // - subopt 10: Vendor Name (Netgear)
  113. // - subopt 15: unknown
  114. // - Interface-Id
  115. // - Vendor-specific Information
  116. // - Suboption 1025: CMTS capabilities
  117. // - Suboption 1026: Cable Modem MAC addr = 10:0d:7f:00:07:88
  118. // string exported from Wireshark
  119. string hex_string =
  120. "0c002a0288fe00fe00015a8d09fffe7af955fe80000000000000120d7ffffe00078800"
  121. "090189010d397f0001000a00030001100d7f000788000300287f000788000000000000"
  122. "000000050018000000000000000000000000000000000000000000000000000e000000"
  123. "0800020000000600020011001400000010000f0000118b0009646f63736973332e3000"
  124. "1101200000118b0001000a0020002100220025002600240006100d7f00078800230081"
  125. "0101010201030301010401010501010601010701180801080901000a01010b01180c01"
  126. "010d0200400e0200100f01011004000000021101011301011401001501381601011701"
  127. "011801041901041a01041b01281c01021d01081e01201f011020011821010222010123"
  128. "010124011825010126020040270101120701100d7f00078a0002000345434d0003000b"
  129. "45434d3a45524f555445520004000d3335463132395550303030353200050004332e31"
  130. "310006000956312e30312e31315400070013505350552d426f6f7420312e302e31362e"
  131. "323200080006303030393542000900084347343030305444000a00074e657467656172"
  132. "000f000745524f5554455200120012427531264361312f3000100d7f00078800000011"
  133. "00160000118b040100040102030004020006100d7f000788";
  134. std::vector<uint8_t> bin;
  135. // Decode the hex string and store it in bin (which happens
  136. // to be OptionBuffer format)
  137. isc::util::encode::decodeHex(hex_string, bin);
  138. Pkt6Ptr pkt(new Pkt6(&bin[0], bin.size()));
  139. captureSetDefaultFields(pkt);
  140. return (pkt);
  141. }
  142. /// returns a buffer with relayed SOLICIT (from DOCSIS3.0 eRouter)
  143. Pkt6Ptr PktCaptures::captureeRouterRelayedSolicit() {
  144. /* Packet description exported from wireshark:
  145. DHCPv6
  146. Message type: Relay-forw (12)
  147. Hopcount: 0
  148. Link address: 2001:558:ffa8::1 (2001:558:ffa8::1)
  149. Peer address: fe80::22e5:2aff:feb8:1515 (fe80::22e5:2aff:feb8:1515)
  150. Relay Message
  151. Option: Relay Message (9)
  152. Length: 241
  153. Value: 01a90044000e000000140000000600080011001700180019...
  154. DHCPv6
  155. Message type: Solicit (1)
  156. Transaction ID: 0xa90044
  157. Rapid Commit
  158. Option: Rapid Commit (14)
  159. Length: 0
  160. Reconfigure Accept
  161. Option: Reconfigure Accept (20)
  162. Length: 0
  163. Option Request
  164. Option: Option Request (6)
  165. Length: 8
  166. Value: 0011001700180019
  167. Requested Option code: Vendor-specific Information (17)
  168. Requested Option code: DNS recursive name server (23)
  169. Requested Option code: Domain Search List (24)
  170. Requested Option code: Identity Association for Prefix Delegation (25)
  171. Vendor Class
  172. Option: Vendor Class (16)
  173. Length: 16
  174. Value: 0000118b000a65526f75746572312e30
  175. Enterprise ID: Cable Television Laboratories, Inc. (4491)
  176. vendor-class-data: eRouter1.0
  177. Vendor-specific Information
  178. Option: Vendor-specific Information (17)
  179. Length: 112
  180. Value: 0000118b0002000745524f555445520003000b45434d3a45...
  181. Enterprise ID: Cable Television Laboratories, Inc. (4491)
  182. Suboption: Device Type = (2)"EROUTER"
  183. Suboption: Embedded Components = (3)"ECM:EROUTER"
  184. Suboption: Serial Number = (4)"2BR229U40044C"
  185. Suboption: Hardware Version = (5)"1.04"
  186. Suboption: Software Version = (6)"V1.33.03"
  187. Suboption: Boot ROM Version = (7)"2.3.0R2"
  188. Suboption: Organization Unique Identifier = (8)"00095B"
  189. Suboption: Model Number = (9)"CG3000DCR"
  190. Suboption: Vendor Name = (10)"Netgear"
  191. Client Identifier
  192. Option: Client Identifier (1)
  193. Length: 10
  194. Value: 0003000120e52ab81515
  195. DUID: 0003000120e52ab81515
  196. DUID Type: link-layer address (3)
  197. Hardware type: Ethernet (1)
  198. Link-layer address: 20:e5:2a:b8:15:15
  199. Identity Association for Prefix Delegation
  200. Option: Identity Association for Prefix Delegation (25)
  201. Length: 41
  202. Value: 2ab815150000000000000000001a00190000000000000000...
  203. IAID: 2ab81515
  204. T1: 0
  205. T2: 0
  206. IA Prefix
  207. Option: IA Prefix (26)
  208. Length: 25
  209. Value: 000000000000000038000000000000000000000000000000...
  210. Preferred lifetime: 0
  211. Valid lifetime: 0
  212. Prefix length: 56
  213. Prefix address: :: (::)
  214. Identity Association for Non-temporary Address
  215. Option: Identity Association for Non-temporary Address (3)
  216. Length: 12
  217. Value: 2ab815150000000000000000
  218. IAID: 2ab81515
  219. T1: 0
  220. T2: 0
  221. Elapsed time
  222. Option: Elapsed time (8)
  223. Length: 2
  224. Value: 0000
  225. Elapsed time: 0 ms
  226. Vendor-specific Information
  227. Option: Vendor-specific Information (17)
  228. Length: 22
  229. Value: 0000118b0402000620e52ab815140401000401020300
  230. Enterprise ID: Cable Television Laboratories, Inc. (4491)
  231. Suboption: CM MAC Address Option = (1026)20:e5:2a:b8:15:14
  232. Suboption: CMTS Capabilities Option : (1025)
  233. Interface-Id
  234. Option: Interface-Id (18)
  235. Length: 4
  236. Value: 00000022
  237. Interface-ID:
  238. Remote Identifier
  239. Option: Remote Identifier (37)
  240. Length: 14
  241. Value: 0000101300015c228d4110000122
  242. Enterprise ID: Arris Interactive LLC (4115)
  243. Remote-ID: 00015c228d4110000122
  244. DHCP option 53
  245. Option: Unknown (53)
  246. Length: 10
  247. Value: 0003000100015c228d3d
  248. DUID: 0003000100015c228d3d
  249. DUID Type: link-layer address (3)
  250. Hardware type: Ethernet (1)
  251. Link-layer address: 00:01:5c:22:8d:3d */
  252. // string exported from Wireshark
  253. string hex_string =
  254. "0c0020010558ffa800000000000000000001fe8000000000000022e52afffeb8151500"
  255. "0900f101a90044000e000000140000000600080011001700180019001000100000118b"
  256. "000a65526f75746572312e30001100700000118b0002000745524f555445520003000b"
  257. "45434d3a45524f555445520004000d3242523232395534303034344300050004312e30"
  258. "340006000856312e33332e303300070007322e332e3052320008000630303039354200"
  259. "090009434733303030444352000a00074e6574676561720001000a0003000120e52ab8"
  260. "1515001900292ab815150000000000000000001a001900000000000000003800000000"
  261. "0000000000000000000000000003000c2ab81515000000000000000000080002000000"
  262. "1100160000118b0402000620e52ab81514040100040102030000120004000000220025"
  263. "000e0000101300015c228d41100001220035000a0003000100015c228d3d";
  264. std::vector<uint8_t> bin;
  265. // Decode the hex string and store it in bin (which happens
  266. // to be OptionBuffer format)
  267. isc::util::encode::decodeHex(hex_string, bin);
  268. Pkt6Ptr pkt(new Pkt6(&bin[0], bin.size()));
  269. captureSetDefaultFields(pkt);
  270. return (pkt);
  271. }
  272. Pkt6Ptr PktCaptures::captureCableLabsShortVendorClass() {
  273. // This is a simple non-relayed Solicit:
  274. // - client-identifier
  275. // - IA_NA
  276. // - Vendor Class (4 bytes)
  277. // - enterprise-id 4491
  278. // - Vendor-specific Information
  279. // - enterprise-id 4491
  280. std::string hex_string =
  281. "01671cb90001000e0001000152ea903a08002758f1e80003000c00004bd10000000000"
  282. "000000001000040000118b0011000a0000118b000100020020";
  283. std::vector<uint8_t> bin;
  284. // Decode the hex string and store it in bin (which happens
  285. // to be OptionBuffer format)
  286. isc::util::encode::decodeHex(hex_string, bin);
  287. Pkt6Ptr pkt(new Pkt6(&bin[0], bin.size()));
  288. captureSetDefaultFields(pkt);
  289. return (pkt);
  290. }
  291. /// @brief creates doubly relayed solicit message
  292. ///
  293. /// This is a traffic capture exported from wireshark and manually modified
  294. /// to include necessary options (RSOO). It includes a SOLICIT message
  295. /// that passed through two relays. It is especially interesting,
  296. /// because of the following properties:
  297. /// - double encapsulation
  298. /// - first relay inserts relay-msg before extra options
  299. /// - second relay inserts relay-msg after extra options
  300. /// - both relays are from different vendors
  301. /// - interface-id are different for each relay
  302. /// - first relay inserts valid remote-id
  303. /// - second relay inserts remote-id with empty vendor data
  304. /// - the solicit message requests for custom options in ORO
  305. /// - there are option types in RELAY-FORW that do not appear in SOLICIT
  306. /// - there are option types in SOLICT that do not appear in RELAY-FORW
  307. ///
  308. /// RELAY-FORW
  309. /// - relay message option
  310. /// - RELAY-FORW
  311. /// - rsoo (66)
  312. /// - option 255 (len 4)
  313. /// - option 256 (len 9)
  314. /// - remote-id option (37)
  315. /// - relay message option
  316. /// - SOLICIT
  317. /// - client-id option
  318. /// - ia_na option
  319. /// - elapsed time
  320. /// - ORO
  321. /// - interface-id option (18)
  322. /// - remote-id option (37)
  323. ///
  324. /// The original capture was posted to dibbler users mailing list.
  325. ///
  326. /// @return created double relayed SOLICIT message
  327. isc::dhcp::Pkt6Ptr PktCaptures::captureRelayed2xRSOO() {
  328. // string exported from Wireshark
  329. string hex_string =
  330. "0c01200108880db800010000000000000000fe80000000000000020021fffe5c18a9"
  331. "0009007d0c0000000000000000000000000000000000fe80000000000000020021fffe5c18a9"
  332. "00420015" // RSOO (includes ...
  333. "00ff000401020304" // ... option 255, len 4, content 0x01020304
  334. "01000009010203040506070809" // ... option 256, len 9, content 0x010203040506070809
  335. "0025000400000de9" // remote-id
  336. "00090036" // relay-msg, len 54
  337. "016b4fe2" // solicit"
  338. "0001000e0001000118b033410000215c18a9" // client-id
  339. "0003000c00000001ffffffffffffffff" // ia-na
  340. "000800020000"
  341. "00060006001700f200f3"
  342. "0012001c4953414d3134347c3239397c697076367c6e743a76703a313a" // vendor-class
  343. "313130002500120000197f0001000118b033410000215c18a9";
  344. std::vector<uint8_t> bin;
  345. // Decode the hex string and store it in bin (which happens
  346. // to be OptionBuffer format)
  347. isc::util::encode::decodeHex(hex_string, bin);
  348. Pkt6Ptr pkt(new Pkt6(&bin[0], bin.size()));
  349. pkt->setRemotePort(547);
  350. pkt->setRemoteAddr(IOAddress("fe80::1234"));
  351. pkt->setLocalPort(547);
  352. pkt->setLocalAddr(IOAddress("ff05::1:3"));
  353. pkt->setIndex(2);
  354. pkt->setIface("eth0");
  355. return (pkt);
  356. }
  357. }; // end of isc::dhcp::test namespace
  358. }; // end of isc::dhcp namespace
  359. }; // end of isc namespace