Re: [Openvpn-devel] [PATCH v2] p2p/dco: renew peer in P2P mode upon reconnection

2022-10-14 Thread Antonio Quartulli

Hi,

On 19/09/2022 17:35, Antonio Quartulli wrote:

In P2P mode when the peer reconnects we have to renew the state in DCO
in order to inform it about the new peer-id.

Cc: Arne Schwabe 
Signed-off-by: Antonio Quartulli 
---
Changes from v1:
* remove useless arguments from tls_multi_process() (and descendant
   calls) as we now pass 'c' directly


Arne is proposing a slightly different approach with his newest patches. 
Therefore this one can be considered obsolete.


Cheers,


---
  src/openvpn/forward.c |  4 +---
  src/openvpn/ssl.c | 54 +--
  src/openvpn/ssl.h |  6 +
  3 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c
index 810cb8a7..41593fc9 100644
--- a/src/openvpn/forward.c
+++ b/src/openvpn/forward.c
@@ -170,9 +170,7 @@ check_tls(struct context *c)
  
  if (interval_test(>c2.tmp_int))

  {
-const int tmp_status = tls_multi_process
-   (c->c2.tls_multi, >c2.to_link, 
>c2.to_link_addr,
-   get_link_socket_info(c), );
+const int tmp_status = tls_multi_process(c, );
  if (tmp_status == TLSMP_ACTIVE)
  {
  update_time();
diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c
index 3116fa4b..10691f0c 100644
--- a/src/openvpn/ssl.c
+++ b/src/openvpn/ssl.c
@@ -45,9 +45,11 @@
  
  #include "error.h"

  #include "common.h"
+#include "openvpn.h"
  #include "socket.h"
  #include "misc.h"
  #include "fdmisc.h"
+#include "forward.h"
  #include "interval.h"
  #include "perf.h"
  #include "status.h"
@@ -2717,13 +2719,14 @@ read_incoming_tls_plaintext(struct key_state *ks, 
struct buffer *buf,
  
  
  static bool

-tls_process_state(struct tls_multi *multi,
+tls_process_state(struct context *c,
struct tls_session *session,
-  struct buffer *to_link,
struct link_socket_actual **to_link_addr,
struct link_socket_info *to_link_socket_info,
interval_t *wakeup)
  {
+struct tls_multi *multi = c->c2.tls_multi;
+struct buffer *to_link = >c2.to_link;
  bool state_change = false;
  struct key_state *ks = >key[KS_PRIMARY];  /* primary key */
  
@@ -2827,6 +2830,20 @@ tls_process_state(struct tls_multi *multi,

  state_change = true;
  dmsg(D_TLS_DEBUG_MED, "STATE S_SENT_KEY");
  ks->state = S_SENT_KEY;
+
+/* In P2P mode we have to renew the peer in DCO in case of
+ * reconnection (--tls-server case)
+ */
+if (session->opt->server && (session->opt->mode != MODE_SERVER)
+&& (ks->key_id == 0) && multi->dco_peer_added)
+{
+msg(D_DCO, "Renewing P2P peer in tls-server mode");
+int ret = dco_p2p_add_new_peer(c);
+if (ret < 0)
+{
+msg(D_DCO, "Cannot renew peer in DCO: %s (%d)", 
strerror(-ret), ret);
+}
+}
  }
  
  /* Receive Key */

@@ -2843,6 +2860,20 @@ tls_process_state(struct tls_multi *multi,
  state_change = true;
  dmsg(D_TLS_DEBUG_MED, "STATE S_GOT_KEY");
  ks->state = S_GOT_KEY;
+
+/* In P2P mode we have to renew the peer in DCO in case of
+ * reconnection (--tls-client case)
+ */
+if (!session->opt->server && !session->opt->pull && (ks->key_id == 0)
+&& multi->dco_peer_added)
+{
+msg(D_DCO, "Renewing P2P peer in tls-client mode");
+int ret = dco_p2p_add_new_peer(c);
+if (ret < 0)
+{
+msg(D_DCO, "Cannot renew peer in DCO: %s (%d)", 
strerror(-ret), ret);
+}
+}
  }
  
  /* Write outgoing plaintext to TLS object */

@@ -2911,15 +2942,16 @@ error:
   * want to send to our peer.
   */
  static bool
-tls_process(struct tls_multi *multi,
+tls_process(struct context *c,
  struct tls_session *session,
-struct buffer *to_link,
  struct link_socket_actual **to_link_addr,
  struct link_socket_info *to_link_socket_info,
  interval_t *wakeup)
  {
  struct key_state *ks = >key[KS_PRIMARY];  /* primary key */
  struct key_state *ks_lame = >key[KS_LAME_DUCK]; /* retiring key 
*/
+struct tls_multi *multi = c->c2.tls_multi;
+struct buffer *to_link = >c2.to_link;
  
  /* Make sure we were initialized and that we're not in an error state */

  ASSERT(ks->state != S_UNDEF);
@@ -2962,7 +2994,7 @@ tls_process(struct tls_multi *multi,
   state_name(ks_lame->state),
   to_link->len,
   *wakeup);
-state_change = tls_process_state(multi, session, to_link, to_link_addr,
+state_change = tls_process_state(c, session, to_link_addr,
   to_link_socket_info, wakeup);
  
  if (ks->state == S_ERROR)

@@ 

[Openvpn-devel] [PATCH v2] p2p/dco: renew peer in P2P mode upon reconnection

2022-09-19 Thread Antonio Quartulli
In P2P mode when the peer reconnects we have to renew the state in DCO
in order to inform it about the new peer-id.

Cc: Arne Schwabe 
Signed-off-by: Antonio Quartulli 
---
Changes from v1:
* remove useless arguments from tls_multi_process() (and descendant
  calls) as we now pass 'c' directly
---
 src/openvpn/forward.c |  4 +---
 src/openvpn/ssl.c | 54 +--
 src/openvpn/ssl.h |  6 +
 3 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c
index 810cb8a7..41593fc9 100644
--- a/src/openvpn/forward.c
+++ b/src/openvpn/forward.c
@@ -170,9 +170,7 @@ check_tls(struct context *c)
 
 if (interval_test(>c2.tmp_int))
 {
-const int tmp_status = tls_multi_process
-   (c->c2.tls_multi, >c2.to_link, 
>c2.to_link_addr,
-   get_link_socket_info(c), );
+const int tmp_status = tls_multi_process(c, );
 if (tmp_status == TLSMP_ACTIVE)
 {
 update_time();
diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c
index 3116fa4b..10691f0c 100644
--- a/src/openvpn/ssl.c
+++ b/src/openvpn/ssl.c
@@ -45,9 +45,11 @@
 
 #include "error.h"
 #include "common.h"
+#include "openvpn.h"
 #include "socket.h"
 #include "misc.h"
 #include "fdmisc.h"
+#include "forward.h"
 #include "interval.h"
 #include "perf.h"
 #include "status.h"
@@ -2717,13 +2719,14 @@ read_incoming_tls_plaintext(struct key_state *ks, 
struct buffer *buf,
 
 
 static bool
-tls_process_state(struct tls_multi *multi,
+tls_process_state(struct context *c,
   struct tls_session *session,
-  struct buffer *to_link,
   struct link_socket_actual **to_link_addr,
   struct link_socket_info *to_link_socket_info,
   interval_t *wakeup)
 {
+struct tls_multi *multi = c->c2.tls_multi;
+struct buffer *to_link = >c2.to_link;
 bool state_change = false;
 struct key_state *ks = >key[KS_PRIMARY];  /* primary key */
 
@@ -2827,6 +2830,20 @@ tls_process_state(struct tls_multi *multi,
 state_change = true;
 dmsg(D_TLS_DEBUG_MED, "STATE S_SENT_KEY");
 ks->state = S_SENT_KEY;
+
+/* In P2P mode we have to renew the peer in DCO in case of
+ * reconnection (--tls-server case)
+ */
+if (session->opt->server && (session->opt->mode != MODE_SERVER)
+&& (ks->key_id == 0) && multi->dco_peer_added)
+{
+msg(D_DCO, "Renewing P2P peer in tls-server mode");
+int ret = dco_p2p_add_new_peer(c);
+if (ret < 0)
+{
+msg(D_DCO, "Cannot renew peer in DCO: %s (%d)", 
strerror(-ret), ret);
+}
+}
 }
 
 /* Receive Key */
@@ -2843,6 +2860,20 @@ tls_process_state(struct tls_multi *multi,
 state_change = true;
 dmsg(D_TLS_DEBUG_MED, "STATE S_GOT_KEY");
 ks->state = S_GOT_KEY;
+
+/* In P2P mode we have to renew the peer in DCO in case of
+ * reconnection (--tls-client case)
+ */
+if (!session->opt->server && !session->opt->pull && (ks->key_id == 0)
+&& multi->dco_peer_added)
+{
+msg(D_DCO, "Renewing P2P peer in tls-client mode");
+int ret = dco_p2p_add_new_peer(c);
+if (ret < 0)
+{
+msg(D_DCO, "Cannot renew peer in DCO: %s (%d)", 
strerror(-ret), ret);
+}
+}
 }
 
 /* Write outgoing plaintext to TLS object */
@@ -2911,15 +2942,16 @@ error:
  * want to send to our peer.
  */
 static bool
-tls_process(struct tls_multi *multi,
+tls_process(struct context *c,
 struct tls_session *session,
-struct buffer *to_link,
 struct link_socket_actual **to_link_addr,
 struct link_socket_info *to_link_socket_info,
 interval_t *wakeup)
 {
 struct key_state *ks = >key[KS_PRIMARY];  /* primary key */
 struct key_state *ks_lame = >key[KS_LAME_DUCK]; /* retiring key */
+struct tls_multi *multi = c->c2.tls_multi;
+struct buffer *to_link = >c2.to_link;
 
 /* Make sure we were initialized and that we're not in an error state */
 ASSERT(ks->state != S_UNDEF);
@@ -2962,7 +2994,7 @@ tls_process(struct tls_multi *multi,
  state_name(ks_lame->state),
  to_link->len,
  *wakeup);
-state_change = tls_process_state(multi, session, to_link, to_link_addr,
+state_change = tls_process_state(c, session, to_link_addr,
  to_link_socket_info, wakeup);
 
 if (ks->state == S_ERROR)
@@ -3055,12 +3087,11 @@ tls_process(struct tls_multi *multi,
  */
 
 int
-tls_multi_process(struct tls_multi *multi,
-  struct buffer *to_link,
-  struct link_socket_actual **to_link_addr,
-  struct link_socket_info