On 30/10/2024 15:50, Ilya Maximets wrote:
> Sometimes connections are getting loaded, but do not become active for
> some reason on a first try.  We can try and bring them up manually.
> However, if they are still not active after that, it's better to just
> remove the connection and try to add them from scratch, as there must
> be some internal issue in libreswan that doesn't allow these connections
> to actually become active.
> 
> Note: Once the "defunct" connection is removed, the second connection
> for the same tunnel will also be removed as "half-loaded".  This ensures
> that all the shared SAs will also be cleaned up, so we can truly start
> from scratch.
> 
> Signed-off-by: Ilya Maximets <[email protected]>
> ---
>  ipsec/ovs-monitor-ipsec.in | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/ipsec/ovs-monitor-ipsec.in b/ipsec/ovs-monitor-ipsec.in
> index 0ac6297bb..5d4b77bd2 100755
> --- a/ipsec/ovs-monitor-ipsec.in
> +++ b/ipsec/ovs-monitor-ipsec.in
> @@ -516,6 +516,7 @@ conn prevent_unencrypted_vxlan
>          self.IPSEC_D = "sql:" + libreswan_root_prefix + ipsec_d
>          self.IPSEC_CTL = libreswan_root_prefix + ipsec_ctl
>          self.conf_file = None
> +        self.conns_not_active = set()
>          self.last_refresh = time.time()
>          self.secrets_file = None
>          vlog.dbg("Using: " + self.IPSEC)
> @@ -641,6 +642,14 @@ conn prevent_unencrypted_vxlan
>              loaded = set(loaded_conns.get(name, dict()).keys())
>              active = set(active_conns.get(name, dict()).keys())
>  
> +            # Untrack connections that became active.
> +            self.conns_not_active.difference_update(active)
> +            # Remove connections that didn't become active after --start
> +            # and another explicit --up.
> +            for conn in self.conns_not_active & loaded:
> +                self._delete_ipsec_connection(conn, "is defunct")
> +                loaded.remove(conn)
> +
>              # Remove all the loaded or active but not desired connections.
>              for conn in loaded | active:
>                  if conn not in desired:
> @@ -671,6 +680,8 @@ conn prevent_unencrypted_vxlan
>                  # so loaded >= active
>                  for conn in loaded - active:
>                      vlog.info("Bringing up ipsec connection %s" % conn)
> +                    # On failure to --up it will be removed from the set.
> +                    self.conns_not_active.add(conn)
>                      self._start_ipsec_connection(conn, "up")
>  
>          # Update shunt policy if changed
> @@ -804,6 +815,7 @@ conn prevent_unencrypted_vxlan
>  
>      def _delete_ipsec_connection(self, conn, reason):
>          vlog.info("%s %s, removing" % (conn, reason))
> +        self.conns_not_active.discard(conn)
>          run_command(self.IPSEC_AUTO +
>                      ["--ctlsocket", self.IPSEC_CTL,
>                       "--config", self.IPSEC_CONF,

Acked-by: Roi Dayan <[email protected]>

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to