Skip to content

Commit 0cc5bc1

Browse files
Feat add interface wwan support (#258)
* Adding interface WWAN backend * Adding interface WWAN frontend * Ordering the interface menu items
1 parent b1c1480 commit 0cc5bc1

14 files changed

Lines changed: 3986 additions & 118 deletions

File tree

backend/app.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
# Import routers
1515
from routers.session import session as session_router
16-
from routers.interfaces import ethernet, dummy, bonding, bridge, geneve, input, l2tpv3, loopback, macsec, openvpn, pppoe, pseudo_ethernet, sstpc, virtual_ethernet, vpp, vti, wireless
16+
from routers.interfaces import ethernet, dummy, bonding, bridge, geneve, input, l2tpv3, loopback, macsec, openvpn, pppoe, pseudo_ethernet, sstpc, virtual_ethernet, vpp, vti, wireless, wwan
1717
from routers.firewall import groups
1818
from routers.firewall import ipv4 as firewall_ipv4
1919
from routers.firewall import ipv6 as firewall_ipv6
@@ -297,6 +297,7 @@ async def get_permissions(request: Request) -> dict:
297297
app.include_router(vpp.router)
298298
app.include_router(vti.router)
299299
app.include_router(wireless.router)
300+
app.include_router(wwan.router)
300301
app.include_router(groups.router)
301302
app.include_router(firewall_ipv4.router)
302303
app.include_router(firewall_ipv6.router)

backend/routers/interfaces/wwan.py

Lines changed: 418 additions & 0 deletions
Large diffs are not rendered by default.

backend/vyos_builders/interfaces/wwan.py

Lines changed: 448 additions & 0 deletions
Large diffs are not rendered by default.

backend/vyos_mappers/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from .interfaces.vpp_versions import get_vpp_mapper
2525
from .interfaces.vti_versions import get_vti_mapper
2626
from .interfaces.wireless_versions import get_wireless_mapper
27+
from .interfaces.wwan_versions import get_wwan_mapper
2728
from .firewall import FirewallGroupsMapper, FirewallIPv4Mapper, FirewallIPv6Mapper, BridgeFirewallMapper, FlowtablesMapper, FirewallZonesMapper
2829
from .firewall.groups_versions import get_firewall_groups_mapper
2930
from .firewall.ipv4_versions import get_firewall_ipv4_mapper
@@ -135,6 +136,8 @@
135136
CommandMapperRegistry.register_feature("interface_vti", get_vti_mapper)
136137
# Wireless uses factory for version-specific mappers
137138
CommandMapperRegistry.register_feature("interface_wireless", get_wireless_mapper)
139+
# WWAN uses factory for version-specific mappers
140+
CommandMapperRegistry.register_feature("interface_wwan", get_wwan_mapper)
138141
# Firewall groups uses factory for version-specific mappers
139142
CommandMapperRegistry.register_feature("firewall_groups", get_firewall_groups_mapper)
140143
# Firewall IPv4 uses factory for version-specific mappers

backend/vyos_mappers/interfaces/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from .vpp import VppInterfaceMapper
2121
from .vti import VtiInterfaceMapper
2222
from .wireless import WirelessInterfaceMapper
23+
from .wwan import WwanInterfaceMapper
2324

2425
__all__ = [
2526
"EthernetInterfaceMapper",
@@ -38,4 +39,5 @@
3839
"VppInterfaceMapper",
3940
"VtiInterfaceMapper",
4041
"WirelessInterfaceMapper",
42+
"WwanInterfaceMapper",
4143
]

backend/vyos_mappers/interfaces/wwan.py

Lines changed: 440 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
WWAN Interface Version-Specific Mappers
3+
4+
Factory function returns the appropriate mapper based on VyOS version.
5+
"""
6+
7+
from ..wwan import WwanInterfaceMapper
8+
from .v1_4 import WwanMapper_v1_4
9+
from .v1_5 import WwanMapper_v1_5
10+
11+
12+
def get_wwan_mapper(version: str) -> WwanInterfaceMapper:
13+
"""Get version-specific WWAN interface mapper."""
14+
if "1.5" in version or "latest" in version:
15+
return WwanMapper_v1_5(version)
16+
return WwanMapper_v1_4(version)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""
2+
WWAN Interface Mapper - VyOS 1.4
3+
4+
VyOS 1.4 does NOT support:
5+
- dhcpv6-options/no-request-dns
6+
- dhcpv6-options/no-request-domain-name
7+
- ipv6/address/interface-identifier (SLAAC interface identifier)
8+
"""
9+
10+
from ..wwan import WwanInterfaceMapper
11+
12+
13+
class WwanMapper_v1_4(WwanInterfaceMapper):
14+
"""VyOS 1.4 WWAN interface mapper."""
15+
16+
def __init__(self, version: str):
17+
super().__init__(version)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
WWAN Interface Mapper - VyOS 1.5
3+
4+
VyOS 1.5 adds:
5+
- dhcpv6-options/no-request-dns
6+
- dhcpv6-options/no-request-domain-name
7+
- ipv6/address/interface-identifier (SLAAC interface identifier)
8+
"""
9+
10+
from typing import List, Dict, Any
11+
from ..wwan import WwanInterfaceMapper
12+
13+
14+
class WwanMapper_v1_5(WwanInterfaceMapper):
15+
"""VyOS 1.5 WWAN interface mapper."""
16+
17+
def __init__(self, version: str):
18+
super().__init__(version)
19+
20+
def get_dhcpv6_no_request_dns(self, interface: str) -> List[str]:
21+
return self._base(interface) + ["dhcpv6-options", "no-request-dns"]
22+
23+
def get_dhcpv6_no_request_domain_name(self, interface: str) -> List[str]:
24+
return self._base(interface) + ["dhcpv6-options", "no-request-domain-name"]
25+
26+
def get_ipv6_address_interface_identifier(self, interface: str, identifier: str) -> List[str]:
27+
return self._base(interface) + ["ipv6", "address", "interface-identifier", identifier]
28+
29+
def get_ipv6_address_interface_identifier_path(self, interface: str) -> List[str]:
30+
return self._base(interface) + ["ipv6", "address", "interface-identifier"]
31+
32+
def parse_single_interface(self, name: str, config: Dict[str, Any]) -> Dict[str, Any]:
33+
result = super().parse_single_interface(name, config)
34+
dhcpv6_config = config.get("dhcpv6-options", {}) or {}
35+
ipv6_addr_config = (config.get("ipv6", {}) or {}).get("address", {}) or {}
36+
result["dhcpv6_no_request_dns"] = "no-request-dns" in dhcpv6_config
37+
result["dhcpv6_no_request_domain_name"] = "no-request-domain-name" in dhcpv6_config
38+
result["ipv6_address_interface_identifier"] = ipv6_addr_config.get("interface-identifier")
39+
return result

0 commit comments

Comments
 (0)