| Message ID | 20221012133457.1927871-1-arne@rfc2549.org |
|---|---|
| State | Superseded |
| Headers | show |
| Series | [Openvpn-devel,1/3] Move dco_installed from sock->info to sock->info.lsa.actual | expand |
NAK.
static inline int
link_socket_read_udp_win32(struct link_socket *sock,
struct buffer *buf,
struct link_socket_actual *from)
{
sockethandle_t sh = { .s = sock->sd };
if (sock->info.dco_installed)
2>C:\Users\lev\Projects\openvpn\src\openvpn\socket.h(1053,20): error
C2039: 'dco_installed': is not a member of 'link_socket_info'
2>C:\Users\lev\Projects\openvpn\src\openvpn\socket.h(114): message :
see declaration of 'link_socket_info'
ke 12. lokak. 2022 klo 16.35 Arne Schwabe (arne@rfc2549.org) kirjoitti:
>
> For tcp this makes no difference as the remote address of the
> socket never changes. For udp this allows OpenVPN to differentiate
> if a reconnecting client is using the same address as before or
> from a different one. This allow sending via the normal userspace
> socket in that case.
>
> Signed-off-by: Arne Schwabe <arne@rfc2549.org>
> ---
> src/openvpn/dco.c | 7 ++++---
> src/openvpn/dco_linux.c | 2 +-
> src/openvpn/forward.c | 8 ++++----
> src/openvpn/init.c | 2 +-
> src/openvpn/mtcp.c | 6 +++---
> src/openvpn/socket.h | 6 +++---
> 6 files changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/src/openvpn/dco.c b/src/openvpn/dco.c
> index a76cdd0cd..1f402bfc2 100644
> --- a/src/openvpn/dco.c
> +++ b/src/openvpn/dco.c
> @@ -448,7 +448,7 @@ dco_p2p_add_new_peer(struct context *c)
> }
>
> c->c2.tls_multi->dco_peer_added = true;
> - c->c2.link_socket->info.dco_installed = true;
> + c->c2.link_socket->info.lsa->actual.dco_installed = true;
>
> return 0;
> }
> @@ -522,7 +522,7 @@ dco_multi_add_new_peer(struct multi_context *m, struct multi_instance *mi)
> {
> struct context *c = &mi->context;
>
> - int peer_id = mi->context.c2.tls_multi->peer_id;
> + int peer_id = c->c2.tls_multi->peer_id;
> struct sockaddr *remoteaddr, *localaddr = NULL;
> struct sockaddr_storage local = { 0 };
> int sd = c->c2.link_socket->sd;
> @@ -531,6 +531,7 @@ dco_multi_add_new_peer(struct multi_context *m, struct multi_instance *mi)
> {
> /* the remote address will be inferred from the TCP socket endpoint */
> remoteaddr = NULL;
> + c->c2.link_socket->info.lsa->actual.dco_installed = true;
> }
> else
> {
> @@ -575,7 +576,7 @@ dco_multi_add_new_peer(struct multi_context *m, struct multi_instance *mi)
> {
> msg(D_DCO|M_ERRNO, "error closing TCP socket after DCO handover");
> }
> - c->c2.link_socket->info.dco_installed = true;
> + c->c2.link_socket->info.lsa->actual.dco_installed = true;
> c->c2.link_socket->sd = SOCKET_UNDEFINED;
> }
>
> diff --git a/src/openvpn/dco_linux.c b/src/openvpn/dco_linux.c
> index 98e10507b..109358205 100644
> --- a/src/openvpn/dco_linux.c
> +++ b/src/openvpn/dco_linux.c
> @@ -285,7 +285,7 @@ ovpn_nl_cb_finish(struct nl_msg (*msg) __attribute__ ((unused)), void *arg)
> *
> * We pass the error code to the user by means of a variable pointed by *arg
> * (supplied by the user when setting this callback) and we parse the kernel
> - * reply to see if it contains a human readable error. If found, it is printed.
> + * reply to see if it contains a human-readable error. If found, it is printed.
> */
> static int
> ovpn_nl_cb_error(struct sockaddr_nl (*nla) __attribute__ ((unused)),
> diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c
> index bee24f0d4..18308c2c5 100644
> --- a/src/openvpn/forward.c
> +++ b/src/openvpn/forward.c
> @@ -1636,13 +1636,13 @@ process_ip_header(struct context *c, unsigned int flags, struct buffer *buf)
> * standard Overlapped I/O.
> *
> * Hide that complexity (...especially if more platforms show up
> - * in future...) in a small inline function.
> + * in the future...) in a small inline function.
> */
> static inline bool
> -should_use_dco_socket(struct link_socket *sock)
> +should_use_dco_socket(struct link_socket_actual *actual)
> {
> #if defined(TARGET_LINUX) || defined(TARGET_FREEBSD)
> - return sock->info.dco_installed;
> + return actual->dco_installed;
> #else
> return false;
> #endif
> @@ -1721,7 +1721,7 @@ process_outgoing_link(struct context *c)
> socks_preprocess_outgoing_link(c, &to_addr, &size_delta);
>
> /* Send packet */
> - if (should_use_dco_socket(c->c2.link_socket))
> + if (should_use_dco_socket(c->c2.to_link_addr))
> {
> size = dco_do_write(&c->c1.tuntap->dco,
> c->c2.tls_multi->peer_id,
> diff --git a/src/openvpn/init.c b/src/openvpn/init.c
> index 5141a35c2..351515aa2 100644
> --- a/src/openvpn/init.c
> +++ b/src/openvpn/init.c
> @@ -3625,7 +3625,7 @@ do_close_link_socket(struct context *c)
> * 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->info.lsa->actual.dco_installed)
> {
> c->c2.link_socket->sd = SOCKET_UNDEFINED;
> }
> diff --git a/src/openvpn/mtcp.c b/src/openvpn/mtcp.c
> index 1abb903f2..07da15a6d 100644
> --- a/src/openvpn/mtcp.c
> +++ b/src/openvpn/mtcp.c
> @@ -402,7 +402,7 @@ multi_tcp_wait_lite(struct multi_context *m, struct multi_instance *mi, const in
>
> tv_clear(&c->c2.timeval); /* ZERO-TIMEOUT */
>
> - if (mi && mi->context.c2.link_socket->info.dco_installed)
> + if (mi && mi->context.c2.link_socket->info.lsa->actual.dco_installed)
> {
> /* If we got a socket that has been handed over to the kernel
> * we must not call the normal socket function to figure out
> @@ -537,7 +537,7 @@ multi_tcp_dispatch(struct multi_context *m, struct multi_instance *mi, const int
>
> case TA_INITIAL:
> ASSERT(mi);
> - if (!mi->context.c2.link_socket->info.dco_installed)
> + if (!mi->context.c2.link_socket->info.lsa->actual.dco_installed)
> {
> multi_tcp_set_global_rw_flags(m, mi);
> }
> @@ -590,7 +590,7 @@ multi_tcp_post(struct multi_context *m, struct multi_instance *mi, const int act
> }
> else
> {
> - if (!c->c2.link_socket->info.dco_installed)
> + if (!c->c2.link_socket->info.lsa->actual.dco_installed)
> {
> multi_tcp_set_global_rw_flags(m, mi);
> }
> diff --git a/src/openvpn/socket.h b/src/openvpn/socket.h
> index 462afa31b..11b37d005 100644
> --- a/src/openvpn/socket.h
> +++ b/src/openvpn/socket.h
> @@ -88,6 +88,7 @@ struct link_socket_actual
> /*int dummy;*/ /* add offset to force a bug if dest not explicitly dereferenced */
>
> struct openvpn_sockaddr dest;
> + bool dco_installed;
> #if ENABLE_IP_PKTINFO
> union {
> #if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
> @@ -121,7 +122,6 @@ struct link_socket_info
> sa_family_t af; /* Address family like AF_INET, AF_INET6 or AF_UNSPEC*/
> bool bind_ipv6_only;
> int mtu_changed; /* Set to true when mtu value is changed */
> - bool dco_installed;
> };
>
> /*
> @@ -1073,7 +1073,7 @@ link_socket_read(struct link_socket *sock,
> struct link_socket_actual *from)
> {
> if (proto_is_udp(sock->info.proto)
> - || sock->info.dco_installed)
> + || sock->info.lsa->actual.dco_installed)
> /* unified UDPv4 and UDPv6, for DCO the kernel
> * will strip the length header */
> {
> @@ -1190,7 +1190,7 @@ link_socket_write(struct link_socket *sock,
> struct buffer *buf,
> struct link_socket_actual *to)
> {
> - if (proto_is_udp(sock->info.proto) || sock->info.dco_installed)
> + if (proto_is_udp(sock->info.proto) || to->dco_installed)
> {
> /* unified UDPv4 and UDPv6 and DCO (kernel adds size header) */
> return link_socket_write_udp(sock, buf, to);
> --
> 2.37.0 (Apple Git-136)
>
>
>
> _______________________________________________
> Openvpn-devel mailing list
> Openvpn-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openvpn-devel
diff --git a/src/openvpn/dco.c b/src/openvpn/dco.c index a76cdd0cd..1f402bfc2 100644 --- a/src/openvpn/dco.c +++ b/src/openvpn/dco.c @@ -448,7 +448,7 @@ dco_p2p_add_new_peer(struct context *c) } c->c2.tls_multi->dco_peer_added = true; - c->c2.link_socket->info.dco_installed = true; + c->c2.link_socket->info.lsa->actual.dco_installed = true; return 0; } @@ -522,7 +522,7 @@ dco_multi_add_new_peer(struct multi_context *m, struct multi_instance *mi) { struct context *c = &mi->context; - int peer_id = mi->context.c2.tls_multi->peer_id; + int peer_id = c->c2.tls_multi->peer_id; struct sockaddr *remoteaddr, *localaddr = NULL; struct sockaddr_storage local = { 0 }; int sd = c->c2.link_socket->sd; @@ -531,6 +531,7 @@ dco_multi_add_new_peer(struct multi_context *m, struct multi_instance *mi) { /* the remote address will be inferred from the TCP socket endpoint */ remoteaddr = NULL; + c->c2.link_socket->info.lsa->actual.dco_installed = true; } else { @@ -575,7 +576,7 @@ dco_multi_add_new_peer(struct multi_context *m, struct multi_instance *mi) { msg(D_DCO|M_ERRNO, "error closing TCP socket after DCO handover"); } - c->c2.link_socket->info.dco_installed = true; + c->c2.link_socket->info.lsa->actual.dco_installed = true; c->c2.link_socket->sd = SOCKET_UNDEFINED; } diff --git a/src/openvpn/dco_linux.c b/src/openvpn/dco_linux.c index 98e10507b..109358205 100644 --- a/src/openvpn/dco_linux.c +++ b/src/openvpn/dco_linux.c @@ -285,7 +285,7 @@ ovpn_nl_cb_finish(struct nl_msg (*msg) __attribute__ ((unused)), void *arg) * * We pass the error code to the user by means of a variable pointed by *arg * (supplied by the user when setting this callback) and we parse the kernel - * reply to see if it contains a human readable error. If found, it is printed. + * reply to see if it contains a human-readable error. If found, it is printed. */ static int ovpn_nl_cb_error(struct sockaddr_nl (*nla) __attribute__ ((unused)), diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c index bee24f0d4..18308c2c5 100644 --- a/src/openvpn/forward.c +++ b/src/openvpn/forward.c @@ -1636,13 +1636,13 @@ process_ip_header(struct context *c, unsigned int flags, struct buffer *buf) * standard Overlapped I/O. * * Hide that complexity (...especially if more platforms show up - * in future...) in a small inline function. + * in the future...) in a small inline function. */ static inline bool -should_use_dco_socket(struct link_socket *sock) +should_use_dco_socket(struct link_socket_actual *actual) { #if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) - return sock->info.dco_installed; + return actual->dco_installed; #else return false; #endif @@ -1721,7 +1721,7 @@ process_outgoing_link(struct context *c) socks_preprocess_outgoing_link(c, &to_addr, &size_delta); /* Send packet */ - if (should_use_dco_socket(c->c2.link_socket)) + if (should_use_dco_socket(c->c2.to_link_addr)) { size = dco_do_write(&c->c1.tuntap->dco, c->c2.tls_multi->peer_id, diff --git a/src/openvpn/init.c b/src/openvpn/init.c index 5141a35c2..351515aa2 100644 --- a/src/openvpn/init.c +++ b/src/openvpn/init.c @@ -3625,7 +3625,7 @@ do_close_link_socket(struct context *c) * 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->info.lsa->actual.dco_installed) { c->c2.link_socket->sd = SOCKET_UNDEFINED; } diff --git a/src/openvpn/mtcp.c b/src/openvpn/mtcp.c index 1abb903f2..07da15a6d 100644 --- a/src/openvpn/mtcp.c +++ b/src/openvpn/mtcp.c @@ -402,7 +402,7 @@ multi_tcp_wait_lite(struct multi_context *m, struct multi_instance *mi, const in tv_clear(&c->c2.timeval); /* ZERO-TIMEOUT */ - if (mi && mi->context.c2.link_socket->info.dco_installed) + if (mi && mi->context.c2.link_socket->info.lsa->actual.dco_installed) { /* If we got a socket that has been handed over to the kernel * we must not call the normal socket function to figure out @@ -537,7 +537,7 @@ multi_tcp_dispatch(struct multi_context *m, struct multi_instance *mi, const int case TA_INITIAL: ASSERT(mi); - if (!mi->context.c2.link_socket->info.dco_installed) + if (!mi->context.c2.link_socket->info.lsa->actual.dco_installed) { multi_tcp_set_global_rw_flags(m, mi); } @@ -590,7 +590,7 @@ multi_tcp_post(struct multi_context *m, struct multi_instance *mi, const int act } else { - if (!c->c2.link_socket->info.dco_installed) + if (!c->c2.link_socket->info.lsa->actual.dco_installed) { multi_tcp_set_global_rw_flags(m, mi); } diff --git a/src/openvpn/socket.h b/src/openvpn/socket.h index 462afa31b..11b37d005 100644 --- a/src/openvpn/socket.h +++ b/src/openvpn/socket.h @@ -88,6 +88,7 @@ struct link_socket_actual /*int dummy;*/ /* add offset to force a bug if dest not explicitly dereferenced */ struct openvpn_sockaddr dest; + bool dco_installed; #if ENABLE_IP_PKTINFO union { #if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST) @@ -121,7 +122,6 @@ struct link_socket_info sa_family_t af; /* Address family like AF_INET, AF_INET6 or AF_UNSPEC*/ bool bind_ipv6_only; int mtu_changed; /* Set to true when mtu value is changed */ - bool dco_installed; }; /* @@ -1073,7 +1073,7 @@ link_socket_read(struct link_socket *sock, struct link_socket_actual *from) { if (proto_is_udp(sock->info.proto) - || sock->info.dco_installed) + || sock->info.lsa->actual.dco_installed) /* unified UDPv4 and UDPv6, for DCO the kernel * will strip the length header */ { @@ -1190,7 +1190,7 @@ link_socket_write(struct link_socket *sock, struct buffer *buf, struct link_socket_actual *to) { - if (proto_is_udp(sock->info.proto) || sock->info.dco_installed) + if (proto_is_udp(sock->info.proto) || to->dco_installed) { /* unified UDPv4 and UDPv6 and DCO (kernel adds size header) */ return link_socket_write_udp(sock, buf, to);
For tcp this makes no difference as the remote address of the socket never changes. For udp this allows OpenVPN to differentiate if a reconnecting client is using the same address as before or from a different one. This allow sending via the normal userspace socket in that case. Signed-off-by: Arne Schwabe <arne@rfc2549.org> --- src/openvpn/dco.c | 7 ++++--- src/openvpn/dco_linux.c | 2 +- src/openvpn/forward.c | 8 ++++---- src/openvpn/init.c | 2 +- src/openvpn/mtcp.c | 6 +++--- src/openvpn/socket.h | 6 +++--- 6 files changed, 16 insertions(+), 15 deletions(-)