diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/ethtool.py | 3 | ||||
| -rw-r--r-- | python/vyos/firewall.py | 71 | ||||
| -rw-r--r-- | python/vyos/ifconfig/ethernet.py | 26 | ||||
| -rw-r--r-- | python/vyos/template.py | 5 | ||||
| -rw-r--r-- | python/vyos/utils/network.py | 2 | 
5 files changed, 72 insertions, 35 deletions
| diff --git a/python/vyos/ethtool.py b/python/vyos/ethtool.py index ca3bcfc3d..f19632719 100644 --- a/python/vyos/ethtool.py +++ b/python/vyos/ethtool.py @@ -172,6 +172,9 @@ class Ethtool:      def get_generic_segmentation_offload(self):          return self._get_generic('generic-segmentation-offload') +    def get_hw_tc_offload(self): +        return self._get_generic('hw-tc-offload') +      def get_large_receive_offload(self):          return self._get_generic('large-receive-offload') diff --git a/python/vyos/firewall.py b/python/vyos/firewall.py index 3305eb269..3ca7a25b9 100644 --- a/python/vyos/firewall.py +++ b/python/vyos/firewall.py @@ -249,29 +249,6 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):                      output.append(f'{proto} {prefix}port {operator} @P_{group_name}') -    if 'log' in rule_conf and rule_conf['log'] == 'enable': -        action = rule_conf['action'] if 'action' in rule_conf else 'accept' -        #output.append(f'log prefix "[{fw_name[:19]}-{rule_id}-{action[:1].upper()}]"') -        output.append(f'log prefix "[{family}-{hook}-{fw_name}-{rule_id}-{action[:1].upper()}]"') -                        ##{family}-{hook}-{fw_name}-{rule_id} -        if 'log_options' in rule_conf: - -            if 'level' in rule_conf['log_options']: -                log_level = rule_conf['log_options']['level'] -                output.append(f'log level {log_level}') - -            if 'group' in rule_conf['log_options']: -                log_group = rule_conf['log_options']['group'] -                output.append(f'log group {log_group}') - -                if 'queue_threshold' in rule_conf['log_options']: -                    queue_threshold = rule_conf['log_options']['queue_threshold'] -                    output.append(f'queue-threshold {queue_threshold}') - -                if 'snapshot_length' in rule_conf['log_options']: -                    log_snaplen = rule_conf['log_options']['snapshot_length'] -                    output.append(f'snaplen {log_snaplen}') -      if 'hop_limit' in rule_conf:          operators = {'eq': '==', 'gt': '>', 'lt': '<'}          for op, operator in operators.items(): @@ -393,6 +370,28 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):          if 'priority' in rule_conf['vlan']:              output.append(f'vlan pcp {rule_conf["vlan"]["priority"]}') +    if 'log' in rule_conf and rule_conf['log'] == 'enable': +        action = rule_conf['action'] if 'action' in rule_conf else 'accept' +        #output.append(f'log prefix "[{fw_name[:19]}-{rule_id}-{action[:1].upper()}]"') +        output.append(f'log prefix "[{family}-{hook}-{fw_name}-{rule_id}-{action[:1].upper()}]"') +                        ##{family}-{hook}-{fw_name}-{rule_id} +        if 'log_options' in rule_conf: + +            if 'level' in rule_conf['log_options']: +                log_level = rule_conf['log_options']['level'] +                output.append(f'log level {log_level}') + +            if 'group' in rule_conf['log_options']: +                log_group = rule_conf['log_options']['group'] +                output.append(f'log group {log_group}') + +                if 'queue_threshold' in rule_conf['log_options']: +                    queue_threshold = rule_conf['log_options']['queue_threshold'] +                    output.append(f'queue-threshold {queue_threshold}') + +                if 'snapshot_length' in rule_conf['log_options']: +                    log_snaplen = rule_conf['log_options']['snapshot_length'] +                    output.append(f'snaplen {log_snaplen}')      output.append('counter') @@ -402,20 +401,24 @@ def parse_rule(rule_conf, hook, fw_name, rule_id, ip_name):      if 'action' in rule_conf:          # Change action=return to action=action          # #output.append(nft_action(rule_conf['action'])) -        output.append(f'{rule_conf["action"]}') -        if 'jump' in rule_conf['action']: -            target = rule_conf['jump_target'] -            output.append(f'NAME{def_suffix}_{target}') +        if rule_conf['action'] == 'offload': +            offload_target = rule_conf['offload_target'] +            output.append(f'flow add @VYOS_FLOWTABLE_{offload_target}') +        else: +            output.append(f'{rule_conf["action"]}') -        if 'queue' in rule_conf['action']: -            if 'queue' in rule_conf: -                target = rule_conf['queue'] -                output.append(f'num {target}') +            if 'jump' in rule_conf['action']: +                target = rule_conf['jump_target'] +                output.append(f'NAME{def_suffix}_{target}') -            if 'queue_options' in rule_conf: -                queue_opts = ','.join(rule_conf['queue_options']) -                output.append(f'{queue_opts}') +            if 'queue' in rule_conf['action']: +                if 'queue' in rule_conf: +                    target = rule_conf['queue'] +                    output.append(f'num {target}') +                if 'queue_options' in rule_conf: +                    queue_opts = ','.join(rule_conf['queue_options']) +                    output.append(f'{queue_opts}')      else:          output.append('return') diff --git a/python/vyos/ifconfig/ethernet.py b/python/vyos/ifconfig/ethernet.py index 24ce3a803..285542057 100644 --- a/python/vyos/ifconfig/ethernet.py +++ b/python/vyos/ifconfig/ethernet.py @@ -57,6 +57,10 @@ class EthernetIf(Interface):              'validate': lambda v: assert_list(v, ['on', 'off']),              'possible': lambda i, v: EthernetIf.feature(i, 'gso', v),          }, +        'hw-tc-offload': { +            'validate': lambda v: assert_list(v, ['on', 'off']), +            'possible': lambda i, v: EthernetIf.feature(i, 'hw-tc-offload', v), +        },          'lro': {              'validate': lambda v: assert_list(v, ['on', 'off']),              'possible': lambda i, v: EthernetIf.feature(i, 'lro', v), @@ -222,6 +226,25 @@ class EthernetIf(Interface):                  print('Adapter does not support changing generic-segmentation-offload settings!')          return False +    def set_hw_tc_offload(self, state): +        """ +        Enable hardware TC flow offload. State can be either True or False. +        Example: +        >>> from vyos.ifconfig import EthernetIf +        >>> i = EthernetIf('eth0') +        >>> i.set_hw_tc_offload(True) +        """ +        if not isinstance(state, bool): +            raise ValueError('Value out of range') + +        enabled, fixed = self.ethtool.get_hw_tc_offload() +        if enabled != state: +            if not fixed: +                return self.set_interface('hw-tc-offload', 'on' if state else 'off') +            else: +                print('Adapter does not support changing hw-tc-offload settings!') +        return False +      def set_lro(self, state):          """          Enable Large Receive offload. State can be either True or False. @@ -358,6 +381,9 @@ class EthernetIf(Interface):          # GSO (generic segmentation offload)          self.set_gso(dict_search('offload.gso', config) != None) +        # GSO (generic segmentation offload) +        self.set_hw_tc_offload(dict_search('offload.hw-tc-offload', config) != None) +          # LRO (large receive offload)          self.set_lro(dict_search('offload.lro', config) != None) diff --git a/python/vyos/template.py b/python/vyos/template.py index add4d3ce5..3be486cc4 100644 --- a/python/vyos/template.py +++ b/python/vyos/template.py @@ -678,6 +678,11 @@ def conntrack_ignore_rule(rule_conf, rule_id, ipv6=False):          proto = rule_conf['protocol']          output.append(f'meta l4proto {proto}') +    tcp_flags = dict_search_args(rule_conf, 'tcp', 'flags') +    if tcp_flags: +        from vyos.firewall import parse_tcp_flags +        output.append(parse_tcp_flags(tcp_flags)) +      for side in ['source', 'destination']:          if side in rule_conf:              side_conf = rule_conf[side] diff --git a/python/vyos/utils/network.py b/python/vyos/utils/network.py index 4c579c760..9354bd495 100644 --- a/python/vyos/utils/network.py +++ b/python/vyos/utils/network.py @@ -139,7 +139,7 @@ def is_ipv6_tentative(iface: str, ipv6_address: str) -> bool:      import json      from vyos.utils.process import rc_cmd -    rc, out = rc_cmd(f'ip -6 --json address show dev {iface} scope global') +    rc, out = rc_cmd(f'ip -6 --json address show dev {iface}')      if rc:          return False | 
