You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Packet.cpp 16KB

5 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. #include <atomic>
  2. #include "Util/MD5.h"
  3. #include "Util/logger.h"
  4. #include "Packet.hpp"
  5. namespace SRT {
  6. const size_t DataPacket::HEADER_SIZE;
  7. const size_t ControlPacket::HEADER_SIZE;
  8. const size_t HandshakePacket::HS_CONTENT_MIN_SIZE;
  9. bool DataPacket::isDataPacket(uint8_t *buf, size_t len) {
  10. if (len < HEADER_SIZE) {
  11. WarnL << "data size" << len << " less " << HEADER_SIZE;
  12. return false;
  13. }
  14. if (!(buf[0] & 0x80)) {
  15. return true;
  16. }
  17. return false;
  18. }
  19. uint32_t DataPacket::getSocketID(uint8_t *buf, size_t len) {
  20. uint8_t *ptr = buf;
  21. ptr += 12;
  22. return loadUint32(ptr);
  23. }
  24. bool DataPacket::loadFromData(uint8_t *buf, size_t len) {
  25. if (len < HEADER_SIZE) {
  26. WarnL << "data size" << len << " less " << HEADER_SIZE;
  27. return false;
  28. }
  29. uint8_t *ptr = buf;
  30. f = ptr[0] >> 7;
  31. packet_seq_number = loadUint32(ptr) & 0x7fffffff;
  32. ptr += 4;
  33. PP = ptr[0] >> 6;
  34. O = (ptr[0] & 0x20) >> 5;
  35. KK = (ptr[0] & 0x18) >> 3;
  36. R = (ptr[0] & 0x04) >> 2;
  37. msg_number = (ptr[0] & 0x03) << 24 | ptr[1] << 12 | ptr[2] << 8 | ptr[3];
  38. ptr += 4;
  39. timestamp = loadUint32(ptr);
  40. ptr += 4;
  41. dst_socket_id = loadUint32(ptr);
  42. ptr += 4;
  43. _data = BufferRaw::create();
  44. _data->assign((char *)(buf), len);
  45. return true;
  46. }
  47. bool DataPacket::storeToHeader() {
  48. if (!_data || _data->size() < HEADER_SIZE) {
  49. WarnL << "data size less " << HEADER_SIZE;
  50. return false;
  51. }
  52. uint8_t *ptr = (uint8_t *)_data->data();
  53. ptr[0] = packet_seq_number >> 24;
  54. ptr[1] = (packet_seq_number >> 16) & 0xff;
  55. ptr[2] = (packet_seq_number >> 8) & 0xff;
  56. ptr[3] = packet_seq_number & 0xff;
  57. ptr += 4;
  58. ptr[0] = PP << 6;
  59. ptr[0] |= O << 5;
  60. ptr[0] |= KK << 3;
  61. ptr[0] |= R << 2;
  62. ptr[0] |= (msg_number & 0xff000000) >> 24;
  63. ptr[1] = (msg_number & 0xff0000) >> 16;
  64. ptr[2] = (msg_number & 0xff00) >> 8;
  65. ptr[3] = msg_number & 0xff;
  66. ptr += 4;
  67. storeUint32(ptr, timestamp);
  68. ptr += 4;
  69. storeUint32(ptr, dst_socket_id);
  70. ptr += 4;
  71. return true;
  72. }
  73. bool DataPacket::storeToData(uint8_t *buf, size_t len) {
  74. _data = BufferRaw::create();
  75. _data->setCapacity(len + HEADER_SIZE);
  76. _data->setSize(len + HEADER_SIZE);
  77. uint8_t *ptr = (uint8_t *)_data->data();
  78. ptr[0] = packet_seq_number >> 24;
  79. ptr[1] = (packet_seq_number >> 16) & 0xff;
  80. ptr[2] = (packet_seq_number >> 8) & 0xff;
  81. ptr[3] = packet_seq_number & 0xff;
  82. ptr += 4;
  83. ptr[0] = PP << 6;
  84. ptr[0] |= O << 5;
  85. ptr[0] |= KK << 3;
  86. ptr[0] |= R << 2;
  87. ptr[0] |= (msg_number & 0xff000000) >> 24;
  88. ptr[1] = (msg_number & 0xff0000) >> 16;
  89. ptr[2] = (msg_number & 0xff00) >> 8;
  90. ptr[3] = msg_number & 0xff;
  91. ptr += 4;
  92. storeUint32(ptr, timestamp);
  93. ptr += 4;
  94. storeUint32(ptr, dst_socket_id);
  95. ptr += 4;
  96. memcpy(ptr, buf, len);
  97. return true;
  98. }
  99. char *DataPacket::data() const {
  100. if (!_data)
  101. return nullptr;
  102. return _data->data();
  103. }
  104. size_t DataPacket::size() const {
  105. if (!_data) {
  106. return 0;
  107. }
  108. return _data->size();
  109. }
  110. char *DataPacket::payloadData() {
  111. if (!_data)
  112. return nullptr;
  113. return _data->data() + HEADER_SIZE;
  114. }
  115. size_t DataPacket::payloadSize() {
  116. if (!_data) {
  117. return 0;
  118. }
  119. return _data->size() - HEADER_SIZE;
  120. }
  121. bool ControlPacket::isControlPacket(uint8_t *buf, size_t len) {
  122. if (len < HEADER_SIZE) {
  123. WarnL << "data size" << len << " less " << HEADER_SIZE;
  124. return false;
  125. }
  126. if (buf[0] & 0x80) {
  127. return true;
  128. }
  129. return false;
  130. }
  131. uint16_t ControlPacket::getControlType(uint8_t *buf, size_t len) {
  132. uint8_t *ptr = buf;
  133. uint16_t control_type = (ptr[0] & 0x7f) << 8 | ptr[1];
  134. return control_type;
  135. }
  136. bool ControlPacket::loadHeader() {
  137. uint8_t *ptr = (uint8_t *)_data->data();
  138. f = ptr[0] >> 7;
  139. control_type = (ptr[0] & 0x7f) << 8 | ptr[1];
  140. ptr += 2;
  141. sub_type = loadUint16(ptr);
  142. ptr += 2;
  143. type_specific_info[0] = ptr[0];
  144. type_specific_info[1] = ptr[1];
  145. type_specific_info[2] = ptr[2];
  146. type_specific_info[3] = ptr[3];
  147. ptr += 4;
  148. timestamp = loadUint32(ptr);
  149. ptr += 4;
  150. dst_socket_id = loadUint32(ptr);
  151. ptr += 4;
  152. return true;
  153. }
  154. bool ControlPacket::storeToHeader() {
  155. uint8_t *ptr = (uint8_t *)_data->data();
  156. ptr[0] = 0x80;
  157. ptr[0] |= control_type >> 8;
  158. ptr[1] = control_type & 0xff;
  159. ptr += 2;
  160. storeUint16(ptr, sub_type);
  161. ptr += 2;
  162. ptr[0] = type_specific_info[0];
  163. ptr[1] = type_specific_info[1];
  164. ptr[2] = type_specific_info[2];
  165. ptr[3] = type_specific_info[3];
  166. ptr += 4;
  167. storeUint32(ptr, timestamp);
  168. ptr += 4;
  169. storeUint32(ptr, dst_socket_id);
  170. ptr += 4;
  171. return true;
  172. }
  173. char *ControlPacket::data() const {
  174. if (!_data)
  175. return nullptr;
  176. return _data->data();
  177. }
  178. size_t ControlPacket::size() const {
  179. if (!_data) {
  180. return 0;
  181. }
  182. return _data->size();
  183. }
  184. uint32_t ControlPacket::getSocketID(uint8_t *buf, size_t len) {
  185. return loadUint32(buf + 12);
  186. }
  187. std::string HandshakePacket::dump(){
  188. _StrPrinter printer;
  189. printer <<"flag:"<< (int)f<<"\r\n";
  190. printer <<"control_type:"<< (int)control_type<<"\r\n";
  191. printer <<"sub_type:"<< (int)sub_type<<"\r\n";
  192. printer <<"type_specific_info:"<< (int)type_specific_info[0]<<":"<<(int)type_specific_info[1]<<":"<<(int)type_specific_info[2]<<":"<<(int)type_specific_info[3]<<"\r\n";
  193. printer <<"timestamp:"<< timestamp<<"\r\n";
  194. printer <<"dst_socket_id:"<< dst_socket_id<<"\r\n";
  195. printer <<"version:"<< version<<"\r\n";
  196. printer <<"encryption_field:"<< encryption_field<<"\r\n";
  197. printer <<"extension_field:"<< extension_field<<"\r\n";
  198. printer <<"initial_packet_sequence_number:"<< initial_packet_sequence_number<<"\r\n";
  199. printer <<"mtu:"<< mtu<<"\r\n";
  200. printer <<"max_flow_window_size:"<< max_flow_window_size<<"\r\n";
  201. printer <<"handshake_type:"<< handshake_type<<"\r\n";
  202. printer <<"srt_socket_id:"<< srt_socket_id<<"\r\n";
  203. printer <<"syn_cookie:"<< syn_cookie<<"\r\n";
  204. printer <<"peer_ip_addr:";
  205. for(size_t i=0;i<sizeof(peer_ip_addr);++i){
  206. printer<<(int)peer_ip_addr[i]<<":";
  207. }
  208. printer<<"\r\n";
  209. for(size_t i=0;i<ext_list.size();++i){
  210. printer<<ext_list[i]->dump()<<"\r\n";
  211. }
  212. return std::move(printer);
  213. }
  214. bool HandshakePacket::loadFromData(uint8_t *buf, size_t len) {
  215. if (HEADER_SIZE + HS_CONTENT_MIN_SIZE > len) {
  216. ErrorL << "size too smalle " << encryption_field;
  217. return false;
  218. }
  219. _data = BufferRaw::create();
  220. _data->assign((char *)(buf), len);
  221. ControlPacket::loadHeader();
  222. uint8_t *ptr = (uint8_t *)_data->data() + HEADER_SIZE;
  223. // parse CIF
  224. version = loadUint32(ptr);
  225. ptr += 4;
  226. encryption_field = loadUint16(ptr);
  227. ptr += 2;
  228. extension_field = loadUint16(ptr);
  229. ptr += 2;
  230. initial_packet_sequence_number = loadUint32(ptr);
  231. ptr += 4;
  232. mtu = loadUint32(ptr);
  233. ptr += 4;
  234. max_flow_window_size = loadUint32(ptr);
  235. ptr += 4;
  236. handshake_type = loadUint32(ptr);
  237. ptr += 4;
  238. srt_socket_id = loadUint32(ptr);
  239. ptr += 4;
  240. syn_cookie = loadUint32(ptr);
  241. ptr += 4;
  242. memcpy(peer_ip_addr, ptr, sizeof(peer_ip_addr) * sizeof(peer_ip_addr[0]));
  243. ptr += sizeof(peer_ip_addr) * sizeof(peer_ip_addr[0]);
  244. if (encryption_field != NO_ENCRYPTION) {
  245. ErrorL << "not support encryption " << encryption_field;
  246. }
  247. if (extension_field == 0) {
  248. return true;
  249. }
  250. if (len == HEADER_SIZE + HS_CONTENT_MIN_SIZE) {
  251. // ErrorL << "extension filed not exist " << extension_field;
  252. return true;
  253. }
  254. return loadExtMessage(ptr, len - HS_CONTENT_MIN_SIZE - HEADER_SIZE);
  255. }
  256. bool HandshakePacket::loadExtMessage(uint8_t *buf, size_t len) {
  257. uint8_t *ptr = buf;
  258. ext_list.clear();
  259. uint16_t type;
  260. uint16_t length;
  261. HSExt::Ptr ext;
  262. while (ptr < buf + len) {
  263. type = loadUint16(ptr);
  264. length = loadUint16(ptr + 2);
  265. switch (type) {
  266. case HSExt::SRT_CMD_HSREQ:
  267. case HSExt::SRT_CMD_HSRSP: ext = std::make_shared<HSExtMessage>(); break;
  268. case HSExt::SRT_CMD_SID: ext = std::make_shared<HSExtStreamID>(); break;
  269. default: WarnL << "not support ext " << type; break;
  270. }
  271. if (ext) {
  272. if (ext->loadFromData(ptr, length * 4 + 4)) {
  273. ext_list.push_back(std::move(ext));
  274. } else {
  275. WarnL << "parse HS EXT failed type=" << type << " len=" << length;
  276. }
  277. ext = nullptr;
  278. }
  279. ptr += length * 4 + 4;
  280. }
  281. return true;
  282. }
  283. bool HandshakePacket::storeExtMessage() {
  284. uint8_t *buf = (uint8_t *)_data->data() + HEADER_SIZE + 48;
  285. size_t len = _data->size() - HEADER_SIZE - 48;
  286. for (auto ex : ext_list) {
  287. memcpy(buf, ex->data(), ex->size());
  288. buf += ex->size();
  289. }
  290. return true;
  291. }
  292. size_t HandshakePacket::getExtSize() {
  293. size_t size = 0;
  294. for (auto it : ext_list) {
  295. size += it->size();
  296. }
  297. return size;
  298. }
  299. bool HandshakePacket::storeToData() {
  300. _data = BufferRaw::create();
  301. for (auto ex : ext_list) {
  302. ex->storeToData();
  303. }
  304. auto ext_size = getExtSize();
  305. _data->setCapacity(HEADER_SIZE + 48 + ext_size);
  306. _data->setSize(HEADER_SIZE + 48 + ext_size);
  307. control_type = ControlPacket::HANDSHAKE;
  308. sub_type = 0;
  309. ControlPacket::storeToHeader();
  310. uint8_t *ptr = (uint8_t *)_data->data() + HEADER_SIZE;
  311. storeUint32(ptr, version);
  312. ptr += 4;
  313. storeUint16(ptr, encryption_field);
  314. ptr += 2;
  315. storeUint16(ptr, extension_field);
  316. ptr += 2;
  317. storeUint32(ptr, initial_packet_sequence_number);
  318. ptr += 4;
  319. storeUint32(ptr, mtu);
  320. ptr += 4;
  321. storeUint32(ptr, max_flow_window_size);
  322. ptr += 4;
  323. storeUint32(ptr, handshake_type);
  324. ptr += 4;
  325. storeUint32(ptr, srt_socket_id);
  326. ptr += 4;
  327. storeUint32(ptr, syn_cookie);
  328. ptr += 4;
  329. memcpy(ptr, peer_ip_addr, sizeof(peer_ip_addr) * sizeof(peer_ip_addr[0]));
  330. ptr += sizeof(peer_ip_addr) * sizeof(peer_ip_addr[0]);
  331. if (encryption_field != NO_ENCRYPTION) {
  332. ErrorL << "not support encryption " << encryption_field;
  333. }
  334. assert(encryption_field == NO_ENCRYPTION);
  335. return storeExtMessage();
  336. }
  337. bool HandshakePacket::isHandshakePacket(uint8_t *buf, size_t len) {
  338. if (!ControlPacket::isControlPacket(buf, len)) {
  339. return false;
  340. }
  341. if (len < HEADER_SIZE + 48) {
  342. return false;
  343. }
  344. return ControlPacket::getControlType(buf, len) == HANDSHAKE;
  345. }
  346. uint32_t HandshakePacket::getHandshakeType(uint8_t *buf, size_t len) {
  347. uint8_t *ptr = buf + HEADER_SIZE + 5 * 4;
  348. return loadUint32(ptr);
  349. }
  350. uint32_t HandshakePacket::getSynCookie(uint8_t *buf, size_t len) {
  351. uint8_t *ptr = buf + HEADER_SIZE + 7 * 4;
  352. return loadUint32(ptr);
  353. }
  354. void HandshakePacket::assignPeerIP(struct sockaddr_storage *addr) {
  355. memset(peer_ip_addr, 0, sizeof(peer_ip_addr) * sizeof(peer_ip_addr[0]));
  356. if (addr->ss_family == AF_INET) {
  357. struct sockaddr_in *ipv4 = (struct sockaddr_in *)addr;
  358. // 抓包 奇怪好像是小头端???
  359. storeUint32LE(peer_ip_addr, ipv4->sin_addr.s_addr);
  360. } else if (addr->ss_family == AF_INET6) {
  361. if (IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)addr)->sin6_addr)) {
  362. struct in_addr addr4;
  363. memcpy(&addr4, 12 + (char *)&(((struct sockaddr_in6 *)addr)->sin6_addr), 4);
  364. storeUint32LE(peer_ip_addr, addr4.s_addr);
  365. } else {
  366. const sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)addr;
  367. memcpy(peer_ip_addr, ipv6->sin6_addr.s6_addr, sizeof(peer_ip_addr) * sizeof(peer_ip_addr[0]));
  368. }
  369. }
  370. }
  371. uint32_t HandshakePacket::generateSynCookie(
  372. struct sockaddr_storage *addr, TimePoint ts, uint32_t current_cookie, int correction) {
  373. static std::atomic<uint32_t> distractor { 0 };
  374. uint32_t rollover = distractor.load() + 10;
  375. while (true) {
  376. // SYN cookie
  377. int64_t timestamp = (DurationCountMicroseconds(SteadyClock::now() - ts) / 60000000) + distractor.load()
  378. + correction; // secret changes every one minute
  379. std::stringstream cookiestr;
  380. cookiestr << SockUtil::inet_ntoa((struct sockaddr *)addr) << ":" << SockUtil::inet_port((struct sockaddr *)addr)
  381. << ":" << timestamp;
  382. union {
  383. unsigned char cookie[16];
  384. uint32_t cookie_val;
  385. };
  386. MD5 md5(cookiestr.str());
  387. memcpy(cookie, md5.rawdigest().c_str(), 16);
  388. if (cookie_val != current_cookie) {
  389. return cookie_val;
  390. }
  391. ++distractor;
  392. // This is just to make the loop formally breakable,
  393. // but this is virtually impossible to happen.
  394. if (distractor == rollover) {
  395. return cookie_val;
  396. }
  397. }
  398. }
  399. bool KeepLivePacket::loadFromData(uint8_t *buf, size_t len) {
  400. if (len < HEADER_SIZE) {
  401. WarnL << "data size" << len << " less " << HEADER_SIZE;
  402. return false;
  403. }
  404. _data = BufferRaw::create();
  405. _data->assign((char *)buf, len);
  406. return loadHeader();
  407. }
  408. bool KeepLivePacket::storeToData() {
  409. control_type = ControlPacket::KEEPALIVE;
  410. sub_type = 0;
  411. _data = BufferRaw::create();
  412. _data->setCapacity(HEADER_SIZE);
  413. _data->setSize(HEADER_SIZE);
  414. return storeToHeader();
  415. }
  416. bool NAKPacket::loadFromData(uint8_t *buf, size_t len) {
  417. if (len < HEADER_SIZE) {
  418. WarnL << "data size" << len << " less " << HEADER_SIZE;
  419. return false;
  420. }
  421. _data = BufferRaw::create();
  422. _data->assign((char *)buf, len);
  423. loadHeader();
  424. uint8_t *ptr = (uint8_t *)_data->data() + HEADER_SIZE;
  425. uint8_t *end = (uint8_t *)_data->data() + _data->size();
  426. LostPair lost;
  427. while (ptr < end) {
  428. if ((*ptr) & 0x80) {
  429. lost.first = loadUint32(ptr) & 0x7fffffff;
  430. lost.second = loadUint32(ptr + 4) & 0x7fffffff;
  431. lost.second += 1;
  432. ptr += 8;
  433. } else {
  434. lost.first = loadUint32(ptr);
  435. lost.second = lost.first + 1;
  436. ptr += 4;
  437. }
  438. lost_list.push_back(lost);
  439. }
  440. return true;
  441. }
  442. bool NAKPacket::storeToData() {
  443. control_type = NAK;
  444. sub_type = 0;
  445. size_t cif_size = getCIFSize(lost_list);
  446. _data = BufferRaw::create();
  447. _data->setCapacity(HEADER_SIZE + cif_size);
  448. _data->setSize(HEADER_SIZE + cif_size);
  449. storeToHeader();
  450. uint8_t *ptr = (uint8_t *)_data->data() + HEADER_SIZE;
  451. for (auto it : lost_list) {
  452. if (it.first + 1 == it.second) {
  453. storeUint32(ptr, it.first);
  454. ptr[0] = ptr[0] & 0x7f;
  455. ptr += 4;
  456. } else {
  457. storeUint32(ptr, it.first);
  458. ptr[0] |= 0x80;
  459. storeUint32(ptr + 4, it.second - 1);
  460. // ptr[4] = ptr[4]&0x7f;
  461. ptr += 8;
  462. }
  463. }
  464. return true;
  465. }
  466. size_t NAKPacket::getCIFSize(std::list<LostPair> &lost) {
  467. size_t size = 0;
  468. for (auto it : lost) {
  469. if (it.first + 1 == it.second) {
  470. size += 4;
  471. } else {
  472. size += 8;
  473. }
  474. }
  475. return size;
  476. }
  477. std::string NAKPacket::dump() {
  478. _StrPrinter printer;
  479. for (auto it : lost_list) {
  480. printer << "[ " << it.first << " , " << it.second - 1 << " ]";
  481. }
  482. return std::move(printer);
  483. }
  484. bool MsgDropReqPacket::loadFromData(uint8_t *buf, size_t len) {
  485. if (len < HEADER_SIZE + 8) {
  486. WarnL << "data size" << len << " less " << HEADER_SIZE;
  487. return false;
  488. }
  489. _data = BufferRaw::create();
  490. _data->assign((char *)buf, len);
  491. loadHeader();
  492. uint8_t *ptr = (uint8_t *)_data->data() + HEADER_SIZE;
  493. first_pkt_seq_num = loadUint32(ptr);
  494. ptr += 4;
  495. last_pkt_seq_num = loadUint32(ptr);
  496. ptr += 4;
  497. return true;
  498. }
  499. bool MsgDropReqPacket::storeToData() {
  500. control_type = DROPREQ;
  501. sub_type = 0;
  502. _data = BufferRaw::create();
  503. _data->setCapacity(HEADER_SIZE + 8);
  504. _data->setSize(HEADER_SIZE + 8);
  505. storeToHeader();
  506. uint8_t *ptr = (uint8_t *)_data->data() + HEADER_SIZE;
  507. storeUint32(ptr, first_pkt_seq_num);
  508. ptr += 4;
  509. storeUint32(ptr, last_pkt_seq_num);
  510. ptr += 4;
  511. return true;
  512. }
  513. } // namespace SRT