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);