On Tue, Mar 07, 2017 at 07:19:45AM +0530, [email protected] wrote:
> From: Numan Siddique <[email protected]>
> 
> OVN will generate the IPv6 address for a logical port if requested
> using the IPv6 prefix and the MAC address (as IEEE EUI64 identifier).
> To generate the IPv6 address, CMS should define the IPv6 prefix in the
> 'Logical_switch.other_config:ipv6_prefix' column.
> 
> Signed-off-by: Numan Siddique <[email protected]>

The documentation uses <dl> for a bulleted list.  Please use <ul>.

The test uses explicit "sleep" calls.  Are these needed?  I guess that
--wait=hv would also work, but faster.

I found ipam_allocate_addresses() to be a little hard to follow.  How
about rewriting it like this?  I have not tested it beyond compiling,
but the general code flow seems more straightforward to me.

static bool
ipam_allocate_addresses(struct ovn_datapath *od, struct ovn_port *op,
                        const char *addrspec)
{
    if (!op->nbsp || !od->ipam_info) {
        return false;
    }

    /* Get or generate MAC address. */
    struct eth_addr mac;
    bool dynamic_mac;
    int n = 0;
    if (ovs_scan(addrspec, ETH_ADDR_SCAN_FMT" dynamic%n",
                 ETH_ADDR_SCAN_ARGS(mac), &n)
        && addrspec[n] == '\0') {
        dynamic_mac = false;
    } else {
        uint64_t mac64 = ipam_get_unused_mac();
        if (!mac64) {
            return false;
        }
        eth_addr_from_uint64(mac64, &mac);
        dynamic_mac = true;
    }

    /* Generate IPv4 address, if desirable. */
    bool dynamic_ip4 = od->ipam_info->allocated_ipv4s != NULL;
    uint32_t ip4 = dynamic_ip4 ? ipam_get_unused_ip(od) : 0;

    /* Generate IPv6 address, if desirable. */
    bool dynamic_ip6 = od->ipam_info->ipv6_prefix_set;
    struct in6_addr ip6;
    if (dynamic_ip6) {
        in6_generate_eui64(mac, &od->ipam_info->ipv6_prefix, &ip6);
    }

    /* If we didn't generate anything, bail out. */
    if (!dynamic_ip4 && !dynamic_ip6) {
        return false;
    }

    /* Save the dynamic addresses. */
    struct ds new_addr = DS_EMPTY_INITIALIZER;
    ds_put_format(&new_addr, ETH_ADDR_FMT, ETH_ADDR_ARGS(mac));
    if (dynamic_ip4) {
        ipam_insert_ip(od, ip4);
        ds_put_format(&new_addr, " "IP_FMT, IP_ARGS(htonl(ip4)));
    }
    if (dynamic_ip6) {
        char ip6_s[INET6_ADDRSTRLEN + 1];
        ipv6_string_mapped(ip6_s, &ip6);
        ds_put_format(&new_addr, " %s", ip6_s);
    }
    ipam_insert_mac(&mac, !dynamic_mac);
    nbrec_logical_switch_port_set_dynamic_addresses(op->nbsp,
                                                    ds_cstr(&new_addr));
    ds_destroy(&new_addr);
    return true;
}

I am a little concerned that, when no dynamic address is assigned, the
code does not clear the dynamic_addresses column.  That means that, if
"dynamic" is removed from the addresses column, the former dynamic
addresses will still appear.  I suspect that the code should clear
dynamic_addresses when there are no dynamic addresses.

Thanks,

Ben.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to