Module: sems
Branch: master
Commit: 4b78e76698eb4a0260361ec7300892c87288a9f8
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=4b78e76698eb4a0260361ec7300892c87288a9f8

Author: Raphael Coeffic <[email protected]>
Committer: Raphael Coeffic <[email protected]>
Date:   Fri Jan 27 15:48:52 2012 +0100

b/f: fixes support for additional IPs (e.g. VIPs).

- reverts LocalSIPIP2If to a multimap.
- adds support for LocalSIPIP2If in trans_layer as well.

---

 core/AmConfig.cpp        |   63 ++++++++++++++++-----------------------------
 core/AmConfig.h          |    2 +-
 core/sip/trans_layer.cpp |   21 +++++++++++++--
 3 files changed, 42 insertions(+), 44 deletions(-)

diff --git a/core/AmConfig.cpp b/core/AmConfig.cpp
index a335b87..561a0bd 100644
--- a/core/AmConfig.cpp
+++ b/core/AmConfig.cpp
@@ -59,7 +59,7 @@ bool         AmConfig::LogStderr               = false;
 
 vector<AmConfig::IP_interface>  AmConfig::Ifs;
 map<string,unsigned short>      AmConfig::If_names;
-map<string,unsigned short>      AmConfig::LocalSIPIP2If;
+multimap<string,unsigned short> AmConfig::LocalSIPIP2If;
 list<AmConfig::SysIntf>         AmConfig::SysIfs;
 
 #ifndef DISABLE_DAEMON_MODE
@@ -716,8 +716,6 @@ static bool fillSysIntfList()
       return false;
     }
 
-    DBG("iface='%s';ip='%s'\n",p_if->ifa_name,host);
-
     string iface_name(p_if->ifa_name);
     list<AmConfig::SysIntf>::iterator intf_it;
     for(intf_it = AmConfig::SysIfs.begin();
@@ -734,36 +732,12 @@ static bool fillSysIntfList()
       intf_it->flags = p_if->ifa_flags;
     }
 
+    DBG("iface='%s';ip='%s';flags=0x%x\n",p_if->ifa_name,host,p_if->ifa_flags);
     intf_it->addrs.push_back(host);
   }
 
   freeifaddrs(ifap);
 
-  // add addresses from SysIntfList, if not present
-  for(unsigned int idx = 0; idx < AmConfig::Ifs.size(); idx++) {
-
-    list<AmConfig::SysIntf>::iterator intf_it = AmConfig::SysIfs.begin();
-    for(;intf_it != AmConfig::SysIfs.end(); ++intf_it) {
-
-      list<string>::iterator addr_it = std::find(intf_it->addrs.begin(),
-                                                intf_it->addrs.end(),
-                                                AmConfig::Ifs[idx].LocalSIPIP);
-      // address not in this interface
-      if(addr_it == intf_it->addrs.end())
-       continue;
-
-      // address is primary
-      if(addr_it == intf_it->addrs.begin())
-       continue;
-
-      if(AmConfig::LocalSIPIP2If.find(intf_it->addrs.front())
-        == AmConfig::LocalSIPIP2If.end()) {
-       
-       AmConfig::LocalSIPIP2If[intf_it->addrs.front()] = idx;
-      }
-    }
-  }
-
   return true;
 }
 
@@ -822,17 +796,26 @@ int AmConfig::finalizeIPConfig()
     else {
       AmConfig::Ifs[i].LocalSIPIP = fixIface2IP(AmConfig::Ifs[i].LocalSIPIP);
     }
-    
-    if(AmConfig::LocalSIPIP2If.find(AmConfig::Ifs[i].LocalSIPIP) == 
AmConfig::LocalSIPIP2If.end()) {
-      
AmConfig::LocalSIPIP2If.insert(std::make_pair(AmConfig::Ifs[i].LocalSIPIP,i));
-    }
-    else {
-      map<string,unsigned short>::iterator it = 
AmConfig::LocalSIPIP2If.find(AmConfig::Ifs[i].LocalSIPIP);
-      const AmConfig::IP_interface& new_intf = AmConfig::Ifs[i];
-      const AmConfig::IP_interface& old_intf = AmConfig::Ifs[it->second];
-      ERROR("Configuration for interface '%s' uses the same IP address as 
'%s'\n",
-           new_intf.name.empty() ? "default" : new_intf.name.c_str(),
-           old_intf.name.empty() ? "default" : old_intf.name.c_str() );
+
+    list<AmConfig::SysIntf>::iterator intf_it = AmConfig::SysIfs.begin();
+    for(;intf_it != AmConfig::SysIfs.end(); ++intf_it) {
+
+      list<string>::iterator addr_it = std::find(intf_it->addrs.begin(),
+                                                intf_it->addrs.end(),
+                                                AmConfig::Ifs[i].LocalSIPIP);
+      // address not in this interface
+      if(addr_it == intf_it->addrs.end())
+       continue;
+
+      for(addr_it = intf_it->addrs.begin(); 
+         addr_it != intf_it->addrs.end(); ++addr_it) {
+
+       if(AmConfig::LocalSIPIP2If.find(*addr_it)
+          == AmConfig::LocalSIPIP2If.end()) {
+       
+         AmConfig::LocalSIPIP2If.insert(make_pair(*addr_it,i));
+       }
+      }
     }
   }
 
@@ -855,7 +838,7 @@ void AmConfig::dump_Ifs()
   }
   
   INFO("Signaling address map:");
-  for(map<string,unsigned short>::iterator it = LocalSIPIP2If.begin();
+  for(multimap<string,unsigned short>::iterator it = LocalSIPIP2If.begin();
       it != LocalSIPIP2If.end(); ++it) {
 
     if(Ifs[it->second].name.empty()){
diff --git a/core/AmConfig.h b/core/AmConfig.h
index 1ad9bfc..16d91d2 100644
--- a/core/AmConfig.h
+++ b/core/AmConfig.h
@@ -110,7 +110,6 @@ struct AmConfig
 
   static vector<IP_interface>       Ifs;
   static map<string,unsigned short> If_names;
-  static map<string,unsigned short> LocalSIPIP2If;
 
   struct SysIntf {
     string       name;
@@ -120,6 +119,7 @@ struct AmConfig
   };
 
   static list<SysIntf> SysIfs;
+  static multimap<string,unsigned short> LocalSIPIP2If;
 
   static int finalizeIPConfig();
 
diff --git a/core/sip/trans_layer.cpp b/core/sip/trans_layer.cpp
index 48843c1..ec794ee 100644
--- a/core/sip/trans_layer.cpp
+++ b/core/sip/trans_layer.cpp
@@ -1851,6 +1851,7 @@ trsp_socket* 
_trans_layer::find_transport(sockaddr_storage* remote_ip)
   }
 
   sockaddr_storage from;
+  string local_ip;
 
   socklen_t    len=sizeof(from);
   trsp_socket* tsock=NULL;
@@ -1871,9 +1872,7 @@ trsp_socket* 
_trans_layer::find_transport(sockaddr_storage* remote_ip)
   }
   close(temp_sock);
 
-  // TODO:
-  //  - if no exact IP match, try with matching the interface
-
+  // try exact match
   for(vector<trsp_socket*>::iterator it = transports.begin();
       it != transports.end(); ++it) {
 
@@ -1883,6 +1882,22 @@ trsp_socket* 
_trans_layer::find_transport(sockaddr_storage* remote_ip)
       }
   }
 
+  if(tsock != NULL)
+      return tsock;
+
+  // try with alternative address
+  if(ip_addr_to_str(&from,local_ip) == 0) {
+      map<string,unsigned short>::iterator if_it = 
AmConfig::LocalSIPIP2If.find(local_ip);
+      if(if_it == AmConfig::LocalSIPIP2If.end()){
+         ERROR("Could not find a local interface for "
+               "resolved local IP (local_ip='%s')",
+               local_ip.c_str());
+      }
+      else {
+         tsock = transports[if_it->second];
+      }
+  }
+
   return tsock;
 
  error:

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to