[ovs-dev] [PATCH 3/3] ovn-northd: Propagate dynamic addresses to port group address sets.

Han Zhou zhouhan at gmail.com
Sun Jul 29 06:54:32 UTC 2018


On Thu, Jul 26, 2018 at 3:51 AM, Jakub Sitnicki <jkbs at redhat.com> wrote:
>
> If a logical switch port belongs to a port group and has dynamic
> addresses assigned, propagate the addresses to the auto-generated
> address sets for the port group.
>
> Signed-off-by: Jakub Sitnicki <jkbs at redhat.com>
> ---
>  ovn/northd/ovn-northd.c | 34 +++++++++++++++++++---------
>  tests/ovn.at            | 59
+++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 83 insertions(+), 10 deletions(-)
>
> diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
> index 52f47c5ed..a93a46f07 100644
> --- a/ovn/northd/ovn-northd.c
> +++ b/ovn/northd/ovn-northd.c
> @@ -6653,6 +6653,24 @@ sync_address_set(struct northd_context *ctx, const
char *name,
>                                      addrs, n_addrs);
>  }
>
> +/* Go through 'addresses' and add found IPv4 addresses to 'ipv4_addrs'
and IPv6
> + * addresses to 'ipv6_addrs'.
> + */
> +static void
> +split_addresses(const char *addresses, struct svec *ipv4_addrs,
> +                struct svec *ipv6_addrs)
> +{
> +    struct lport_addresses laddrs;
> +    extract_lsp_addresses(addresses, &laddrs);
> +    for (size_t k = 0; k < laddrs.n_ipv4_addrs; k++) {
> +        svec_add(ipv4_addrs, laddrs.ipv4_addrs[k].addr_s);
> +    }
> +    for (size_t k = 0; k < laddrs.n_ipv6_addrs; k++) {
> +        svec_add(ipv6_addrs, laddrs.ipv6_addrs[k].addr_s);
> +    }
> +    destroy_lport_addresses(&laddrs);
> +}
> +
>  /* OVN_Southbound Address_Set table contains same records as in north
>   * bound, plus the records generated from Port_Group table in north
bound.
>   *
> @@ -6680,16 +6698,12 @@ sync_address_sets(struct northd_context *ctx)
>          struct svec ipv6_addrs = SVEC_EMPTY_INITIALIZER;
>          for (size_t i = 0; i < nb_port_group->n_ports; i++) {
>              for (size_t j = 0; j < nb_port_group->ports[i]->n_addresses;
j++) {
> -                struct lport_addresses laddrs;
> -
 extract_lsp_addresses(nb_port_group->ports[i]->addresses[j],
> -                                     &laddrs);
> -                for (size_t k = 0; k < laddrs.n_ipv4_addrs; k++) {
> -                    svec_add(&ipv4_addrs, laddrs.ipv4_addrs[k].addr_s);
> -                }
> -                for (size_t k = 0; k < laddrs.n_ipv6_addrs; k++) {
> -                    svec_add(&ipv6_addrs, laddrs.ipv6_addrs[k].addr_s);
> -                }
> -                destroy_lport_addresses(&laddrs);
> +                split_addresses(nb_port_group->ports[i]->addresses[j],
> +                                &ipv4_addrs, &ipv6_addrs);
> +            }
> +            if (nb_port_group->ports[i]->dynamic_addresses) {
> +
 split_addresses(nb_port_group->ports[i]->dynamic_addresses,
> +                                &ipv4_addrs, &ipv6_addrs);
>              }
>          }
>          char *ipv4_addrs_name = xasprintf("%s_ip4", nb_port_group->name);
> diff --git a/tests/ovn.at b/tests/ovn.at
> index e7bdfe250..32e6c1738 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -10267,6 +10267,65 @@ AT_CHECK([ovn-sbctl get Address_Set pg1_ip6
addresses],
>
>  AT_CLEANUP
>
> +AT_SETUP([ovn -- Address Set generation from Port Groups (dynamic
addressing)])
> +ovn_start
> +
> +ovn-nbctl ls-add ls1
> +ovn-nbctl ls-add ls2
> +ovn-nbctl ls-add ls3
> +
> +ovn-nbctl set Logical_Switch ls1 \
> +    other_config:subnet=10.1.0.0/24
other_config:ipv6_prefix="2001:db8:1::"
> +ovn-nbctl set Logical_Switch ls2 \
> +    other_config:subnet=10.2.0.0/24
other_config:ipv6_prefix="2001:db8:2::"
> +ovn-nbctl set Logical_Switch ls3 \
> +    other_config:subnet=10.3.0.0/24
other_config:ipv6_prefix="2001:db8:3::"
> +
> +ovn-nbctl lsp-add ls1 lp1
> +ovn-nbctl lsp-add ls2 lp2
> +ovn-nbctl lsp-add ls3 lp3
> +
> +ovn-nbctl lsp-set-addresses lp1 "02:00:00:00:00:01 dynamic"
> +ovn-nbctl lsp-set-addresses lp2 "02:00:00:00:00:02 dynamic"
> +ovn-nbctl lsp-set-addresses lp3 "02:00:00:00:00:03 dynamic"
> +
> +ovn-nbctl create Port_Group name=pg1
> +ovn-nbctl create Port_Group name=pg2
> +
> +ovn-nbctl --id=@p get Logical_Switch_Port lp1 -- add Port_Group pg1
ports @p
> +ovn-nbctl --id=@p get Logical_Switch_Port lp2 -- add Port_Group pg1
ports @p
> +ovn-nbctl --id=@p get Logical_Switch_Port lp2 -- add Port_Group pg2
ports @p
> +ovn-nbctl --id=@p get Logical_Switch_Port lp3 -- add Port_Group pg2
ports @p
> +
> +ovn-nbctl --wait=sb sync
> +
> +dnl Check if port group address sets were populated with ports' addresses
> +AT_CHECK([ovn-sbctl get Address_Set pg1_ip4 addresses],
> +         [0], [[["10.1.0.2", "10.2.0.2"]]
> +])
> +AT_CHECK([ovn-sbctl get Address_Set pg2_ip4 addresses],
> +         [0], [[["10.2.0.2", "10.3.0.2"]]
> +])
> +AT_CHECK([ovn-sbctl get Address_Set pg1_ip6 addresses],
> +         [0], [[["2001:db8:1::ff:fe00:1", "2001:db8:2::ff:fe00:2"]]
> +])
> +AT_CHECK([ovn-sbctl get Address_Set pg2_ip6 addresses],
> +         [0], [[["2001:db8:2::ff:fe00:2", "2001:db8:3::ff:fe00:3"]]
> +])
> +
> +ovn-nbctl set Logical_Switch ls1 \
> +    other_config:subnet=10.11.0.0/24
other_config:ipv6_prefix="2001:db8:11::"
> +
> +dnl Check if updated address got propagated to the port group address
sets
> +AT_CHECK([ovn-sbctl get Address_Set pg1_ip4 addresses],
> +         [0], [[["10.11.0.2", "10.2.0.2"]]
> +])
> +AT_CHECK([ovn-sbctl get Address_Set pg1_ip6 addresses],
> +         [0], [[["2001:db8:11::ff:fe00:1", "2001:db8:2::ff:fe00:2"]]
> +])
> +
> +AT_CLEANUP
> +
>  AT_SETUP([ovn -- ACL conjunction])
>  ovn_start
>
> --
> 2.14.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Thanks for the fix! Just a minor problem:

It would be better to check if the address is dynamic using
is_dynamic_lsp_address() before calling split_addresses(). Otherwise, there
seems to be annoying INFO log: "invalid syntax '%s' in address" printed if
the address is "dynamic".

Acked-by: Han Zhou <hzhou8 at ebay.com>


More information about the dev mailing list