+/* Looks at the list of managers in 'ovs_cfg' and extracts their remote IP
+ * addresses and ports into '*managersp' and '*n_managersp'. The caller is
+ * responsible for freeing '*managersp' (with free()).
+ *
+ * You may be asking yourself "why does ovs-vswitchd care?", because
+ * ovsdb-server is responsible for connecting to the managers, and ovs-vswitchd
+ * should not be and in fact is not directly involved in that. But
+ * ovs-vswitchd needs to make sure that ovsdb-server can reach the managers, so
+ * it has to tell in-band control where the managers are to enable that.
+ */
+static void
+collect_managers(const struct ovsrec_open_vswitch *ovs_cfg,
+ struct sockaddr_in **managersp, size_t *n_managersp)
+{
+ struct sockaddr_in *managers = NULL;
+ size_t n_managers = 0;
+
+ if (ovs_cfg->n_managers > 0) {
+ size_t i;
+
+ managers = xmalloc(ovs_cfg->n_managers * sizeof *managers);
+ for (i = 0; i < ovs_cfg->n_managers; i++) {
+ const char *name = ovs_cfg->managers[i];
+ struct sockaddr_in *sin = &managers[i];
+
+ if ((!strncmp(name, "tcp:", 4)
+ && inet_parse_active(name + 4, JSONRPC_TCP_PORT, sin)) ||
+ (!strncmp(name, "ssl:", 4)
+ && inet_parse_active(name + 4, JSONRPC_SSL_PORT, sin))) {
+ n_managers++;
+ }
+ }
+ }
+
+ *managersp = managers;
+ *n_managersp = n_managers;
+}
+