From 615d1b1f338b4aac805fbc6b747b0352dfbf01fb Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 16 May 2019 14:27:16 +0200 Subject: [PATCH] refactor --- .../src/slsReceiverTCPIPInterface.cpp | 12 ++-- slsSupportLib/include/network_utils.h | 6 +- slsSupportLib/src/network_utils.cpp | 61 ++++++++++++++++++- 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index bc55f67b3..87cfaaf53 100755 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -6,13 +6,13 @@ #include "FixedCapacityContainer.h" #include "ServerSocket.h" -#include "ServerInterface.h" #include "slsReceiver.h" #include "slsReceiverImplementation.h" #include "slsReceiverTCPIPInterface.h" #include "slsReceiverUsers.h" #include "versionAPI.h" #include "string_utils.h" +#include "sls_detector_exceptions.h" #include #include @@ -24,6 +24,8 @@ #include #include +using sls::SocketError; + slsReceiverTCPIPInterface::~slsReceiverTCPIPInterface() { stop(); } @@ -725,7 +727,7 @@ int slsReceiverTCPIPInterface::setup_udp(sls::ServerInterface2 &socket){ } FILE_LOG(logINFO) << "Receiver UDP IP: " << ip1; // get eth - std::string temp = genericSocket::ipToName(ip1); + std::string temp = sls::IpToInterfaceName(ip1); if (temp == "none"){ ret = FAIL; strcpy(mess, "Failed to get ethernet interface or IP \n"); @@ -747,7 +749,7 @@ int slsReceiverTCPIPInterface::setup_udp(sls::ServerInterface2 &socket){ } //get mac address if (ret != FAIL) { - temp = genericSocket::nameToMac(eth); + temp = sls::InterfaceNameToMac(eth).str(); if (temp=="00:00:00:00:00:00") { ret = FAIL; strcpy(mess,"failed to get mac adddress to listen to\n"); @@ -771,7 +773,7 @@ int slsReceiverTCPIPInterface::setup_udp(sls::ServerInterface2 &socket){ receiver->setUDPPortNumber2(port2); FILE_LOG(logINFO) << "Receiver UDP IP 2: " << ip2; // get eth - temp = genericSocket::ipToName(ip2); + temp = sls::IpToInterfaceName(ip2); if (temp == "none"){ ret = FAIL; strcpy(mess, "Failed to get 2nd ethernet interface or IP \n"); @@ -791,7 +793,7 @@ int slsReceiverTCPIPInterface::setup_udp(sls::ServerInterface2 &socket){ //get mac address if (ret != FAIL) { - temp = genericSocket::nameToMac(eth); + temp = sls::InterfaceNameToMac(eth).str(); if (temp=="00:00:00:00:00:00") { ret = FAIL; strcpy(mess,"failed to get 2nd mac adddress to listen to\n"); diff --git a/slsSupportLib/include/network_utils.h b/slsSupportLib/include/network_utils.h index 9a8410531..e4a963033 100755 --- a/slsSupportLib/include/network_utils.h +++ b/slsSupportLib/include/network_utils.h @@ -4,8 +4,6 @@ namespace sls { -uint32_t HostnameToIp(const char *hostname); - class IpAddr { private: uint32_t addr_{0}; @@ -58,6 +56,10 @@ class MacAddr { constexpr uint64_t uint64() const noexcept { return addr_; } }; +uint32_t HostnameToIp(const char *hostname); +std::string IpToInterfaceName(const std::string& ip); +MacAddr InterfaceNameToMac(std::string inf); + std::ostream &operator<<(std::ostream &out, const IpAddr &addr); std::ostream &operator<<(std::ostream &out, const MacAddr &addr); diff --git a/slsSupportLib/src/network_utils.cpp b/slsSupportLib/src/network_utils.cpp index 3b71af9f4..5153cf234 100755 --- a/slsSupportLib/src/network_utils.cpp +++ b/slsSupportLib/src/network_utils.cpp @@ -6,11 +6,14 @@ #include #include #include - +#include #include #include #include #include +#include +#include +#include #include "network_utils.h" @@ -93,4 +96,60 @@ uint32_t HostnameToIp(const char *hostname) { return ip; } +std::string IpToInterfaceName(const std::string &ip) { + //TODO! Copied from genericSocket needs to be refactored! + struct ifaddrs *addrs, *iap; + struct sockaddr_in *sa; + + char buf[32]; + const int buf_len = sizeof(buf); + memset(buf, 0, buf_len); + strcpy(buf, "none"); + + getifaddrs(&addrs); + for (iap = addrs; iap != NULL; iap = iap->ifa_next) { + if (iap->ifa_addr && (iap->ifa_flags & IFF_UP) && + iap->ifa_addr->sa_family == AF_INET) { + sa = (struct sockaddr_in *)(iap->ifa_addr); + inet_ntop(iap->ifa_addr->sa_family, (void *)&(sa->sin_addr), buf, + buf_len); + if (ip == std::string(buf)) { + strcpy(buf, iap->ifa_name); + break; + } + } + } + freeifaddrs(addrs); + return std::string(buf); +} + +MacAddr InterfaceNameToMac(std::string inf) { + //TODO! Copied from genericSocket needs to be refactored! + struct ifreq ifr; + char mac[32]; + const int mac_len = sizeof(mac); + memset(mac,0,mac_len); + + int sock=socket(PF_INET, SOCK_STREAM, 0); + strncpy(ifr.ifr_name,inf.c_str(),sizeof(ifr.ifr_name)-1); + ifr.ifr_name[sizeof(ifr.ifr_name)-1]='\0'; + + + if (-1==ioctl(sock, SIOCGIFHWADDR, &ifr)) { + perror("ioctl(SIOCGIFHWADDR) "); + return std::string("00:00:00:00:00:00"); + } + for (int j=0, k=0; j<6; j++) { + k+=snprintf(mac+k, mac_len-k-1, j ? ":%02X" : "%02X", + (int)(unsigned int)(unsigned char)ifr.ifr_hwaddr.sa_data[j]); + } + mac[mac_len-1]='\0'; + + if(sock!=1){ + close(sock); + } + return MacAddr(mac); + + } + } // namespace sls