From 315c689c65dcc350c2c7b181b678067351723ffd Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> Date: Sun, 25 Jun 2017 01:44:55 +0900 Subject: [PATCH] Supply timstamp to the library --- examples/client.cc | 4 ++-- examples/server.cc | 4 ++-- examples/util.cc | 8 ++++++++ examples/util.h | 2 ++ lib/includes/ngtcp2/ngtcp2.h | 7 +++++-- lib/ngtcp2_conn.c | 36 ++++++++++++++++++++---------------- 6 files changed, 39 insertions(+), 22 deletions(-) diff --git a/examples/client.cc b/examples/client.cc index fc0fc002..9dbd1f73 100644 --- a/examples/client.cc +++ b/examples/client.cc @@ -295,7 +295,7 @@ int Client::tls_handshake() { int Client::feed_data(const uint8_t *data, size_t datalen) { int rv; - rv = ngtcp2_conn_recv(conn_, data, datalen); + rv = ngtcp2_conn_recv(conn_, data, datalen, util::timestamp()); if (rv != 0) { std::cerr << "ngtcp2_conn_recv: " << rv << std::endl; return -1; @@ -324,7 +324,7 @@ int Client::on_read() { int Client::on_write() { std::array<uint8_t, 1280> buf; - auto n = ngtcp2_conn_send(conn_, buf.data(), buf.size()); + auto n = ngtcp2_conn_send(conn_, buf.data(), buf.size(), util::timestamp()); if (n < 0) { return -1; } diff --git a/examples/server.cc b/examples/server.cc index dcde19d9..8e68d134 100644 --- a/examples/server.cc +++ b/examples/server.cc @@ -319,7 +319,7 @@ void Handler::write_client_handshake(const uint8_t *data, size_t datalen) { int Handler::feed_data(const uint8_t *data, size_t datalen) { int rv; - rv = ngtcp2_conn_recv(conn_, data, datalen); + rv = ngtcp2_conn_recv(conn_, data, datalen, util::timestamp()); if (rv != 0) { std::cerr << "ngtcp2_conn_recv: " << rv << std::endl; return -1; @@ -351,7 +351,7 @@ int Handler::on_write() { std::array<uint8_t, 1280> buf; for (;;) { - auto n = ngtcp2_conn_send(conn_, buf.data(), buf.size()); + auto n = ngtcp2_conn_send(conn_, buf.data(), buf.size(), util::timestamp()); if (n < 0) { return -1; } diff --git a/examples/util.cc b/examples/util.cc index 41747072..4bc7dcd1 100644 --- a/examples/util.cc +++ b/examples/util.cc @@ -24,6 +24,8 @@ */ #include "util.h" +#include <chrono> + namespace ngtcp2 { namespace util { @@ -60,6 +62,12 @@ std::mt19937 make_mt19937() { return std::mt19937(rd()); } +ngtcp2_tstamp timestamp() { + return std::chrono::duration_cast<std::chrono::microseconds>( + std::chrono::steady_clock::now().time_since_epoch()) + .count(); +} + } // namespace util } // namespace ngtcp2 diff --git a/examples/util.h b/examples/util.h index 945bc943..4b2c6daa 100644 --- a/examples/util.h +++ b/examples/util.h @@ -44,6 +44,8 @@ std::string format_hex(const uint8_t *s, size_t len); std::mt19937 make_mt19937(); +ngtcp2_tstamp timestamp(); + } // namespace util } // namespace ngtcp2; diff --git a/lib/includes/ngtcp2/ngtcp2.h b/lib/includes/ngtcp2/ngtcp2.h index 4cd7760d..31cca1f4 100644 --- a/lib/includes/ngtcp2/ngtcp2.h +++ b/lib/includes/ngtcp2/ngtcp2.h @@ -207,6 +207,9 @@ typedef enum { NGTCP2_FRAME_STREAM = 0xc0 } ngtcp2_frame_type; +/* + * ngtcp2_tstamp is a timestamp with microsecond resolution. + */ typedef uint64_t ngtcp2_tstamp; typedef struct { @@ -526,10 +529,10 @@ NGTCP2_EXTERN int ngtcp2_conn_server_new(ngtcp2_conn **pconn, uint64_t conn_id, NGTCP2_EXTERN void ngtcp2_conn_del(ngtcp2_conn *conn); NGTCP2_EXTERN int ngtcp2_conn_recv(ngtcp2_conn *conn, const uint8_t *pkt, - size_t pktlen); + size_t pktlen, ngtcp2_tstamp ts); NGTCP2_EXTERN ssize_t ngtcp2_conn_send(ngtcp2_conn *conn, uint8_t *dest, - size_t destlen); + size_t destlen, ngtcp2_tstamp ts); NGTCP2_EXTERN int ngtcp2_conn_handshake_completed(ngtcp2_conn *conn); diff --git a/lib/ngtcp2_conn.c b/lib/ngtcp2_conn.c index 7cb86661..9f679fb7 100644 --- a/lib/ngtcp2_conn.c +++ b/lib/ngtcp2_conn.c @@ -399,8 +399,8 @@ static ssize_t ngtcp2_conn_send_client_initial(ngtcp2_conn *conn, uint8_t *dest, } static ssize_t ngtcp2_conn_send_client_cleartext(ngtcp2_conn *conn, - uint8_t *dest, - size_t destlen) { + uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts) { const uint8_t *payload; ssize_t payloadlen; ngtcp2_frame ackfr; @@ -408,7 +408,7 @@ static ssize_t ngtcp2_conn_send_client_cleartext(ngtcp2_conn *conn, int rv; ackfr.type = 0; - rv = conn_create_ack_frame(conn, &ackfr.ack, 0 /* timestamp */); + rv = conn_create_ack_frame(conn, &ackfr.ack, ts); if (rv != 0) { return rv; } @@ -436,7 +436,8 @@ static ssize_t ngtcp2_conn_send_client_cleartext(ngtcp2_conn *conn, static ssize_t ngtcp2_conn_send_server_cleartext(ngtcp2_conn *conn, uint8_t *dest, size_t destlen, - int initial) { + int initial, + ngtcp2_tstamp ts) { uint64_t pkt_num = 0; const uint8_t *payload; ssize_t payloadlen; @@ -445,7 +446,7 @@ static ssize_t ngtcp2_conn_send_server_cleartext(ngtcp2_conn *conn, int rv; ackfr.type = 0; - rv = conn_create_ack_frame(conn, &ackfr.ack, 0 /* timestamp */); + rv = conn_create_ack_frame(conn, &ackfr.ack, ts); if (rv != 0) { return rv; } @@ -481,7 +482,8 @@ static ssize_t ngtcp2_conn_send_server_cleartext(ngtcp2_conn *conn, ackfr.type == 0 ? NULL : &ackfr, tx_buf); } -ssize_t ngtcp2_conn_send(ngtcp2_conn *conn, uint8_t *dest, size_t destlen) { +ssize_t ngtcp2_conn_send(ngtcp2_conn *conn, uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts) { ssize_t nwrite = 0; int rv; @@ -494,7 +496,7 @@ ssize_t ngtcp2_conn_send(ngtcp2_conn *conn, uint8_t *dest, size_t destlen) { conn->state = NGTCP2_CS_CLIENT_CI_SENT; break; case NGTCP2_CS_CLIENT_SC_RECVED: - nwrite = ngtcp2_conn_send_client_cleartext(conn, dest, destlen); + nwrite = ngtcp2_conn_send_client_cleartext(conn, dest, destlen, ts); if (nwrite < 0) { break; } @@ -507,14 +509,14 @@ ssize_t ngtcp2_conn_send(ngtcp2_conn *conn, uint8_t *dest, size_t destlen) { } break; case NGTCP2_CS_SERVER_CI_RECVED: - nwrite = ngtcp2_conn_send_server_cleartext(conn, dest, destlen, 1); + nwrite = ngtcp2_conn_send_server_cleartext(conn, dest, destlen, 1, ts); if (nwrite < 0) { break; } conn->state = NGTCP2_CS_SERVER_SC_SENT; break; case NGTCP2_CS_SERVER_SC_SENT: - nwrite = ngtcp2_conn_send_server_cleartext(conn, dest, destlen, 0); + nwrite = ngtcp2_conn_send_server_cleartext(conn, dest, destlen, 0, ts); if (nwrite < 0) { break; } @@ -526,7 +528,8 @@ ssize_t ngtcp2_conn_send(ngtcp2_conn *conn, uint8_t *dest, size_t destlen) { static int ngtcp2_conn_recv_cleartext(ngtcp2_conn *conn, uint8_t exptype, const uint8_t *pkt, size_t pktlen, - int server, int initial) { + int server, int initial, + ngtcp2_tstamp ts) { ssize_t nread; ngtcp2_pkt_hd hd; ngtcp2_frame fr; @@ -607,7 +610,7 @@ static int ngtcp2_conn_recv_cleartext(ngtcp2_conn *conn, uint8_t exptype, } if (require_ack) { - rv = ngtcp2_conn_sched_ack(conn, hd.pkt_num, 0 /* timestamp */); + rv = ngtcp2_conn_sched_ack(conn, hd.pkt_num, ts); if (rv != 0) { return rv; } @@ -616,7 +619,8 @@ static int ngtcp2_conn_recv_cleartext(ngtcp2_conn *conn, uint8_t exptype, return 0; } -int ngtcp2_conn_recv(ngtcp2_conn *conn, const uint8_t *pkt, size_t pktlen) { +int ngtcp2_conn_recv(ngtcp2_conn *conn, const uint8_t *pkt, size_t pktlen, + ngtcp2_tstamp ts) { int rv = 0; if (pktlen == 0) { @@ -634,7 +638,7 @@ int ngtcp2_conn_recv(ngtcp2_conn *conn, const uint8_t *pkt, size_t pktlen) { case NGTCP2_CS_CLIENT_CI_SENT: /* TODO Handle Version Negotiation */ rv = ngtcp2_conn_recv_cleartext(conn, NGTCP2_PKT_SERVER_CLEARTEXT, pkt, - pktlen, 0, 1); + pktlen, 0, 1, ts); if (rv < 0) { break; } @@ -642,14 +646,14 @@ int ngtcp2_conn_recv(ngtcp2_conn *conn, const uint8_t *pkt, size_t pktlen) { break; case NGTCP2_CS_CLIENT_SC_RECVED: rv = ngtcp2_conn_recv_cleartext(conn, NGTCP2_PKT_SERVER_CLEARTEXT, pkt, - pktlen, 0, 0); + pktlen, 0, 0, ts); if (rv < 0) { break; } break; case NGTCP2_CS_SERVER_INITIAL: rv = ngtcp2_conn_recv_cleartext(conn, NGTCP2_PKT_CLIENT_INITIAL, pkt, - pktlen, 1, 1); + pktlen, 1, 1, ts); if (rv < 0) { break; } @@ -657,7 +661,7 @@ int ngtcp2_conn_recv(ngtcp2_conn *conn, const uint8_t *pkt, size_t pktlen) { break; case NGTCP2_CS_SERVER_SC_SENT: rv = ngtcp2_conn_recv_cleartext(conn, NGTCP2_PKT_CLIENT_CLEARTEXT, pkt, - pktlen, 1, 0); + pktlen, 1, 0, ts); if (rv < 0) { break; } -- GitLab