On Wed, Sep 21, 2022 at 12:49:29PM +0200, Arne Schwabe wrote: > Currently control packet size is controlled by tun-mtu in a very > non-obvious way since the control overhead is not taken into account > and control channel packet will end up with a different size than > data channel packet. > > Instead we decouple this and introduce max-packet-size. Control packet size > defaults to 1250 if max-packet-size is not set. > > Patch v2: rebase on latest patch set > Patch v3: Introduce TLS_CHANNEL_MTU_MIN define and give explaination > of its value. > Patch v4: introduce max-packet-size instead of tls-mtu
In general I think this change really could use more documentation. E.g. so we imply --mssfix, this should be documented under --mssfix. Also we should look at all existing examples with --mssfix/--fragment/--tun-mtu and check whether they should be changed to use different options. E.g. how does --max-packet-size interact with the argument-less --mssfix? That should be mentioned. At the moment this patch adds an option but gives the user no indication when and why to use it compared to all other MTU-related options. Some other small suggestions below. > diff --git a/Changes.rst b/Changes.rst > index 275f8d647..25b0e9846 100644 > --- a/Changes.rst > +++ b/Changes.rst > @@ -88,6 +88,12 @@ Data channel offloading with ovpn-dco > which brings DATA_V2 packet support. > > > +Improved control channel packet size control (``max-packet-size``) > + The size of control channel is no longer tied to > + ``--link-mtu``/``--tun-mtu`` and can be set using ``--max-packet-size``. > + Setting the size to small sizes no longer breaks the OpenVPN protocol in > + certain situations. This should mention the implied --mssfix. This way it sounds like it only affects control channel. > Deprecated features > ------------------- > ``inetd`` has been removed > @@ -150,6 +156,9 @@ User-visible Changes > - Option ``--nobind`` is default when ``--client`` or ``--pull`` is used in > the configuration > - :code:`link_mtu` parameter is removed from environment or replaced with 0 > when scripts are > called with parameters. This parameter is unreliable and no longer > internally calculated. > +- control channel packet maximum size is no longer influenced by > ``--link-mtu``/``--tun-mtu`` > + and must be set by ``--max-packet-size`` now. > + > > Overview of changes in 2.5 > ========================== > diff --git a/doc/man-sections/link-options.rst > b/doc/man-sections/link-options.rst > index 373193aa3..176c2b0db 100644 > --- a/doc/man-sections/link-options.rst > +++ b/doc/man-sections/link-options.rst > @@ -454,3 +454,19 @@ the local and the remote host. > if mode server: > socket-flags TCP_NODELAY > push "socket-flags TCP_NODELAY" > + > +--max-packet-size size > + This option will instruct OpenVPN to try to limit the maximum on-write > packet > + size by restricting the control channel packet size and setting > ``--mssfix``. > + > + OpenVPN will try to keep its control channel messages below this size but > + due to some constraints in the protocol this is not always possible. If the > + option is not set, the control packet maximum size defaults to 1250. > + The control channel packet size will be restricted to values between > + 512 and 2048. The maximum packet size includes encapsulation overhead like > + UDP and IP. > + > + For ``--mssfix`` it will expand to: > + :: > + > + mssfix size mtu > \ No newline at end of file Missing newline > diff --git a/src/openvpn/common.h b/src/openvpn/common.h > index b94680885..056c25438 100644 > --- a/src/openvpn/common.h > +++ b/src/openvpn/common.h > @@ -68,6 +68,16 @@ typedef unsigned long ptr_type; > */ > #define TLS_CHANNEL_BUF_SIZE 2048 > > +/* TLS control buffer minimum size, this size is not actually inherent to > + * the protocol but. Our current sending window is 6 and the receive window > + * is 8 or 12 depending on the OpenVPN version. We need to be able to send > + * a TLS record of size TLS_CHANNEL_BUF_SIZE. Splitting this into more than > + * 6 packets (with overhead) would complicate our sending logic a lot more, > so > + * we settle here for a "round" number that allow with overhead of ~100 bytes > + * to be larger than TLS_CHANNEL_BUF_SIZE. E.g. 6x ~400 > 2048. That sentence is difficult to parse, specifically "so we settle here for a "round" number that allow with overhead of ~100 bytes to be larger than TLS_CHANNEL_BUF_SIZE". I'm not completely sure what you want to say so I find it difficult to make recommendations. > + * */ > +#define TLS_CHANNEL_MTU_MIN 512 > + > /* > * This parameter controls the maximum size of a bundle > * of pushed options. [...] > diff --git a/src/openvpn/options.c b/src/openvpn/options.c > index e44993c03..a7385118e 100644 > --- a/src/openvpn/options.c > +++ b/src/openvpn/options.c > @@ -825,6 +825,7 @@ init_options(struct options *o, const bool init_gc) > o->ce.bind_local = true; > o->ce.tun_mtu = TUN_MTU_DEFAULT; > o->ce.link_mtu = LINK_MTU_DEFAULT; > + o->ce.tls_mtu = TLS_MTU_DEFAULT; > o->ce.mtu_discover_type = -1; > o->ce.mssfix = 0; > o->ce.mssfix_default = true; > @@ -1711,6 +1712,7 @@ show_connection_entry(const struct connection_entry *o) > SHOW_BOOL(link_mtu_defined); > SHOW_INT(tun_mtu_extra); > SHOW_BOOL(tun_mtu_extra_defined); > + SHOW_INT(tls_mtu); > > SHOW_INT(mtu_discover_type); > > @@ -6442,6 +6444,25 @@ add_option(struct options *options, > options->ce.tun_mtu_extra = positive_atoi(p[1]); > options->ce.tun_mtu_extra_defined = true; > } > + else if (streq(p[0], "max-packet-size") && p[1] && !p[2]) > + { > + VERIFY_PERMISSION(OPT_P_MTU|OPT_P_CONNECTION); > + int maxmtu = positive_atoi(p[1]); > + options->ce.tls_mtu = constrain_int(maxmtu, TLS_CHANNEL_MTU_MIN, > TLS_CHANNEL_BUF_SIZE); > + > + if (maxmtu < TLS_CHANNEL_MTU_MIN || maxmtu > TLS_CHANNEL_BUF_SIZE) > + { > + msg(M_WARN, "max-packet-size value outside of allowed control " > + "channel packet size (%d to %d), will use %d " > + "instead", TLS_CHANNEL_MTU_MIN, TLS_CHANNEL_BUF_SIZE, > + options->ce.tls_mtu); Would add '.' after instead. Also we might want to add "Note: " prefix to be more consistent with other similar messages? > + } > + > + /* also set mssfix maxmtu mtu */ > + options->ce.mssfix = maxmtu; > + options->ce.mssfix_default = false; > + options->ce.mssfix_encap = true; > + } > #ifdef ENABLE_FRAGMENT > else if (streq(p[0], "mtu-dynamic")) > { [...] regards, -- Frank Lichtenheld _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel