diff options
author | Numan Siddique <nusiddiq@redhat.com> | 2017-02-13 12:43:03 +0530 |
---|---|---|
committer | Russell Bryant <russell@ovn.org> | 2017-02-15 14:40:46 -0500 |
commit | 6c4f7a8abbae5c73b4e217a7ebceac4f6498d819 (patch) | |
tree | 424d628560273b891e58893bf71db59366d95ec9 | |
parent | 994879387b501d64114d0691063b0cf070fafb94 (diff) | |
download | openvswitch-6c4f7a8abbae5c73b4e217a7ebceac4f6498d819.tar.gz |
ovn-northd ipam: handle the static MAC updates by the user
Changing the logical port's address from "MAC1 dynamic"
to "MAC2 dynamic" is not handled by ovn-northd. This patch
fixes this issue.
Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1408121
Signed-off-by: Numan Siddique <nusiddiq@redhat.com>
Signed-off-by: Russell Bryant <russell@ovn.org>
-rw-r--r-- | ovn/northd/ovn-northd.c | 37 | ||||
-rw-r--r-- | tests/ovn.at | 19 |
2 files changed, 56 insertions, 0 deletions
diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c index a4f76a9d6..03dc850c8 100644 --- a/ovn/northd/ovn-northd.c +++ b/ovn/northd/ovn-northd.c @@ -1179,6 +1179,41 @@ tag_alloc_create_new_tag(struct hmap *tag_alloc_table, } +/* + * This function checks if the MAC in "address" parameter (if present) is + * different from the one stored in Logical_Switch_Port.dynamic_addresses + * and updates it. + */ +static void +check_and_update_mac_in_dynamic_addresses( + const char *address, + const struct nbrec_logical_switch_port *nbsp) +{ + if (!nbsp->dynamic_addresses) { + return; + } + int buf_index = 0; + struct eth_addr ea; + if (!ovs_scan_len(address, &buf_index, + ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea))) { + return; + } + + struct eth_addr present_ea; + buf_index = 0; + if (ovs_scan_len(nbsp->dynamic_addresses, &buf_index, + ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(present_ea)) + && !eth_addr_equals(ea, present_ea)) { + /* MAC address has changed. Update it */ + char *new_addr = xasprintf( + ETH_ADDR_FMT"%s", ETH_ADDR_ARGS(ea), +  ->dynamic_addresses[buf_index]); + nbrec_logical_switch_port_set_dynamic_addresses( + nbsp, new_addr); + free(new_addr); + } +} + static void join_logical_ports(struct northd_context *ctx, struct hmap *datapaths, struct hmap *ports, @@ -1243,6 +1278,8 @@ join_logical_ports(struct northd_context *ctx, } if (is_dynamic_lsp_address(nbsp->addresses[j])) { if (nbsp->dynamic_addresses) { + check_and_update_mac_in_dynamic_addresses( + nbsp->addresses[j], nbsp); if (!extract_lsp_addresses(nbsp->dynamic_addresses, &op->lsp_addrs[op->n_lsp_addrs])) { static struct vlog_rate_limit rl diff --git a/tests/ovn.at b/tests/ovn.at index 26108aaaa..c821574b7 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -4893,6 +4893,25 @@ AT_CHECK([ovn-nbctl get Logical-Switch-Port p31 dynamic_addresses], [0], ["fe:dc:ba:98:76:54 192.168.1.18" ]) +# Update the static MAC address with dynamically allocated IP and check +# if the MAC address is updated in 'Logical_Switch_Port.dynamic_adddresses' +ovn-nbctl --wait=sb lsp-set-addresses p31 "fe:dc:ba:98:76:55 dynamic" +ovn-nbctl get Logical-Switch-Port p31 dynamic_addresses + +AT_CHECK([ovn-nbctl get Logical-Switch-Port p31 dynamic_addresses], [0], + ["fe:dc:ba:98:76:55 192.168.1.18" +]) + +ovn-nbctl --wait=sb lsp-set-addresses p31 "dynamic" +AT_CHECK([ovn-nbctl get Logical-Switch-Port p31 dynamic_addresses], [0], + ["fe:dc:ba:98:76:55 192.168.1.18" +]) + +ovn-nbctl --wait=sb lsp-set-addresses p31 "fe:dc:ba:98:76:56 dynamic" +AT_CHECK([ovn-nbctl get Logical-Switch-Port p31 dynamic_addresses], [0], + ["fe:dc:ba:98:76:56 192.168.1.18" +]) + as ovn-sb OVS_APP_EXIT_AND_WAIT([ovsdb-server]) |