You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by sc...@apache.org on 2018/02/14 11:42:49 UTC

[trafficserver] branch quic-latest updated: drain all of udp packets and make sure PollCont run before UDPNetHandler

This is an automated email from the ASF dual-hosted git repository.

scw00 pushed a commit to branch quic-latest
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/quic-latest by this push:
     new fa51000  drain all of udp packets and make sure PollCont run before UDPNetHandler
fa51000 is described below

commit fa5100060a43d95ec8df9c3b67ca9fa3388b141a
Author: scw00 <sc...@apache.org>
AuthorDate: Tue Feb 13 18:14:13 2018 +0800

    drain all of udp packets and make sure PollCont run before UDPNetHandler
---
 iocore/net/P_UDPNet.h            |   3 +-
 iocore/net/QUICNetVConnection.cc | 111 ++++++++++++++++++++++-----------------
 iocore/net/UnixUDPNet.cc         |   2 +-
 3 files changed, 67 insertions(+), 49 deletions(-)

diff --git a/iocore/net/P_UDPNet.h b/iocore/net/P_UDPNet.h
index 52de3b8..ae584ab 100644
--- a/iocore/net/P_UDPNet.h
+++ b/iocore/net/P_UDPNet.h
@@ -59,7 +59,8 @@ extern UDPNetProcessorInternal udpNetInternal;
 #define SLOT_TIME HRTIME_MSECONDS(SLOT_TIME_MSEC)
 #define N_SLOTS 2048
 
-constexpr int UDP_PERIOD = 9;
+constexpr int UDP_PERIOD    = 9;
+constexpr int UDP_NH_PERIOD = UDP_PERIOD + 1;
 
 class PacketQueue
 {
diff --git a/iocore/net/QUICNetVConnection.cc b/iocore/net/QUICNetVConnection.cc
index dc8823f..372403e 100644
--- a/iocore/net/QUICNetVConnection.cc
+++ b/iocore/net/QUICNetVConnection.cc
@@ -513,14 +513,24 @@ QUICNetVConnection::state_handshake(int event, Event *data)
   switch (event) {
   case QUIC_EVENT_PACKET_READ_READY: {
     QUICPacketCreationResult result;
-    QUICPacketUPtr packet = this->_dequeue_recv_packet(result);
-    if (result == QUICPacketCreationResult::NOT_READY) {
-      error = QUICErrorUPtr(new QUICNoError());
-    } else if (result == QUICPacketCreationResult::FAILED) {
-      error = QUICConnectionErrorUPtr(new QUICConnectionError(QUICTransErrorCode::TLS_FATAL_ALERT_GENERATED));
-    } else {
-      error = this->_state_handshake_process_packet(std::move(packet));
-    }
+    do {
+      QUICPacketUPtr packet = this->_dequeue_recv_packet(result);
+      if (result == QUICPacketCreationResult::NOT_READY) {
+        error = QUICErrorUPtr(new QUICNoError());
+      } else if (result == QUICPacketCreationResult::FAILED) {
+        error = QUICConnectionErrorUPtr(new QUICConnectionError(QUICTransErrorCode::TLS_FATAL_ALERT_GENERATED));
+      } else if (result == QUICPacketCreationResult::SUCCESS) {
+        error = this->_state_handshake_process_packet(std::move(packet));
+      }
+
+      // if we complete handshake, switch to establish state
+      if (this->_handshake_handler && this->_handshake_handler->is_completed()) {
+        this->_switch_to_established_state();
+        return this->handleEvent(event, data);
+      }
+
+    } while (error->cls == QUICErrorClass::NONE &&
+             (result == QUICPacketCreationResult::SUCCESS || result == QUICPacketCreationResult::IGNORED));
     break;
   }
   case QUIC_EVENT_PACKET_WRITE_READY: {
@@ -801,47 +811,51 @@ QUICNetVConnection::_state_common_receive_packet()
   QUICPacketCreationResult result;
 
   // Receive a QUIC packet
-  QUICPacketUPtr p = this->_dequeue_recv_packet(result);
-  if (result == QUICPacketCreationResult::FAILED) {
-    return QUICConnectionErrorUPtr(new QUICConnectionError(QUICTransErrorCode::TLS_FATAL_ALERT_GENERATED));
-  } else if (result == QUICPacketCreationResult::NOT_READY) {
-    return QUICErrorUPtr(new QUICNoError());
-  } else if (result == QUICPacketCreationResult::IGNORED) {
-    return QUICErrorUPtr(new QUICNoError());
-  }
-
-  net_activity(this, this_ethread());
+  do {
+    QUICPacketUPtr p = this->_dequeue_recv_packet(result);
+    if (result == QUICPacketCreationResult::FAILED) {
+      return QUICConnectionErrorUPtr(new QUICConnectionError(QUICTransErrorCode::TLS_FATAL_ALERT_GENERATED));
+    } else if (result == QUICPacketCreationResult::NOT_READY) {
+      return QUICErrorUPtr(new QUICNoError());
+    } else if (result == QUICPacketCreationResult::IGNORED) {
+      continue;
+    }
 
-  // Check connection migration
-  if (this->_handshake_handler->is_completed() && p->connection_id() != this->_quic_connection_id) {
-    for (unsigned int i = 0; i < countof(this->_alt_quic_connection_ids); ++i) {
-      AltConnectionInfo &info = this->_alt_quic_connection_ids[i];
-      if (info.id == p->connection_id()) {
-        // Migrate connection
-        // TODO Address Validation
-        // TODO Adjust expected packet number with a gap computed based on info.seq_num
-        // TODO Unregister the old connection id (Should we wait for a while?)
-        this->_quic_connection_id = info.id;
-        this->_reset_token        = info.token;
-        this->_update_alt_connection_ids(i);
-        break;
+    net_activity(this, this_ethread());
+
+    // Check connection migration
+    if (this->_handshake_handler->is_completed() && p->connection_id() != this->_quic_connection_id) {
+      for (unsigned int i = 0; i < countof(this->_alt_quic_connection_ids); ++i) {
+        AltConnectionInfo &info = this->_alt_quic_connection_ids[i];
+        if (info.id == p->connection_id()) {
+          // Migrate connection
+          // TODO Address Validation
+          // TODO Adjust expected packet number with a gap computed based on info.seq_num
+          // TODO Unregister the old connection id (Should we wait for a while?)
+          this->_quic_connection_id = info.id;
+          this->_reset_token        = info.token;
+          this->_update_alt_connection_ids(i);
+          break;
+        }
       }
+      ink_assert(p->connection_id() == this->_quic_connection_id);
     }
-    ink_assert(p->connection_id() == this->_quic_connection_id);
-  }
 
-  // Process the packet
-  switch (p->type()) {
-  case QUICPacketType::PROTECTED:
-    error = this->_state_connection_established_process_packet(std::move(p));
-    break;
-  case QUICPacketType::HANDSHAKE:
-    // FIXME Just ignore for now but it has to be acked (GitHub#2609)
-    break;
-  default:
-    error = QUICErrorUPtr(new QUICConnectionError(QUICTransErrorCode::INTERNAL_ERROR));
-    break;
-  }
+    // Process the packet
+    switch (p->type()) {
+    case QUICPacketType::PROTECTED:
+      error = this->_state_connection_established_process_packet(std::move(p));
+      break;
+    case QUICPacketType::HANDSHAKE:
+      // FIXME Just ignore for now but it has to be acked (GitHub#2609)
+      break;
+    default:
+      error = QUICErrorUPtr(new QUICConnectionError(QUICTransErrorCode::INTERNAL_ERROR));
+      break;
+    }
+
+  } while (error->cls == QUICErrorClass::NONE &&
+           (result == QUICPacketCreationResult::SUCCESS || result == QUICPacketCreationResult::IGNORED));
   return error;
 }
 
@@ -1147,8 +1161,11 @@ QUICNetVConnection::_dequeue_recv_packet(QUICPacketCreationResult &result)
   quic_packet = this->_packet_factory.create(std::move(pkt), written, this->largest_received_packet_number(), result);
   if (result == QUICPacketCreationResult::NOT_READY) {
     QUICConDebug("Not ready to decrypt the packet");
-    // Retry later
-    this->_packet_recv_queue.enqueue(udp_packet);
+    // FIXME: unordered packet should be buffered and retried
+    udp_packet->free();
+    if (this->_packet_recv_queue.size > 0) {
+      result = QUICPacketCreationResult::SUCCESS;
+    }
     this_ethread()->schedule_in_local(this, HRTIME_MSECONDS(10), QUIC_EVENT_PACKET_READ_READY);
   } else if (result == QUICPacketCreationResult::IGNORED) {
     QUICConDebug("Ignore to decrypt the packet");
diff --git a/iocore/net/UnixUDPNet.cc b/iocore/net/UnixUDPNet.cc
index e3891b8..9c75b4e 100644
--- a/iocore/net/UnixUDPNet.cc
+++ b/iocore/net/UnixUDPNet.cc
@@ -923,7 +923,7 @@ UDPNetHandler::startNetEvent(int event, Event *e)
   (void)event;
   SET_HANDLER((UDPNetContHandler)&UDPNetHandler::mainNetEvent);
   trigger_event = e;
-  e->schedule_every(-HRTIME_MSECONDS(UDP_PERIOD));
+  e->schedule_every(-HRTIME_MSECONDS(UDP_NH_PERIOD));
   return EVENT_CONT;
 }
 

-- 
To stop receiving notification emails like this one, please contact
scw00@apache.org.