On Wed, Jul 27, 2016 at 12:54:39AM +0530, Numan Siddique wrote:
> OVN implements a native DHCPv4 support which caters to the common
> use case of providing an IP address to a booting instance by
> providing stateless replies to DHCPv4 requests based on statically
> configured address mappings. To do this it allows a short list of
> DHCPv4 options to be configured and applied at each compute host
> running ovn-controller.
> 
> A new table 'DHCP_Options' is added in OVN NB DB to store the DHCP
> options. Logical ports refer to this table to configure the DHCPv4
> options.
> 
> For each logical port configured with DHCPv4 Options following flows
> are added
>  - A logical flow which copies the DHCPv4 options to the DHCPv4
>    request packets using the 'put_dhcp_opts' action and advances the
>    packet to the next stage.
> 
>  - A logical flow which implements the DHCP reponder by sending
>    the DHCPv4 reply back to the inport once the 'put_dhcp_opts' action
>    is applied.
> 
> Signed-off-by: Numan Siddique <nusid...@redhat.com>
> Co-authored-by: Ben Pfaff <b...@ovn.org>
> Signed-off-by: Ben Pfaff <b...@ovn.org>

Thanks for the revision!

The check_and_add_supported_dhcp_opts_to_sb_db() function seems awfully
optimistic that, once it adds the DHCP options, nothing could ever make
them go away.  I think that's unrealistic: we want ovn-northd to be
resilient against changes to the southbound database, which might be
inadvertent or due to the database getting rolled back or recreated for
various reasons.  So I removed the nothing_to_add check there.

I also made some improvements to the documentation.

I'm appending the changes I folded in.  With those changes, I applied
this to master.  Thanks again!

--8<--------------------------cut here-------------------------->8--

diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
index 578fbbb..aecc1d8 100644
--- a/ovn/northd/ovn-northd.c
+++ b/ovn/northd/ovn-northd.c
@@ -3288,12 +3288,6 @@ static struct dhcp_opts_map supported_dhcp_opts[] = {
 static void
 check_and_add_supported_dhcp_opts_to_sb_db(struct northd_context *ctx)
 {
-    static bool nothing_to_add = false;
-
-    if (nothing_to_add) {
-        return;
-    }
-
     struct hmap dhcp_opts_to_add = HMAP_INITIALIZER(&dhcp_opts_to_add);
     for (size_t i = 0; (i < sizeof(supported_dhcp_opts) /
                             sizeof(supported_dhcp_opts[0])); i++) {
@@ -3307,18 +3301,13 @@ check_and_add_supported_dhcp_opts_to_sb_db(struct 
northd_context *ctx)
             dhcp_opts_find(&dhcp_opts_to_add, opt_row->name);
         if (dhcp_opt) {
             hmap_remove(&dhcp_opts_to_add, &dhcp_opt->hmap_node);
-        }
-        else {
+        } else {
             sbrec_dhcp_options_delete(opt_row);
         }
     }
 
-    if (!dhcp_opts_to_add.n) {
-        nothing_to_add = true;
-    }
-
     struct dhcp_opts_map *opt;
-    HMAP_FOR_EACH_POP(opt, hmap_node, &dhcp_opts_to_add) {
+    HMAP_FOR_EACH (opt, hmap_node, &dhcp_opts_to_add) {
         struct sbrec_dhcp_options *sbrec_dhcp_option =
             sbrec_dhcp_options_insert(ctx->ovnsb_txn);
         sbrec_dhcp_options_set_name(sbrec_dhcp_option, opt->name);
diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml
index 86dbfa7..abd0340 100644
--- a/ovn/ovn-nb.xml
+++ b/ovn/ovn-nb.xml
@@ -932,7 +932,7 @@
     </column>
   </table>
 
-  <table name="DHCP_Options" title="DHCP options.">
+  <table name="DHCP_Options" title="DHCP options">
     <p>
       OVN implements a native DHCPv4 support which caters to the common
       use case of providing an IPv4 address to a booting instance by
@@ -952,34 +952,59 @@
     <group title="DHCPv4 options">
       <p>
         CMS should define the set of DHCPv4 options as key/value pairs in the
-        <ref column="options"/> column of this table. In order for the
+        <ref column="options"/> column of this table. For
         <code>ovn-controller</code> to include these DHCPv4 options, the
         <ref column="dhcpv4_options"/> of <ref table="Logical_Switch_Port"/>
         should refer to an entry in this table.
       </p>
 
-      <group title="Supported v4 options">
+      <group title="Mandatory DHCPv4 options">
         <p>
-          Below are the supported DHCPv4 options whose values are IPv4 address
-          or addresses. If the value has more than one IPv4 address, then it
-          should be enclosed within '{}' braces. Please refer to the
-          RFC 2132 <code>"https://tools.ietf.org/html/rfc2132";</code> for
-          more details on the DHCPv4 options and their codes.
+          The following options must be defined.
         </p>
 
-        <column name="options" key="netmask">
+        <column name="options" key="server_id">
+          The IP address for the DHCP server to use.  This should be in the
+          subnet of the offered IP.  This is also included in the DHCP offer as
+          option 54, ``server identifier.''
+        </column>
+
+        <column name="options" key="server_mac">
+          The Ethernet address for the DHCP server to use.
+        </column>
+
+        <column name="options" key="router">
           <p>
-            The DHCPv4 option code for this option is 1.
+            The IP address of a gateway for the client to use.  This should be
+            in the subnet of the offered IP.  The DHCPv4 option code for this
+            option is 3.
           </p>
+        </column>
 
+        <column name="options" key="lease_time"
+                type='{"type": "integer", "minInteger": 0, "maxInteger": 
4294967295}'>
           <p>
-            Example. key="netmask", value="255.255.255.0"
+            The offered lease time in seconds, 
+          </p>
+
+          <p>
+            The DHCPv4 option code for this option is 51.
           </p>
         </column>
+      </group>
 
-        <column name="options" key="router">
+      <group title="IPv4 DHCP Options">
+        <p>
+          Below are the supported DHCPv4 options whose values are an IPv4
+          address, e.g. <code>192.168.1.1</code>.  Some options accept multiple
+          IPv4 addresses enclosed within curly braces, e.g. <code>{192.168.1.2,
+          192.168.1.3}</code>. Please refer to RFC 2132 for more details on
+          DHCPv4 options and their codes.
+        </p>
+
+        <column name="options" key="netmask">
           <p>
-            The DHCPv4 option code for this option is 3.
+            The DHCPv4 option code for this option is 1.
           </p>
         </column>
 
@@ -1031,12 +1056,6 @@
           </p>
         </column>
 
-        <column name="options" key="server_id">
-          <p>
-            The DHCPv4 option code for this option is 54.
-          </p>
-        </column>
-
         <column name="options" key="tftp_server">
           <p>
             The DHCPv4 option code for this option is 66.
@@ -1056,9 +1075,7 @@
           </p>
 
           <p>
-            Example.
-            key="classless_static_route"
-            value="{30.0.0.0/24,10.0.0.10, 0.0.0.0/0,10.0.0.1}"
+            Example: <code>{30.0.0.0/24,10.0.0.10, 0.0.0.0/0,10.0.0.1}</code>
           </p>
         </column>
 
@@ -1069,125 +1086,70 @@
             Microsoft Windows DHCPv4 clients.
           </p>
         </column>
-
-        <column name="options" key="server_mac">
-          <p>
-            <code>eth.src</code> will be set to this value in the DHCPv4
-            response packet.
-          </p>
-        </column>
       </group>
 
-      <group title="Other supported DHCPv4 options">
-        <column name="options" key="ip_forward_enable">
-          <p>
-            The DHCPv4 option code for this option is 19.
-          </p>
+      <group title="Boolean DHCP Options">
+        <p>
+          These options accept a Boolean value, expressed as <code>0</code> for
+          false or <code>1</code> for true.
+        </p>
 
+        <column name="options" key="ip_forward_enable"
+                type='{"type": "string", "enum": ["set", ["0", "1"]]}'>
           <p>
-            The value of this DHCPv4 option is of type <code>bool</code>.
-
-            Example. key="ip_forward_enable", value="1"
+            The DHCPv4 option code for this option is 19.
           </p>
         </column>
 
-        <column name="options" key="router_discovery">
+        <column name="options" key="router_discovery"
+                type='{"type": "string", "enum": ["set", ["0", "1"]]}'>
           <p>
             The DHCPv4 option code for this option is 31.
           </p>
-
-          <p>
-            The value of this DHCPv4 option is of type <code>bool</code>.
-          </p>
         </column>
 
-        <column name="options" key="ethernet_encap">
+        <column name="options" key="ethernet_encap"
+                type='{"type": "string", "enum": ["set", ["0", "1"]]}'>
           <p>
             The DHCPv4 option code for this option is 36.
           </p>
-
-          <p>
-            The value of this DHCPv4 option is of type <code>bool</code>.
-          </p>
-        </column>
-
-        <column name="options" key="default_ttl">
-          <p>
-            The DHCPv4 option code for this option is 23.
-          </p>
-
-          <p>
-            The value of this DHCPv4 option is of type <code>uint8</code>.
-
-            Example. key="default_ttl", value="128".
-          </p>
         </column>
+      </group>
 
-        <column name="options" key="tcp_ttl">
-          <p>
-            The DHCPv4 option code for this option is 37.
-          </p>
+      <group title="Integer DHCP Options">
+        <p>
+          These options accept a nonnegative integer value.
+        </p>
 
-          <p>
-            The value of this DHCPv4 option is of type <code>uint8</code>.
-          </p>
+        <column name="options" key="default_ttl"
+                type='{"type": "integer", "minInteger": 0, "maxInteger": 255}'>
+          The DHCPv4 option code for this option is 23.
         </column>
 
-        <column name="options" key="mtu">
-          <p>
-            The DHCPv4 option code for this option is 26.
-          </p>
-
-          <p>
-            The value of this DHCPv4 option is of type <code>uint16</code>.
-          </p>
+        <column name="options" key="tcp_ttl"
+                type='{"type": "integer", "minInteger": 0, "maxInteger": 255}'>
+          The DHCPv4 option code for this option is 37.
         </column>
 
-        <column name="options" key="lease_time">
-          <p>
-            The DHCPv4 option code for this option is 51.
-          </p>
-
-          <p>
-            The value of this DHCPv4 option is of type <code>uint32</code>.
-
-            Example. key="lease_time", value="42000"
-          </p>
+        <column name="options" key="mtu"
+                type='{"type": "integer", "minInteger": 68, "maxInteger": 
65535}'>
+          The DHCPv4 option code for this option is 26.
         </column>
 
-        <column name="options" key="T1">
-          <p>
-            The DHCPv4 option code for this option is 58.
-          </p>
-
-          <p>
-            The value of this DHCPv4 option is of type <code>uint32</code>.
-
-            Example. key="T1", value="30000"
-          </p>
+        <column name="options" key="T1"
+                type='{"type": "integer", "minInteger": 68, "maxInteger": 
4294967295}'>
+          This specifies the time interval from address assignment until the
+          client begins trying to renew its address.  The DHCPv4 option code
+          for this option is 58.
         </column>
 
-        <column name="options" key="T2">
-          <p>
-            The DHCPv4 option code for this option is 59.
-          </p>
-
-          <p>
-            The value of this DHCPv4 option is of type <code>uint32</code>.
-
-            Example. key="T2", value="40000"
-          </p>
+        <column name="options" key="T2"
+                type='{"type": "integer", "minInteger": 68, "maxInteger": 
4294967295}'>
+          This specifies the time interval from address assignment until the
+          client begins trying to rebind its address.  The DHCPv4 option code
+          for this option is 59.
         </column>
       </group>
-
-      <group title="Mandatory DHCPv4 options">
-        <p>
-          DHCPv4 options <code>"server_id"</code>, <code>"server_mac"</code>,
-          <code>"router"</code> and <code>"lease_time"</code> are mandatory
-          options which CMS should define for <code>OVN</code> to support
-          native DHCPv4.
-        </p>
-      </group>
     </group>
 
     <group title="Common Columns">
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to