diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/conf_mode/interfaces-pppoe.py | 36 | ||||
-rw-r--r-- | src/systemd/dhclient6@.service | 18 | ||||
-rw-r--r-- | src/systemd/dhcp6c@.service | 16 |
3 files changed, 51 insertions, 19 deletions
diff --git a/src/conf_mode/interfaces-pppoe.py b/src/conf_mode/interfaces-pppoe.py index e72540f66..e46d52d19 100755 --- a/src/conf_mode/interfaces-pppoe.py +++ b/src/conf_mode/interfaces-pppoe.py @@ -36,6 +36,7 @@ default_config_data = { 'deleted': False, 'description': '\0', 'disable': False, + 'dhcpv6_pd': [], 'intf': '', 'idle_timeout': '', 'ipv6_autoconf': False, @@ -138,6 +139,27 @@ def get_config(): if conf.exists('vrf'): pppoe['vrf'] = conf.return_value(['vrf']) + if conf.exists(['dhcpv6-options', 'delegate']): + for interface in conf.list_nodes(['dhcpv6-options', 'delegate']): + pd = { + 'ifname': interface, + 'sla_id': '', + 'sla_len': '', + 'if_id': '' + } + conf.set_level(base_path + [pppoe['intf'], 'dhcpv6-options', 'delegate', interface]) + + if conf.exists(['sla-id']): + pd['sla_id'] = conf.return_value(['sla-id']) + + if conf.exists(['sla-len']): + pd['sla_len'] = conf.return_value(['sla-len']) + + if conf.exists(['interface-id']): + pd['if_id'] = conf.return_value(['interface-id']) + + pppoe['dhcpv6_pd'].append(pd) + return pppoe def verify(pppoe): @@ -169,9 +191,15 @@ def generate(pppoe): script_pppoe_ip_up = f'/etc/ppp/ip-up.d/1000-vyos-pppoe-{intf}' script_pppoe_ip_down = f'/etc/ppp/ip-down.d/1000-vyos-pppoe-{intf}' script_pppoe_ipv6_up = f'/etc/ppp/ipv6-up.d/1000-vyos-pppoe-{intf}' + config_wide_dhcp6c = f'/run/dhcp6c/dhcp6c.{intf}.conf' config_files = [config_pppoe, script_pppoe_pre_up, script_pppoe_ip_up, - script_pppoe_ip_down, script_pppoe_ipv6_up] + script_pppoe_ip_down, script_pppoe_ipv6_up, config_wide_dhcp6c] + + # Shutdown DHCPv6 prefix delegation client + if not pppoe['dhcpv6_pd']: + cmd(f'systemctl stop dhcp6c@{intf}.service') + # Always hang-up PPPoE connection prior generating new configuration file cmd(f'systemctl stop ppp@{intf}.service') @@ -201,6 +229,12 @@ def generate(pppoe): render(script_pppoe_ipv6_up, 'pppoe/ipv6-up.script.tmpl', pppoe, trim_blocks=True, permission=0o755) + if len(pppoe['dhcpv6_pd']) > 0: + # ipv6.tmpl relies on ifname - this should be made consitent in the + # future better then double key-ing the same value + pppoe['ifname'] = intf + render(config_wide_dhcp6c, 'dhcp-client/ipv6.tmpl', pppoe, trim_blocks=True) + return None def apply(pppoe): diff --git a/src/systemd/dhclient6@.service b/src/systemd/dhclient6@.service deleted file mode 100644 index fd69e4d48..000000000 --- a/src/systemd/dhclient6@.service +++ /dev/null @@ -1,18 +0,0 @@ -[Unit] -Description=DHCPv6 client on %i -Documentation=man:dhclient(8) -ConditionPathExists=/var/lib/dhcp/dhclient_v6_%i.conf -ConditionPathExists=/var/lib/dhcp/dhclient_v6_%i.options -After=vyos-router.service - -[Service] -WorkingDirectory=/var/lib/dhcp -Type=exec -EnvironmentFile=-/var/lib/dhcp/dhclient_v6_%i.options -PIDFile=/var/lib/dhcp/dhclient_v6_%i.pid -ExecStart=/sbin/dhclient -6 $DHCLIENT_OPTS -ExecStop=/sbin/dhclient -6 $DHCLIENT_OPTS -r -Restart=always - -[Install] -WantedBy=multi-user.target diff --git a/src/systemd/dhcp6c@.service b/src/systemd/dhcp6c@.service new file mode 100644 index 000000000..1a4175461 --- /dev/null +++ b/src/systemd/dhcp6c@.service @@ -0,0 +1,16 @@ +[Unit] +Description=WIDE DHCPv6 client on %i +Documentation=man:dhcp6c(8) man:dhcp6c.conf(5) +ConditionPathExists=/run/dhcp6c/dhcp6c.%i.conf +After=vyos-router.service + +[Service] +WorkingDirectory=/run/dhcp6c +Type=forking +PIDFile=/run/dhcp6c/dhcp6c.%i.pid +ExecStart=/usr/sbin/dhcp6c -D -k /run/dhcp6c/dhcp6c.%i.sock -c /run/dhcp6c/dhcp6c.%i.conf -p /run/dhcp6c/dhcp6c.%i.pid %i + +Restart=always + +[Install] +WantedBy=multi-user.target |