[ovs-dev,2/2] OVN: Add support for DHCP option 150 - TFTP server address

Message ID 20190307162835.28751-2-lmartins@redhat.com
State New
Headers show
Series
  • [ovs-dev,1/2] OVN: Add support for DHCP option 210 - path prefix
Related show

Commit Message

Lucas Alvares Gomes Martins March 7, 2019, 4:28 p.m.
From: Lucas Alvares Gomes <lucasagomes@gmail.com>

OpenStack Ironic relies on a few DHCP options [0] that were not
supported in OVN yet. This patch is adding the last one which is the
option 150 (TFTP server address, RFC5859 [1]).

Note that this option is Cisco proprietary, the IEEE standard that
matches with this requirement is Option 66. The difference is that 150
allows to multiple IPs to be specified and 66 only allows one.

[0]
https://github.com/openstack/ironic/blob/3f6d4c6a789b12512d6cc67cdbc93ba5fbf29848/ironic/common/pxe_utils.py#L44-L54
[1] https://tools.ietf.org/html/rfc5859

Signed-off-by: Lucas Alvares Gomes <lucasagomes@gmail.com>
---
 ovn/lib/ovn-l7.h        | 2 ++
 ovn/northd/ovn-northd.c | 1 +
 ovn/ovn-nb.xml          | 9 +++++++++
 tests/ovn.at            | 6 +++---
 tests/test-ovn.c        | 1 +
 5 files changed, 16 insertions(+), 3 deletions(-)

Comments

Ben Pfaff March 7, 2019, 10:16 p.m. | #1
On Thu, Mar 07, 2019 at 04:28:35PM +0000, lmartins@redhat.com wrote:
> From: Lucas Alvares Gomes <lucasagomes@gmail.com>
> 
> OpenStack Ironic relies on a few DHCP options [0] that were not
> supported in OVN yet. This patch is adding the last one which is the
> option 150 (TFTP server address, RFC5859 [1]).
> 
> Note that this option is Cisco proprietary, the IEEE standard that
> matches with this requirement is Option 66. The difference is that 150
> allows to multiple IPs to be specified and 66 only allows one.
> 
> [0]
> https://github.com/openstack/ironic/blob/3f6d4c6a789b12512d6cc67cdbc93ba5fbf29848/ironic/common/pxe_utils.py#L44-L54
> [1] https://tools.ietf.org/html/rfc5859
> 
> Signed-off-by: Lucas Alvares Gomes <lucasagomes@gmail.com>

I applied this series.  Thank you!

Patch

diff --git a/ovn/lib/ovn-l7.h b/ovn/lib/ovn-l7.h
index a2224d019..fe3104e1f 100644
--- a/ovn/lib/ovn-l7.h
+++ b/ovn/lib/ovn-l7.h
@@ -73,6 +73,8 @@  struct gen_opts_map {
 #define DHCP_OPT_BOOTFILE DHCP_OPTION("bootfile_name", 67, "str")
 #define DHCP_OPT_WPAD DHCP_OPTION("wpad", 252, "str")
 #define DHCP_OPT_PATH_PREFIX DHCP_OPTION("path_prefix", 210, "str")
+#define DHCP_OPT_TFTP_SERVER_ADDRESS \
+    DHCP_OPTION("tftp_server_address", 150, "ipv4")
 
 static inline uint32_t
 gen_opt_hash(char *opt_name)
diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
index 1a59c9fa9..2843969f4 100644
--- a/ovn/northd/ovn-northd.c
+++ b/ovn/northd/ovn-northd.c
@@ -7389,6 +7389,7 @@  static struct gen_opts_map supported_dhcp_opts[] = {
     DHCP_OPT_WPAD,
     DHCP_OPT_BOOTFILE,
     DHCP_OPT_PATH_PREFIX,
+    DHCP_OPT_TFTP_SERVER_ADDRESS,
 };
 
 static struct gen_opts_map supported_dhcpv6_opts[] = {
diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml
index b084c821e..61a57110a 100644
--- a/ovn/ovn-nb.xml
+++ b/ovn/ovn-nb.xml
@@ -2178,6 +2178,15 @@ 
             instead of deriving it from the bootfile name.
           </p>
         </column>
+
+        <column name="options" key="tftp_server_address">
+          <p>
+            The DHCPv4 option code for this option is 150. The option
+            contains one or more IPv4 addresses that the client MAY
+            use. This option is Cisco proprietary, the IEEE standard
+            that matches with this requirement is option 66 (tftp_server).
+          </p>
+        </column>
       </group>
     </group>
 
diff --git a/tests/ovn.at b/tests/ovn.at
index a5a6c6652..f2f2bc405 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -1107,9 +1107,9 @@  reg1[0] = put_dhcp_opts(offerip = 1.2.3.4, router = 10.0.0.1);
 reg2[5] = put_dhcp_opts(offerip=10.0.0.4,router=10.0.0.1,netmask=255.255.254.0,mtu=1400,domain="ovn.org",wpad="https://example.org",bootfile_name="https://127.0.0.1/boot.ipxe",path_prefix="/tftpboot");
     formats as reg2[5] = put_dhcp_opts(offerip = 10.0.0.4, router = 10.0.0.1, netmask = 255.255.254.0, mtu = 1400, domain = "ovn.org", wpad = "https://example.org", bootfile_name = "https://127.0.0.1/boot.ipxe", path_prefix = "/tftpboot");
     encodes as controller(userdata=00.00.00.02.00.00.00.00.00.01.de.10.00.00.00.25.0a.00.00.04.03.04.0a.00.00.01.01.04.ff.ff.fe.00.1a.02.05.78.0f.07.6f.76.6e.2e.6f.72.67.fc.13.68.74.74.70.73.3a.2f.2f.65.78.61.6d.70.6c.65.2e.6f.72.67.43.1b.68.74.74.70.73.3a.2f.2f.31.32.37.2e.30.2e.30.2e.31.2f.62.6f.6f.74.2e.69.70.78.65.d2.09.2f.74.66.74.70.62.6f.6f.74,pause)
-reg0[15] = put_dhcp_opts(offerip=10.0.0.4,router=10.0.0.1,netmask=255.255.255.0,mtu=1400,ip_forward_enable=1,default_ttl=121,dns_server={8.8.8.8,7.7.7.7},classless_static_route={30.0.0.0/24,10.0.0.4,40.0.0.0/16,10.0.0.6,0.0.0.0/0,10.0.0.1},ethernet_encap=1,router_discovery=0);
-    formats as reg0[15] = put_dhcp_opts(offerip = 10.0.0.4, router = 10.0.0.1, netmask = 255.255.255.0, mtu = 1400, ip_forward_enable = 1, default_ttl = 121, dns_server = {8.8.8.8, 7.7.7.7}, classless_static_route = {30.0.0.0/24, 10.0.0.4, 40.0.0.0/16, 10.0.0.6, 0.0.0.0/0, 10.0.0.1}, ethernet_encap = 1, router_discovery = 0);
-    encodes as controller(userdata=00.00.00.02.00.00.00.00.00.01.de.10.00.00.00.6f.0a.00.00.04.03.04.0a.00.00.01.01.04.ff.ff.ff.00.1a.02.05.78.13.01.01.17.01.79.06.08.08.08.08.08.07.07.07.07.79.14.18.1e.00.00.0a.00.00.04.10.28.00.0a.00.00.06.00.0a.00.00.01.24.01.01.1f.01.00,pause)
+reg0[15] = put_dhcp_opts(offerip=10.0.0.4,router=10.0.0.1,netmask=255.255.255.0,mtu=1400,ip_forward_enable=1,default_ttl=121,dns_server={8.8.8.8,7.7.7.7},classless_static_route={30.0.0.0/24,10.0.0.4,40.0.0.0/16,10.0.0.6,0.0.0.0/0,10.0.0.1},ethernet_encap=1,router_discovery=0,tftp_server_address={10.0.0.4,10.0.0.5});
+    formats as reg0[15] = put_dhcp_opts(offerip = 10.0.0.4, router = 10.0.0.1, netmask = 255.255.255.0, mtu = 1400, ip_forward_enable = 1, default_ttl = 121, dns_server = {8.8.8.8, 7.7.7.7}, classless_static_route = {30.0.0.0/24, 10.0.0.4, 40.0.0.0/16, 10.0.0.6, 0.0.0.0/0, 10.0.0.1}, ethernet_encap = 1, router_discovery = 0, tftp_server_address = {10.0.0.4, 10.0.0.5});
+    encodes as controller(userdata=00.00.00.02.00.00.00.00.00.01.de.10.00.00.00.6f.0a.00.00.04.03.04.0a.00.00.01.01.04.ff.ff.ff.00.1a.02.05.78.13.01.01.17.01.79.06.08.08.08.08.08.07.07.07.07.79.14.18.1e.00.00.0a.00.00.04.10.28.00.0a.00.00.06.00.0a.00.00.01.24.01.01.1f.01.00.96.08.0a.00.00.04.0a.00.00.05,pause)
 
 reg1[0..1] = put_dhcp_opts(offerip = 1.2.3.4, router = 10.0.0.1);
     Cannot use 2-bit field reg1[0..1] where 1-bit field is required.
diff --git a/tests/test-ovn.c b/tests/test-ovn.c
index 8e8c38a66..9e3112bf9 100644
--- a/tests/test-ovn.c
+++ b/tests/test-ovn.c
@@ -185,6 +185,7 @@  create_gen_opts(struct hmap *dhcp_opts, struct hmap *dhcpv6_opts,
     dhcp_opt_add(dhcp_opts, "wpad", 252, "str");
     dhcp_opt_add(dhcp_opts, "bootfile_name", 67, "str");
     dhcp_opt_add(dhcp_opts, "path_prefix", 210, "str");
+    dhcp_opt_add(dhcp_opts, "tftp_server_address", 150, "ipv4");
 
     /* DHCPv6 options. */
     hmap_init(dhcpv6_opts);