I'm sponsoring this fast-track for Huafeng Lu and the Sun Cluster
team.  The timer is set to 11/17/2008, and a draft of the contract is
available in the case directory as "contract-01".

Note: the fast-track materials were presented to me as "open," though
many of the cases related to these hooks are currently closed.  The
change in the system that is the subject of this case, though, should
be reviewable independently, so this shouldn't cause problems.

Introduction

  "TCP/IP hooks for clustering" (PSARC 1997/314) introduced several
  TCP/IP hooks for the Sun Cluster product, and the contract is
  1997/314:contract-1.new.  These hooks are called by the Solaris
  TCP/IP code at certain places.  Now, to support client-side shared
  address (RFE 6717519), we need to modify one of these hooks,
  cl_inet_connect().

Release Binding

  A patch/micro release binding is asserted.  This will require the
  release of coordinated patches for Solaris and Sun Cluster.

Interfaces

    Exported Interface         Stability               Comments
    ==================         =========               ========
    cl_inet_connect            Removed (was Contracted) PSARC 1997/314
    cl_inet_connect2           Contr. Project Private  function pointer
    cluster_version_supported  Contr. Project Private  cluster version
                                                       supported by Solaris
    udp_t.udp_cl_v6lastdst     Project Private         most recent dest addr
    udp_t.udp_cl_lastdstport   Project Private         most recent dest port

Detailed Description

  Currently, a shared address is used only at the server side.  Server
  applications are started on Cluster nodes, which reply to requests
  coming from external clients.  This proposal (RFE 6717519) aims to
  allow Cluster nodes to use shared addresses as client addresses to
  talk to external servers.  Note: this proposal only handles TCP and
  UDP; SCTP is beyond its scope.

  For TCP, several Cluster nodes bind to the same shared address, then
  connect to external applications. The cl_inet_connect() hook is
  called at connect time (for both outgoing and incoming connection
  requests) to check if the 5-tuple is unique. The hook is added with
  a return value to indicate whether the check is passed, and an input
  parameter to indicate whether the connection is outgoing or
  incoming.

  The situation for UDP is a bit different.  Since there is no real
  connection in UDP and the same socket can be used to send to
  multiple destinations, the major task is to register the five-tuple
  at the cluster level.  Such registration is performed at connect(),
  sendto() and sendmsg(), which call the cl_inet_connect() hook at
  proper time.  For performance reasons, sendto()/sendmsg() calls the
  hook only when the destination is new.  To facilitate this, two new
  fields are added to the udp_t struct to store the most recent
  destination address and port: in6_addr_t udp_cl_v6lastdst; in_port_t
  udp_cl_lastdstport; In a sendto() or sendmsg(), the
  cl_inet_connect() hook is called only when the destination is
  different from most recent one.

Versioning

  In addition to the hook signature changes listed above, the hook
  name will also be changed for versioning reasons.  Thus, overall the
  new signature of the hook is:

        int (*cl_inet_connect2)(uint8_t protocol,
            boolean_t is_outgoing, sa_family_t addr_family,
            uint8_t *laddrp, in_port_t lport,
            uint8_t *faddrp, in_port_t fport);

  Here's the old signature for comparison.  Note: after renaming, the
  old name cl_inet_connect is obsolete and will no longer be called
  from Solaris.

        void (*cl_inet_connect)(uint8_t protocol,
            sa_family_t addr_family,
            uint8_t *laddrp, in_port_t lport,
            uint8_t *faddrp, in_port_t fport);

  With changes at both Solaris and Cluster sides, there is a "version
  matching" issue.  There is no mechanism to check if the Cluster
  version matches the Solaris release; the Cluster simply associate
  the hook with an implementation, if the hook is defined in Solaris.
  Thus, if the Cluster product is not running with the correct Solaris
  release, the hook will be associated with the wrong implementation,
  and may cause serious problems or even panic.

  To solve this problem, the function pointer is renamed as above.  To
  help with future versioning, a new version string is introduced in
  Solaris code:

        const char *cluster_version_supported = "1.1";

  The new Cluster code checks which Cluster version Solaris supports,
  and associates the corresponding hook implementation with the hook.

  This is a generic mechanism, but doesn't work for the currently
  released Cluster code, which doesn't check the version.  As a
  workaround, we rename the hook in Solaris so that the current
  Cluster version won't be loaded after upgrading ON.  This prevents
  the user from damaging his system, and release notes will indicate
  what the errors mean.

Out of Scope

  Note the actual implementation of these hooks are in the Cluster
  code, not in the Solaris code.  Solaris TCP/IP code only declares
  and calls them.  For this project, the Cluster team is responsible
  for changing the implementation of the cl_inet_connect2() hook in
  the Sun Cluster code.

-- 
James Carlson, Solaris Networking              <james.d.carlson at sun.com>
Sun Microsystems / 35 Network Drive        71.232W   Vox +1 781 442 2084
MS UBUR02-212 / Burlington MA 01803-2757   42.496N   Fax +1 781 442 1677

Reply via email to