Honestly still not sure one would start reviewing the actual code but here are at least a few minor things I noticed while browsing through it:
> Antonio Quartulli <a...@unstable.cc> hat am 11.04.2022 15:35 geschrieben: > > > Implement the data-channel offloading using the ovpn-dco kernel > module. See README.dco.md for more details. > > Signed-off-by: Arne Schwabe <a...@rfc2549.org> > Signed-off-by: Antonio Quartulli <a...@unstable.cc> > --- > > Changes from v1: > * uncrustified code. Note that uncrustify wanted to change way more > code in our repo, therefore I had to dig into the proposed changes and > pick only those related to this patch. For this reason I may have > missed something. You also incorporated my review suggestions. [...] > diff --git a/README.dco.md b/README.dco.md > new file mode 100644 > index 00000000..e73e0fc2 > --- /dev/null > +++ b/README.dco.md [...} > +DCO and P2P mode > +---------------- > +DCO is also available when running OpenVPN in P2P mode without > --pull/--client option. > +The P2P mode is useful for scenarios when the OpenVPN tunnel should not > interfere with > +overall routing and behave more like a "dumb" tunnel like GRE. > + > +However, DCO requires DATA_V2 to be enabled. This requires P2P with NCP > capability, which > +is only available in OpenVPN 2.6 and later. Changes.rst doesn't mention this change, should it? Should we mention here what "NCP" stands for? > +OpenVPN prints a diagnostic message for the P2P NCP result when running in > P2P mode: > + > + P2P mode NCP negotiation result: TLS_export=1, DATA_v2=1, peer-id > 9484735, cipher=AES-256-GCM > + > +Double check that your have `DATA_v2=1` in your output and a supported AEAD > cipher > +(AES-XXX-GCM or CHACHA20POLY1305). [...] > diff --git a/doc/man-sections/advanced-options.rst > b/doc/man-sections/advanced-options.rst > index 5157c561..6019aefe 100644 > --- a/doc/man-sections/advanced-options.rst > +++ b/doc/man-sections/advanced-options.rst > @@ -91,3 +91,16 @@ used when debugging or testing out special usage scenarios. > *(Linux only)* Set the TX queue length on the TUN/TAP interface. > Currently defaults to operating system default. > > +--disable-dco > + Disables the opportunistic use of the data channel offloading if available. Nitpick: would remove "the" in "the data channel offloading". [...] > diff --git a/src/openvpn/crypto.c b/src/openvpn/crypto.c > index 9e10f64e..7e49d710 100644 > --- a/src/openvpn/crypto.c > +++ b/src/openvpn/crypto.c > @@ -845,6 +845,7 @@ init_key_ctx(struct key_ctx *ctx, const struct key *key, > cipher_kt_iv_size(kt->cipher)); > warn_insecure_key_type(ciphername); > } > + Spurious uncrustify change? > if (md_defined(kt->digest)) > { > ctx->hmac = hmac_ctx_new(); > diff --git a/src/openvpn/dco.c b/src/openvpn/dco.c > new file mode 100644 > index 00000000..2f7779f6 > --- /dev/null > +++ b/src/openvpn/dco.c [...] > +/** > + * Find a usable key that is not the primary (i.e. the secondary key) > + * > + * @param multi The TLS struct to retrieve keys from > + * @param primary The primary key that should be skipped doring the scan "during" [...] > +static bool > +dco_check_option_conflict_ce(const struct connection_entry *ce, int msglevel) > +{ > + if (ce->fragment) > + { > + msg(msglevel, "Note: --fragment disables data channel offload."); > + return true; > + } > + > + if (ce->http_proxy_options) > + { > + msg(msglevel, "Note: --http-proxy disables data channel offload."); > + return true; > + } > + > + if (ce->socks_proxy_server) > + { > + msg(msglevel, "Note --socks-proxy disable data channel offload."); "Note: --socks-proxy disables data channel offload." Missing ':' after "Note" and missing 's' in "disables". > + return true; > + } > + > + return false; > +} [...] > diff --git a/src/openvpn/dco_linux.c b/src/openvpn/dco_linux.c > new file mode 100644 > index 00000000..6c670950 > --- /dev/null > +++ b/src/openvpn/dco_linux.c [...] > +/** > + * @brief resolves the netlink ID for ovpn-dco > + * > + * This function queries the kernel via a netlink socket > + * whether the ovpn-dco netlink namespace is available > + * > + * This function can be used to determine if the kernel > + * support DCO offloading. "supports" > + * > + * @return ID on success, negative error code on error > + */ > +static int > +resolve_ovpn_netlink_id(int msglevel) [...] > +/** > + * Send a preprared netlink message and registers cb as callback if non-null. > + * > + * The method will also free nl_msg > + * @param dco The dco context to use > + * @param nl_msg the message to use > + * @param cb An optional callback if the caller expects an answers\ "an answer", also spurious '\' > + * @param prefix A prefix to report in the error message to give the user > context > + * @return status of sending the message > + */ > +static int > +ovpn_nl_msg_send(dco_context_t *dco, struct nl_msg *nl_msg, ovpn_nl_cb cb, > + const char *prefix) > +{ > + dco->status = 1; > + > + if (cb) > + { > + nl_cb_set(dco->nl_cb, NL_CB_VALID, NL_CB_CUSTOM, cb, dco); > + } > + else > + { > + nl_cb_set(dco->nl_cb, NL_CB_VALID, NL_CB_CUSTOM, NULL, dco); > + } Is there an actual difference to just writing nl_cb_set(dco->nl_cb, NL_CB_VALID, NL_CB_CUSTOM, cb, dco); without the whole if/else? > + nl_send_auto(dco->nl_sock, nl_msg); > + > + while (dco->status == 1) > + { > + ovpn_nl_recvmsgs(dco, prefix); > + } > + > + if (dco->status < 0) > + { > + msg(M_INFO, "%s: failed to send netlink message: %s (%d)", > + prefix, strerror(-dco->status), dco->status); > + } > + > + return dco->status; > +} > + > +struct sockaddr * > +mapped_v4_to_v6(struct sockaddr *sock, struct gc_arena *gc) > +{ > + struct sockaddr_in6 *sock6 = ((struct sockaddr_in6 *)sock); > + if (sock->sa_family == AF_INET6 > + && memcmp(&sock6->sin6_addr, > "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff", 12)==0) magic constant? > + { > + > + struct sockaddr_in *sock4; > + ALLOC_OBJ_CLEAR_GC(sock4, struct sockaddr_in, gc); > + memcpy(&sock4->sin_addr, sock6->sin6_addr.s6_addr +12, 4); > + sock4->sin_port = sock6->sin6_port; > + sock4->sin_family = AF_INET; > + return (struct sockaddr *) sock4; > + } > + return sock; > +} [...] Regards, -- Frank Lichtenheld _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel