Hi Blaise,

Actually we discussed the floating-tls patch in last community meeting:

<http://thread.gmane.org/gmane.network.openvpn.devel/4189>

This week's meeting is starting in ~5 minutes on #openvpn-devel at
irc.freenode.net - perhaps you could join and discuss floating-tls in
detail with the other devs?

-- 
Samuli Seppänen
Community Manager
OpenVPN Technologies, Inc

irc freenode net: mattock



> Hi,
>
> Didn't hear back from anybody. Is there really no interest at all in
> adding floating TLS?
>
> Thanks,
> Blaise
>
> On Thu, Oct 21, 2010 at 8:25 PM, Blaise Gassend <bla...@willowgarage.com> 
> wrote:
>   
>> Hi,
>>
>> To allow seamless roaming of our robots at willowgarage
>> (http://willowgarage.com), I have put together a patch that allows TLS
>> connections to float. I would like to put this patch up for critique
>> and possible inclusion into mainline openvpn. The general approach has
>> been to prefix a few bytes at the start of each packet which contain
>> an opcode and a unique identifier (random number) for the session.
>> That identifier is used instead of the IP address for determining
>> which connection the packet belongs to.
>>
>> Regards,
>> Blaise
>>
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -129,6 +129,12 @@
>>    [FRAGMENT="yes"]
>>  )
>>
>> +AC_ARG_ENABLE(floating-tls,
>> +   [  --disable-floating-tls  Disable floating tls support 
>> (--floating-tls)],
>> +   [FLOATING_TLS="$enableval"],
>> +   [FLOATING_TLS="yes"]
>> +)
>> +
>>  AC_ARG_ENABLE(multihome,
>>    [  --disable-multihome     Disable multi-homed UDP server support
>> (--multihome)],
>>    [MULTIHOME="$enableval"],
>> @@ -791,6 +797,11 @@
>>    AC_DEFINE(ENABLE_HTTP_PROXY, 1, [Enable HTTP proxy support])
>>  fi
>>
>> +dnl compile --floating-tls option
>> +if test "$FLOATING_TLS" = "yes"; then
>> +   AC_DEFINE(FLOATING_TLS, 1, [Enable floating-tls UDP server capability])
>> +fi
>> +
>>  dnl compile --multihome option
>>  if test "$MULTIHOME" = "yes"; then
>>    AC_DEFINE(ENABLE_MULTIHOME, 1, [Enable multi-homed UDP server capability])
>> --- a/forward.c
>> +++ b/forward.c
>> @@ -39,6 +39,10 @@
>>  #include "occ-inline.h"
>>  #include "ping-inline.h"
>>
>> +#ifdef FLOATING_TLS
>> +#include "ssl.h"
>> +#endif
>> +
>>  /* show event wait debugging info */
>>
>>  #ifdef ENABLE_DEBUG
>> @@ -834,7 +838,11 @@
>>        *
>>        * Also, update the persisted version of our packet-id.
>>        */
>> -      if (!TLS_MODE (c))
>> +      if (!TLS_MODE (c)
>> +#ifdef FLOATING_TLS
>> +          || c->options.floating_tls
>> +#endif
>> +          )
>>        link_socket_set_outgoing_addr (&c->c2.buf, lsi, &c->c2.from, NULL, 
>> c->c2.es);
>>
>>       /* reset packet received timer */
>> @@ -1088,6 +1096,21 @@
>>            /* If Socks5 over UDP, prepend header */
>>            socks_preprocess_outgoing_link (c, &to_addr, &size_delta);
>>  #endif
>> +
>> +#ifdef FLOATING_TLS
>> +            if (c->c2.link_socket->info.proto == PROTO_UDPv4 &&
>> +                c->options.floating_tls &&
>> +                c->options.tls_client)
>> +            {
>> +              if (c->floating_tls_prefix == 0)
>> +                RAND_bytes((uint8_t *) &c->floating_tls_prefix,
>> sizeof(c->floating_tls_prefix));
>> +
>> +              struct buffer *buf = &c->c2.to_link;
>> +              uint8_t opcode = FLOATING_TLS_OPCODE |
>> sizeof(c->floating_tls_prefix);
>> +              ASSERT (buf_write_prepend (buf,
>> &c->floating_tls_prefix, sizeof (c->floating_tls_prefix)));
>> +              ASSERT (buf_write_prepend (buf, &opcode, sizeof (opcode)));
>> +            }
>> +#endif
>>            /* Send packet */
>>            size = link_socket_write (c->c2.link_socket,
>>                                      &c->c2.to_link,
>> --- a/init.c
>> +++ b/init.c
>> @@ -1826,6 +1826,10 @@
>>   to.disable_occ = !options->occ;
>>  #endif
>>
>> +#ifdef FLOATING_TLS
>> +  to.floating_tls = options->floating_tls;
>> +#endif
>> +
>>   to.verify_command = options->tls_verify;
>>   to.verify_x509name = options->tls_remote;
>>   to.crl_file = options->crl_file;
>> --- a/mudp.c
>> +++ b/mudp.c
>> @@ -31,6 +31,10 @@
>>
>>  #include "memdbg.h"
>>
>> +#ifdef FLOATING_TLS
>> +#include "ssl.h"
>> +#endif
>> +
>>  /*
>>  * Get a client instance based on real address.  If
>>  * the instance doesn't exist, create it while
>> @@ -44,8 +48,36 @@
>>   struct mroute_addr real;
>>   struct multi_instance *mi = NULL;
>>   struct hash *hash = m->hash;
>> +  bool ret = false;
>> +
>> +#ifdef FLOATING_TLS
>> +  // Check if this is a floating-tls packet
>> +  if (m->top.c2.buf.len > 0)
>> +  {
>> +    uint8_t c = *BPTR (&m->top.c2.buf);
>> +    if ((c & FLOATING_TLS_OPCODE_MASK) == FLOATING_TLS_OPCODE)
>> +    {
>> +      int len = c & FLOATING_TLS_LENGTH_MASK;
>> +      uint8_t *id = BPTR (&m->top.c2.buf) + 1;
>> +
>> +      if (buf_advance(&m->top.c2.buf, len + 1))
>> +      {
>> +        int i;
>> +        real.type = MR_ADDR_IPV4 | MR_WITH_PORT;
>> +        real.netbits = 0;
>> +        real.len = len;
>> +        memcpy (real.addr, id, real.len);
>> +        ret = true;
>> +      }
>> +    }
>> +  }
>> +#endif
>> +
>> +  // Not a floating-tls packet
>> +  if (!ret)
>> +    ret = mroute_extract_openvpn_sockaddr (&real, &m->top.c2.from.dest, 
>> true);
>>
>> -  if (mroute_extract_openvpn_sockaddr (&real, &m->top.c2.from.dest, true))
>> +  if (ret)
>>     {
>>       struct hash_element *he;
>>       const uint32_t hv = hash_value (hash, &real);
>> --- a/openvpn.h
>> +++ b/openvpn.h
>> @@ -484,6 +484,10 @@
>>   /* persistent across SIGHUP */
>>   struct context_persist persist;
>>
>> +#ifdef FLOATING_TLS
>> +  uint64_t floating_tls_prefix;
>> +#endif
>> +
>>   /* level 0 context contains data related to
>>      once-per OpenVPN instantiation events
>>      such as daemonization */
>> --- a/options.c
>> +++ b/options.c
>> @@ -126,6 +126,7 @@
>>   "                  Set n=\"infinite\" to retry indefinitely.\n"
>>   "--float         : Allow remote to change its IP address/port, such
>> as through\n"
>>   "                  DHCP (this is the default if --remote is not used).\n"
>> +  "--floating-tls  : Allows floating in multi-tls sessions.\n"
>>   "--ipchange cmd  : Execute shell command cmd on remote ip address 
>> initial\n"
>>   "                  setting or change -- execute as: cmd ip-address port#\n"
>>   "--port port     : TCP/UDP port # for both local and remote.\n"
>> @@ -1334,6 +1335,10 @@
>>   SHOW_BOOL (tls_exit);
>>
>>   SHOW_STR (tls_auth_file);
>> +
>> +#ifdef FLOATING_TLS
>> +  SHOW_BOOL (floating_tls);
>> +#endif
>>  #endif
>>  #endif
>>
>> @@ -1909,6 +1914,9 @@
>>       MUST_BE_UNDEF (transition_window);
>>       MUST_BE_UNDEF (tls_auth_file);
>>       MUST_BE_UNDEF (single_session);
>> +#ifdef FLOATING_TLS
>> +      MUST_BE_UNDEF (floating_tls);
>> +#endif
>>       MUST_BE_UNDEF (tls_exit);
>>       MUST_BE_UNDEF (crl_file);
>>       MUST_BE_UNDEF (key_method);
>> @@ -2339,6 +2347,11 @@
>>          buf_printf (&out, ",no-iv");
>>       }
>>
>> +#ifdef FLOATING_TLS
>> +  if (o->floating_tls)
>> +    buf_printf (&out, ",floating-tls");
>> +#endif
>> +
>>  #ifdef USE_SSL
>>   /*
>>    * SSL Options
>> @@ -5413,6 +5426,13 @@
>>       VERIFY_PERMISSION (OPT_P_GENERAL);
>>       options->single_session = true;
>>     }
>> +#ifdef FLOATING_TLS
>> +  else if (streq (p[0], "floating-tls"))
>> +    {
>> +      VERIFY_PERMISSION (OPT_P_GENERAL);
>> +      options->floating_tls = true;
>> +    }
>> +#endif
>>   else if (streq (p[0], "tls-exit"))
>>     {
>>       VERIFY_PERMISSION (OPT_P_GENERAL);
>> --- a/options.h
>> +++ b/options.h
>> @@ -168,6 +168,10 @@
>>   bool genkey;
>>  #endif
>>
>> +#ifdef FLOATING_TLS
>> +  bool floating_tls;
>> +#endif
>> +
>>   /* Networking parms */
>>   struct connection_entry ce;
>>
>> --- a/ssl.c
>> +++ b/ssl.c
>> @@ -4160,7 +4160,12 @@
>>  #ifdef ENABLE_DEF_AUTH
>>                  && !ks->auth_deferred
>>  #endif
>> -                 && link_socket_actual_match (from, &ks->remote_addr))
>> +                 && (
>> +#ifdef FLOATING_TLS
>> +                    multi->opt.floating_tls ||
>> +#endif
>> +                    link_socket_actual_match (from, &ks->remote_addr)
>> +                  ))
>>                {
>>                  /* return appropriate data channel decrypt key in opt */
>>                  opt->key_ctx_bi = &ks->key;
>> @@ -4403,7 +4408,11 @@
>>              /*
>>               * Verify remote IP address
>>               */
>> -             if (!new_link && !link_socket_actual_match (&ks->remote_addr, 
>> from))
>> +             if (!new_link
>> +#ifdef FLOATING_TLS
>> +                  && !multi->opt.floating_tls
>> +#endif
>> +                  && !link_socket_actual_match (&ks->remote_addr, from))
>>                {
>>                  msg (D_TLS_ERRORS, "TLS Error: Received control packet from
>> unexpected IP addr: %s",
>>                      print_link_socket_actual (from, &gc));
>> @@ -4468,7 +4477,11 @@
>>                ks->remote_addr = *from;
>>                ++multi->n_sessions;
>>              }
>> -           else if (!link_socket_actual_match (&ks->remote_addr, from))
>> +           else if (
>> +#ifdef FLOATING_TLS
>> +                !multi->opt.floating_tls &&
>> +#endif
>> +                !link_socket_actual_match (&ks->remote_addr, from))
>>              {
>>                msg (D_TLS_ERRORS,
>>                     "TLS Error: Existing session control channel packet from
>> unknown IP address: %s",
>> --- a/ssl.h
>> +++ b/ssl.h
>> @@ -221,6 +221,13 @@
>>  #define P_FIRST_OPCODE                 1
>>  #define P_LAST_OPCODE                  8
>>
>> +/* Extra opcodes for floating TLS */
>> +#ifdef FLOATING_TLS
>> +#define FLOATING_TLS_OPCODE_MASK 0xF0
>> +#define FLOATING_TLS_OPCODE 0xF0
>> +#define FLOATING_TLS_LENGTH_MASK 0x0F
>> +#endif
>> +
>>  /* key negotiation states */
>>  #define S_ERROR          -1
>>  #define S_UNDEF           0
>> @@ -416,6 +423,10 @@
>>   int key_method;
>>   bool replay;
>>   bool single_session;
>> +#ifdef FLOATING_TLS
>> +  bool floating_tls;
>> +#endif
>> +
>>  #ifdef ENABLE_OCC
>>   bool disable_occ;
>>  #endif
>> --- a/openvpn.8
>> +++ b/openvpn.8
>> @@ -573,6 +573,10 @@
>>  option.
>>  .\"*********************************************************
>>  .TP
>> +.B \-\-floating-tls
>> +Allows tls connections to float.
>> +.\"*********************************************************
>> +.TP
>>  .B \-\-ipchange cmd
>>  Execute shell command
>>  .B cmd
>>
>>     
>
> ------------------------------------------------------------------------------
> Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
> Tap into the largest installed PC base & get more eyes on your game by
> optimizing for Intel(R) Graphics Technology. Get started today with the
> Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
> http://p.sf.net/sfu/intelisp-dev2dev
> _______________________________________________
> Openvpn-devel mailing list
> Openvpn-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openvpn-devel
>   



Reply via email to