Updated Branches: refs/heads/master d0333c576 -> 667cca193
TS-2007 Add TSNetConnectTransparent API for transparent net connections Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/667cca19 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/667cca19 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/667cca19 Branch: refs/heads/master Commit: 667cca19347c4009767f94edbaac788b3cb2851d Parents: d0333c5 Author: Uri Shachar <ushac...@apache.org> Authored: Tue Jul 9 01:15:50 2013 +0300 Committer: Uri Shachar <ushac...@apache.org> Committed: Tue Jul 9 01:15:50 2013 +0300 ---------------------------------------------------------------------- CHANGES | 2 ++ proxy/InkAPI.cc | 19 +++++++++++++++++++ proxy/api/ts/experimental.h | 28 ++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/667cca19/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index 6249fe7..52a2d08 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,8 @@ Changes with Apache Traffic Server 3.3.5 + *) [TS-2007] Add TSNetConnectTransparent API for transparent net connections + *) [TS-1991] clang complaint: logical not is only applied to the left hand side of this comparison. http://git-wip-us.apache.org/repos/asf/trafficserver/blob/667cca19/proxy/InkAPI.cc ---------------------------------------------------------------------- diff --git a/proxy/InkAPI.cc b/proxy/InkAPI.cc index f598b47..209dd0b 100644 --- a/proxy/InkAPI.cc +++ b/proxy/InkAPI.cc @@ -6484,6 +6484,25 @@ TSNetConnect(TSCont contp, sockaddr const* addr) } TSAction +TSNetConnectTransparent(TSCont contp, sockaddr const* client_addr, sockaddr const* server_addr) +{ + sdk_assert(sdk_sanity_check_continuation(contp) == TS_SUCCESS); + sdk_assert(ats_is_ip(server_addr)); + sdk_assert(ats_ip_are_compatible(client_addr, server_addr)); + + NetVCOptions opt; + opt.addr_binding = NetVCOptions::FOREIGN_ADDR; + opt.local_ip.assign(client_addr); + opt.local_port = ats_ip_port_host_order(client_addr); + + FORCE_PLUGIN_MUTEX(contp); + + return reinterpret_cast<TSAction>( + netProcessor.connect_re(reinterpret_cast<INKContInternal*>(contp), server_addr, &opt) + ); +} + +TSAction TSNetAccept(TSCont contp, int port, int domain, int accept_threads) { NetProcessor::AcceptOptions opt; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/667cca19/proxy/api/ts/experimental.h ---------------------------------------------------------------------- diff --git a/proxy/api/ts/experimental.h b/proxy/api/ts/experimental.h index c8945c1..08537ae 100644 --- a/proxy/api/ts/experimental.h +++ b/proxy/api/ts/experimental.h @@ -215,6 +215,34 @@ extern "C" tsapi int TSHttpTxnLookingUpTypeGet(TSHttpTxn txnp); + /** + Opens a network connection to the host specified by the 'to' sockaddr + spoofing the client addr to equal the 'from' sockaddr. + If the connection is successfully opened, contp + is called back with the event TS_EVENT_NET_CONNECT and the new + network vconnection will be passed in the event data parameter. + If the connection is not successful, contp is called back with + the event TS_EVENT_NET_CONNECT_FAILED. + + Note: It is possible to receive TS_EVENT_NET_CONNECT + even if the connection failed, because of the implementation of + network sockets in the underlying operating system. There is an + exception: if a plugin tries to open a connection to a port on + its own host machine, then TS_EVENT_NET_CONNECT is sent only + if the connection is successfully opened. In general, however, + your plugin needs to look for an TS_EVENT_VCONN_WRITE_READY to + be sure that the connection is successfully opened. + + @return TSAction which allows you to check if the connection is complete, + or cancel the attempt to connect. + + */ + tsapi TSAction TSNetConnectTransparent(TSCont contp, /**< continuation that is called back when the attempted net connection either succeeds or fails. */ + struct sockaddr const* from, /**< Address to spoof as connection origin */ + struct sockaddr const* to /**< Address to which to connect. */ + ); + + /* ===== Matcher Utils ===== */ #define TS_MATCHER_LINE_INVALID 0 typedef struct tsapi_matcheline* TSMatcherLine;