Add a new OVN configuration entry in the Open_vSwitch database called "ovn-bridge-mappings". This allows the configuration of mappings between a physical network name and an OVS bridge that provides connectivity to that network.
For example, if you wanted to configure "physnet1" to map to "br-eth0" and "physnet2" to map to "br-eth1", the configuration would be: $ ovs-vsctl set open . \ > external-ids:ovn-bridge-mappings=physnet1:br-eth0,physnet2:br-eth1 In this patch, the configuration option is only parsed and validated to make sure the referenced bridges actually exist. Later patches will make use of the bridge mappings. Documentation for this configuration value is introduced in a later patch that makes use of this by introducing a "localnet" logical port type. Signed-off-by: Russell Bryant <rbry...@redhat.com> --- ovn/controller/ovn-controller.c | 54 ++++++++++++++++++++++++++++++++++++++++- ovn/controller/ovn-controller.h | 7 ++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c index bb9c7a3..16b6a8c 100644 --- a/ovn/controller/ovn-controller.c +++ b/ovn/controller/ovn-controller.c @@ -33,6 +33,8 @@ #include "poll-loop.h" #include "fatal-signal.h" #include "lib/vswitch-idl.h" +#include "hash.h" +#include "hmap.h" #include "smap.h" #include "stream.h" #include "stream-ssl.h" @@ -85,6 +87,43 @@ get_bridge(struct controller_ctx *ctx, const char *name) return NULL; } +static int +parse_bridge_mappings(struct controller_ctx *ctx, const char *bridge_mappings_) +{ + char *cur, *next, *start; + int res = 0; + + next = start = xstrdup(bridge_mappings_); + + while ((cur = strsep(&next, ","))) { + char *network, *bridge = cur; + const struct ovsrec_bridge *ovs_bridge; + + network = strsep(&bridge, ":"); + if (!bridge || !*network || !*bridge) { + VLOG_ERR("Invalid ovn-bridge-mappings configuration: '%s'", bridge_mappings_); + res = -1; + break; + } + + VLOG_DBG("Bridge mapping - network '%s' to bridge '%s'", network, bridge); + + ovs_bridge = get_bridge(ctx, bridge); + if (!ovs_bridge) { + VLOG_WARN("Bridge '%s' not found for network '%s'", bridge, network); + res = -1; + break; + } + + smap_add(&ctx->localnet_mappings, network, bridge); + smap_add(&ctx->bridge_mappings, bridge, network); + } + + free(start); + + return res; +} + /* Retrieve the OVN integration bridge from the "external-ids:ovn-bridge" * key, the remote location from the "external-ids:ovn-remote" key, and * the chassis name from the "external-ids:system-id" key in the @@ -105,7 +144,7 @@ get_core_config(struct controller_ctx *ctx) } while (1) { - const char *remote, *system_id, *br_int_name; + const char *remote, *system_id, *br_int_name, *bridge_mappings; ovsdb_idl_run(ctx->ovs_idl); @@ -134,6 +173,17 @@ get_core_config(struct controller_ctx *ctx) goto try_again; } + smap_init(&ctx->bridge_mappings); + smap_init(&ctx->localnet_mappings); + bridge_mappings = smap_get(&cfg->external_ids, "ovn-bridge-mappings"); + if (bridge_mappings) { + int res = parse_bridge_mappings(ctx, bridge_mappings); + if (res) { + VLOG_INFO("Error parsing ovn-bridge-mappings. Waiting ..."); + goto try_again; + } + } + ovnsb_remote = xstrdup(remote); ctx->chassis_id = xstrdup(system_id); return; @@ -259,6 +309,8 @@ main(int argc, char *argv[]) free(ctx.chassis_id); free(ovnsb_remote); free(ovs_remote); + smap_destroy(&ctx.bridge_mappings); + smap_destroy(&ctx.localnet_mappings); exit(retval); } diff --git a/ovn/controller/ovn-controller.h b/ovn/controller/ovn-controller.h index 6f98658..98bf248 100644 --- a/ovn/controller/ovn-controller.h +++ b/ovn/controller/ovn-controller.h @@ -19,6 +19,8 @@ #include "ovn/lib/ovn-sb-idl.h" +struct smap; + struct controller_ctx { char *chassis_id; /* ID for this chassis. */ char *br_int_name; /* Name of local integration bridge. */ @@ -26,6 +28,11 @@ struct controller_ctx { struct ovsdb_idl *ovs_idl; const struct ovsrec_bridge *br_int; + + /* Map bridges to local nets from ovn-bridge-mappings */ + struct smap bridge_mappings; + /* Map local nets to bridges from ovn-bridge-mappings */ + struct smap localnet_mappings; }; static inline const struct sbrec_chassis * -- 2.4.3 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev