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
