Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion backend/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

# Import routers
from routers.session import session as session_router
from routers.interfaces import ethernet, dummy, bonding, bridge, geneve, input, l2tpv3, loopback, macsec, openvpn, pppoe, pseudo_ethernet, sstpc, virtual_ethernet, vpp, vti, wireless
from routers.interfaces import ethernet, dummy, bonding, bridge, geneve, input, l2tpv3, loopback, macsec, openvpn, pppoe, pseudo_ethernet, sstpc, virtual_ethernet, vpp, vti, wireless, wwan
from routers.firewall import groups
from routers.firewall import ipv4 as firewall_ipv4
from routers.firewall import ipv6 as firewall_ipv6
Expand Down Expand Up @@ -297,6 +297,7 @@ async def get_permissions(request: Request) -> dict:
app.include_router(vpp.router)
app.include_router(vti.router)
app.include_router(wireless.router)
app.include_router(wwan.router)
app.include_router(groups.router)
app.include_router(firewall_ipv4.router)
app.include_router(firewall_ipv6.router)
Expand Down
418 changes: 418 additions & 0 deletions backend/routers/interfaces/wwan.py

Large diffs are not rendered by default.

448 changes: 448 additions & 0 deletions backend/vyos_builders/interfaces/wwan.py

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions backend/vyos_mappers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from .interfaces.vpp_versions import get_vpp_mapper
from .interfaces.vti_versions import get_vti_mapper
from .interfaces.wireless_versions import get_wireless_mapper
from .interfaces.wwan_versions import get_wwan_mapper
from .firewall import FirewallGroupsMapper, FirewallIPv4Mapper, FirewallIPv6Mapper, BridgeFirewallMapper, FlowtablesMapper, FirewallZonesMapper
from .firewall.groups_versions import get_firewall_groups_mapper
from .firewall.ipv4_versions import get_firewall_ipv4_mapper
Expand Down Expand Up @@ -135,6 +136,8 @@
CommandMapperRegistry.register_feature("interface_vti", get_vti_mapper)
# Wireless uses factory for version-specific mappers
CommandMapperRegistry.register_feature("interface_wireless", get_wireless_mapper)
# WWAN uses factory for version-specific mappers
CommandMapperRegistry.register_feature("interface_wwan", get_wwan_mapper)
# Firewall groups uses factory for version-specific mappers
CommandMapperRegistry.register_feature("firewall_groups", get_firewall_groups_mapper)
# Firewall IPv4 uses factory for version-specific mappers
Expand Down
2 changes: 2 additions & 0 deletions backend/vyos_mappers/interfaces/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from .vpp import VppInterfaceMapper
from .vti import VtiInterfaceMapper
from .wireless import WirelessInterfaceMapper
from .wwan import WwanInterfaceMapper

__all__ = [
"EthernetInterfaceMapper",
Expand All @@ -38,4 +39,5 @@
"VppInterfaceMapper",
"VtiInterfaceMapper",
"WirelessInterfaceMapper",
"WwanInterfaceMapper",
]
440 changes: 440 additions & 0 deletions backend/vyos_mappers/interfaces/wwan.py

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions backend/vyos_mappers/interfaces/wwan_versions/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
WWAN Interface Version-Specific Mappers

Factory function returns the appropriate mapper based on VyOS version.
"""

from ..wwan import WwanInterfaceMapper
from .v1_4 import WwanMapper_v1_4
from .v1_5 import WwanMapper_v1_5


def get_wwan_mapper(version: str) -> WwanInterfaceMapper:
"""Get version-specific WWAN interface mapper."""
if "1.5" in version or "latest" in version:
return WwanMapper_v1_5(version)
return WwanMapper_v1_4(version)
17 changes: 17 additions & 0 deletions backend/vyos_mappers/interfaces/wwan_versions/v1_4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""
WWAN Interface Mapper - VyOS 1.4

VyOS 1.4 does NOT support:
- dhcpv6-options/no-request-dns
- dhcpv6-options/no-request-domain-name
- ipv6/address/interface-identifier (SLAAC interface identifier)
"""

from ..wwan import WwanInterfaceMapper


class WwanMapper_v1_4(WwanInterfaceMapper):
"""VyOS 1.4 WWAN interface mapper."""

def __init__(self, version: str):
super().__init__(version)
39 changes: 39 additions & 0 deletions backend/vyos_mappers/interfaces/wwan_versions/v1_5.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"""
WWAN Interface Mapper - VyOS 1.5

VyOS 1.5 adds:
- dhcpv6-options/no-request-dns
- dhcpv6-options/no-request-domain-name
- ipv6/address/interface-identifier (SLAAC interface identifier)
"""

from typing import List, Dict, Any
from ..wwan import WwanInterfaceMapper


class WwanMapper_v1_5(WwanInterfaceMapper):
"""VyOS 1.5 WWAN interface mapper."""

def __init__(self, version: str):
super().__init__(version)

def get_dhcpv6_no_request_dns(self, interface: str) -> List[str]:
return self._base(interface) + ["dhcpv6-options", "no-request-dns"]

def get_dhcpv6_no_request_domain_name(self, interface: str) -> List[str]:
return self._base(interface) + ["dhcpv6-options", "no-request-domain-name"]

def get_ipv6_address_interface_identifier(self, interface: str, identifier: str) -> List[str]:
return self._base(interface) + ["ipv6", "address", "interface-identifier", identifier]

def get_ipv6_address_interface_identifier_path(self, interface: str) -> List[str]:
return self._base(interface) + ["ipv6", "address", "interface-identifier"]

def parse_single_interface(self, name: str, config: Dict[str, Any]) -> Dict[str, Any]:
result = super().parse_single_interface(name, config)
dhcpv6_config = config.get("dhcpv6-options", {}) or {}
ipv6_addr_config = (config.get("ipv6", {}) or {}).get("address", {}) or {}
result["dhcpv6_no_request_dns"] = "no-request-dns" in dhcpv6_config
result["dhcpv6_no_request_domain_name"] = "no-request-domain-name" in dhcpv6_config
result["ipv6_address_interface_identifier"] = ipv6_addr_config.get("interface-identifier")
return result
Loading
Loading