quic_trace.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. /*
  2. * Copyright 2023-2024 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License 2.0 (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #include <openssl/bio.h>
  10. #include "../ssl_local.h"
  11. #include "internal/quic_wire_pkt.h"
  12. static const char *packet_type(int type)
  13. {
  14. switch (type) {
  15. case QUIC_PKT_TYPE_INITIAL:
  16. return "Initial";
  17. case QUIC_PKT_TYPE_0RTT:
  18. return "0RTT";
  19. case QUIC_PKT_TYPE_HANDSHAKE:
  20. return "Handshake";
  21. case QUIC_PKT_TYPE_RETRY:
  22. return "Retry";
  23. case QUIC_PKT_TYPE_1RTT:
  24. return "1RTT";
  25. case QUIC_PKT_TYPE_VERSION_NEG:
  26. return "VersionNeg";
  27. default:
  28. return "Unknown";
  29. }
  30. }
  31. /* Print a non-NUL terminated string to BIO */
  32. static void put_str(BIO *bio, char *str, size_t slen)
  33. {
  34. size_t i;
  35. for (i = 0; i < slen; i++)
  36. BIO_printf(bio, "%c", str[i]);
  37. }
  38. static void put_data(BIO *bio, const uint8_t *data, size_t datalen)
  39. {
  40. size_t i;
  41. for (i = 0; i < datalen; i++)
  42. BIO_printf(bio, "%02x", data[i]);
  43. }
  44. static void put_conn_id(BIO *bio, QUIC_CONN_ID *id)
  45. {
  46. if (id->id_len == 0) {
  47. BIO_puts(bio, "<zero length id>");
  48. return;
  49. }
  50. BIO_puts(bio, "0x");
  51. put_data(bio, id->id, id->id_len);
  52. }
  53. static void put_token(BIO *bio, const uint8_t *token, size_t token_len)
  54. {
  55. if (token_len == 0)
  56. BIO_puts(bio, "<zero length token>");
  57. else
  58. put_data(bio, token, token_len);
  59. }
  60. static int frame_ack(BIO *bio, PACKET *pkt)
  61. {
  62. OSSL_QUIC_FRAME_ACK ack;
  63. OSSL_QUIC_ACK_RANGE *ack_ranges = NULL;
  64. uint64_t total_ranges = 0;
  65. uint64_t i;
  66. int ret = 0;
  67. if (!ossl_quic_wire_peek_frame_ack_num_ranges(pkt, &total_ranges)
  68. /* In case sizeof(uint64_t) > sizeof(size_t) */
  69. || total_ranges > SIZE_MAX / sizeof(ack_ranges[0])
  70. || (ack_ranges = OPENSSL_zalloc(sizeof(ack_ranges[0])
  71. * (size_t)total_ranges)) == NULL)
  72. return ret;
  73. ack.ack_ranges = ack_ranges;
  74. ack.num_ack_ranges = (size_t)total_ranges;
  75. /* Ack delay exponent is 0, so we can get the raw delay time below */
  76. if (!ossl_quic_wire_decode_frame_ack(pkt, 0, &ack, NULL))
  77. goto end;
  78. BIO_printf(bio, " Largest acked: %llu\n",
  79. (unsigned long long)ack.ack_ranges[0].end);
  80. BIO_printf(bio, " Ack delay (raw) %llu\n",
  81. (unsigned long long)ossl_time2ticks(ack.delay_time));
  82. BIO_printf(bio, " Ack range count: %llu\n",
  83. (unsigned long long)total_ranges - 1);
  84. BIO_printf(bio, " First ack range: %llu\n",
  85. (unsigned long long)(ack.ack_ranges[0].end
  86. - ack.ack_ranges[0].start));
  87. for (i = 1; i < total_ranges; i++) {
  88. BIO_printf(bio, " Gap: %llu\n",
  89. (unsigned long long)(ack.ack_ranges[i - 1].start
  90. - ack.ack_ranges[i].end - 2));
  91. BIO_printf(bio, " Ack range len: %llu\n",
  92. (unsigned long long)(ack.ack_ranges[i].end
  93. - ack.ack_ranges[i].start));
  94. }
  95. ret = 1;
  96. end:
  97. OPENSSL_free(ack_ranges);
  98. return ret;
  99. }
  100. static int frame_reset_stream(BIO *bio, PACKET *pkt)
  101. {
  102. OSSL_QUIC_FRAME_RESET_STREAM frame_data;
  103. if (!ossl_quic_wire_decode_frame_reset_stream(pkt, &frame_data))
  104. return 0;
  105. BIO_printf(bio, " Stream id: %llu\n",
  106. (unsigned long long)frame_data.stream_id);
  107. BIO_printf(bio, " App Protocol Error Code: %llu\n",
  108. (unsigned long long)frame_data.app_error_code);
  109. BIO_printf(bio, " Final size: %llu\n",
  110. (unsigned long long)frame_data.final_size);
  111. return 1;
  112. }
  113. static int frame_stop_sending(BIO *bio, PACKET *pkt)
  114. {
  115. OSSL_QUIC_FRAME_STOP_SENDING frame_data;
  116. if (!ossl_quic_wire_decode_frame_stop_sending(pkt, &frame_data))
  117. return 0;
  118. BIO_printf(bio, " Stream id: %llu\n",
  119. (unsigned long long)frame_data.stream_id);
  120. BIO_printf(bio, " App Protocol Error Code: %llu\n",
  121. (unsigned long long)frame_data.app_error_code);
  122. return 1;
  123. }
  124. static int frame_crypto(BIO *bio, PACKET *pkt)
  125. {
  126. OSSL_QUIC_FRAME_CRYPTO frame_data;
  127. if (!ossl_quic_wire_decode_frame_crypto(pkt, 1, &frame_data))
  128. return 0;
  129. BIO_printf(bio, " Offset: %llu\n", (unsigned long long)frame_data.offset);
  130. BIO_printf(bio, " Len: %llu\n", (unsigned long long)frame_data.len);
  131. return 1;
  132. }
  133. static int frame_new_token(BIO *bio, PACKET *pkt)
  134. {
  135. const uint8_t *token;
  136. size_t token_len;
  137. if (!ossl_quic_wire_decode_frame_new_token(pkt, &token, &token_len))
  138. return 0;
  139. BIO_puts(bio, " Token: ");
  140. put_token(bio, token, token_len);
  141. BIO_puts(bio, "\n");
  142. return 1;
  143. }
  144. static int frame_stream(BIO *bio, PACKET *pkt, uint64_t frame_type)
  145. {
  146. OSSL_QUIC_FRAME_STREAM frame_data;
  147. BIO_puts(bio, "Stream");
  148. switch(frame_type) {
  149. case OSSL_QUIC_FRAME_TYPE_STREAM:
  150. BIO_puts(bio, "\n");
  151. break;
  152. case OSSL_QUIC_FRAME_TYPE_STREAM_FIN:
  153. BIO_puts(bio, " (Fin)\n");
  154. break;
  155. case OSSL_QUIC_FRAME_TYPE_STREAM_LEN:
  156. BIO_puts(bio, " (Len)\n");
  157. break;
  158. case OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN:
  159. BIO_puts(bio, " (Len, Fin)\n");
  160. break;
  161. case OSSL_QUIC_FRAME_TYPE_STREAM_OFF:
  162. BIO_puts(bio, " (Off)\n");
  163. break;
  164. case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN:
  165. BIO_puts(bio, " (Off, Fin)\n");
  166. break;
  167. case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN:
  168. BIO_puts(bio, " (Off, Len)\n");
  169. break;
  170. case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN:
  171. BIO_puts(bio, " (Off, Len, Fin)\n");
  172. break;
  173. default:
  174. return 0;
  175. }
  176. if (!ossl_quic_wire_decode_frame_stream(pkt, 1, &frame_data))
  177. return 0;
  178. BIO_printf(bio, " Stream id: %llu\n",
  179. (unsigned long long)frame_data.stream_id);
  180. BIO_printf(bio, " Offset: %llu\n",
  181. (unsigned long long)frame_data.offset);
  182. /*
  183. * It would be nice to find a way of passing the implicit length through
  184. * to the msg_callback. But this is not currently possible.
  185. */
  186. if (frame_data.has_explicit_len)
  187. BIO_printf(bio, " Len: %llu\n", (unsigned long long)frame_data.len);
  188. else
  189. BIO_puts(bio, " Len: <implicit length>\n");
  190. return 1;
  191. }
  192. static int frame_max_data(BIO *bio, PACKET *pkt)
  193. {
  194. uint64_t max_data = 0;
  195. if (!ossl_quic_wire_decode_frame_max_data(pkt, &max_data))
  196. return 0;
  197. BIO_printf(bio, " Max Data: %llu\n", (unsigned long long)max_data);
  198. return 1;
  199. }
  200. static int frame_max_stream_data(BIO *bio, PACKET *pkt)
  201. {
  202. uint64_t stream_id = 0;
  203. uint64_t max_stream_data = 0;
  204. if (!ossl_quic_wire_decode_frame_max_stream_data(pkt, &stream_id,
  205. &max_stream_data))
  206. return 0;
  207. BIO_printf(bio, " Max Stream Data: %llu\n",
  208. (unsigned long long)max_stream_data);
  209. return 1;
  210. }
  211. static int frame_max_streams(BIO *bio, PACKET *pkt)
  212. {
  213. uint64_t max_streams = 0;
  214. if (!ossl_quic_wire_decode_frame_max_streams(pkt, &max_streams))
  215. return 0;
  216. BIO_printf(bio, " Max Streams: %llu\n", (unsigned long long)max_streams);
  217. return 1;
  218. }
  219. static int frame_data_blocked(BIO *bio, PACKET *pkt)
  220. {
  221. uint64_t max_data = 0;
  222. if (!ossl_quic_wire_decode_frame_data_blocked(pkt, &max_data))
  223. return 0;
  224. BIO_printf(bio, " Max Data: %llu\n", (unsigned long long)max_data);
  225. return 1;
  226. }
  227. static int frame_stream_data_blocked(BIO *bio, PACKET *pkt)
  228. {
  229. uint64_t stream_id = 0;
  230. uint64_t max_data = 0;
  231. if (!ossl_quic_wire_decode_frame_stream_data_blocked(pkt, &stream_id,
  232. &max_data))
  233. return 0;
  234. BIO_printf(bio, " Stream id: %llu\n", (unsigned long long)stream_id);
  235. BIO_printf(bio, " Max Data: %llu\n", (unsigned long long)max_data);
  236. return 1;
  237. }
  238. static int frame_streams_blocked(BIO *bio, PACKET *pkt)
  239. {
  240. uint64_t max_data = 0;
  241. if (!ossl_quic_wire_decode_frame_streams_blocked(pkt, &max_data))
  242. return 0;
  243. BIO_printf(bio, " Max Data: %llu\n", (unsigned long long)max_data);
  244. return 1;
  245. }
  246. static int frame_new_conn_id(BIO *bio, PACKET *pkt)
  247. {
  248. OSSL_QUIC_FRAME_NEW_CONN_ID frame_data;
  249. if (!ossl_quic_wire_decode_frame_new_conn_id(pkt, &frame_data))
  250. return 0;
  251. BIO_printf(bio, " Sequence Number: %llu\n",
  252. (unsigned long long)frame_data.seq_num);
  253. BIO_printf(bio, " Retire prior to: %llu\n",
  254. (unsigned long long)frame_data.retire_prior_to);
  255. BIO_puts(bio, " Connection id: ");
  256. put_conn_id(bio, &frame_data.conn_id);
  257. BIO_puts(bio, "\n Stateless Reset Token: ");
  258. put_data(bio, frame_data.stateless_reset.token,
  259. sizeof(frame_data.stateless_reset.token));
  260. BIO_puts(bio, "\n");
  261. return 1;
  262. }
  263. static int frame_retire_conn_id(BIO *bio, PACKET *pkt)
  264. {
  265. uint64_t seq_num;
  266. if (!ossl_quic_wire_decode_frame_retire_conn_id(pkt, &seq_num))
  267. return 0;
  268. BIO_printf(bio, " Sequence Number: %llu\n", (unsigned long long)seq_num);
  269. return 1;
  270. }
  271. static int frame_path_challenge(BIO *bio, PACKET *pkt)
  272. {
  273. uint64_t data = 0;
  274. if (!ossl_quic_wire_decode_frame_path_challenge(pkt, &data))
  275. return 0;
  276. BIO_printf(bio, " Data: %016llx\n", (unsigned long long)data);
  277. return 1;
  278. }
  279. static int frame_path_response(BIO *bio, PACKET *pkt)
  280. {
  281. uint64_t data = 0;
  282. if (!ossl_quic_wire_decode_frame_path_response(pkt, &data))
  283. return 0;
  284. BIO_printf(bio, " Data: %016llx\n", (unsigned long long)data);
  285. return 1;
  286. }
  287. static int frame_conn_closed(BIO *bio, PACKET *pkt)
  288. {
  289. OSSL_QUIC_FRAME_CONN_CLOSE frame_data;
  290. if (!ossl_quic_wire_decode_frame_conn_close(pkt, &frame_data))
  291. return 0;
  292. BIO_printf(bio, " Error Code: %llu\n",
  293. (unsigned long long)frame_data.error_code);
  294. BIO_puts(bio, " Reason: ");
  295. put_str(bio, frame_data.reason, frame_data.reason_len);
  296. BIO_puts(bio, "\n");
  297. return 1;
  298. }
  299. static int trace_frame_data(BIO *bio, PACKET *pkt)
  300. {
  301. uint64_t frame_type;
  302. if (!ossl_quic_wire_peek_frame_header(pkt, &frame_type, NULL))
  303. return 0;
  304. switch (frame_type) {
  305. case OSSL_QUIC_FRAME_TYPE_PING:
  306. BIO_puts(bio, "Ping\n");
  307. if (!ossl_quic_wire_decode_frame_ping(pkt))
  308. return 0;
  309. break;
  310. case OSSL_QUIC_FRAME_TYPE_PADDING:
  311. BIO_puts(bio, "Padding\n");
  312. ossl_quic_wire_decode_padding(pkt);
  313. break;
  314. case OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN:
  315. case OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN:
  316. BIO_puts(bio, "Ack ");
  317. if (frame_type == OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN)
  318. BIO_puts(bio, " (with ECN)\n");
  319. else
  320. BIO_puts(bio, " (without ECN)\n");
  321. if (!frame_ack(bio, pkt))
  322. return 0;
  323. break;
  324. case OSSL_QUIC_FRAME_TYPE_RESET_STREAM:
  325. BIO_puts(bio, "Reset stream\n");
  326. if (!frame_reset_stream(bio, pkt))
  327. return 0;
  328. break;
  329. case OSSL_QUIC_FRAME_TYPE_STOP_SENDING:
  330. BIO_puts(bio, "Stop sending\n");
  331. if (!frame_stop_sending(bio, pkt))
  332. return 0;
  333. break;
  334. case OSSL_QUIC_FRAME_TYPE_CRYPTO:
  335. BIO_puts(bio, "Crypto\n");
  336. if (!frame_crypto(bio, pkt))
  337. return 0;
  338. break;
  339. case OSSL_QUIC_FRAME_TYPE_NEW_TOKEN:
  340. BIO_puts(bio, "New token\n");
  341. if (!frame_new_token(bio, pkt))
  342. return 0;
  343. break;
  344. case OSSL_QUIC_FRAME_TYPE_STREAM:
  345. case OSSL_QUIC_FRAME_TYPE_STREAM_FIN:
  346. case OSSL_QUIC_FRAME_TYPE_STREAM_LEN:
  347. case OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN:
  348. case OSSL_QUIC_FRAME_TYPE_STREAM_OFF:
  349. case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN:
  350. case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN:
  351. case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN:
  352. /* frame_stream() prints the frame type string */
  353. if (!frame_stream(bio, pkt, frame_type))
  354. return 0;
  355. break;
  356. case OSSL_QUIC_FRAME_TYPE_MAX_DATA:
  357. BIO_puts(bio, "Max data\n");
  358. if (!frame_max_data(bio, pkt))
  359. return 0;
  360. break;
  361. case OSSL_QUIC_FRAME_TYPE_MAX_STREAM_DATA:
  362. BIO_puts(bio, "Max stream data\n");
  363. if (!frame_max_stream_data(bio, pkt))
  364. return 0;
  365. break;
  366. case OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI:
  367. case OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_UNI:
  368. BIO_puts(bio, "Max streams ");
  369. if (frame_type == OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI)
  370. BIO_puts(bio, " (Bidi)\n");
  371. else
  372. BIO_puts(bio, " (Uni)\n");
  373. if (!frame_max_streams(bio, pkt))
  374. return 0;
  375. break;
  376. case OSSL_QUIC_FRAME_TYPE_DATA_BLOCKED:
  377. BIO_puts(bio, "Data blocked\n");
  378. if (!frame_data_blocked(bio, pkt))
  379. return 0;
  380. break;
  381. case OSSL_QUIC_FRAME_TYPE_STREAM_DATA_BLOCKED:
  382. BIO_puts(bio, "Stream data blocked\n");
  383. if (!frame_stream_data_blocked(bio, pkt))
  384. return 0;
  385. break;
  386. case OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI:
  387. case OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_UNI:
  388. BIO_puts(bio, "Streams blocked");
  389. if (frame_type == OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI)
  390. BIO_puts(bio, " (Bidi)\n");
  391. else
  392. BIO_puts(bio, " (Uni)\n");
  393. if (!frame_streams_blocked(bio, pkt))
  394. return 0;
  395. break;
  396. case OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID:
  397. BIO_puts(bio, "New conn id\n");
  398. if (!frame_new_conn_id(bio, pkt))
  399. return 0;
  400. break;
  401. case OSSL_QUIC_FRAME_TYPE_RETIRE_CONN_ID:
  402. BIO_puts(bio, "Retire conn id\n");
  403. if (!frame_retire_conn_id(bio, pkt))
  404. return 0;
  405. break;
  406. case OSSL_QUIC_FRAME_TYPE_PATH_CHALLENGE:
  407. BIO_puts(bio, "Path challenge\n");
  408. if (!frame_path_challenge(bio, pkt))
  409. return 0;
  410. break;
  411. case OSSL_QUIC_FRAME_TYPE_PATH_RESPONSE:
  412. BIO_puts(bio, "Path response\n");
  413. if (!frame_path_response(bio, pkt))
  414. return 0;
  415. break;
  416. case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP:
  417. case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT:
  418. BIO_puts(bio, "Connection close");
  419. if (frame_type == OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP)
  420. BIO_puts(bio, " (app)\n");
  421. else
  422. BIO_puts(bio, " (transport)\n");
  423. if (!frame_conn_closed(bio, pkt))
  424. return 0;
  425. break;
  426. case OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE:
  427. BIO_puts(bio, "Handshake done\n");
  428. if (!ossl_quic_wire_decode_frame_handshake_done(pkt))
  429. return 0;
  430. break;
  431. default:
  432. return 0;
  433. }
  434. if (PACKET_remaining(pkt) != 0)
  435. BIO_puts(bio, " <unexpected trailing frame data skipped>\n");
  436. return 1;
  437. }
  438. int ossl_quic_trace(int write_p, int version, int content_type,
  439. const void *buf, size_t msglen, SSL *ssl, void *arg)
  440. {
  441. BIO *bio = arg;
  442. PACKET pkt;
  443. switch (content_type) {
  444. case SSL3_RT_QUIC_DATAGRAM:
  445. BIO_puts(bio, write_p ? "Sent" : "Received");
  446. /*
  447. * Unfortunately there is no way of receiving auxiliary information
  448. * about the datagram through the msg_callback API such as the peer
  449. * address
  450. */
  451. BIO_printf(bio, " Datagram\n Length: %zu\n", msglen);
  452. break;
  453. case SSL3_RT_QUIC_PACKET:
  454. {
  455. QUIC_PKT_HDR hdr;
  456. size_t i;
  457. if (!PACKET_buf_init(&pkt, buf, msglen))
  458. return 0;
  459. /* Decode the packet header */
  460. /*
  461. * TODO(QUIC SERVER): We need to query the short connection id len
  462. * here, e.g. via some API SSL_get_short_conn_id_len()
  463. */
  464. if (ossl_quic_wire_decode_pkt_hdr(&pkt, 0, 0, 1, &hdr, NULL) != 1)
  465. return 0;
  466. BIO_puts(bio, write_p ? "Sent" : "Received");
  467. BIO_puts(bio, " Packet\n");
  468. BIO_printf(bio, " Packet Type: %s\n", packet_type(hdr.type));
  469. if (hdr.type != QUIC_PKT_TYPE_1RTT)
  470. BIO_printf(bio, " Version: 0x%08lx\n",
  471. (unsigned long)hdr.version);
  472. BIO_puts(bio, " Destination Conn Id: ");
  473. put_conn_id(bio, &hdr.dst_conn_id);
  474. BIO_puts(bio, "\n");
  475. if (hdr.type != QUIC_PKT_TYPE_1RTT) {
  476. BIO_puts(bio, " Source Conn Id: ");
  477. put_conn_id(bio, &hdr.src_conn_id);
  478. BIO_puts(bio, "\n");
  479. }
  480. BIO_printf(bio, " Payload length: %zu\n", hdr.len);
  481. if (hdr.type == QUIC_PKT_TYPE_INITIAL) {
  482. BIO_puts(bio, " Token: ");
  483. put_token(bio, hdr.token, hdr.token_len);
  484. BIO_puts(bio, "\n");
  485. }
  486. if (hdr.type != QUIC_PKT_TYPE_VERSION_NEG
  487. && hdr.type != QUIC_PKT_TYPE_RETRY) {
  488. BIO_puts(bio, " Packet Number: 0x");
  489. /* Will always be at least 1 byte */
  490. for (i = 0; i < hdr.pn_len; i++)
  491. BIO_printf(bio, "%02x", hdr.pn[i]);
  492. BIO_puts(bio, "\n");
  493. }
  494. break;
  495. }
  496. case SSL3_RT_QUIC_FRAME_PADDING:
  497. case SSL3_RT_QUIC_FRAME_FULL:
  498. case SSL3_RT_QUIC_FRAME_HEADER:
  499. {
  500. BIO_puts(bio, write_p ? "Sent" : "Received");
  501. BIO_puts(bio, " Frame: ");
  502. if (!PACKET_buf_init(&pkt, buf, msglen))
  503. return 0;
  504. if (!trace_frame_data(bio, &pkt)) {
  505. BIO_puts(bio, " <error processing frame data>\n");
  506. return 0;
  507. }
  508. }
  509. break;
  510. default:
  511. /* Unrecognised content_type. We defer to SSL_trace */
  512. return 0;
  513. }
  514. return 1;
  515. }