From 22e61c7fc7768cffd8801a1a8e5237600b6bca38 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6glund?= <jonas.hoglund@embeddednation.com>
Date: Wed, 27 Nov 2019 15:31:59 +0100
Subject: [PATCH] Handle multiple upstream interfaces.

---
 mcproxy/include/parser/interface.hpp |  4 +++
 mcproxy/src/parser/configuration.cpp | 44 ++++++++++++++++++++--------
 mcproxy/src/parser/interface.cpp     | 40 +++++++++++++++++++++++++
 3 files changed, 76 insertions(+), 12 deletions(-)

diff --git a/mcproxy/include/parser/interface.hpp b/mcproxy/include/parser/interface.hpp
index fef04d8..93d5d23 100644
--- a/mcproxy/include/parser/interface.hpp
+++ b/mcproxy/include/parser/interface.hpp
@@ -220,6 +220,10 @@ public:
     const std::string& get_instance_name() const;
     const std::list<std::shared_ptr<interface>>& get_upstreams() const;
     const std::list<std::shared_ptr<interface>>& get_downstreams() const;
+    bool delete_upstream(const std::shared_ptr<interface>& id);
+    bool delete_downstream(const std::shared_ptr<interface>& id);
+    int get_upstream_count() const;
+    int get_downstream_count() const;
     const std::list<std::shared_ptr<rule_binding>>& get_global_settings() const;
     int get_table_number() const;
     bool get_user_selected_table_number() const; 
diff --git a/mcproxy/src/parser/configuration.cpp b/mcproxy/src/parser/configuration.cpp
index 18d8044..0181e7d 100644
--- a/mcproxy/src/parser/configuration.cpp
+++ b/mcproxy/src/parser/configuration.cpp
@@ -212,25 +212,45 @@ void configuration::initalize_interfaces()
 	};
 
     for (auto & inst : def_set) {
+		auto downstreams = inst->get_downstreams();
+			for (auto & downstream : downstreams) {
+				try {
+					add(downstream);
+				} catch (const char *s) {
+					inst->delete_downstream(downstream);
+					continue;
+				}
+			}
 
-		try {
-			for (auto & downstream : inst->get_downstreams()) {
-				add(downstream);
+			if (inst->get_downstream_count() == 0) {
+				m_inst_def_set.erase(inst);
+				continue;
 			}
 
-			for (auto & upstream : inst->get_upstreams()) {
-				add(upstream);
+		auto upstreams = inst->get_upstreams();
+			for (auto & upstream : upstreams) {
+				try {
+					add(upstream);
+				} catch (const char *s) {
+					inst->delete_upstream(upstream);
+					continue;
+				}
 			}
 
-			if (!m_interfaces_map.insert(std::pair<std::string, std::shared_ptr<interfaces>>(inst->get_instance_name(), result)).second) {
-				HC_LOG_ERROR("proxy instance " << inst->get_instance_name() << " already exists");
-				throw "failed to add instance";
+			if (inst->get_upstream_count() == 0) {
+				m_inst_def_set.erase(inst);
+				continue;
 			}
 
-		} catch (const char *s) {
-			m_inst_def_set.erase(inst);
-			continue;
-		}
+			try {
+				if (!m_interfaces_map.insert(std::pair<std::string, std::shared_ptr<interfaces>>(inst->get_instance_name(), result)).second) {
+					HC_LOG_ERROR("proxy instance " << inst->get_instance_name() << " already exists");
+					throw "failed to add instance";
+				}
+			} catch (const char *s) {
+				m_inst_def_set.erase(inst);
+				continue;
+			}
     }
 
 	if (m_inst_def_set.size() == 0) {
diff --git a/mcproxy/src/parser/interface.cpp b/mcproxy/src/parser/interface.cpp
index 3da8e27..3cf51f0 100644
--- a/mcproxy/src/parser/interface.cpp
+++ b/mcproxy/src/parser/interface.cpp
@@ -517,6 +517,46 @@ const std::list<std::shared_ptr<interface>>& instance_definition::get_downstream
     return m_downstreams;
 }
 
+int instance_definition::get_upstream_count() const
+{
+    HC_LOG_TRACE("");
+    return m_upstreams.size();
+}
+
+int instance_definition::get_downstream_count() const
+{
+    HC_LOG_TRACE("");
+    return m_downstreams.size();
+}
+
+bool instance_definition::delete_upstream(const std::shared_ptr<interface>& id)
+{
+	std::list<std::shared_ptr<interface>>::iterator i;
+
+	HC_LOG_TRACE("");
+	for (i = m_upstreams.begin(); i != m_upstreams.end(); ++i) {
+		if (id == *i) {
+			m_upstreams.erase(i);
+			return true;
+		}
+	}
+	return false;
+}
+
+bool instance_definition::delete_downstream(const std::shared_ptr<interface>& id)
+{
+	std::list<std::shared_ptr<interface>>::iterator i;
+
+    HC_LOG_TRACE("");
+	for (i = m_downstreams.begin(); i != m_downstreams.end(); ++i) {
+		if (id == *i) {
+			m_downstreams.erase(i);
+			return true;
+		}
+	}
+	return false;
+}
+
 const std::list<std::shared_ptr<rule_binding>>& instance_definition::get_global_settings() const
 {
     HC_LOG_TRACE("");
-- 
GitLab