diff options
4 files changed, 40 insertions, 6 deletions
| diff --git a/data/templates/dhcp-client/ipv4.j2 b/data/templates/dhcp-client/ipv4.j2 index cc5ddf09c..4a5d5e54d 100644 --- a/data/templates/dhcp-client/ipv4.j2 +++ b/data/templates/dhcp-client/ipv4.j2 @@ -9,14 +9,21 @@ interface "{{ ifname }}" {      send host-name "{{ dhcp_options.host_name }}";  {% if dhcp_options.client_id is vyos_defined %}  {%     set client_id = dhcp_options.client_id %} -{#   Use HEX representation of client-id as it is send in MAC-address style using hex characters. If not HEX, use double quotes ASCII format #} -{%     if not dhcp_options.client_id.split(':') | length >= 5 %} -{%         set client_id = '"' + dhcp_options.client_id + '"' %} +{#   Use HEX representation of client-id as it is send in MAC-address style using hex characters. #} +{#   If not HEX, use double quotes ASCII format #} +{%     if not client_id.split(':') | length >= 3 %} +{%         set client_id = '"' ~ dhcp_options.client_id ~ '"' %}  {%     endif %}      send dhcp-client-identifier {{ client_id }};  {% endif %}  {% if dhcp_options.vendor_class_id is vyos_defined %} -    send vendor-class-identifier "{{ dhcp_options.vendor_class_id }}"; +{%     set vendor_class_id = dhcp_options.vendor_class_id %} +{#   Use HEX representation of client-id as it is send in MAC-address style using hex characters. #} +{#   If not HEX, use double quotes ASCII format #} +{%     if not vendor_class_id.split(':') | length >= 3 %} +{%         set vendor_class_id = '"' ~ dhcp_options.vendor_class_id ~ '"' %} +{%     endif %} +    send vendor-class-identifier {{ vendor_class_id }};  {% endif %}      # The request statement causes the client to request that any server responding to the      # client send the client its values for the specified options. diff --git a/interface-definitions/include/constraint/dhcp-client-string-option.xml.i b/interface-definitions/include/constraint/dhcp-client-string-option.xml.i new file mode 100644 index 000000000..76e0e5466 --- /dev/null +++ b/interface-definitions/include/constraint/dhcp-client-string-option.xml.i @@ -0,0 +1,4 @@ +<!-- include start from include/constraint/dhcp-client-string-option.xml.i --> +<regex>[-_a-zA-Z0-9\s]+</regex> +<regex>([a-fA-F0-9][a-fA-F0-9]:){2,}[a-fA-F0-9][a-fA-F0-9]</regex> +<!-- include end --> diff --git a/interface-definitions/include/interface/dhcp-options.xml.i b/interface-definitions/include/interface/dhcp-options.xml.i index 8027769ff..fff83fd5c 100644 --- a/interface-definitions/include/interface/dhcp-options.xml.i +++ b/interface-definitions/include/interface/dhcp-options.xml.i @@ -7,6 +7,13 @@      <leafNode name="client-id">        <properties>          <help>Identifier used by client to identify itself to the DHCP server</help> +        <valueHelp> +          <format>txt</format> +          <description>DHCP option string</description> +        </valueHelp> +        <constraint> +          #include <include/constraint/dhcp-client-string-option.xml.i> +        </constraint>        </properties>      </leafNode>      <leafNode name="host-name"> @@ -27,6 +34,13 @@      <leafNode name="vendor-class-id">        <properties>          <help>Identify the vendor client type to the DHCP server</help> +        <valueHelp> +          <format>txt</format> +          <description>DHCP option string</description> +        </valueHelp> +        <constraint> +          #include <include/constraint/dhcp-client-string-option.xml.i> +        </constraint>        </properties>      </leafNode>      #include <include/interface/no-default-route.xml.i> diff --git a/smoketest/scripts/cli/base_interfaces_test.py b/smoketest/scripts/cli/base_interfaces_test.py index 73b4e9764..1edcda4fd 100644 --- a/smoketest/scripts/cli/base_interfaces_test.py +++ b/smoketest/scripts/cli/base_interfaces_test.py @@ -158,14 +158,20 @@ class BasicInterfaceTest:              if not self._test_dhcp or not self._test_vrf:                  self.skipTest('not supported') +            client_id = 'VyOS-router'              distance = '100' +            hostname = 'vyos' +            vendor_class_id = 'vyos-vendor'              for interface in self._interfaces:                  for option in self._options.get(interface, []):                      self.cli_set(self._base_path + [interface] + option.split())                  self.cli_set(self._base_path + [interface, 'address', 'dhcp']) +                self.cli_set(self._base_path + [interface, 'dhcp-options', 'client-id', client_id])                  self.cli_set(self._base_path + [interface, 'dhcp-options', 'default-route-distance', distance]) +                self.cli_set(self._base_path + [interface, 'dhcp-options', 'host-name', hostname]) +                self.cli_set(self._base_path + [interface, 'dhcp-options', 'vendor-class-id', vendor_class_id])              self.cli_commit() @@ -175,8 +181,11 @@ class BasicInterfaceTest:                  self.assertTrue(dhclient_pid)                  dhclient_config = read_file(f'{dhclient_base_dir}/dhclient_{interface}.conf') -                self.assertIn('request subnet-mask, broadcast-address, routers, domain-name-servers', dhclient_config) -                self.assertIn('require subnet-mask;', dhclient_config) +                self.assertIn(f'request subnet-mask, broadcast-address, routers, domain-name-servers', dhclient_config) +                self.assertIn(f'require subnet-mask;', dhclient_config) +                self.assertIn(f'send host-name "{hostname}";', dhclient_config) +                self.assertIn(f'send dhcp-client-identifier "{client_id}";', dhclient_config) +                self.assertIn(f'send vendor-class-identifier "{vendor_class_id}";', dhclient_config)                  # and the commandline has the appropriate options                  cmdline = read_file(f'/proc/{dhclient_pid}/cmdline') | 
