I have stared at this code before, and it "seems to be reasonable".

What I *can* attest is that it does not break existing "master" functionality
on client or server, Linux or FreeBSD or "make distcheck" (autoconf changes, 
new modules, ...).  I did not expect anything, but this was sort of the
risk at this point.

Calling configure with --enable-dco does compile the new stuff, so it
is at least "compile safe" (and no warnings).

Some review comments that could be fixed in a followup patch:

 - some of the functions (like "ovpn_dco_nlmsg_create()", "dco_new_peer()")
   could definitely use a bit of commenting so non-netlink-experts would 
   understand what these functions do, and why...  (and I'm sure I mentioned
   that before).

 - dco_new_peer() treats "localaddr" and "remoteaddr" differently 
   when packing, which looks weird -> I think a comment that this is
   to reduce kernel code ("we need full sockaddr for the remote, and
   only the local IP address for local") would avoid confusion.

 - openvpn_dco_init_netlink() carries this TODO

+    /* TODO: Why are we setting this buffer size? */

   ... so, someone should know, and add an appropriate comment :-)

 - a few words of explanation on "... multicast message sent by the
   ovpn-dco kernel module" might be good - I see you subscribe to it,
   and explain mcast_family_handler(), but I can not find any indication
   of "what sort of messages would we expect to see here?".

 - ovpn_dco_nlmsg_create() has

+    if (!nl_msg)
+    {
+        msg(M_ERR, "cannot allocate netlink message");
+        return NULL;
+    }

   ... which never returns, as M_ERR is fatal.  OTOH, *some* callers do

+    struct nl_msg *nl_msg = ovpn_dco_nlmsg_create(dco, 
OVPN_CMD_REGISTER_PACKET);
+    if (!nl_msg)
+    {
+        msg(M_ERR, "%s: cannot allocate message to register for control 
packets",

   ... but not *all* of them (dco_new_peer() does not check nl_msg at all).

   So this should be made consistent - like, either ovpn_dco_nlmsg_create()
   will M_ERR on allocation failure, or return NULL (and never M_ERR).  If 
   it does M_ERR itself, no need to check that in the callers...


 - open_tun_dco() reports an *error* top create DCO interface with D_DCO_DEBUG

+        msg(D_DCO_DEBUG, "Cannot create DCO interface %s: %d", dev, ret);

   ... and two lines down, an error on if_nametoindex() leads to a FATAL

+        msg(M_FATAL, "DCO: cannot retrieve ifindex for interface %s", dev);

   ... so what?  Is this function allowed to fail, and return "ret < 0",
   or should it M_ERR/M_FATAL on errors?  There is no pre-function comment
   that could clarify the intent...

 - dco_new_key() has code to support "none"

+    if (dco_cipher != OVPN_CIPHER_ALG_NONE)
+    {

   ... but dco_cipher can never be OVPN_CIPHER_ALG_NONE anymore... and if
   that indent is removed, the NLA_PUT calls for _iv do not need to wrap :-)

 - dco_set_peer() does not pass on the mss yet

 - in ovpn_handle_msg(), can this be called uninitialized?

+    if (!attrs[OVPN_ATTR_IFINDEX])
+    {
+        msg(D_DCO, "ovpn-dco: Received message without ifindex");
+        return NL_SKIP;
+    }

   (not sure if nla_parse() will ensure that there is enough attributes,
   or just "well-formed" - and whether *attrs actually gets zeroed 
   by nla_parse(), as openvpn_handle_msg() has no CLEAR() )

 - same function - under which conditions can this fire?  Kernel getting
   confused?

+    uint32_t ifindex = nla_get_u32(attrs[OVPN_ATTR_IFINDEX]);
+    if (ifindex != dco->ifindex)
+    {
+        msg(D_DCO, "ovpn-dco: received message type %d with mismatched ifindex 
%d\n",


Uncrustify has complained at me when I merged the patch (because in that
moment, ovpn_dco_linux.h was "newly modified" and the exclusion rule
does not match on the pre-commit-hook) - but as discussed, this is a bit
complicated due to "kernel style" vs "openvpn style", so I've left it
alone for the moment.

Your patch has been applied to the master branch.

commit e34437c26b764851555e4acbe2ccca6bec235c7e
Author: Antonio Quartulli
Date:   Fri Jun 24 10:37:45 2022 +0200

     dco: introduce low-level code for handling ovpn-dco in the Linux kernel

     Signed-off-by: Antonio Quartulli <a...@unstable.cc>
     Acked-by: Arne Schwabe <a...@rfc2549.org>
     Message-Id: <20220624083809.23487-...@unstable.cc>
     URL: 
https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg24512.html
     Signed-off-by: Gert Doering <g...@greenie.muc.de>


--
kind regards,

Gert Doering



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

Reply via email to