diff --git a/examples/client.cc b/examples/client.cc
index bcd3f24f077e4e828c860558951e47afb671fc98..4e255ecf2c9664cf432a21678e5d6269c44e6b2b 100644
--- a/examples/client.cc
+++ b/examples/client.cc
@@ -1202,10 +1202,10 @@ int Client::feed_data(const sockaddr *sa, socklen_t salen, uint8_t *data,
                       size_t datalen) {
   int rv;
 
+  auto path = ngtcp2_path{
+      {local_addr_.len, reinterpret_cast<uint8_t *>(&local_addr_.su)},
+      {salen, const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(sa))}};
   if (ngtcp2_conn_get_handshake_completed(conn_)) {
-    auto path = ngtcp2_path{
-        {local_addr_.len, reinterpret_cast<uint8_t *>(&local_addr_.su)},
-        {salen, const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(sa))}};
     rv = ngtcp2_conn_read_pkt(conn_, &path, data, datalen,
                               util::timestamp(loop_));
     if (rv != 0) {
@@ -1213,16 +1213,16 @@ int Client::feed_data(const sockaddr *sa, socklen_t salen, uint8_t *data,
       disconnect(rv);
       return -1;
     }
-  } else {
-    return do_handshake(data, datalen);
+    return 0;
   }
 
-  return 0;
+  return do_handshake(&path, data, datalen);
 }
 
-int Client::do_handshake_read_once(const uint8_t *data, size_t datalen) {
-  auto rv =
-      ngtcp2_conn_read_handshake(conn_, data, datalen, util::timestamp(loop_));
+int Client::do_handshake_read_once(const ngtcp2_path *path, const uint8_t *data,
+                                   size_t datalen) {
+  auto rv = ngtcp2_conn_read_handshake(conn_, path, data, datalen,
+                                       util::timestamp(loop_));
   if (rv < 0) {
     std::cerr << "ngtcp2_conn_read_handshake: " << ngtcp2_strerror(rv)
               << std::endl;
@@ -1261,7 +1261,8 @@ ssize_t Client::do_handshake_write_once() {
   return nwrite;
 }
 
-int Client::do_handshake(const uint8_t *data, size_t datalen) {
+int Client::do_handshake(const ngtcp2_path *path, const uint8_t *data,
+                         size_t datalen) {
   ssize_t nwrite;
 
   if (sendbuf_.size() > 0) {
@@ -1271,13 +1272,15 @@ int Client::do_handshake(const uint8_t *data, size_t datalen) {
     }
   }
 
-  auto rv = do_handshake_read_once(data, datalen);
-  if (rv != 0) {
-    return rv;
+  if (datalen) {
+    auto rv = do_handshake_read_once(path, data, datalen);
+    if (rv != 0) {
+      return rv;
+    }
   }
 
   // For 0-RTT
-  rv = write_0rtt_streams();
+  auto rv = write_0rtt_streams();
   if (rv != 0) {
     return rv;
   }
@@ -1357,7 +1360,7 @@ int Client::on_write(bool retransmit) {
   }
 
   if (!ngtcp2_conn_get_handshake_completed(conn_)) {
-    auto rv = do_handshake(nullptr, 0);
+    auto rv = do_handshake(nullptr, nullptr, 0);
     schedule_retransmit();
     return rv;
   }
diff --git a/examples/client.h b/examples/client.h
index dd8baeb5a84a560c3bbe194fa7abd67c175b525b..f74fe5a020d712e3551534602a6850a6399f2988 100644
--- a/examples/client.h
+++ b/examples/client.h
@@ -162,8 +162,10 @@ public:
   int on_write_0rtt_stream(uint64_t stream_id, uint8_t fin, Buffer &data);
   int feed_data(const sockaddr *sa, socklen_t salen, uint8_t *data,
                 size_t datalen);
-  int do_handshake(const uint8_t *data, size_t datalen);
-  int do_handshake_read_once(const uint8_t *data, size_t datalen);
+  int do_handshake(const ngtcp2_path *path, const uint8_t *data,
+                   size_t datalen);
+  int do_handshake_read_once(const ngtcp2_path *path, const uint8_t *data,
+                             size_t datalen);
   ssize_t do_handshake_write_once();
   void schedule_retransmit();
 
diff --git a/examples/server.cc b/examples/server.cc
index 1b29e11d8f813fab420848a3b98d96df35e8a7bc..0bcd6ff6f32ab2b8fd646ee63d3057b27c4ac8fb 100644
--- a/examples/server.cc
+++ b/examples/server.cc
@@ -1425,9 +1425,10 @@ ssize_t Handler::hp_mask(uint8_t *dest, size_t destlen, const uint8_t *key,
                          samplelen);
 }
 
-int Handler::do_handshake_read_once(const uint8_t *data, size_t datalen) {
-  auto rv =
-      ngtcp2_conn_read_handshake(conn_, data, datalen, util::timestamp(loop_));
+int Handler::do_handshake_read_once(const ngtcp2_path *path,
+                                    const uint8_t *data, size_t datalen) {
+  auto rv = ngtcp2_conn_read_handshake(conn_, path, data, datalen,
+                                       util::timestamp(loop_));
   if (rv != 0) {
     std::cerr << "ngtcp2_conn_read_handshake: " << ngtcp2_strerror(rv)
               << std::endl;
@@ -1463,10 +1464,13 @@ ssize_t Handler::do_handshake_write_once() {
   return nwrite;
 }
 
-int Handler::do_handshake(const uint8_t *data, size_t datalen) {
-  auto rv = do_handshake_read_once(data, datalen);
-  if (rv != 0) {
-    return rv;
+int Handler::do_handshake(const ngtcp2_path *path, const uint8_t *data,
+                          size_t datalen) {
+  if (datalen) {
+    auto rv = do_handshake_read_once(path, data, datalen);
+    if (rv != 0) {
+      return rv;
+    }
   }
 
   if (sendbuf_.size() > 0) {
@@ -1501,12 +1505,13 @@ int Handler::feed_data(Endpoint &ep, const sockaddr *sa, socklen_t salen,
                        uint8_t *data, size_t datalen) {
   int rv;
 
+  auto path = ngtcp2_path{
+      {ep.addr.len,
+       const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(&ep.addr.su)),
+       &ep},
+      {salen, const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(sa))}};
+
   if (ngtcp2_conn_get_handshake_completed(conn_)) {
-    auto path = ngtcp2_path{
-        {ep.addr.len,
-         const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(&ep.addr.su)),
-         &ep},
-        {salen, const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(sa))}};
     rv = ngtcp2_conn_read_pkt(conn_, &path, data, datalen,
                               util::timestamp(loop_));
     if (rv != 0) {
@@ -1517,12 +1522,13 @@ int Handler::feed_data(Endpoint &ep, const sockaddr *sa, socklen_t salen,
       }
       return handle_error(rv);
     }
-  } else {
-    // TODO Should we check that path is consistent during handshake?
-    rv = do_handshake(data, datalen);
-    if (rv != 0) {
-      return handle_error(rv);
-    }
+
+    return 0;
+  }
+
+  rv = do_handshake(&path, data, datalen);
+  if (rv != 0) {
+    return handle_error(rv);
   }
 
   return 0;
@@ -1568,7 +1574,7 @@ int Handler::on_write(bool retransmit) {
   }
 
   if (!ngtcp2_conn_get_handshake_completed(conn_)) {
-    rv = do_handshake(nullptr, 0);
+    rv = do_handshake(nullptr, nullptr, 0);
     if (rv == NETWORK_ERR_SEND_NON_FATAL) {
       schedule_retransmit();
     }
diff --git a/examples/server.h b/examples/server.h
index 2757ccdc1c676f78c84b628f309be94c5320d250..6790977fb6477805a07e3e666ce271f3c2d39078 100644
--- a/examples/server.h
+++ b/examples/server.h
@@ -182,9 +182,11 @@ public:
   int write_stream_data(Stream &stream, int fin, Buffer &data);
   int feed_data(Endpoint &ep, const sockaddr *sa, socklen_t salen,
                 uint8_t *data, size_t datalen);
-  int do_handshake_read_once(const uint8_t *data, size_t datalen);
+  int do_handshake_read_once(const ngtcp2_path *path, const uint8_t *data,
+                             size_t datalen);
   ssize_t do_handshake_write_once();
-  int do_handshake(const uint8_t *data, size_t datalen);
+  int do_handshake(const ngtcp2_path *path, const uint8_t *data,
+                   size_t datalen);
   void schedule_retransmit();
   void signal_write();
 
diff --git a/lib/includes/ngtcp2/ngtcp2.h b/lib/includes/ngtcp2/ngtcp2.h
index 823587cd29f2c5a126ef1fd22bef17e8232145a1..8aa7811181e63ad428b7e94b7a346cf0510ec1cd 100644
--- a/lib/includes/ngtcp2/ngtcp2.h
+++ b/lib/includes/ngtcp2/ngtcp2.h
@@ -1540,7 +1540,7 @@ NGTCP2_EXTERN void ngtcp2_conn_del(ngtcp2_conn *conn);
  *
  * `ngtcp2_conn_read_handshake` performs QUIC cryptographic handshake
  * by reading given data.  |pkt| points to the buffer to read and
- * |pktlen| is the length of the buffer.
+ * |pktlen| is the length of the buffer.  |path| is the network path.
  *
  * The application should call `ngtcp2_conn_write_handshake` (or
  * `ngtcp2_conn_client_write_handshake` for client session) to make
@@ -1558,6 +1558,7 @@ NGTCP2_EXTERN void ngtcp2_conn_del(ngtcp2_conn *conn);
  * negative error codes: (TBD).
  */
 NGTCP2_EXTERN int ngtcp2_conn_read_handshake(ngtcp2_conn *conn,
+                                             const ngtcp2_path *path,
                                              const uint8_t *pkt, size_t pktlen,
                                              ngtcp2_tstamp ts);
 
diff --git a/lib/ngtcp2_conn.c b/lib/ngtcp2_conn.c
index f97e03586461faca2a32ca01caa5c5808ff64729..8ecebd0317827904fa1dbbf97f9959b72917b086 100644
--- a/lib/ngtcp2_conn.c
+++ b/lib/ngtcp2_conn.c
@@ -3605,8 +3605,8 @@ static void conn_recv_max_data(ngtcp2_conn *conn, const ngtcp2_max_data *fr) {
  *     Out of memory.
  */
 static int conn_buffer_pkt(ngtcp2_conn *conn, ngtcp2_pkt_chain **ppc,
-                           const uint8_t *pkt, size_t pktlen,
-                           ngtcp2_tstamp ts) {
+                           const ngtcp2_path *path, const uint8_t *pkt,
+                           size_t pktlen, ngtcp2_tstamp ts) {
   int rv;
   ngtcp2_pkt_chain *pc;
   size_t i;
@@ -3618,7 +3618,7 @@ static int conn_buffer_pkt(ngtcp2_conn *conn, ngtcp2_pkt_chain **ppc,
     return 0;
   }
 
-  rv = ngtcp2_pkt_chain_new(&pc, pkt, pktlen, ts, conn->mem);
+  rv = ngtcp2_pkt_chain_new(&pc, path, pkt, pktlen, ts, conn->mem);
   if (rv != 0) {
     return rv;
   }
@@ -3630,9 +3630,10 @@ static int conn_buffer_pkt(ngtcp2_conn *conn, ngtcp2_pkt_chain **ppc,
 
 /*
  * conn_buffer_protected_pkt buffers a protected packet |pkt| whose
- * length is |pktlen|.  This function is called when a protected
- * packet is received, but the local endpoint has not established
- * cryptographic context (e.g., Handshake packet is lost or delayed).
+ * length is |pktlen|.  The packet is obtained via network |path|.
+ * This function is called when a protected packet is received, but
+ * the local endpoint has not established cryptographic context (e.g.,
+ * Handshake packet is lost or delayed).
  *
  * This function also buffers 0-RTT Protected packet if it arrives
  * before Initial packet.
@@ -3646,15 +3647,16 @@ static int conn_buffer_pkt(ngtcp2_conn *conn, ngtcp2_pkt_chain **ppc,
  * NGTCP2_ERR_NOMEM
  *     Out of memory.
  */
-static int conn_buffer_protected_pkt(ngtcp2_conn *conn, const uint8_t *pkt,
-                                     size_t pktlen, ngtcp2_tstamp ts) {
-  return conn_buffer_pkt(conn, &conn->buffed_rx_ppkts, pkt, pktlen, ts);
+static int conn_buffer_protected_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,
+                                     const uint8_t *pkt, size_t pktlen,
+                                     ngtcp2_tstamp ts) {
+  return conn_buffer_pkt(conn, &conn->buffed_rx_ppkts, path, pkt, pktlen, ts);
 }
 
 /*
  * conn_buffer_handshake_pkt buffers Handshake packet which comes
  * before Initial packet, in other words, before handshake rx key is
- * generated.
+ * generated.  The packet is obtained via network |path|.
  *
  * This function returns 0 if it succeeds, or one of the following
  * negative error codes:
@@ -3662,9 +3664,10 @@ static int conn_buffer_protected_pkt(ngtcp2_conn *conn, const uint8_t *pkt,
  * NGTCP2_ERR_NOMEM
  *     Out of memory.
  */
-static int conn_buffer_handshake_pkt(ngtcp2_conn *conn, const uint8_t *pkt,
-                                     size_t pktlen, ngtcp2_tstamp ts) {
-  return conn_buffer_pkt(conn, &conn->buffed_rx_hs_pkts, pkt, pktlen, ts);
+static int conn_buffer_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,
+                                     const uint8_t *pkt, size_t pktlen,
+                                     ngtcp2_tstamp ts) {
+  return conn_buffer_pkt(conn, &conn->buffed_rx_hs_pkts, path, pkt, pktlen, ts);
 }
 
 /*
@@ -4076,8 +4079,10 @@ static ssize_t conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,
  * In addition to the above error codes, error codes returned from
  * conn_recv_pkt are also returned.
  */
-static ssize_t conn_recv_handshake_pkt(ngtcp2_conn *conn, const uint8_t *pkt,
-                                       size_t pktlen, ngtcp2_tstamp ts) {
+static ssize_t conn_recv_handshake_pkt(ngtcp2_conn *conn,
+                                       const ngtcp2_path *path,
+                                       const uint8_t *pkt, size_t pktlen,
+                                       ngtcp2_tstamp ts) {
   ssize_t nread;
   ngtcp2_pkt_hd hd;
   ngtcp2_max_frame mfr;
@@ -4122,7 +4127,7 @@ static ssize_t conn_recv_handshake_pkt(ngtcp2_conn *conn, const uint8_t *pkt,
     ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON,
                     "buffering Short packet len=%zu", pktlen);
 
-    rv = conn_buffer_protected_pkt(conn, pkt, pktlen, ts);
+    rv = conn_buffer_protected_pkt(conn, path, pkt, pktlen, ts);
     if (rv != 0) {
       assert(ngtcp2_err_is_fatal(rv));
       return rv;
@@ -4249,7 +4254,7 @@ static ssize_t conn_recv_handshake_pkt(ngtcp2_conn *conn, const uint8_t *pkt,
     ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON,
                     "buffering 0-RTT Protected packet len=%zu", pktlen);
 
-    rv = conn_buffer_protected_pkt(conn, pkt, pktlen, ts);
+    rv = conn_buffer_protected_pkt(conn, path, pkt, pktlen, ts);
     if (rv != 0) {
       assert(ngtcp2_err_is_fatal(rv));
       return rv;
@@ -4288,7 +4293,7 @@ static ssize_t conn_recv_handshake_pkt(ngtcp2_conn *conn, const uint8_t *pkt,
       ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON,
                       "buffering Handshake packet len=%zu", pktlen);
 
-      rv = conn_buffer_handshake_pkt(conn, pkt, pktlen, ts);
+      rv = conn_buffer_handshake_pkt(conn, path, pkt, pktlen, ts);
       if (rv != 0) {
         assert(ngtcp2_err_is_fatal(rv));
         return rv;
@@ -4509,13 +4514,14 @@ static ssize_t conn_recv_handshake_pkt(ngtcp2_conn *conn, const uint8_t *pkt,
  * This function returns the same error code returned by
  * conn_recv_handshake_pkt.
  */
-static int conn_recv_handshake_cpkt(ngtcp2_conn *conn, const uint8_t *pkt,
-                                    size_t pktlen, ngtcp2_tstamp ts) {
+static int conn_recv_handshake_cpkt(ngtcp2_conn *conn, const ngtcp2_path *path,
+                                    const uint8_t *pkt, size_t pktlen,
+                                    ngtcp2_tstamp ts) {
   ssize_t nread;
   size_t origlen = pktlen;
 
   while (pktlen) {
-    nread = conn_recv_handshake_pkt(conn, pkt, pktlen, ts);
+    nread = conn_recv_handshake_pkt(conn, path, pkt, pktlen, ts);
     if (nread < 0) {
       if (ngtcp2_err_is_fatal((int)nread)) {
         return (int)nread;
@@ -6234,10 +6240,8 @@ static int conn_process_buffered_protected_pkt(ngtcp2_conn *conn,
 
   for (ppc = &conn->buffed_rx_ppkts; *ppc;) {
     next = (*ppc)->next;
-    /* TODO Assume that protected packet is received in the expected
-       path. */
-    nread =
-        conn_recv_pkt(conn, &conn->dcid.path, (*ppc)->pkt, (*ppc)->pktlen, ts);
+    nread = conn_recv_pkt(conn, &(*ppc)->path.path, (*ppc)->pkt, (*ppc)->pktlen,
+                          ts);
     ngtcp2_pkt_chain_del(*ppc, conn->mem);
     *ppc = next;
     if (nread < 0) {
@@ -6265,7 +6269,8 @@ static int conn_process_buffered_handshake_pkt(ngtcp2_conn *conn,
 
   for (ppc = &conn->buffed_rx_hs_pkts; *ppc;) {
     next = (*ppc)->next;
-    nread = conn_recv_handshake_pkt(conn, (*ppc)->pkt, (*ppc)->pktlen, ts);
+    nread = conn_recv_handshake_pkt(conn, &(*ppc)->path.path, (*ppc)->pkt,
+                                    (*ppc)->pktlen, ts);
     ngtcp2_pkt_chain_del(*ppc, conn->mem);
     *ppc = next;
     if (nread < 0) {
@@ -6424,8 +6429,9 @@ static size_t conn_server_hs_tx_left(ngtcp2_conn *conn) {
   return conn->hs_recved * 3 - conn->hs_sent;
 }
 
-int ngtcp2_conn_read_handshake(ngtcp2_conn *conn, const uint8_t *pkt,
-                               size_t pktlen, ngtcp2_tstamp ts) {
+int ngtcp2_conn_read_handshake(ngtcp2_conn *conn, const ngtcp2_path *path,
+                               const uint8_t *pkt, size_t pktlen,
+                               ngtcp2_tstamp ts) {
   int rv;
   ngtcp2_pktns *hs_pktns = &conn->hs_pktns;
 
@@ -6441,7 +6447,7 @@ int ngtcp2_conn_read_handshake(ngtcp2_conn *conn, const uint8_t *pkt,
     /* TODO Better to log something when we ignore input */
     return 0;
   case NGTCP2_CS_CLIENT_WAIT_HANDSHAKE:
-    rv = conn_recv_handshake_cpkt(conn, pkt, pktlen, ts);
+    rv = conn_recv_handshake_cpkt(conn, path, pkt, pktlen, ts);
     if (rv < 0) {
       return rv;
     }
@@ -6460,7 +6466,7 @@ int ngtcp2_conn_read_handshake(ngtcp2_conn *conn, const uint8_t *pkt,
 
     return 0;
   case NGTCP2_CS_SERVER_INITIAL:
-    rv = conn_recv_handshake_cpkt(conn, pkt, pktlen, ts);
+    rv = conn_recv_handshake_cpkt(conn, path, pkt, pktlen, ts);
     if (rv < 0) {
       return rv;
     }
@@ -6483,7 +6489,7 @@ int ngtcp2_conn_read_handshake(ngtcp2_conn *conn, const uint8_t *pkt,
 
     return 0;
   case NGTCP2_CS_SERVER_WAIT_HANDSHAKE:
-    rv = conn_recv_handshake_cpkt(conn, pkt, pktlen, ts);
+    rv = conn_recv_handshake_cpkt(conn, path, pkt, pktlen, ts);
     if (rv < 0) {
       return rv;
     }
diff --git a/lib/ngtcp2_pkt.c b/lib/ngtcp2_pkt.c
index 63f354a1c4bda9c1ce094632ef79eef9fd62c497..adb36dcc85f2121b4787ac46f6e3fa8fefcfbf1e 100644
--- a/lib/ngtcp2_pkt.c
+++ b/lib/ngtcp2_pkt.c
@@ -33,13 +33,16 @@
 #include "ngtcp2_cid.h"
 #include "ngtcp2_mem.h"
 
-int ngtcp2_pkt_chain_new(ngtcp2_pkt_chain **ppc, const uint8_t *pkt,
-                         size_t pktlen, ngtcp2_tstamp ts, ngtcp2_mem *mem) {
+int ngtcp2_pkt_chain_new(ngtcp2_pkt_chain **ppc, const ngtcp2_path *path,
+                         const uint8_t *pkt, size_t pktlen, ngtcp2_tstamp ts,
+                         ngtcp2_mem *mem) {
   *ppc = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_pkt_chain) + pktlen);
   if (*ppc == NULL) {
     return NGTCP2_ERR_NOMEM;
   }
 
+  ngtcp2_path_storage_init(&(*ppc)->path, path->local.addr, path->local.len,
+                           path->remote.addr, path->remote.len);
   (*ppc)->next = NULL;
   (*ppc)->pkt = (uint8_t *)(*ppc) + sizeof(ngtcp2_pkt_chain);
   (*ppc)->pktlen = pktlen;
diff --git a/lib/ngtcp2_pkt.h b/lib/ngtcp2_pkt.h
index f7863f2815bd48a135f4ae46ddb364d60d434ea1..dc6724588d602d8d2fd8a62d29c504c87813f41f 100644
--- a/lib/ngtcp2_pkt.h
+++ b/lib/ngtcp2_pkt.h
@@ -88,6 +88,7 @@ typedef struct ngtcp2_pkt_chain ngtcp2_pkt_chain;
  * ngtcp2_pkt_chain is the chain of incoming packets buffered.
  */
 struct ngtcp2_pkt_chain {
+  ngtcp2_path_storage path;
   ngtcp2_pkt_chain *next;
   uint8_t *pkt;
   size_t pktlen;
@@ -97,7 +98,9 @@ struct ngtcp2_pkt_chain {
 /*
  * ngtcp2_pkt_chain_new allocates ngtcp2_pkt_chain objects, and
  * assigns its pointer to |*ppc|.  The content of buffer pointed by
- * |pkt| of length |pktlen| is copied into |*ppc|.
+ * |pkt| of length |pktlen| is copied into |*ppc|.  The packet is
+ * obtained via the network |path|.  The values of path->local and
+ * path->remote are copied into |*ppc|.
  *
  * This function returns 0 if it succeeds, or one of the following
  * negative error codes:
@@ -105,8 +108,9 @@ struct ngtcp2_pkt_chain {
  * NGTCP2_ERR_NOMEM
  *     Out of memory.
  */
-int ngtcp2_pkt_chain_new(ngtcp2_pkt_chain **ppc, const uint8_t *pkt,
-                         size_t pktlen, ngtcp2_tstamp ts, ngtcp2_mem *mem);
+int ngtcp2_pkt_chain_new(ngtcp2_pkt_chain **ppc, const ngtcp2_path *path,
+                         const uint8_t *pkt, size_t pktlen, ngtcp2_tstamp ts,
+                         ngtcp2_mem *mem);
 
 /*
  * ngtcp2_pkt_chain_del deallocates |pc|.  It also frees the memory
diff --git a/tests/ngtcp2_conn_test.c b/tests/ngtcp2_conn_test.c
index 95843befbef2df12eee139f5e7f25efba750b65c..c65d7d1ef213d20477ca78c6592e8100058eb68a 100644
--- a/tests/ngtcp2_conn_test.c
+++ b/tests/ngtcp2_conn_test.c
@@ -2078,7 +2078,8 @@ void test_ngtcp2_conn_recv_retry(void) {
 
     CU_ASSERT(spktlen > 0);
 
-    rv = ngtcp2_conn_read_handshake(conn, buf, (size_t)spktlen, ++t);
+    rv =
+        ngtcp2_conn_read_handshake(conn, &null_path, buf, (size_t)spktlen, ++t);
 
     CU_ASSERT(0 == rv);
 
@@ -2113,7 +2114,7 @@ void test_ngtcp2_conn_recv_retry(void) {
 
   CU_ASSERT(spktlen > 0);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, (size_t)spktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, (size_t)spktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -2153,7 +2154,7 @@ void test_ngtcp2_conn_recv_retry(void) {
 
   CU_ASSERT(spktlen > 0);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, (size_t)spktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, (size_t)spktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -2306,7 +2307,7 @@ void test_ngtcp2_conn_handshake(void) {
       conn, buf, sizeof(buf), NGTCP2_PKT_INITIAL, &rcid,
       ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -2346,7 +2347,7 @@ void test_ngtcp2_conn_handshake_error(void) {
       conn, buf, sizeof(buf), NGTCP2_PKT_INITIAL, &conn->oscid,
       ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(NGTCP2_ERR_CRYPTO == rv);
 
@@ -2366,7 +2367,7 @@ void test_ngtcp2_conn_handshake_error(void) {
       conn, buf, sizeof(buf), NGTCP2_PKT_INITIAL, &rcid,
       ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(NGTCP2_ERR_CRYPTO == rv);
 
@@ -3315,7 +3316,7 @@ void test_ngtcp2_conn_recv_early_data(void) {
       conn, buf, sizeof(buf), NGTCP2_PKT_INITIAL, &rcid,
       ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -3335,7 +3336,7 @@ void test_ngtcp2_conn_recv_early_data(void) {
       conn, buf, sizeof(buf), NGTCP2_PKT_0RTT_PROTECTED, &rcid,
       ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -3365,7 +3366,7 @@ void test_ngtcp2_conn_recv_early_data(void) {
       conn, buf, sizeof(buf), NGTCP2_PKT_0RTT_PROTECTED, &rcid,
       ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -3383,7 +3384,7 @@ void test_ngtcp2_conn_recv_early_data(void) {
       conn, buf, sizeof(buf), NGTCP2_PKT_INITIAL, &rcid,
       ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -3423,7 +3424,7 @@ void test_ngtcp2_conn_recv_early_data(void) {
       conn, buf + pktlen, sizeof(buf) - pktlen, NGTCP2_PKT_0RTT_PROTECTED,
       &rcid, ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -3468,7 +3469,7 @@ void test_ngtcp2_conn_recv_compound_pkt(void) {
       conn, buf + pktlen, sizeof(buf) - pktlen, NGTCP2_PKT_INITIAL,
       &conn->oscid, ngtcp2_conn_get_dcid(conn), ++pkt_num, conn->version, &fr);
 
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(0 == rv);
 
@@ -3558,7 +3559,7 @@ void test_ngtcp2_conn_pkt_payloadlen(void) {
   write_pkt_payloadlen(buf, dcid, &conn->oscid, payloadlen + 1);
 
   /* The incoming packet should be ignored */
-  rv = ngtcp2_conn_read_handshake(conn, buf, pktlen, ++t);
+  rv = ngtcp2_conn_read_handshake(conn, &null_path, buf, pktlen, ++t);
 
   CU_ASSERT(0 == rv);
   CU_ASSERT(NGTCP2_CS_SERVER_INITIAL == conn->state);