summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/vyos/defaults.py6
-rwxr-xr-xpython/vyos/firewall.py14
2 files changed, 14 insertions, 6 deletions
diff --git a/python/vyos/defaults.py b/python/vyos/defaults.py
index 65e702927..17f8aed51 100644
--- a/python/vyos/defaults.py
+++ b/python/vyos/defaults.py
@@ -90,6 +90,12 @@ rt_symbolic_names = {
rt_global_vrf = rt_symbolic_names['main']
rt_global_table = rt_symbolic_names['main']
+# Firewall marks fragments with bit 31 of the packet mark until the filter
+# hooks are done. Firewall and routing policy marks stop at 2147483647, so the
+# bit is free - anything matching a mark while the bit can be set must mask it.
+fragment_mark_bit = '0x80000000'
+user_mark_mask = '0x7fffffff'
+
vyconfd_conf = '/etc/vyos/vyconfd.conf'
DEFAULT_COMMIT_CONFIRM_MINUTES = 10
diff --git a/python/vyos/firewall.py b/python/vyos/firewall.py
index 1e33462f4..847e74531 100755
--- a/python/vyos/firewall.py
+++ b/python/vyos/firewall.py
@@ -23,8 +23,10 @@ from vyos.utils.dict import dict_search_args
from vyos.utils.dict import dict_search_recursive
from vyos.utils.process import cmdl
from vyos.utils.network import get_vrf_tableid
+from vyos.defaults import fragment_mark_bit
from vyos.defaults import rt_global_table
from vyos.defaults import rt_global_vrf
+from vyos.defaults import user_mark_mask
# Conntrack
def conntrack_required(conf):
@@ -462,11 +464,11 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):
if 'fragment' in rule_conf:
# Checking for fragmentation after priority -400 is not possible,
- # so we use a priority -450 hook to set a mark
+ # a priority -450 hook sets bit 31 of the mark on fragments
if 'match_frag' in rule_conf['fragment']:
- output.append('meta mark 0xffff1')
+ output.append(f'meta mark & {fragment_mark_bit} == {fragment_mark_bit}')
if 'match_non_frag' in rule_conf['fragment']:
- output.append('meta mark != 0xffff1')
+ output.append(f'meta mark & {fragment_mark_bit} != {fragment_mark_bit}')
if 'limit' in rule_conf:
if 'rate' in rule_conf['limit']:
@@ -536,7 +538,7 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):
if mark[0] == '!':
operator = '!='
mark = mark[1:]
- output.append(f'meta mark {operator} {{{mark}}}')
+ output.append(f'meta mark & {user_mark_mask} {operator} {{{mark}}}')
if 'vlan' in rule_conf:
if 'id' in rule_conf['vlan']:
@@ -608,7 +610,7 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):
output.append(f'ip{def_suffix} dscp set {dscp}')
if 'mark' in rule_conf['set']:
mark = rule_conf['set']['mark']
- output.append(f'meta mark set {mark}')
+ output.append(f'meta mark set meta mark & {fragment_mark_bit} | {mark}')
if 'vrf' in rule_conf['set']:
set_table = True
vrf_name = rule_conf['set']['vrf']
@@ -624,7 +626,7 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):
table = rt_global_table
if set_table:
mark = 0x7FFFFFFF - int(table)
- output.append(f'meta mark set {mark}')
+ output.append(f'meta mark set meta mark & {fragment_mark_bit} | {mark}')
if 'tcp_mss' in rule_conf['set']:
mss = rule_conf['set']['tcp_mss']
output.append(f'tcp option maxseg size set {mss}')