diff options
| author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2026-03-04 17:53:27 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-04 17:53:27 +0200 |
| commit | 25925528d06cd557ca380e23ff1dc11670d9bc1f (patch) | |
| tree | 5b6eaf4b2eb25860dc4f871946e86d27b6a939ce /src/op_mode | |
| parent | 9fae68c92fe769da4f877c8df358868812a660ad (diff) | |
| parent | 80727823e8ac309959a06f8aaeb0e12f2f7a1f43 (diff) | |
| download | vyos-1x-25925528d06cd557ca380e23ff1dc11670d9bc1f.tar.gz vyos-1x-25925528d06cd557ca380e23ff1dc11670d9bc1f.zip | |
Merge pull request #5006 from ritika0313/T7513-CGNAT-exclude-rule-vyos-1x
T7513: vyos-1x: CGNAT Exclude Rule CLI support
Diffstat (limited to 'src/op_mode')
| -rw-r--r-- | src/op_mode/vpp_nat_cgnat.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/op_mode/vpp_nat_cgnat.py b/src/op_mode/vpp_nat_cgnat.py index 9a7dd2086..0ef0ca410 100644 --- a/src/op_mode/vpp_nat_cgnat.py +++ b/src/op_mode/vpp_nat_cgnat.py @@ -120,6 +120,44 @@ def show_interfaces(raw: bool): @_verify +def show_exclude_rules(raw: bool): + """Show CGNAT exclude rules (identity mappings)""" + vpp = VPPControl() + identity_mappings_dump = vpp.api.det44_identity_mapping_dump() + mappings: list[dict] = _get_raw_output(identity_mappings_dump) + + if raw: + return mappings + + if not mappings: + return "No CGNAT exclude rules configured" + + data_entries = [] + for m in mappings: + proto_map = {0: 'all', 1: 'icmp', 6: 'tcp', 17: 'udp'} + proto_name = proto_map.get(m.get('protocol'), str(m.get('protocol'))) + port_str = str(m.get('port')) if m.get('port') else 'any' + + # Check if address-only (flag & 1) + if m.get('flags', 0) & 1: + proto_name = 'all' + port_str = 'any' + + tag_raw = m.get('tag') + if isinstance(tag_raw, bytes): + tag = tag_raw.decode('utf-8', errors='replace').rstrip('\x00') + else: + tag = str(tag_raw) if tag_raw else '' + + values = [m.get('addr'), proto_name, port_str, m.get('vrf_id', 0), tag] + data_entries.append(values) + + headers = ['Address', 'Protocol', 'Port', 'VRF', 'Description'] + out = sorted(data_entries, key=lambda x: x[0]) + return tabulate(out, headers=headers, tablefmt='simple') + + +@_verify def clear_session(address: str, port: str, ext_address: str, ext_port: str): vpp = VPPControl() vpp.api.det44_close_session_in( |
