You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by am...@apache.org on 2018/04/09 14:50:13 UTC

[trafficserver] branch master updated: TSHttpTxnOutgoingAddrSet: Add documentation, implement for HTTP/2.

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

amc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 5396b4f  TSHttpTxnOutgoingAddrSet: Add documentation, implement for HTTP/2.
5396b4f is described below

commit 5396b4fbf2911bbdf0b38274f69b34dd586c90f4
Author: Alan M. Carroll <am...@apache.org>
AuthorDate: Sat Apr 7 15:02:16 2018 -0500

    TSHttpTxnOutgoingAddrSet: Add documentation, implement for HTTP/2.
---
 .../api/functions/TSHttpTxnOutgoingAddrGet.en.rst  | 27 +++++++++---
 proxy/ProxyClientSession.h                         | 25 +++++++++++
 proxy/ProxyClientTransaction.h                     | 23 +++++++---
 proxy/http/Http1ClientSession.cc                   |  3 +-
 proxy/http/Http1ClientSession.h                    | 24 -----------
 proxy/http/Http1ClientTransaction.cc               |  4 +-
 proxy/http/Http1ClientTransaction.h                | 50 ++--------------------
 proxy/http2/Http2SessionAccept.cc                  |  4 ++
 8 files changed, 74 insertions(+), 86 deletions(-)

diff --git a/doc/developer-guide/api/functions/TSHttpTxnOutgoingAddrGet.en.rst b/doc/developer-guide/api/functions/TSHttpTxnOutgoingAddrGet.en.rst
index 1a604af..cfbee11 100644
--- a/doc/developer-guide/api/functions/TSHttpTxnOutgoingAddrGet.en.rst
+++ b/doc/developer-guide/api/functions/TSHttpTxnOutgoingAddrGet.en.rst
@@ -14,11 +14,13 @@
    implied.  See the License for the specific language governing
    permissions and limitations under the License.
 
+.. include:: ../../../common.defs
+.. default-domain:: c
 
-TSHttpTxnOutgoingAddrGet
+Local outbound address
 ========================
 
-Get the outgoing address used in origin connection.
+Get or set the local IP address for outbound connections.
 
 
 Synopsis
@@ -27,13 +29,26 @@ Synopsis
 `#include <ts/ts.h>`
 
 .. c:function:: sockaddr const* TSHttpTxnOutgoingAddrGet(TSHttpTxn txnp)
+.. c:function:: TSReturnCode TSHttpTxnOutgoingAddrSet(TSHttpTxn txnp, sockaddr const* addr)
 
 
 Description
 -----------
 
-.. note::
+These functions concern the local IP address and port, that is the address and port on the |TS| side
+of outbound connections (network connections *from* |TS| *to* another socket).
 
-   The pointer is valid only for the current callback.  Clients that
-   need to keep the value across callbacks must maintain their own
-   storage.
+The address and optional the port can be set with :func:`TSHttpTxnOutgoingAddrSet`. This must be
+done before the outbound connection is made, that is in the :macro:`TS_HTTP_SEND_REQUEST_HDR_HOOK` or earlier.
+The :arg:`addr` must be populated with the IP address and port to be used. If the port is not
+relevant it can be set to zero, which means use any available local port. This function returns
+:macro:`TS_SUCCESS` on success and :macro:`TS_ERROR` on failure.
+
+Even on a successful call to :func:`TSHttpTxnOutgoingAddrSet`, the local IP address may not match
+what was passing :arg:`addr` if :ts:cv:`session sharing <proxy.config.http.server_session_sharing.match>` is enabled.
+
+Conversely :func:`TSHttpTxnOutgoingAddrGet` retrieves the local address and must be called after
+:macro:`TS_HTTP_SEND_REQUEST_HDR_HOOK`, after the outbound connection has been established. It returns a
+pointer to a :code:`sockaddr` which contains the local IP address and port. If there is no valid
+outbound connection, :arg:`addr` will be :code:`NULL`. The returned pointer is a transient pointer
+and must not be referenced after the callback in which :func:`TSHttpTxnOutgoingAddrGet` was called.
diff --git a/proxy/ProxyClientSession.h b/proxy/ProxyClientSession.h
index c797e9d..ec636bd 100644
--- a/proxy/ProxyClientSession.h
+++ b/proxy/ProxyClientSession.h
@@ -161,6 +161,24 @@ public:
   // Indicate we are done with a transaction.
   virtual void release(ProxyClientTransaction *trans) = 0;
 
+  virtual in_port_t
+  get_outbound_port() const
+  {
+    return outbound_port;
+  }
+
+  virtual IpAddr
+  get_outbound_ip4() const
+  {
+    return outbound_ip4;
+  }
+
+  virtual IpAddr
+  get_outbound_ip6() const
+  {
+    return outbound_ip6;
+  }
+
   int64_t
   connection_id() const
   {
@@ -240,6 +258,13 @@ public:
   /// acl record - cache IpAllow::match() call
   const AclRecord *acl_record = nullptr;
 
+  /// Local address for outbound connection.
+  IpAddr outbound_ip4;
+  /// Local address for outbound connection.
+  IpAddr outbound_ip6;
+  /// Local port for outbound connection.
+  in_port_t outbound_port{0};
+
   /// DNS resolution preferences.
   HostResStyle host_res_style = HOST_RES_IPV4;
 
diff --git a/proxy/ProxyClientTransaction.h b/proxy/ProxyClientTransaction.h
index 224df05..0ada783 100644
--- a/proxy/ProxyClientTransaction.h
+++ b/proxy/ProxyClientTransaction.h
@@ -154,28 +154,37 @@ public:
   virtual void release(IOBufferReader *r);
 
   // outbound values Set via the server port definition.  Really only used for Http1 at the moment
-  virtual uint16_t
+  virtual in_port_t
   get_outbound_port() const
   {
-    return 0;
+    return outbound_port;
   }
   virtual IpAddr
   get_outbound_ip4() const
   {
-    return IpAddr();
+    return outbound_ip4;
   }
   virtual IpAddr
   get_outbound_ip6() const
   {
-    return IpAddr();
+    return outbound_ip6;
   }
   virtual void
-  set_outbound_port(uint16_t new_port)
+  set_outbound_port(in_port_t port)
   {
+    outbound_port = port;
   }
   virtual void
   set_outbound_ip(const IpAddr &new_addr)
   {
+    if (new_addr.isIp4()) {
+      outbound_ip4 = new_addr;
+    } else if (new_addr.isIp6()) {
+      outbound_ip6 = new_addr;
+    } else {
+      outbound_ip4.invalidate();
+      outbound_ip6.invalidate();
+    }
   }
   virtual bool
   is_outbound_transparent() const
@@ -269,6 +278,10 @@ protected:
 
   /// DNS resolution preferences.
   HostResStyle host_res_style;
+  /// Local outbound address control.
+  in_port_t outbound_port{0};
+  IpAddr outbound_ip4;
+  IpAddr outbound_ip6;
 
   bool restart_immediate;
 
diff --git a/proxy/http/Http1ClientSession.cc b/proxy/http/Http1ClientSession.cc
index 5ead868..4fae601 100644
--- a/proxy/http/Http1ClientSession.cc
+++ b/proxy/http/Http1ClientSession.cc
@@ -76,7 +76,6 @@ Http1ClientSession::Http1ClientSession()
     slave_ka_vio(nullptr),
     bound_ss(nullptr),
     released_transactions(0),
-    outbound_port(0),
     f_outbound_transparent(false),
     f_transparent_passthrough(false)
 {
@@ -134,7 +133,7 @@ Http1ClientSession::free()
   this->do_io_write(nullptr, 0, nullptr);
 
   // Free the transaction resources
-  this->trans.super::destroy();
+  this->trans.super_type::destroy();
 
   super::free();
   THREAD_FREE(this, http1ClientSessionAllocator, this_thread());
diff --git a/proxy/http/Http1ClientSession.h b/proxy/http/Http1ClientSession.h
index 779c3ec..7bd5b19 100644
--- a/proxy/http/Http1ClientSession.h
+++ b/proxy/http/Http1ClientSession.h
@@ -128,24 +128,6 @@ public:
   // Indicate we are done with a transaction
   void release(ProxyClientTransaction *trans) override;
 
-  virtual uint16_t
-  get_outbound_port() const
-  {
-    return outbound_port;
-  }
-
-  virtual IpAddr
-  get_outbound_ip4() const
-  {
-    return outbound_ip4;
-  }
-
-  virtual IpAddr
-  get_outbound_ip6() const
-  {
-    return outbound_ip6;
-  }
-
   void attach_server_session(HttpServerSession *ssession, bool transaction_done = true) override;
 
   HttpServerSession *
@@ -228,12 +210,6 @@ public:
   // Link<Http1ClientSession> debug_link;
   LINK(Http1ClientSession, debug_link);
 
-  /// Local address for outbound connection.
-  IpAddr outbound_ip4;
-  /// Local address for outbound connection.
-  IpAddr outbound_ip6;
-  /// Local port for outbound connection.
-  uint16_t outbound_port;
   /// Set outbound connection to transparent.
   bool f_outbound_transparent;
   /// Transparently pass-through non-HTTP traffic.
diff --git a/proxy/http/Http1ClientTransaction.cc b/proxy/http/Http1ClientTransaction.cc
index 9c662c6..54d5fc2 100644
--- a/proxy/http/Http1ClientTransaction.cc
+++ b/proxy/http/Http1ClientTransaction.cc
@@ -42,7 +42,7 @@ Http1ClientTransaction::release(IOBufferReader *r)
   if (r != sm_reader) {
     this->do_io_close();
   } else {
-    super::release(r);
+    super_type::release(r);
   }
 }
 
@@ -57,7 +57,7 @@ Http1ClientTransaction::set_parent(ProxyClientSession *new_parent)
     outbound_ip6         = http1_parent->outbound_ip6;
     outbound_transparent = http1_parent->f_outbound_transparent;
   }
-  super::set_parent(new_parent);
+  super_type::set_parent(new_parent);
 }
 
 void
diff --git a/proxy/http/Http1ClientTransaction.h b/proxy/http/Http1ClientTransaction.h
index fb23bc7..e53372d 100644
--- a/proxy/http/Http1ClientTransaction.h
+++ b/proxy/http/Http1ClientTransaction.h
@@ -31,9 +31,9 @@ class Continuation;
 class Http1ClientTransaction : public ProxyClientTransaction
 {
 public:
-  typedef ProxyClientTransaction super;
+  using super_type = ProxyClientTransaction;
 
-  Http1ClientTransaction() : super(), outbound_port(0), outbound_transparent(false) {}
+  Http1ClientTransaction() {}
   // Implement VConnection interface.
   VIO *
   do_io_read(Continuation *c, int64_t nbytes = INT64_MAX, MIOBuffer *buf = 0) override
@@ -96,47 +96,6 @@ public:
 
   void set_parent(ProxyClientSession *new_parent) override;
 
-  uint16_t
-  get_outbound_port() const override
-  {
-    return outbound_port;
-  }
-
-  IpAddr
-  get_outbound_ip4() const override
-  {
-    return outbound_ip4;
-  }
-
-  IpAddr
-  get_outbound_ip6() const override
-  {
-    return outbound_ip6;
-  }
-
-  void
-  set_outbound_port(uint16_t new_port) override
-  {
-    outbound_port = new_port;
-  }
-
-  void
-  set_outbound_ip(const IpAddr &new_addr) override
-  {
-    if (new_addr.isIp4()) {
-      outbound_ip4 = new_addr;
-    } else if (new_addr.isIp6()) {
-      outbound_ip6 = new_addr;
-    } else {
-      clear_outbound_ip();
-    }
-  }
-  void
-  clear_outbound_ip()
-  {
-    outbound_ip4.invalidate();
-    outbound_ip6.invalidate();
-  }
   bool
   is_outbound_transparent() const override
   {
@@ -180,10 +139,7 @@ public:
   }
 
 protected:
-  uint16_t outbound_port;
-  IpAddr outbound_ip4;
-  IpAddr outbound_ip6;
-  bool outbound_transparent;
+  bool outbound_transparent{false};
 };
 
 #endif
diff --git a/proxy/http2/Http2SessionAccept.cc b/proxy/http2/Http2SessionAccept.cc
index 5081d04..1c53b94 100644
--- a/proxy/http2/Http2SessionAccept.cc
+++ b/proxy/http2/Http2SessionAccept.cc
@@ -57,6 +57,10 @@ Http2SessionAccept::accept(NetVConnection *netvc, MIOBuffer *iobuf, IOBufferRead
 
   Http2ClientSession *new_session = THREAD_ALLOC_INIT(http2ClientSessionAllocator, this_ethread());
   new_session->acl_record         = session_acl_record;
+  new_session->host_res_style     = ats_host_res_from(client_ip->sa_family, options.host_res_preference);
+  new_session->outbound_ip4       = options.outbound_ip4;
+  new_session->outbound_ip6       = options.outbound_ip6;
+  new_session->outbound_port      = options.outbound_port;
   new_session->new_connection(netvc, iobuf, reader, false /* backdoor */);
 
   return true;

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