Hi,

Regarding testing - if ordex could rebase and push dco branch, I could
start a fresh openvpn-build on GHA to build Windows installers with
dco. Here are MSI installers build with 6 days old dco branch:

https://github.com/OpenVPN/openvpn-build/actions/runs/2815957952

pe 19. elok. 2022 klo 12.02 Gert Doering (g...@greenie.muc.de) kirjoitti:
>
> Hi,
>
> On Sat, Aug 13, 2022 at 10:42:20PM +0200, Antonio Quartulli wrote:
> > With this change it is possible to use ovpn-dco-win when running OpenVPN
> > in client or P2P mode.
> >
> > Signed-off-by: Arne Schwabe <a...@rfc2549.org>
> > Signed-off-by: Lev Stipakov <l...@openvpn.net>
> > Signed-off-by: Antonio Quartulli <a...@unstable.cc>
>
> All the prerequisites for this have now been merged.  So if someone
> could *test* that "master + 3/7" actually works, we could proceed with
> merging it...
>
> I do have a few code nags that I hope will find agreement.
>
> > @@ -1810,9 +1811,12 @@ do_open_tun(struct context *c)
> >              ovpn_dco_init(c->mode, &c->c1.tuntap->dco);
> >          }
> >
> > -        /* open the tun device */
> > -        open_tun(c->options.dev, c->options.dev_type, c->options.dev_node,
> > -                 c->c1.tuntap, &c->net_ctx);
> > +        /* open the tun device (ovpn-dco-win already opened the device for 
> > the socket) */
> > +        if (!tuntap_is_dco_win(c->c1.tuntap))
> > +        {
> > +            open_tun(c->options.dev, c->options.dev_type, 
> > c->options.dev_node,
> > +                     c->c1.tuntap, &c->net_ctx);
> > +        }
>
> do_open_tun() is one of the already-confusing functions, and this extra
> condition isn't helping.
>
> Can we move the extra condition into the *WIN32 specific* open_tun()
> ("/* nothing to do for DCO, return */") and leave init.c alone?
>
> > @@ -3570,6 +3584,15 @@ do_close_free_key_schedule(struct context *c, bool 
> > free_ssl_ctx)
> >  static void
> >  do_close_link_socket(struct context *c)
> >  {
> > +    /* in dco-win case, link socket is a tun handle which is
> > +     * closed in do_close_tun(). Set it to UNDEFINED so
> > +     * we won't use WinSock API to close it. */
> > +    if (tuntap_is_dco_win(c->c1.tuntap) && c->c2.link_socket
> > +        && c->c2.link_socket->info.dco_installed)
> > +    {
> > +        c->c2.link_socket->sd = SOCKET_UNDEFINED;
> > +    }
> > +
>
> Overloading the link socket with a tun handle and then having
> special cases all around is not exactly easy to understand or
> maintainable code.  I have no good suggestion how to make this
> nicer, but this is going to come back and haunt us.
>
> (We still do not have automated windows testing, with all 3 driver
> types...)
>
> > @@ -3439,10 +3441,12 @@ options_postprocess_setdefault_ncpciphers(struct 
> > options *o)
> >          /* custom --data-ciphers set, keep list */
> >          return;
> >      }
> > +#if !defined(_WIN32)
> >      else if (cipher_valid("CHACHA20-POLY1305"))
> >      {
> >          o->ncp_ciphers = "AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305";
> >      }
> > +#endif
>
> Not sure I understand this exclusion.  It's the *default* ciphers,
> and we know that Windows can do CHACHA20-POLY1305 - *DCO* on Windows
> might not be able to use this, but this disables using CHACHA-Poly
> in the default config for all windows builds.
>
> Maybe just query the DCO cipher list here, if DCO is enabled?
>
> So
>
>      ...
>      else if (dco_enabled())
>      {
>          o->ncp_ciphers = dco_get_supported_ciphers()
>      }
>      else if (cipher_valid("CHACHA20-POLY1305"))
>      {
>          o->ncp_ciphers = "AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305";
>      }
> ...
>
> > diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c
> > index b4c20f69..db73b35d 100644
> > --- a/src/openvpn/socket.c
> > +++ b/src/openvpn/socket.c
> > @@ -2162,7 +2197,24 @@ link_socket_init_phase2(struct context *c)
> >      /* If a valid remote has been found, create the socket with its 
> > addrinfo */
> >      if (sock->info.lsa->current_remote)
> >      {
> > -        create_socket(sock, sock->info.lsa->current_remote);
> > +#if defined(_WIN32)
> > +        if (dco_enabled(&c->options))
> > +        {
> > +            create_socket_dco_win(c, sock, &sig_info->signal_received);
> > +            if (sig_info->signal_received)
> > +            {
> > +                goto done;
> > +            }
> > +
> > +            linksock_print_addr(sock);
> > +            goto done;
> > +        }
> > +        else
>
> I understand that we need to use a different create_socket_dco_win()
> function here, but all the *other* lines of code are just "huh, wat".
>
> Why not move the linksock_print_addr(sock); *into* create_socket_dco_win(),
> and then this would collaps to a much more compact
>
> > +#if defined(_WIN32)
> > +        if (dco_enabled(&c->options))
> > +        {
> > +            create_socket_dco_win(c, sock, &sig_info->signal_received);
> > +            goto done;
> > +        }
> > +        else
> > +#endif
>
> (still quite ugly)
>
> gert
> --
> "If was one thing all people took for granted, was conviction that if you
>  feed honest figures into a computer, honest figures come out. Never doubted
>  it myself till I met a computer with a sense of humor."
>                              Robert A. Heinlein, The Moon is a Harsh Mistress
>
> Gert Doering - Munich, Germany                             g...@greenie.muc.de
> _______________________________________________
> Openvpn-devel mailing list
> Openvpn-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openvpn-devel



-- 
-Lev


_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to