You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@trafficserver.apache.org by James Peach <jp...@apache.org> on 2014/05/23 20:59:56 UTC

Re: git commit: TS-2838 Add log fields for plugins on HttpSM and use for SPDY.

This should have gone through API review. Can you please post a review email?

On May 23, 2014, at 9:30 AM, amc@apache.org wrote:

> Repository: trafficserver
> Updated Branches:
>  refs/heads/master b6383928a -> aadb75226
> 
> 
> TS-2838 Add log fields for plugins on HttpSM and use for SPDY.
> 
> 
> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
> Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/aadb7522
> Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/aadb7522
> Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/aadb7522
> 
> Branch: refs/heads/master
> Commit: aadb752267ba194a3a6f584c0874cda36e6ab859
> Parents: b638392
> Author: Alan M. Carroll <am...@network-geographics.com>
> Authored: Fri May 23 09:30:03 2014 -0700
> Committer: Alan M. Carroll <am...@network-geographics.com>
> Committed: Fri May 23 09:30:03 2014 -0700
> 
> ----------------------------------------------------------------------
> CHANGES                           |  2 ++
> proxy/FetchSM.cc                  | 17 ++++++-------
> proxy/FetchSM.h                   |  4 ++-
> proxy/InkAPI.cc                   |  9 ++++++-
> proxy/Plugin.h                    | 29 ++++++++++++++++++++++
> proxy/PluginVC.cc                 | 12 ++++++++-
> proxy/PluginVC.h                  | 23 ++++++++++++++++-
> proxy/api/ts/ts.h                 | 14 +++++++----
> proxy/http/HttpClientSession.cc   |  8 ++++++
> proxy/http/HttpProxyServerMain.cc |  9 +++----
> proxy/http/HttpSM.cc              |  1 +
> proxy/http/HttpSM.h               |  5 ++++
> proxy/logging/Log.cc              | 30 +++++++++--------------
> proxy/logging/LogAccess.cc        | 45 ++++++----------------------------
> proxy/logging/LogAccess.h         |  3 ++-
> proxy/logging/LogAccessHttp.cc    | 23 ++++++++++++-----
> proxy/logging/LogAccessHttp.h     |  3 ++-
> proxy/spdy/SpdyClientSession.cc   | 36 ++++++++++++++++++++++++---
> proxy/spdy/SpdyClientSession.h    | 12 ++++++---
> proxy/spdy/SpdySessionAccept.cc   | 15 +++---------
> proxy/spdy/SpdySessionAccept.h    | 11 +++------
> 21 files changed, 198 insertions(+), 113 deletions(-)
> ----------------------------------------------------------------------
> 
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/CHANGES
> ----------------------------------------------------------------------
> diff --git a/CHANGES b/CHANGES
> index 4f8d8af..fa34b15 100644
> --- a/CHANGES
> +++ b/CHANGES
> @@ -1,6 +1,8 @@
>                                                          -*- coding: utf-8 -*-
> Changes with Apache Traffic Server 5.0.0
> 
> +  *) [TS-2838] Add logging fields for plugins to TS connect API. Use for SPDY.
> +
>   *) [TS-2833] Remove REC_BUILD_STAND_ALONE, REC_BUILD_MGMT and
>    REC_BUILD_STUB. Dead code.
> 
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/FetchSM.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/FetchSM.cc b/proxy/FetchSM.cc
> index c119aca..a0a4033 100644
> --- a/proxy/FetchSM.cc
> +++ b/proxy/FetchSM.cc
> @@ -61,23 +61,22 @@ FetchSM::cleanUp()
>   client_response_hdr.destroy();
>   ats_free(client_response);
>   cont_mutex.clear();
> -
> -  PluginVC *vc = (PluginVC *) http_vc;
> -
> -  vc->do_io_close();
> +  http_vc->do_io_close();
>   FetchSMAllocator.free(this);
> }
> 
> void
> FetchSM::httpConnect()
> {
> -  Debug(DEBUG_TAG, "[%s] calling httpconnect write", __FUNCTION__);
> -  http_vc = TSHttpConnect(&_addr.sa);
> +  PluginIdentity* pi = dynamic_cast<PluginIdentity*>(contp);
> +  char const* tag = pi ? pi->getPluginTag() : "fetchSM";
> +  int64_t id = pi ? pi->getPluginId() : 0;
> 
> -  PluginVC *vc = (PluginVC *) http_vc;
> +  Debug(DEBUG_TAG, "[%s] calling httpconnect write", __FUNCTION__);
> +  http_vc = reinterpret_cast<PluginVC*>(TSHttpConnectWithPluginId(&_addr.sa, tag, id));
> 
> -  read_vio = vc->do_io_read(this, INT64_MAX, resp_buffer);
> -  write_vio = vc->do_io_write(this, getReqLen() + req_content_length, req_reader);
> +  read_vio = http_vc->do_io_read(this, INT64_MAX, resp_buffer);
> +  write_vio = http_vc->do_io_write(this, getReqLen() + req_content_length, req_reader);
> }
> 
> char* FetchSM::resp_get(int *length) {
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/FetchSM.h
> ----------------------------------------------------------------------
> diff --git a/proxy/FetchSM.h b/proxy/FetchSM.h
> index 0de5d96..c1b94bf 100644
> --- a/proxy/FetchSM.h
> +++ b/proxy/FetchSM.h
> @@ -35,6 +35,8 @@
> #include "HttpSM.h"
> #include "HttpTunnel.h"
> 
> +class PluginVC;
> +
> class FetchSM: public Continuation
> {
> public:
> @@ -139,7 +141,7 @@ private:
>   int dechunk_body();
> 
>   int recursion;
> -  TSVConn http_vc;
> +  PluginVC* http_vc;
>   VIO *read_vio;
>   VIO *write_vio;
>   MIOBuffer *req_buffer;
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/InkAPI.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/InkAPI.cc b/proxy/InkAPI.cc
> index 0182ebe..dceea6e 100644
> --- a/proxy/InkAPI.cc
> +++ b/proxy/InkAPI.cc
> @@ -6047,7 +6047,7 @@ extern HttpSessionAccept *plugin_http_accept;
> extern HttpSessionAccept *plugin_http_transparent_accept;
> 
> TSVConn
> -TSHttpConnect(sockaddr const* addr)
> +TSHttpConnectWithPluginId(sockaddr const* addr, char const* tag, int64_t id)
> {
>   sdk_assert(addr);
> 
> @@ -6058,6 +6058,8 @@ TSHttpConnect(sockaddr const* addr)
>     PluginVCCore *new_pvc = PluginVCCore::alloc();
> 
>     new_pvc->set_active_addr(addr);
> +    new_pvc->set_plugin_id(id);
> +    new_pvc->set_plugin_tag(tag);
>     new_pvc->set_accept_cont(plugin_http_accept);
> 
>     PluginVC *return_vc = new_pvc->connect();
> @@ -6076,6 +6078,11 @@ TSHttpConnect(sockaddr const* addr)
>   return NULL;
> }
> 
> +TSVConn
> +TSHttpConnect(sockaddr const* addr)
> +{
> +  return TSHttpConnectWithPluginId(addr, "plugin", 0);
> +}
> 
> TSVConn
> TSHttpConnectTransparent(sockaddr const* client_addr, sockaddr const* server_addr)
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/Plugin.h
> ----------------------------------------------------------------------
> diff --git a/proxy/Plugin.h b/proxy/Plugin.h
> index 4c1ad09..8f70f1a 100644
> --- a/proxy/Plugin.h
> +++ b/proxy/Plugin.h
> @@ -58,4 +58,33 @@ extern PluginRegInfo *plugin_reg_current;
> 
> void plugin_init(void);
> 
> +/** Abstract interface class for plugin based continuations.
> +
> +    The primary intended use of this is for logging so that continuations
> +    that generate logging messages can generate plugin local data in a
> +    generic way.
> +
> +    The core will at appropriate times dynamically cast the continuation
> +    to this class and if successful access the plugin data via these
> +    methods.
> +
> +    Plugins should mix this in to continuations for which it is useful.
> +    The default implementations return empty / invalid responses and should
> +    be overridden by the plugin.
> + */
> +class PluginIdentity
> +{
> + public:
> +  /** Get the plugin tag.
> +      The returned string must have a lifetime at least as long as the plugin.
> +      @return A string identifying the plugin or @c NULL.
> +  */
> +  virtual char const* getPluginTag() const { return NULL; }
> +  /** Get the plugin instance ID.
> +      A plugin can create multiple subsidiary instances. This is used as the
> +      identifier for those to distinguish the instances.
> +  */
> +  virtual int64_t getPluginId() const { return 0; }
> +};
> +
> #endif /* __PLUGIN_H__ */
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/PluginVC.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/PluginVC.cc b/proxy/PluginVC.cc
> index 2e4cfa1..16eb5a2 100644
> --- a/proxy/PluginVC.cc
> +++ b/proxy/PluginVC.cc
> @@ -1051,7 +1051,6 @@ void
> PluginVCCore::set_accept_cont(Continuation * c)
> {
>   connect_to = c;
> -
>   // FIX ME - must return action
> }
> 
> @@ -1202,6 +1201,17 @@ PluginVCCore::set_transparent(bool passive_side, bool active_side)
>   active_vc.set_is_transparent(active_side);
> }
> 
> +void
> +PluginVCCore::set_plugin_id(int64_t id)
> +{
> +  passive_vc.plugin_id = active_vc.plugin_id = id;
> +}
> +
> +void
> +PluginVCCore::set_plugin_tag(char const* tag)
> +{
> +  passive_vc.plugin_tag = active_vc.plugin_tag = tag;
> +}
> 
> /*************************************************************
>  *
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/PluginVC.h
> ----------------------------------------------------------------------
> diff --git a/proxy/PluginVC.h b/proxy/PluginVC.h
> index d770de5..6ee3a93 100644
> --- a/proxy/PluginVC.h
> +++ b/proxy/PluginVC.h
> @@ -36,6 +36,7 @@
> #ifndef _PLUGIN_VC_H_
> #define _PLUGIN_VC_H_
> 
> +#include "Plugin.h"
> #include "P_Net.h"
> #include "ink_atomic.h"
> 
> @@ -75,7 +76,7 @@ enum
>   PLUGIN_VC_MAGIC_DEAD = 0xaabbdead
> };
> 
> -class PluginVC:public NetVConnection
> +class PluginVC:public NetVConnection, public PluginIdentity
> {
>   friend class PluginVCCore;
> public:
> @@ -114,6 +115,18 @@ public:
> 
>   virtual PluginVC* get_other_side() { return other_side; }
> 
> +  //@{ @name Plugin identity.
> +  /// Override for @c PluginIdentity.
> +  virtual char const* getPluginTag() const { return plugin_tag; }
> +  /// Override for @c PluginIdentity.
> +  virtual int64_t getPluginId() const { return plugin_id; }
> +
> +  /// Setter for plugin tag.
> +  virtual void setPluginTag(char const* tag) { plugin_tag = tag; }
> +  /// Setter for plugin id.
> +  virtual void setPluginId(int64_t id) { plugin_id = id; }
> +  //@}
> +
>   int main_handler(int event, void *data);
> 
> private:
> @@ -152,6 +165,9 @@ private:
>   ink_hrtime inactive_timeout;
>   ink_hrtime inactive_timeout_at;
>   Event *inactive_event;
> +
> +  char const* plugin_tag;
> +  int64_t plugin_id;
> };
> 
> class PluginVCCore:public Continuation
> @@ -198,6 +214,11 @@ public:
> 
>   void set_transparent(bool passive_side, bool active_side);
> 
> +  /// Set the plugin ID for the internal VCs.
> +  void set_plugin_id(int64_t id);
> +  /// Set the plugin tag for the internal VCs.
> +  void set_plugin_tag(char const* tag);
> +
>   // The active vc is handed to the initiator of
>   //   connection.  The passive vc is handled to
>   //   receiver of the connection
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/api/ts/ts.h
> ----------------------------------------------------------------------
> diff --git a/proxy/api/ts/ts.h b/proxy/api/ts/ts.h
> index 27d0546..917d6b2 100644
> --- a/proxy/api/ts/ts.h
> +++ b/proxy/api/ts/ts.h
> @@ -1588,12 +1588,16 @@ extern "C"
>       than TSNetConnect() to localhost since it avoids the overhead of
>       passing the data through the operating system.
> 
> -      @param log_ip ip address (in network byte order) that connection
> -        will be logged as coming from.
> -      @param log_port port (in network byte order) that connection will
> -        be logged as coming from.
> -      @param vc will be set to point to the new TSVConn on success.
> +      This returns a VConn that connected to the transaction.
> +
> +      @param addr Target address of the origin server.
> +      @param tag A logging tag that can be accessed via the pitag field. May be @c NULL.
> +      @param id A logging id that can be access via the piid field.
> +   */
> +  tsapi TSVConn TSHttpConnectWithPluginId(struct sockaddr const* addr, char const* tag, int64_t id);
> 
> +  /** Backwards compatible version.
> +      This provides a @a tag of "plugin" and an @a id of 0.
>    */
>   tsapi TSVConn TSHttpConnect(struct sockaddr const* addr);
> 
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/http/HttpClientSession.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/http/HttpClientSession.cc b/proxy/http/HttpClientSession.cc
> index d2246c8..0620b3b 100644
> --- a/proxy/http/HttpClientSession.cc
> +++ b/proxy/http/HttpClientSession.cc
> @@ -36,6 +36,7 @@
> #include "HttpSM.h"
> #include "HttpDebugNames.h"
> #include "HttpServerSession.h"
> +#include "Plugin.h"
> 
> #define DebugSsn(tag, ...) DebugSpecific(debug_on, tag, __VA_ARGS__)
> #define STATE_ENTER(state_name, event, vio) { \
> @@ -137,6 +138,7 @@ void
> HttpClientSession::new_transaction()
> {
>   ink_assert(current_reader == NULL);
> +  PluginIdentity* pi = dynamic_cast<PluginIdentity*>(client_vc);
> 
>   read_state = HCS_ACTIVE_READER;
>   current_reader = HttpSM::allocate();
> @@ -145,6 +147,12 @@ HttpClientSession::new_transaction()
>   DebugSsn("http_cs", "[%" PRId64 "] Starting transaction %d using sm [%" PRId64 "]", con_id, transact_count, current_reader->sm_id);
> 
>   current_reader->attach_client_session(this, sm_reader);
> +  if (pi) {
> +    // it's a plugin VC of some sort with identify information.
> +    // copy it to the SM.
> +    current_reader->plugin_tag = pi->getPluginTag();
> +    current_reader->plugin_id = pi->getPluginId();
> +  }
> }
> 
> inline void
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/http/HttpProxyServerMain.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/http/HttpProxyServerMain.cc b/proxy/http/HttpProxyServerMain.cc
> index 2bf7d64..9eb9291 100644
> --- a/proxy/http/HttpProxyServerMain.cc
> +++ b/proxy/http/HttpProxyServerMain.cc
> @@ -180,8 +180,7 @@ MakeHttpProxyAcceptor(HttpProxyAcceptor& acceptor, HttpProxyPort& port, unsigned
> 
> #if TS_HAS_SPDY
>   if (port.m_session_protocol_preference.intersects(SPDY_PROTOCOL_SET)) {
> -    probe->registerEndpoint(ProtocolProbeSessionAccept::PROTO_SPDY,
> -                            new SpdySessionAccept(SpdySessionAccept::SPDY_VERSION_3_1));
> +    probe->registerEndpoint(ProtocolProbeSessionAccept::PROTO_SPDY, new SpdySessionAccept(spdy::SESSION_VERSION_3_1));
>   }
> #endif
> 
> @@ -207,11 +206,11 @@ MakeHttpProxyAcceptor(HttpProxyAcceptor& acceptor, HttpProxyPort& port, unsigned
>     // SPDY
> #if TS_HAS_SPDY
>     if (port.m_session_protocol_preference.contains(TS_NPN_PROTOCOL_INDEX_SPDY_3)) {
> -      ssl->registerEndpoint(TS_NPN_PROTOCOL_SPDY_3, new SpdySessionAccept(SpdySessionAccept::SPDY_VERSION_3));
> +      ssl->registerEndpoint(TS_NPN_PROTOCOL_SPDY_3, new SpdySessionAccept(spdy::SESSION_VERSION_3));
>     }
> 
>     if (port.m_session_protocol_preference.contains(TS_NPN_PROTOCOL_INDEX_SPDY_3_1)) {
> -      ssl->registerEndpoint(TS_NPN_PROTOCOL_SPDY_3_1, new SpdySessionAccept(SpdySessionAccept::SPDY_VERSION_3_1));
> +      ssl->registerEndpoint(TS_NPN_PROTOCOL_SPDY_3_1, new SpdySessionAccept(spdy::SESSION_VERSION_3_1));
>     }
> #endif
> 
> @@ -316,7 +315,7 @@ start_HttpProxyServerBackDoor(int port, int accept_threads)
>   opt.localhost_only = true;
>   ha_opt.backdoor = true;
>   opt.backdoor = true;
> -  
> +
>   // The backdoor only binds the loopback interface
>   netProcessor.main_accept(new HttpSessionAccept(ha_opt), NO_FD, opt);
> }
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/http/HttpSM.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc
> index 2eabc1d..02afe4a 100644
> --- a/proxy/http/HttpSM.cc
> +++ b/proxy/http/HttpSM.cc
> @@ -325,6 +325,7 @@ HttpSM::HttpSM()
>     client_response_hdr_bytes(0), client_response_body_bytes(0),
>     cache_response_hdr_bytes(0), cache_response_body_bytes(0),
>     pushed_response_hdr_bytes(0), pushed_response_body_bytes(0),
> +    plugin_tag(0), plugin_id(0),
>     hooks_set(0), cur_hook_id(TS_HTTP_LAST_HOOK), cur_hook(NULL),
>     cur_hooks(0), callout_state(HTTP_API_NO_CALLOUT), terminate_sm(false), kill_this_async_done(false)
> {
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/http/HttpSM.h
> ----------------------------------------------------------------------
> diff --git a/proxy/http/HttpSM.h b/proxy/http/HttpSM.h
> index 2b5a6fd..13121ec 100644
> --- a/proxy/http/HttpSM.h
> +++ b/proxy/http/HttpSM.h
> @@ -488,6 +488,11 @@ public:
>   int pushed_response_hdr_bytes;
>   int64_t pushed_response_body_bytes;
>   TransactionMilestones milestones;
> +  // The next two enable plugins to tag the state machine for
> +  // the purposes of logging so the instances can be correlated
> +  // with the source plugin.
> +  char const* plugin_tag;
> +  int64_t plugin_id;
> 
>   // hooks_set records whether there are any hooks relevant
>   //  to this transaction.  Used to avoid costly calls
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/Log.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/logging/Log.cc b/proxy/logging/Log.cc
> index 16138b4..9ee618e 100644
> --- a/proxy/logging/Log.cc
> +++ b/proxy/logging/Log.cc
> @@ -365,27 +365,19 @@ Log::init_fields()
>   global_field_list.add (field, false);
>   ink_hash_table_insert (field_symbol_hash, "caun", field);
> 
> -# if 0
> -  Ptr<LogFieldAliasTable> proto_type_map = make_ptr(new LogFieldAliasTable);
> -  proto_type_map->init(7,
> -                       // Transport protocols
> -                       TS_PROTO_UDP, "UDP",
> -                       TS_PROTO_TCP, "TCP",
> -                       TS_PROTO_TLS, "TLS",
> -                       // Application protocols
> -                       TS_PROTO_HTTP, "HTTP",
> -                       TS_PROTO_SPDY, "SPDY",
> -                       TS_PROTO_RTMP, "RTMP",
> -                       TS_PROTO_WS,   "WS");
> -
> -  field = new LogField("client_protocol_stack", "cps",
> +  field = new LogField("plugin_identity_id", "piid",
>                        LogField::sINT,
> -                       &LogAccess::marshal_client_protocol_stack,
> -                       &LogAccess::unmarshal_client_protocol_stack,
> -                       (Ptr<LogFieldAliasMap>) proto_type_map);
> +                       &LogAccess::marshal_plugin_identity_id,
> +                       reinterpret_cast<LogField::UnmarshalFunc>(&LogAccess::unmarshal_int_to_str));
>   global_field_list.add(field, false);
> -  ink_hash_table_insert(field_symbol_hash, "cps", field);
> -# endif
> +  ink_hash_table_insert(field_symbol_hash, "piid", field);
> +
> +  field = new LogField("plugin_identity_tag", "pitag",
> +                       LogField::STRING,
> +                       &LogAccess::marshal_plugin_identity_tag,
> +                       reinterpret_cast<LogField::UnmarshalFunc>(&LogAccess::unmarshal_str));
> +  global_field_list.add(field, false);
> +  ink_hash_table_insert(field_symbol_hash, "pitag", field);
> 
>   field = new LogField("client_req_timestamp_sec", "cqts",
>                        LogField::sINT,
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/LogAccess.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/logging/LogAccess.cc b/proxy/logging/LogAccess.cc
> index 968762e..5009113 100644
> --- a/proxy/logging/LogAccess.cc
> +++ b/proxy/logging/LogAccess.cc
> @@ -75,12 +75,18 @@ LogAccess::init()
>   -------------------------------------------------------------------------*/
> 
> int
> -LogAccess::marshal_client_protocol_stack(char *buf)
> +LogAccess::marshal_plugin_identity_id(char *buf)
> {
>   DEFAULT_INT_FIELD;
> }
> 
> int
> +LogAccess::marshal_plugin_identity_tag(char *buf)
> +{
> +  DEFAULT_STR_FIELD;
> +}
> +
> +int
> LogAccess::marshal_client_host_ip(char *buf)
> {
>   DEFAULT_IP_FIELD;
> @@ -1311,43 +1317,6 @@ LogAccess::unmarshal_cache_write_code(char **buf, char *dest, int len, Ptr<LogFi
>   return (LogAccess::unmarshal_with_map(unmarshal_int(buf), dest, len, map, "UNKNOWN_CACHE_WRITE_CODE"));
> }
> 
> -# if 0
> -int
> -LogAccess::unmarshal_client_protocol_stack(char **buf, char *dest, int len, Ptr<LogFieldAliasMap> map)
> -{
> -  ink_assert(buf != NULL);
> -  ink_assert(*buf != NULL);
> -  ink_assert(dest != NULL);
> -
> -  char *p;
> -  size_t nr_chars = 0;
> -  int i, ret, nr_bits, left_len;
> -  TSClientProtoStack proto_stack = (TSClientProtoStack)unmarshal_int(buf);
> -
> -  p = dest;
> -  left_len = len;
> -  nr_bits = 8 * sizeof(TSClientProtoStack);
> -
> -  for (i = 0; i < nr_bits && left_len; i++) {
> -    if ((proto_stack >> i) & 0x1) {
> -      if (p != dest) {
> -        *p++ = '+';
> -        left_len--;
> -      }
> -      ret = map->asString(i, p, left_len, &nr_chars);
> -      if (ret == LogFieldAliasMap::ALL_OK) {
> -        p += nr_chars;
> -        left_len -= nr_chars;
> -      } else if (ret == LogFieldAliasMap::BUFFER_TOO_SMALL) {
> -        break;
> -      }
> -    }
> -  }
> -
> -  return (len - left_len);
> -}
> -# endif
> -
> int
> LogAccess::unmarshal_record(char **buf, char *dest, int len)
> {
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/LogAccess.h
> ----------------------------------------------------------------------
> diff --git a/proxy/logging/LogAccess.h b/proxy/logging/LogAccess.h
> index 940145d..8fb35b5 100644
> --- a/proxy/logging/LogAccess.h
> +++ b/proxy/logging/LogAccess.h
> @@ -172,7 +172,6 @@ public:
>   inkcoreapi virtual int marshal_client_auth_user_name(char *); // STR
>   int marshal_client_req_timestamp_sec(char *); // INT
> 
> -  inkcoreapi virtual int marshal_client_protocol_stack(char *); // INT
>   inkcoreapi virtual int marshal_client_req_text(char *);       // STR
>   inkcoreapi virtual int marshal_client_req_http_method(char *);        // STR
>   inkcoreapi virtual int marshal_client_req_url(char *);        // STR
> @@ -251,6 +250,8 @@ public:
>   inkcoreapi virtual int marshal_transfer_time_ms(char *);      // INT
>   inkcoreapi virtual int marshal_transfer_time_s(char *);       // INT
>   inkcoreapi virtual int marshal_file_size(char *);     // INT
> +  inkcoreapi virtual int marshal_plugin_identity_id(char *); // INT
> +  inkcoreapi virtual int marshal_plugin_identity_tag(char *); // STR
>   int marshal_entry_type(char *);       // INT
> 
> 
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/LogAccessHttp.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/logging/LogAccessHttp.cc b/proxy/logging/LogAccessHttp.cc
> index a8dad70..b44e684 100644
> --- a/proxy/logging/LogAccessHttp.cc
> +++ b/proxy/logging/LogAccessHttp.cc
> @@ -206,16 +206,27 @@ LogAccessHttp::set_client_req_url_path(char *buf, int len)
> 
> /*-------------------------------------------------------------------------
>   -------------------------------------------------------------------------*/
> -# if 0
> int
> -LogAccessHttp::marshal_client_protocol_stack(char *buf)
> +LogAccessHttp::marshal_plugin_identity_id(char *buf)
> {
> -  if (buf) {
> -    marshal_int(buf, m_http_sm->proto_stack);
> -  }
> +  if (buf) marshal_int(buf, m_http_sm->plugin_id);
>   return INK_MIN_ALIGN;
> }
> -# endif
> +
> +int
> +LogAccessHttp::marshal_plugin_identity_tag(char *buf)
> +{
> +  int len = INK_MIN_ALIGN;
> +  char const* tag = m_http_sm->plugin_tag;
> +
> +  if (!tag) tag = "*";
> +  else len = LogAccess::strlen(tag);
> +
> +  if (buf) marshal_str(buf, tag, len);
> +
> +  return len;
> +}
> +
> int
> LogAccessHttp::marshal_client_host_ip(char *buf)
> {
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/LogAccessHttp.h
> ----------------------------------------------------------------------
> diff --git a/proxy/logging/LogAccessHttp.h b/proxy/logging/LogAccessHttp.h
> index 53a0ff5..51ee9e3 100644
> --- a/proxy/logging/LogAccessHttp.h
> +++ b/proxy/logging/LogAccessHttp.h
> @@ -58,7 +58,6 @@ public:
>   virtual int marshal_client_host_ip(char *);   // STR
>   virtual int marshal_client_host_port(char *); // INT
>   virtual int marshal_client_auth_user_name(char *);    // STR
> -  //  virtual int marshal_client_protocol_stack(char *);    // INT
>   virtual int marshal_client_req_text(char *);  // STR
>   virtual int marshal_client_req_http_method(char *);   // INT
>   virtual int marshal_client_req_url(char *);   // STR
> @@ -128,6 +127,8 @@ public:
>   virtual int marshal_transfer_time_ms(char *); // INT
>   virtual int marshal_transfer_time_s(char *);  // INT
>   virtual int marshal_file_size(char *); // INT
> +  virtual int marshal_plugin_identity_id(char *);    // INT
> +  virtual int marshal_plugin_identity_tag(char *);    // STR
> 
>   //
>   // named fields from within a http header
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/spdy/SpdyClientSession.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/spdy/SpdyClientSession.cc b/proxy/spdy/SpdyClientSession.cc
> index 2c77ff6..fcb79fb 100644
> --- a/proxy/spdy/SpdyClientSession.cc
> +++ b/proxy/spdy/SpdyClientSession.cc
> @@ -27,6 +27,22 @@
> static ClassAllocator<SpdyClientSession> spdyClientSessionAllocator("spdyClientSessionAllocator");
> ClassAllocator<SpdyRequest> spdyRequestAllocator("spdyRequestAllocator");
> 
> +#if TS_HAS_SPDY
> +#include "SpdyClientSession.h"
> +
> +static const spdylay_proto_version versmap[] = {
> +  SPDYLAY_PROTO_SPDY2,    // SPDY_VERSION_2
> +  SPDYLAY_PROTO_SPDY3,    // SPDY_VERSION_3
> +  SPDYLAY_PROTO_SPDY3_1,  // SPDY_VERSION_3_1
> +};
> +
> +static char const* const  npnmap[] = {
> +  TS_NPN_PROTOCOL_SPDY_2,
> +  TS_NPN_PROTOCOL_SPDY_3,
> +  TS_NPN_PROTOCOL_SPDY_3_1
> +};
> +
> +#endif
> static int spdy_process_read(TSEvent event, SpdyClientSession *sm);
> static int spdy_process_write(TSEvent event, SpdyClientSession *sm);
> static int spdy_process_fetch(TSEvent event, SpdyClientSession *sm, void *edata);
> @@ -69,15 +85,16 @@ SpdyRequest::clear()
> }
> 
> void
> -SpdyClientSession::init(NetVConnection * netvc, spdylay_proto_version vers)
> +SpdyClientSession::init(NetVConnection * netvc, spdy::SessionVersion vers)
> {
>   int r;
> 
>   this->mutex = new_ProxyMutex();
>   this->vc = netvc;
>   this->req_map.clear();
> +  this->version = vers;
> 
> -  r = spdylay_session_server_new(&session, vers, &SPDY_CFG.spdy.callbacks, this);
> +  r = spdylay_session_server_new(&session, versmap[vers], &SPDY_CFG.spdy.callbacks, this);
> 
>   // A bit ugly but we need a thread and I don't want to wait until the
>   // session start event in case of a time out generating a decrement
> @@ -157,7 +174,7 @@ SpdyClientSession::clear()
> }
> 
> void
> -spdy_sm_create(NetVConnection * netvc, spdylay_proto_version vers, MIOBuffer * iobuf, IOBufferReader * reader)
> +spdy_sm_create(NetVConnection * netvc, spdy::SessionVersion vers, MIOBuffer * iobuf, IOBufferReader * reader)
> {
>   SpdyClientSession  *sm;
> 
> @@ -242,6 +259,19 @@ out:
>   return EVENT_CONT;
> }
> 
> +int64_t
> +SpdyClientSession::getPluginId() const
> +{
> +  return sm_id;
> +}
> +
> +char const*
> +SpdyClientSession::getPluginTag() const
> +{
> +  return npnmap[this->version];
> +}
> +
> +
> static int
> spdy_process_read(TSEvent /* event ATS_UNUSED */, SpdyClientSession *sm)
> {
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/spdy/SpdyClientSession.h
> ----------------------------------------------------------------------
> diff --git a/proxy/spdy/SpdyClientSession.h b/proxy/spdy/SpdyClientSession.h
> index 2f37d35..738ff55 100644
> --- a/proxy/spdy/SpdyClientSession.h
> +++ b/proxy/spdy/SpdyClientSession.h
> @@ -24,9 +24,11 @@
> #ifndef __P_SPDY_SM_H__
> #define __P_SPDY_SM_H__
> 
> +#include "SpdyDefs.h"
> #include "SpdyCommon.h"
> #include "SpdyCallbacks.h"
> #include <openssl/md5.h>
> +#include "Plugin.h"
> 
> class SpdyClientSession;
> typedef int (*SpdyClientSessionHandler) (TSCont contp, TSEvent event, void *data);
> @@ -89,7 +91,7 @@ public:
>   MD5_CTX recv_md5;
> };
> 
> -class SpdyClientSession : public Continuation
> +class SpdyClientSession : public Continuation, public PluginIdentity
> {
> 
> public:
> @@ -101,10 +103,11 @@ public:
>     clear();
>   }
> 
> -  void init(NetVConnection * netvc, spdylay_proto_version vers);
> +  void init(NetVConnection * netvc, spdy::SessionVersion vers);
>   void clear();
> 
>   int64_t sm_id;
> +  spdy::SessionVersion version;
>   uint64_t total_size;
>   TSHRTime start_time;
> 
> @@ -124,12 +127,15 @@ public:
> 
>   map<int32_t, SpdyRequest*> req_map;
> 
> +  virtual char const* getPluginTag() const;
> +  virtual int64_t getPluginId() const;
> +
> private:
>   int state_session_start(int event, void * edata);
>   int state_session_readwrite(int event, void * edata);
> };
> 
> -void spdy_sm_create(NetVConnection * netvc, spdylay_proto_version vers, MIOBuffer * iobuf, IOBufferReader * reader);
> +void spdy_sm_create(NetVConnection * netvc, spdy::SessionVersion vers, MIOBuffer * iobuf, IOBufferReader * reader);
> 
> extern ClassAllocator<SpdyRequest> spdyRequestAllocator;
> 
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/spdy/SpdySessionAccept.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/spdy/SpdySessionAccept.cc b/proxy/spdy/SpdySessionAccept.cc
> index e679adc..d7dfa11 100644
> --- a/proxy/spdy/SpdySessionAccept.cc
> +++ b/proxy/spdy/SpdySessionAccept.cc
> @@ -26,20 +26,13 @@
> 
> #if TS_HAS_SPDY
> #include "SpdyClientSession.h"
> -
> -static const spdylay_proto_version versmap[] = {
> -  SPDYLAY_PROTO_SPDY2,    // SPDY_VERSION_2
> -  SPDYLAY_PROTO_SPDY3,    // SPDY_VERSION_3
> -  SPDYLAY_PROTO_SPDY3_1,  // SPDY_VERSION_3_1
> -};
> -
> #endif
> 
> -SpdySessionAccept::SpdySessionAccept(unsigned vers)
> +SpdySessionAccept::SpdySessionAccept(spdy::SessionVersion vers)
>     : SessionAccept(new_ProxyMutex()), version(vers)
> {
> #if TS_HAS_SPDY
> -  ink_release_assert(vers < countof(versmap));
> +  ink_release_assert(spdy::SESSION_VERSION_2 <= vers && vers <= spdy::SESSION_VERSION_3_1);
> #endif
>   SET_HANDLER(&SpdySessionAccept::mainEvent);
> }
> @@ -51,7 +44,7 @@ SpdySessionAccept::mainEvent(int event, void * edata)
>     NetVConnection * netvc =static_cast<NetVConnection *>(edata);
> 
> #if TS_HAS_SPDY
> -    spdy_sm_create(netvc, versmap[this->version], NULL, NULL);
> +    spdy_sm_create(netvc, this->version, NULL, NULL);
> #else
>     Error("accepted a SPDY session, but SPDY support is not available");
>     netvc->do_io_close();
> @@ -68,7 +61,7 @@ void
> SpdySessionAccept::accept(NetVConnection * netvc, MIOBuffer * iobuf, IOBufferReader * reader)
> {
> #if TS_HAS_SPDY
> -  spdy_sm_create(netvc, versmap[this->version], iobuf, reader);
> +  spdy_sm_create(netvc, this->version, iobuf, reader);
> #else
>   (void)netvc;
>   (void)iobuf;
> 
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/spdy/SpdySessionAccept.h
> ----------------------------------------------------------------------
> diff --git a/proxy/spdy/SpdySessionAccept.h b/proxy/spdy/SpdySessionAccept.h
> index 9d740e2..af3d81d 100644
> --- a/proxy/spdy/SpdySessionAccept.h
> +++ b/proxy/spdy/SpdySessionAccept.h
> @@ -28,18 +28,13 @@
> #include "P_EventSystem.h"
> #include "P_UnixNet.h"
> #include "I_IOBuffer.h"
> +#include "SpdyDefs.h"
> 
> class SpdySessionAccept: public SessionAccept
> {
> public:
> 
> -  enum {
> -    SPDY_VERSION_2 = 0,
> -    SPDY_VERSION_3,
> -    SPDY_VERSION_3_1,
> -  };
> -
> -  explicit SpdySessionAccept(unsigned vers);
> +  explicit SpdySessionAccept(spdy::SessionVersion vers);
>   ~SpdySessionAccept() {}
> 
>   void accept(NetVConnection *, MIOBuffer *, IOBufferReader *);
> @@ -49,7 +44,7 @@ private:
>   SpdySessionAccept(const SpdySessionAccept &); // disabled
>   SpdySessionAccept& operator =(const SpdySessionAccept&); // disabled
> 
> -  unsigned version;
> +  spdy::SessionVersion version;
> };
> 
> #endif /* SpdySessionAccept_H_ */
>