diff --git a/napalm_opnsense/opnsense.py b/napalm_opnsense/opnsense.py index 24cc66c..4009791 100644 --- a/napalm_opnsense/opnsense.py +++ b/napalm_opnsense/opnsense.py @@ -298,7 +298,11 @@ class OPNsenseDriver(FirewallDriver): "gateway": "192.168.1.1", "family": "ipv4", "prefix_length": 24, + "vlan_id": 20, } + + ``vlan_id`` is ``None`` for interfaces that are not 802.1Q VLAN + sub-interfaces (e.g. the untagged management/LAN interface). """ import ipaddress @@ -307,7 +311,7 @@ class OPNsenseDriver(FirewallDriver): networks: List[Dict[str, Any]] = [] - def _add(ifname: str, cidr: str, family: str) -> None: + def _add(ifname: str, cidr: str, family: str, vlan_id: int | None) -> None: """Parse a CIDR string (e.g. '10.0.0.1/24') and append to networks.""" try: iface_obj = ipaddress.ip_interface(cidr) @@ -320,6 +324,7 @@ class OPNsenseDriver(FirewallDriver): "gateway": str(iface_obj.ip), "family": family, "prefix_length": net.prefixlen, + "vlan_id": vlan_id, }) except ValueError: pass @@ -329,13 +334,21 @@ class OPNsenseDriver(FirewallDriver): if not name: continue + vlan_id: int | None = None + raw_tag = iface.get("vlan_tag") + if raw_tag: + try: + vlan_id = int(raw_tag) + except (TypeError, ValueError): + vlan_id = None + # Primary format: flat CIDR strings in addr4/addr6 addr4: str = iface.get("addr4", "") addr6: str = iface.get("addr6", "") if addr4: - _add(name, addr4, "ipv4") + _add(name, addr4, "ipv4", vlan_id) if addr6: - _add(name, addr6, "ipv6") + _add(name, addr6, "ipv6", vlan_id) # Fallback: ipv4/ipv6 arrays where ipaddr may include prefix if not addr4: @@ -344,14 +357,14 @@ class OPNsenseDriver(FirewallDriver): subnet = entry.get("subnetbits") or entry.get("prefix_length") cidr = f"{ip_field}/{subnet}" if subnet and "/" not in ip_field else ip_field if cidr: - _add(name, cidr, "ipv4") + _add(name, cidr, "ipv4", vlan_id) if not addr6: for entry in iface.get("ipv6") or []: ip_field = entry.get("ipaddr") or entry.get("ip", "") prefix = entry.get("prefixlen") or entry.get("prefix_length") cidr = f"{ip_field}/{prefix}" if prefix and "/" not in ip_field else ip_field if cidr: - _add(name, cidr, "ipv6") + _add(name, cidr, "ipv6", vlan_id) return networks