You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2012/07/09 06:17:40 UTC

git commit: TS-961: Initial TSPortDescriptor API

Updated Branches:
  refs/heads/master b512fef66 -> bbb15e4f9


TS-961: Initial TSPortDescriptor API

The TSPortDescriptor API is a generic API that defines how a plugin
can accept new connections. This initial version supports the
descriptor strings used by proxy.config.http.server_ports.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/bbb15e4f
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/bbb15e4f
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/bbb15e4f

Branch: refs/heads/master
Commit: bbb15e4f95e7594cd6d0bdfb150cfb16006462c9
Parents: b512fef
Author: James Peach <jp...@apache.org>
Authored: Mon May 7 21:44:44 2012 -0700
Committer: James Peach <jp...@apache.org>
Committed: Sun Jul 8 21:13:24 2012 -0700

----------------------------------------------------------------------
 CHANGES                           |    2 +
 iocore/net/P_SSLConfig.h          |    9 +++
 proxy/InkAPI.cc                   |   22 +++++++
 proxy/InkAPITest.cc               |   58 ++++++++++++++++---
 proxy/api/ts/ts.h.in              |   15 +++++
 proxy/http/HttpProxyServerMain.cc |  100 ++++++++++++++++++--------------
 proxy/http/HttpProxyServerMain.h  |    4 +
 7 files changed, 158 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/bbb15e4f/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 5261560..1793435 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,7 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 3.3.0
+  *) [TS-961] Add TSPortDescriptor API to support accepting connections with inbound transparency.
+
   *) [TS-1332] Silence spurious error when adding SSL certificates with alternate names
 
   *) [TS-1087] TSHttpTxnOutgoingAddrSet forward declaration does not match implementation

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/bbb15e4f/iocore/net/P_SSLConfig.h
----------------------------------------------------------------------
diff --git a/iocore/net/P_SSLConfig.h b/iocore/net/P_SSLConfig.h
index 3fd3a13..f2115c2 100644
--- a/iocore/net/P_SSLConfig.h
+++ b/iocore/net/P_SSLConfig.h
@@ -108,6 +108,15 @@ public:
   static SslConfigParams *acquire();
   static void release(SslConfigParams * params);
 
+  struct scoped_config {
+    scoped_config() : p(SslConfig::acquire()) {}
+    ~scoped_config() { SslConfig::release(p); }
+    operator const SslConfigParams * () const { return p; }
+
+    private:
+      SslConfigParams * p;
+  };
+
 private:
   static int id;
 #ifndef USE_CONFIG_PROCESSOR

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/bbb15e4f/proxy/InkAPI.cc
----------------------------------------------------------------------
diff --git a/proxy/InkAPI.cc b/proxy/InkAPI.cc
index 5e8c786..aca617b 100644
--- a/proxy/InkAPI.cc
+++ b/proxy/InkAPI.cc
@@ -67,6 +67,7 @@
 
 #include "I_RecDefs.h"
 #include "I_RecCore.h"
+#include "HttpProxyServerMain.h"
 
 
 /****************************************************************
@@ -8252,4 +8253,25 @@ TSMgmtIntCreate(TSRecordType rec_type, const char *name, TSMgmtInt data_default,
   return TS_SUCCESS;
 }
 
+// Parse a port descriptor for the proxy.config.http.server_ports descriptor format.
+TSPortDescriptor
+TSPortDescriptorParse(const char * descriptor)
+{
+  HttpProxyPort * port = NEW(new HttpProxyPort());
+
+  if (descriptor && port->processOptions(descriptor)) {
+    return (TSPortDescriptor)port;
+  }
+
+  delete port;
+  return NULL;
+}
+
+TSReturnCode
+TSPortDescriptorAccept(TSPortDescriptor descp, TSCont contp)
+{
+  HttpProxyPort * port = (HttpProxyPort *)descp;
+  return start_HttpProxyPort(*port, 0 /* nthreads */) ? TS_SUCCESS : TS_ERROR;
+}
+
 #endif //TS_NO_API

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/bbb15e4f/proxy/InkAPITest.cc
----------------------------------------------------------------------
diff --git a/proxy/InkAPITest.cc b/proxy/InkAPITest.cc
index 3827244..6b20ecc 100644
--- a/proxy/InkAPITest.cc
+++ b/proxy/InkAPITest.cc
@@ -254,10 +254,10 @@ REGRESSION_TEST(SDK_API_TSConfig) (RegressionTest * test, int atype, int *pstatu
 //                    TSNetAccept
 //                    TSNetConnect
 //////////////////////////////////////////////
-#define IP(a,b,c,d) htonl((a) << 24 | (b) << 16 | (c) << 8 | (d))
-const unsigned short server_port = 12345;
-RegressionTest *SDK_NetVConn_test;
-int *SDK_NetVConn_pstatus;
+
+static unsigned short   SDK_NetVConn_port;
+static RegressionTest * SDK_NetVConn_test;
+static int *            SDK_NetVConn_pstatus;
 
 int
 server_handler(TSCont contp, TSEvent event, void *data)
@@ -305,8 +305,8 @@ client_handler(TSCont contp, TSEvent event, void *data)
     } else
       SDK_RPRINT(SDK_NetVConn_test, "TSNetVConnRemoteIPGet", "TestCase1", TC_PASS, "ok");
 
-    if (input_server_port != server_port) {
-      SDK_RPRINT(SDK_NetVConn_test, "TSNetVConnRemotePortGet", "TestCase1", TC_FAIL, "server port [%d] is incorrect -- expected [%d]", input_server_port, server_port);
+    if (input_server_port != SDK_NetVConn_port) {
+      SDK_RPRINT(SDK_NetVConn_test, "TSNetVConnRemotePortGet", "TestCase1", TC_FAIL, "server port [%d] is incorrect -- expected [%d]", input_server_port, SDK_NetVConn_port);
 
       TSContDestroy(contp);
       // Fix me: how to deal with server side cont?
@@ -328,8 +328,34 @@ REGRESSION_TEST(SDK_API_TSNetVConn) (RegressionTest * test, int atype, int *psta
 {
   NOWARN_UNUSED(atype);
   *pstatus = REGRESSION_TEST_INPROGRESS;
+
+  SDK_NetVConn_test = test;
+  SDK_NetVConn_pstatus = pstatus;
+  SDK_NetVConn_port = 12345;
+
+  TSMutex server_mutex = TSMutexCreate();
+  TSMutex client_mutex = TSMutexCreate();
+
+  TSCont server_cont = TSContCreate(server_handler, server_mutex);
+  TSCont client_cont = TSContCreate(client_handler, client_mutex);
+
+  TSNetAccept(server_cont, SDK_NetVConn_port, -1, 0);
+
+  IpEndpoint addr;
+  ats_ip4_set(&addr, htonl(INADDR_LOOPBACK), htons(SDK_NetVConn_port));
+  TSNetConnect(client_cont, &addr.sa);
+}
+
+REGRESSION_TEST(SDK_API_TSPortDescriptor) (RegressionTest * test, int atype, int *pstatus)
+{
+  NOWARN_UNUSED(atype);
+  TSPortDescriptor port;
+  char desc[64];
+
+  *pstatus = REGRESSION_TEST_INPROGRESS;
   SDK_NetVConn_test = test;
   SDK_NetVConn_pstatus = pstatus;
+  SDK_NetVConn_port = 54321;
 
   TSMutex server_mutex = TSMutexCreate();
   TSMutex client_mutex = TSMutexCreate();
@@ -337,10 +363,26 @@ REGRESSION_TEST(SDK_API_TSNetVConn) (RegressionTest * test, int atype, int *psta
   TSCont server_cont = TSContCreate(server_handler, server_mutex);
   TSCont client_cont = TSContCreate(client_handler, client_mutex);
 
-  TSNetAccept(server_cont, server_port, -1, 0);
+  port = TSPortDescriptorParse(NULL);
+  if (port) {
+    SDK_RPRINT(test, "TSPortDescriptorParse", "NULL port descriptor", TC_FAIL,
+        "TSPortDescriptorParse(NULL) returned %s", port);
+    *pstatus = REGRESSION_TEST_FAILED;
+    return;
+  }
+
+  snprintf(desc, sizeof(desc), "%u", SDK_NetVConn_port);
+  port = TSPortDescriptorParse(desc);
+
+  if (TSPortDescriptorAccept(port, server_cont) == TS_ERROR) {
+    SDK_RPRINT(test, "TSPortDescriptorParse", "Basic port descriptor", TC_FAIL,
+        "TSPortDescriptorParse(%s) returned TS_ERROR", desc);
+    *pstatus = REGRESSION_TEST_FAILED;
+    return;
+  }
 
   IpEndpoint addr;
-  ats_ip4_set(&addr, htonl(INADDR_LOOPBACK), htons(server_port));
+  ats_ip4_set(&addr, htonl(INADDR_LOOPBACK), htons(SDK_NetVConn_port));
   TSNetConnect(client_cont, &addr.sa);
 }
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/bbb15e4f/proxy/api/ts/ts.h.in
----------------------------------------------------------------------
diff --git a/proxy/api/ts/ts.h.in b/proxy/api/ts/ts.h.in
index 5e13a5d..329bd40 100644
--- a/proxy/api/ts/ts.h.in
+++ b/proxy/api/ts/ts.h.in
@@ -687,6 +687,7 @@ extern "C"
   typedef struct tsapi_cachehttpinfo* TSCacheHttpInfo;
   typedef struct tsapi_cachetxn* TSCacheTxn;
 
+  typedef struct tsapi_port* TSPortDescriptor;
   typedef struct tsapi_vio* TSVIO;
   typedef struct tsapi_thread* TSThread;
   typedef struct tsapi_mutex* TSMutex;
@@ -2658,6 +2659,20 @@ extern "C"
   */
   tsapi TSReturnCode TSNetAcceptNamedProtocol(TSCont contp, const char * protocol);
 
+  /**
+    Create a new port from the string specification used by the
+    proxy.config.http.server_ports configuration value.
+   */
+  tsapi TSPortDescriptor TSPortDescriptorParse(const char * descriptor);
+
+  /**
+     Start listening on the given port descriptor. If a connection is
+     successfully accepted, the TS_EVENT_NET_ACCEPT is delivered to the
+     continuation. The event data will be a valid TSVConn bound to the accepted
+     connection.
+   */
+  tsapi TSReturnCode TSPortDescriptorAccept(TSPortDescriptor, TSCont);
+
   /* --------------------------------------------------------------------------
      DNS Lookups */
   tsapi TSAction TSHostLookup(TSCont contp, const char* hostname, size_t namelen);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/bbb15e4f/proxy/http/HttpProxyServerMain.cc
----------------------------------------------------------------------
diff --git a/proxy/http/HttpProxyServerMain.cc b/proxy/http/HttpProxyServerMain.cc
index 555cea0..4ae75a1 100644
--- a/proxy/http/HttpProxyServerMain.cc
+++ b/proxy/http/HttpProxyServerMain.cc
@@ -154,6 +154,61 @@ init_HttpProxyServer(void)
 #endif
 }
 
+bool
+start_HttpProxyPort(const HttpProxyPort& port, unsigned nthreads)
+{
+  NetProcessor::AcceptOptions net;
+  HttpAccept::Options         http;
+  SslConfig::scoped_config    sslParam;
+
+  net.accept_threads = nthreads;
+
+  net.f_inbound_transparent = port.m_inbound_transparent_p;
+  net.ip_family = port.m_family;
+  net.local_port = port.m_port;
+
+  http.f_outbound_transparent = port.m_outbound_transparent_p;
+  http.transport_type = port.m_type;
+
+  if (port.m_inbound_ip.isValid()) {
+    net.local_ip = port.m_inbound_ip;
+  } else if (AF_INET6 == port.m_family && HttpConfig::m_master.inbound_ip6.isIp6()) {
+    net.local_ip = HttpConfig::m_master.inbound_ip6;
+  } else if (AF_INET == port.m_family && HttpConfig::m_master.inbound_ip4.isIp4()) {
+    net.local_ip = HttpConfig::m_master.inbound_ip4;
+  }
+
+  if (port.m_outbound_ip4.isValid()) {
+    http.outbound_ip4 = port.m_outbound_ip4;
+  } else if (HttpConfig::m_master.outbound_ip4.isValid()) {
+    http.outbound_ip4 = HttpConfig::m_master.outbound_ip4;
+  }
+
+  if (port.m_outbound_ip6.isValid()) {
+    http.outbound_ip6 = port.m_outbound_ip6;
+  } else if (HttpConfig::m_master.outbound_ip6.isValid()) {
+    http.outbound_ip6 = HttpConfig::m_master.outbound_ip6;
+  }
+
+  if (port.isSSL()) {
+    HttpAccept * accept = NEW(new HttpAccept(http));
+    SSLNextProtocolAccept * ssl = NEW(new SSLNextProtocolAccept(accept));
+    ssl->registerEndpoint(TS_NPN_PROTOCOL_HTTP_1_0, accept);
+    ssl->registerEndpoint(TS_NPN_PROTOCOL_HTTP_1_1, accept);
+
+#ifndef TS_NO_API
+    ink_scoped_mutex lock(ssl_plugin_mutex);
+    ssl_plugin_acceptors.push(ssl);
+#endif
+
+    return sslNetProcessor.main_accept(ssl, port.m_fd, net) != NULL;
+  } else {
+    return netProcessor.main_accept(NEW(new HttpAccept(http)), port.m_fd, net) != NULL;
+  }
+
+  // XXX although we make a good pretence here, I don't believe that NetProcessor::main_accept() ever actually returns
+  // NULL. It would be useful to be able to detect errors and spew them here though.
+}
 
 void
 start_HttpProxyServer(int accept_threads)
@@ -178,54 +233,11 @@ start_HttpProxyServer(int accept_threads)
   REC_ReadConfigInteger(opt.send_bufsize, "proxy.config.net.sock_send_buffer_size_in");
   REC_ReadConfigInteger(opt.packet_mark, "proxy.config.net.sock_packet_mark_in");
   REC_ReadConfigInteger(opt.packet_tos, "proxy.config.net.sock_packet_tos_in");
-  SslConfigParams *sslParam = sslTerminationConfig.acquire();
   
   for ( int i = 0 , n = HttpProxyPort::global().length() ; i < n ; ++i ) {
-    HttpProxyPort& p = HttpProxyPort::global()[i];
-    HttpAccept::Options ha_opt;
-
-    opt.f_inbound_transparent = p.m_inbound_transparent_p;
-    opt.ip_family = p.m_family;
-    opt.local_port = p.m_port;
-
-    ha_opt.f_outbound_transparent = p.m_outbound_transparent_p;
-    ha_opt.transport_type = p.m_type;
-
-    if (p.m_inbound_ip.isValid())
-      opt.local_ip = p.m_inbound_ip;
-    else if (AF_INET6 == p.m_family && HttpConfig::m_master.inbound_ip6.isIp6())
-      opt.local_ip = HttpConfig::m_master.inbound_ip6;
-    else if (AF_INET == p.m_family && HttpConfig::m_master.inbound_ip4.isIp4())
-      opt.local_ip = HttpConfig::m_master.inbound_ip4;
-
-    if (p.m_outbound_ip4.isValid())
-      ha_opt.outbound_ip4 = p.m_outbound_ip4;
-    else if (HttpConfig::m_master.outbound_ip4.isValid())
-      ha_opt.outbound_ip4 = HttpConfig::m_master.outbound_ip4;
-
-    if (p.m_outbound_ip6.isValid())
-      ha_opt.outbound_ip6 = p.m_outbound_ip6;
-    else if (HttpConfig::m_master.outbound_ip6.isValid())
-      ha_opt.outbound_ip6 = HttpConfig::m_master.outbound_ip6;
-
-    if (p.isSSL()) {
-      HttpAccept * http = NEW(new HttpAccept(ha_opt));
-      SSLNextProtocolAccept * ssl = NEW(new SSLNextProtocolAccept(http));
-      ssl->registerEndpoint(TS_NPN_PROTOCOL_HTTP_1_0, http);
-      ssl->registerEndpoint(TS_NPN_PROTOCOL_HTTP_1_1, http);
-
-#ifndef TS_NO_API
-      ink_scoped_mutex lock(ssl_plugin_mutex);
-      ssl_plugin_acceptors.push(ssl);
-#endif
-      sslNetProcessor.main_accept(ssl, p.m_fd, opt);
-    } else {
-      netProcessor.main_accept(NEW(new HttpAccept(ha_opt)), p.m_fd, opt);
-    }
+    start_HttpProxyPort(HttpProxyPort::global()[i], accept_threads);
   }
 
-  sslTerminationConfig.release(sslParam);
-
 #ifdef DEBUG
   if (diags->on("http_dump")) {
 //      HttpStateMachine::dump_state_machines();

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/bbb15e4f/proxy/http/HttpProxyServerMain.h
----------------------------------------------------------------------
diff --git a/proxy/http/HttpProxyServerMain.h b/proxy/http/HttpProxyServerMain.h
index 52e1e02..71906f1 100644
--- a/proxy/http/HttpProxyServerMain.h
+++ b/proxy/http/HttpProxyServerMain.h
@@ -21,6 +21,8 @@
   limitations under the License.
  */
 
+struct HttpProxyPort;
+
 void init_HttpProxyServer(void);
 
 /** Start the proxy server. 
@@ -29,3 +31,5 @@ void init_HttpProxyServer(void);
 void start_HttpProxyServer(int accept_threads = 0);
 
 void start_HttpProxyServerBackDoor(int port, int accept_threads = 0);
+
+bool start_HttpProxyPort(const HttpProxyPort& port, unsigned nthreads);