[ovs-dev] [PATCH v2] ovn-northd: Add logical flows to support native DHCPv4

Numan Siddique nusiddiq at redhat.com
Tue Jun 28 03:15:06 UTC 2016


On Mon, Jun 27, 2016 at 10:35 PM, Zong Kai LI <zealokii at gmail.com> wrote:

> +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++) {
>> +        hmap_insert(&dhcp_opts_to_add, &supported_dhcp_opts[i].hmap_node,
>> +                    dhcp_opt_hash(supported_dhcp_opts[i].name));
>> +    }
>> +
>> +    const struct sbrec_dhcp_options *opt_row, *opt_row_next;
>> +    SBREC_DHCP_OPTIONS_FOR_EACH_SAFE(opt_row, opt_row_next,
>> ctx->ovnsb_idl) {
>> +        struct dhcp_opts_map *dhcp_opt =
>> +            dhcp_opts_find(&dhcp_opts_to_add, opt_row->name);
>> +        if (dhcp_opt) {
>> +            hmap_remove(&dhcp_opts_to_add, &dhcp_opt->hmap_node);
>> +        }
>> +        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) {
>> +        struct sbrec_dhcp_options *sbrec_dhcp_option =
>> +            sbrec_dhcp_options_insert(ctx->ovnsb_txn);
>> +        sbrec_dhcp_options_set_name(sbrec_dhcp_option, opt->name);
>> +        sbrec_dhcp_options_set_code(sbrec_dhcp_option, opt->code);
>> +        sbrec_dhcp_options_set_type(sbrec_dhcp_option, opt->type);
>> +    }
>> +
>> +    hmap_destroy(&dhcp_opts_to_add);
>> +}
>> +
>>
>
> After HMAP_FOR_EACH_POP processed, will not dhcp_opts_to_add.n be set to
> 0? For actions left in dhcp_opts_to_add has been added in HMAP_FOR_EACH_POP
> loop.
> If so, how about move dhcp_opts_to_add checking after HMAP_FOR_EACH_POP
> loop?
>

​The idea to check ​

​"
​
if (!
​​
dhcp_opts_to_add.n) {
​" before ​
​
​"
​
HMAP_FOR_EACH_POP
​" is to determine if all the dhcp options are written to database or not.
If
​
dhcp_opts_to_add.n
​ is zero, it means the SB DB "DHCP_Options" table is in sync with the
supported DHCP options.

​

>
>
>> diff --git a/ovn/ovn-nb.ovsschema b/ovn/ovn-nb.ovsschema
>> index 58f04b2..9587b94 100644
>> --- a/ovn/ovn-nb.ovsschema
>> +++ b/ovn/ovn-nb.ovsschema
>> @@ -1,7 +1,7 @@
>>  {
>>      "name": "OVN_Northbound",
>> -    "version": "3.1.0",
>> -    "cksum": "1426508118 6135",
>> +    "version": "3.2.0",
>> +    "cksum": "27511920 6856",
>>      "tables": {
>>          "Logical_Switch": {
>>              "columns": {
>> @@ -43,6 +43,11 @@
>>                                             "max": "unlimited"}},
>>                  "up": {"type": {"key": "boolean", "min": 0, "max": 1}},
>>                  "enabled": {"type": {"key": "boolean", "min": 0, "max":
>> 1}},
>> +                "dhcpv4_options": {"type": {"key": {"type": "uuid",
>> +                                            "refTable": "DHCP_Options",
>> +                                            "refType": "strong"},
>> +                                 "min": 0,
>> +                                 "max": 1}},
>>
>
> I just recognized that this new column is in table Logical_Switch_Port,
> why not in table Logical_Switch? Or we prefer lsp on the same ls can have
> different dhcp_options?
>

​Please see this thread [1] for more details. The previous versions of this​

​patch were referencing "Subnet" table in the "Logical_Switch" table.

[1] - http://openvswitch.org/pipermail/dev/2016-June/073807.html
​

>
>
>> +static void
>> +nbctl_lsp_set_dhcpv4_options(struct ctl_context *ctx)
>> +{
>> +    const char *id = ctx->argv[1];
>> +    const struct nbrec_logical_switch_port *lsp;
>> +
>> +    lsp = lsp_by_name_or_uuid(ctx, id, true);
>> +    const struct nbrec_dhcp_options *dhcp_opt = NULL;
>> +    if (ctx->argc == 3 ) {
>> +        dhcp_opt = dhcp_options_get(ctx, ctx->argv[2], true);
>> +    }
>> +
>> +    if (dhcp_opt) {
>> +        ovs_be32 ip;
>> +        unsigned int plen;
>> +        char *error = ip_parse_cidr(dhcp_opt->cidr, &ip, &plen);
>> +        if (error){
>> +            free(error);
>> +            VLOG_WARN("DHCP options cidr '%s' is not IPv4",
>> dhcp_opt->cidr);
>> +            return;
>>
>
> how about using ctl_fatal here?
>
>

​Ack.
​


> +static void
>> +nbctl_dhcp_options_create(struct ctl_context *ctx)
>> +{
>> +    /* Validate the cidr */
>> +    ovs_be32 ip;
>> +    unsigned int plen;
>> +    char *error = ip_parse_cidr(ctx->argv[1], &ip, &plen);
>> +    if (error){
>> +        /* check if its IPv6 cidr */
>> +        free(error);
>> +        struct in6_addr ipv6;
>> +        error = ipv6_parse_cidr(ctx->argv[1], &ipv6, &plen);
>> +        if (error) {
>> +            free(error);
>> +            VLOG_WARN("Invalid cidr format '%s'", ctx->argv[1]);
>> +            return;
>>
>
> ditto.
>
>
>> +ovn-nbctl -- --id=@d1 create DHCP_Options cidr=10.0.0.0/24 \
>> +options="\"server_id\"=\"10.0.0.1\" \"server_mac\"=\"ff:10:00:00:00:01\"
>> \
>> +\"lease_time\"=\"3600\" \"router\"=\"10.0.0.1\"" \
>>
>
> how about using
> ​​
> nbctl_dhcp_options_create here?
>

​I think the way it is used is better. If we use ​

​"
​
nbctl_dhcp_options_create
​" then we need to store the
UUID of the created DHCP options in a variable.​
​

>
> +-- add Logical_Switch_Port ls1-lp1 dhcpv4_options @d1 \
>> +-- add Logical_Switch_Port ls1-lp2 dhcpv4_options @d1
>> +
>> +ovn-nbctl -- --id=@d2 create DHCP_Options cidr=30.0.0.0/24 \
>> +options="\"server_id\"=\"30.0.0.1\" \"server_mac\"=\"ff:10:00:00:00:02\"
>> \
>> +\"lease_time\"=\"3600\"" -- add Logical_Switch_Port ls2-lp2
>> dhcpv4_options @d2
>>
>
> ditto
>
> Thanks,
> Zong Kai, LI
>



More information about the dev mailing list