summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2020-08-23 00:04:09 +0200
committerChristian Poessinger <christian@poessinger.com>2020-08-23 01:10:46 +0200
commitec1cf7dd1508e4a84d99818c7e34d093242b3331 (patch)
treec05f822aed8f03ead38c00658350d516961b88eb
parent5a5974d5a00b482cabd3dee92bc365d3c9f399bc (diff)
downloadvyos-1x-ec1cf7dd1508e4a84d99818c7e34d093242b3331.tar.gz
vyos-1x-ec1cf7dd1508e4a84d99818c7e34d093242b3331.zip
dhcpv6-pd: T2821: support dhcpv6-pd without "address dhcpv6"
Currently DHCPv6-PD requires an interface address configured to dhcpv6 on the CLI. This is not required also sometimes there is either no dhcpv6 interface addressing available (PPPoE) or wanted. This limitation was artificial due to the old interface code. Change the implementation to spawn the DHCPv6 client and request a prefix even when there is no address request configured.
-rw-r--r--data/templates/dhcp-client/ipv6.tmpl12
-rw-r--r--python/vyos/ifconfig/interface.py17
2 files changed, 21 insertions, 8 deletions
diff --git a/data/templates/dhcp-client/ipv6.tmpl b/data/templates/dhcp-client/ipv6.tmpl
index e9285d86b..85841fe94 100644
--- a/data/templates/dhcp-client/ipv6.tmpl
+++ b/data/templates/dhcp-client/ipv6.tmpl
@@ -2,13 +2,15 @@
# man https://www.unix.com/man-page/debian/5/dhcp6c.conf/
interface {{ ifname }} {
+{% if address is defined and 'dhcpv6' in address %}
request domain-name-servers;
request domain-name;
-{% if dhcpv6_options is defined and dhcpv6_options.parameters_only is defined %}
+{% if dhcpv6_options is defined and dhcpv6_options.parameters_only is defined %}
information-only;
-{% endif %}
-{% if dhcpv6_options is not defined or dhcpv6_options.temporary is not defined %}
+{% endif %}
+{% if dhcpv6_options is not defined or dhcpv6_options.temporary is not defined %}
send ia-na 0; # non-temporary address
+{% endif %}
{% endif %}
{% if dhcpv6_options is defined and dhcpv6_options.pd is defined %}
{% for pd in dhcpv6_options.pd %}
@@ -17,10 +19,12 @@ interface {{ ifname }} {
{% endif %}
};
-{% if dhcpv6_options is not defined or dhcpv6_options.temporary is not defined %}
+{% if address is defined and 'dhcpv6' in address %}
+{% if dhcpv6_options is not defined or dhcpv6_options.temporary is not defined %}
id-assoc na 0 {
# Identity association for non temporary address
};
+{% endif %}
{% endif %}
{% if dhcpv6_options is defined and dhcpv6_options.pd is defined %}
diff --git a/python/vyos/ifconfig/interface.py b/python/vyos/ifconfig/interface.py
index 892495dec..537c4bc2d 100644
--- a/python/vyos/ifconfig/interface.py
+++ b/python/vyos/ifconfig/interface.py
@@ -901,10 +901,15 @@ class Interface(Control):
if isinstance(new_addr, str):
new_addr = [new_addr]
- # ensure DHCP/DHCPv6 is stopped (when not configured explicitly)
- for proto in ['dhcp', 'dhcpv6']:
- if proto not in new_addr:
- self.del_addr(proto)
+ # always ensure DHCP client is stopped (when not configured explicitly)
+ if 'dhcp' not in new_addr:
+ self.del_addr('dhcp')
+
+ # always ensure DHCPv6 client is stopped (when not configured as client
+ # for IPv6 address or prefix delegation
+ dhcpv6pd = jmespath.search('dhcpv6_options.pd', config)
+ if 'dhcpv6' not in new_addr or dhcpv6pd == None:
+ self.del_addr('dhcpv6')
# determine IP addresses which are assigned to the interface and build a
# list of addresses which are no longer in the dict so they can be removed
@@ -915,6 +920,10 @@ class Interface(Control):
for addr in new_addr:
self.add_addr(addr)
+ # start DHCPv6 client when only PD was configured
+ if dhcpv6pd != None:
+ self.set_dhcpv6(True)
+
# There are some items in the configuration which can only be applied
# if this instance is not bound to a bridge. This should be checked
# by the caller but better save then sorry!