summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyrylo Yatsenko <hedrok@gmail.com>2026-06-20 09:37:42 +0300
committerKyrylo Yatsenko <hedrok@gmail.com>2026-06-20 09:59:00 +0300
commite8611801c7f36d7942ed367c5cf0b0dfd08083d2 (patch)
tree763f3bcf6f7a8820083575893891629fd9954f32
parent6c0fd99099a6251a12bc2287d5ba2ab115cd8015 (diff)
downloadvyos-1x-e8611801c7f36d7942ed367c5cf0b0dfd08083d2.tar.gz
vyos-1x-e8611801c7f36d7942ed367c5cf0b0dfd08083d2.zip
T8097: strongswan: add CLI for ESN
Add CLI commands: set vpn ipsec ike-group MyIKEGroup proposal 1 esn ESN-VALUE set vpn ipsec esp-group MyESPGroup proposal 1 esn ESN-VALUE Where ESN-VALUE can be one of: * required: only establish connection using ESN * optional: try using ESN, but if not available, accept non-ESN * disabled (default): don't use ESN StrongSwan 6.0.6 doesn't allow connections between proposal with '-noesn' and without '-esn'/'-noesn'. To make it work as expected, use two proposals for 'optional' and 'disabled': * required: PROPOSAL-esn * optional: PROPOSAL-esn-noesn,PROPOSAL * disabled: PROPOSAL-noesn,PROPOSAL
-rw-r--r--interface-definitions/include/vpn-ipsec-esn.xml.i26
-rw-r--r--interface-definitions/vpn_ipsec.xml.in2
-rwxr-xr-xpython/vyos/template.py11
3 files changed, 39 insertions, 0 deletions
diff --git a/interface-definitions/include/vpn-ipsec-esn.xml.i b/interface-definitions/include/vpn-ipsec-esn.xml.i
new file mode 100644
index 000000000..b4faa25d5
--- /dev/null
+++ b/interface-definitions/include/vpn-ipsec-esn.xml.i
@@ -0,0 +1,26 @@
+<!-- include start from vpn-ipsec-esn.xml.i -->
+<leafNode name="esn">
+ <properties>
+ <help>Extended Sequence Number (ESN)</help>
+ <completionHelp>
+ <list>optional required disabled</list>
+ </completionHelp>
+ <valueHelp>
+ <format>optional</format>
+ <description>Prefer ESN, but allow 32-bit sequence numbers</description>
+ </valueHelp>
+ <valueHelp>
+ <format>required</format>
+ <description>ESN enabled, accept 64-bit sequence numbers only</description>
+ </valueHelp>
+ <valueHelp>
+ <format>disabled</format>
+ <description>ESN disabled, accept 32-bit sequence numbers only</description>
+ </valueHelp>
+ <constraint>
+ <regex>(optional|required|disabled)</regex>
+ </constraint>
+ </properties>
+ <defaultValue>disabled</defaultValue>
+</leafNode>
+<!-- include end -->
diff --git a/interface-definitions/vpn_ipsec.xml.in b/interface-definitions/vpn_ipsec.xml.in
index ee8340a74..5ae9a8d64 100644
--- a/interface-definitions/vpn_ipsec.xml.in
+++ b/interface-definitions/vpn_ipsec.xml.in
@@ -294,6 +294,7 @@
<children>
#include <include/vpn-ipsec-encryption.xml.i>
#include <include/vpn-ipsec-hash.xml.i>
+ #include <include/vpn-ipsec-esn.xml.i>
</children>
</tagNode>
</children>
@@ -598,6 +599,7 @@
</leafNode>
#include <include/vpn-ipsec-encryption.xml.i>
#include <include/vpn-ipsec-hash.xml.i>
+ #include <include/vpn-ipsec-esn.xml.i>
</children>
</tagNode>
</children>
diff --git a/python/vyos/template.py b/python/vyos/template.py
index 8a624d989..91ef1baa8 100755
--- a/python/vyos/template.py
+++ b/python/vyos/template.py
@@ -527,6 +527,17 @@ def get_esp_ike_cipher(group_config, ike_group=None):
group = get_first_ike_dh_group(ike_group)
tmp += '-' + pfs_lut[group]
+ # For 'optional' and 'disabled' we need two values as
+ # proposal without '-esn'/'-noesn' is incompatible with
+ # proposals with any of them.
+ if 'esn' in proposal:
+ if proposal['esn'] == 'required':
+ tmp += '-esn'
+ elif proposal['esn'] == 'optional':
+ ciphers.append(tmp + '-esn-noesn')
+ elif proposal['esn'] == 'disabled':
+ ciphers.append(tmp + '-noesn')
+
ciphers.append(tmp)
return ciphers