From 82b02d18b3a6817c104942b4720187f7be6408e9 Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Wed, 1 May 2024 16:45:16 -0700 Subject: [PATCH 01/13] improve macOS get default gateway --- Pcap++/header/PcapLiveDevice.h | 11 ++++- Pcap++/src/PcapLiveDevice.cpp | 86 +++++++++++++++++++++++++++------- 2 files changed, 79 insertions(+), 18 deletions(-) diff --git a/Pcap++/header/PcapLiveDevice.h b/Pcap++/header/PcapLiveDevice.h index 8abf91fd7..3c0978d68 100644 --- a/Pcap++/header/PcapLiveDevice.h +++ b/Pcap++/header/PcapLiveDevice.h @@ -1,10 +1,11 @@ #pragma once #include -#include +#include +#include #include #include -#include +#include #include "IpAddress.h" #include "Packet.h" @@ -578,4 +579,10 @@ namespace pcpp pcap_t* doOpen(const DeviceConfiguration& config); }; + //route message struct for communication in BSD / APPLE device + struct BSDRoutingMessage{ + struct rt_msghdr header; + char messageSpace[512]; + }; + } // namespace pcpp diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index 70a0c18ab..c22287a95 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -36,6 +36,7 @@ #endif // if defined(_WIN32) #if defined(__APPLE__) || defined(__FreeBSD__) #include +#include #include #endif @@ -1055,31 +1056,84 @@ void PcapLiveDevice::setDefaultGateway() } } #elif defined(__APPLE__) || defined(__FreeBSD__) - std::string command = "netstat -nr | grep default | grep " + m_Name; - std::string ifaceInfo = executeShellCommand(command); - if (ifaceInfo == "") - { - PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get netstat output"); + + #define ROUNDUP(a) \ + ((a) > 0 ? (1 + (((a) - 1) | (sizeof(uint32_t) - 1))) : sizeof(uint32_t)) + #define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) + + struct BSDRoutingMessage routingMessage; + char* spacePtr = routingMessage.messageSpace; + int sockfd = socket(PF_ROUTE, SOCK_RAW, 0); + if (sockfd < 0) { + PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get open routing socket"); + return ; + } + + bzero((char *)&routingMessage, sizeof(routingMessage)); + routingMessage.header.rtm_msglen = sizeof(struct rt_msghdr); + routingMessage.header.rtm_version = RTM_VERSION; + routingMessage.header.rtm_type = RTM_GET; + routingMessage.header.rtm_addrs = RTA_DST | RTA_NETMASK | RTA_IFP; + routingMessage.header.rtm_flags = RTF_UP | RTF_GATEWAY | RTF_STATIC; + + struct sockaddr_in so_dst , so_mask; + struct sockaddr_dl so_ifp; + memset(&so_dst, 0, sizeof(so_dst)); + memset(&so_mask, 0, sizeof(so_mask)); + memset(&so_ifp, 0, sizeof(so_ifp)); + + int len = sizeof(sockaddr_in); + bcopy((char *)&(so_dst), spacePtr, len); + spacePtr += len; + bcopy((char *)&(so_mask), spacePtr, len); + spacePtr += len; + routingMessage.header.rtm_msglen += 2*len ; + len = sizeof(sockaddr_dl); + bcopy((char *)&(so_ifp), spacePtr, len); + spacePtr += len; + + + if (write(sockfd, (char*)&routingMessage, routingMessage.header.rtm_msglen) < 0) { + PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't write into the routing socket"); return; } - // remove the word "default" - ifaceInfo.erase(0, 7); - - // remove spaces - while (ifaceInfo.at(0) == ' ') - ifaceInfo.erase(0,1); - - // erase string after gateway IP address - ifaceInfo.resize(ifaceInfo.find(' ', 0)); + // Read the response from the route socket + if (read(sockfd, (char*)&routingMessage, sizeof(routingMessage)) < 0) { + PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't read from the routing socket"); + return; + } + struct sockaddr_in *gate = nullptr; + struct sockaddr_dl *ifp = nullptr; + struct sockaddr *sa = nullptr; + spacePtr = ((char*)(&routingMessage.header+1)); + for (int i = 1; i; i <<= 1) + { + if (i & routingMessage.header.rtm_addrs) + { + sa = (struct sockaddr *)spacePtr; + switch (i) + { + case RTA_GATEWAY: + gate = (sockaddr_in* )sa; + break; + case RTA_IFP: + if (sa->sa_family == AF_LINK && + ((sockaddr_dl *)sa)->sdl_nlen) + ifp = (sockaddr_dl *)sa; + break; + } + ADVANCE(spacePtr, sa); + } + } try { - m_DefaultGateway = IPv4Address(ifaceInfo); + m_DefaultGateway = IPv4Address(gate->sin_addr.s_addr); } catch(const std::exception& e) { - PCPP_LOG_ERROR("Error retrieving default gateway address: "<< ifaceInfo << ": " << e.what()); + PCPP_LOG_ERROR("Error retrieving default gateway address: "<< inet_ntoa(gate->sin_addr) << ": " << e.what()); } #endif } From 5f6750ad071c8d9c9bd4990f65a36e5abc4d67ab Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Sun, 5 May 2024 02:44:54 -0700 Subject: [PATCH 02/13] fix based on comments --- Pcap++/header/PcapLiveDevice.h | 6 ---- Pcap++/src/PcapLiveDevice.cpp | 50 +++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Pcap++/header/PcapLiveDevice.h b/Pcap++/header/PcapLiveDevice.h index 3c0978d68..293c28d6e 100644 --- a/Pcap++/header/PcapLiveDevice.h +++ b/Pcap++/header/PcapLiveDevice.h @@ -579,10 +579,4 @@ namespace pcpp pcap_t* doOpen(const DeviceConfiguration& config); }; - //route message struct for communication in BSD / APPLE device - struct BSDRoutingMessage{ - struct rt_msghdr header; - char messageSpace[512]; - }; - } // namespace pcpp diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index c22287a95..a2a9ca156 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1057,15 +1057,18 @@ void PcapLiveDevice::setDefaultGateway() } #elif defined(__APPLE__) || defined(__FreeBSD__) - #define ROUNDUP(a) \ - ((a) > 0 ? (1 + (((a) - 1) | (sizeof(uint32_t) - 1))) : sizeof(uint32_t)) - #define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) + //route message struct for communication in BSD / APPLE device + struct BSDRoutingMessage{ + struct rt_msghdr header; + char messageSpace[512]; + }; struct BSDRoutingMessage routingMessage; char* spacePtr = routingMessage.messageSpace; + // It creates a raw socket that can be used for routing-related operations int sockfd = socket(PF_ROUTE, SOCK_RAW, 0); if (sockfd < 0) { - PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get open routing socket"); + PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't get open routing socket"); return ; } @@ -1076,43 +1079,40 @@ void PcapLiveDevice::setDefaultGateway() routingMessage.header.rtm_addrs = RTA_DST | RTA_NETMASK | RTA_IFP; routingMessage.header.rtm_flags = RTF_UP | RTF_GATEWAY | RTF_STATIC; - struct sockaddr_in so_dst , so_mask; - struct sockaddr_dl so_ifp; - memset(&so_dst, 0, sizeof(so_dst)); - memset(&so_mask, 0, sizeof(so_mask)); - memset(&so_ifp, 0, sizeof(so_ifp)); + struct sockaddr_in so_dst = {0} , so_mask = {0}; + struct sockaddr_dl so_ifp = {0}; - int len = sizeof(sockaddr_in); - bcopy((char *)&(so_dst), spacePtr, len); + size_t len = sizeof(sockaddr_in); + bcopy(reinterpret_cast(&so_dst), spacePtr, len); spacePtr += len; - bcopy((char *)&(so_mask), spacePtr, len); + bcopy(reinterpret_cast(&so_mask), spacePtr, len); spacePtr += len; routingMessage.header.rtm_msglen += 2*len ; len = sizeof(sockaddr_dl); - bcopy((char *)&(so_ifp), spacePtr, len); - spacePtr += len; + bcopy(reinterpret_cast(&so_ifp), spacePtr, len); + routingMessage.header.rtm_msglen += len ; - if (write(sockfd, (char*)&routingMessage, routingMessage.header.rtm_msglen) < 0) { - PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't write into the routing socket"); + if (write(sockfd, reinterpret_cast(&routingMessage), routingMessage.header.rtm_msglen) < 0) { + PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't write into the routing socket"); return; } // Read the response from the route socket - if (read(sockfd, (char*)&routingMessage, sizeof(routingMessage)) < 0) { - PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't read from the routing socket"); + if (read(sockfd,reinterpret_cast(&routingMessage), sizeof(routingMessage)) < 0) { + PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't read from the routing socket"); return; } struct sockaddr_in *gate = nullptr; struct sockaddr_dl *ifp = nullptr; struct sockaddr *sa = nullptr; - spacePtr = ((char*)(&routingMessage.header+1)); - for (int i = 1; i; i <<= 1) + spacePtr = (reinterpret_cast(&routingMessage.header+1)); + for (int i = 1; i > 0; i <<= 1) { if (i & routingMessage.header.rtm_addrs) { - sa = (struct sockaddr *)spacePtr; + sa = reinterpret_cast(spacePtr); switch (i) { case RTA_GATEWAY: @@ -1124,9 +1124,15 @@ void PcapLiveDevice::setDefaultGateway() ifp = (sockaddr_dl *)sa; break; } - ADVANCE(spacePtr, sa); + // Make sure the increment is the nearest multiple of the size of uint32_t + spacePtr += sa->sa_len > 0 ? (1 + (((sa->sa_len) - 1) | (sizeof(uint32_t) - 1))) : sizeof(uint32_t); } } + if(gate == nullptr || ifp == nullptr) + { + PCPP_LOG_ERROR("Error retrieving default gateway address: Empty Message related to gate"); + return; + } try { m_DefaultGateway = IPv4Address(gate->sin_addr.s_addr); From 2605beda842aa8de9e8f09d09bb3cfe56d97797e Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Sun, 5 May 2024 03:27:37 -0700 Subject: [PATCH 03/13] fix header file issue in windows system --- Pcap++/header/PcapLiveDevice.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Pcap++/header/PcapLiveDevice.h b/Pcap++/header/PcapLiveDevice.h index 293c28d6e..f278bbf92 100644 --- a/Pcap++/header/PcapLiveDevice.h +++ b/Pcap++/header/PcapLiveDevice.h @@ -2,7 +2,6 @@ #include #include -#include #include #include #include From e4a12891180b8ccb2324d77802fa1de77173d229 Mon Sep 17 00:00:00 2001 From: "Liu, An-Chi" Date: Wed, 22 May 2024 11:54:02 +0900 Subject: [PATCH 04/13] Update Pcap++/src/PcapLiveDevice.cpp --- Pcap++/src/PcapLiveDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index a2a9ca156..bc66f484f 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1099,7 +1099,7 @@ void PcapLiveDevice::setDefaultGateway() } // Read the response from the route socket - if (read(sockfd,reinterpret_cast(&routingMessage), sizeof(routingMessage)) < 0) { + if (read(sockfd, reinterpret_cast(&routingMessage), sizeof(routingMessage)) < 0) { PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't read from the routing socket"); return; } From 3a50896b627a671f560609352c83656d28d4fac5 Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Wed, 5 Jun 2024 19:52:35 +0900 Subject: [PATCH 05/13] separate freeBSD implementation from macOS --- Pcap++/src/PcapLiveDevice.cpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index f41f6a99e..4981da5c9 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1060,9 +1060,9 @@ void PcapLiveDevice::setDefaultGateway() PCPP_LOG_ERROR("Error retrieving default gateway address: " << e.what()); } } -#elif defined(__APPLE__) || defined(__FreeBSD__) +#elif defined(__APPLE__) - //route message struct for communication in BSD / APPLE device + //route message struct for communication in APPLE device struct BSDRoutingMessage{ struct rt_msghdr header; char messageSpace[512]; @@ -1077,7 +1077,7 @@ void PcapLiveDevice::setDefaultGateway() return ; } - bzero((char *)&routingMessage, sizeof(routingMessage)); + memset(reinterpret_cast(&routingMessage), 0, sizeof(routingMessage)); routingMessage.header.rtm_msglen = sizeof(struct rt_msghdr); routingMessage.header.rtm_version = RTM_VERSION; routingMessage.header.rtm_type = RTM_GET; @@ -1146,6 +1146,33 @@ void PcapLiveDevice::setDefaultGateway() { PCPP_LOG_ERROR("Error retrieving default gateway address: "<< inet_ntoa(gate->sin_addr) << ": " << e.what()); } +#elif defined(__FreeBSD__) + std::string command = "netstat -nr | grep default | grep " + m_Name; + std::string ifaceInfo = executeShellCommand(command); + if (ifaceInfo == "") + { + PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get netstat output"); + return; + } + + // remove the word "default" + ifaceInfo.erase(0, 7); + + // remove spaces + while (ifaceInfo.at(0) == ' ') + ifaceInfo.erase(0,1); + + // erase string after gateway IP address + ifaceInfo.resize(ifaceInfo.find(' ', 0)); + + try + { + m_DefaultGateway = IPv4Address(ifaceInfo); + } + catch(const std::exception& e) + { + PCPP_LOG_ERROR("Error retrieving default gateway address: "<< ifaceInfo << ": " << e.what()); + } #endif } From 0c9db453aaef0abdb377b1496d065d646ec60d66 Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Sat, 8 Jun 2024 11:38:25 +0900 Subject: [PATCH 06/13] change c style code to cpp style --- Pcap++/src/PcapLiveDevice.cpp | 71 +++++++++++++++++------------------ 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index 4981da5c9..8c98808fe 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1076,8 +1076,7 @@ void PcapLiveDevice::setDefaultGateway() PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't get open routing socket"); return ; } - - memset(reinterpret_cast(&routingMessage), 0, sizeof(routingMessage)); + memset(reinterpret_cast(&routingMessage), 0, sizeof(routingMessage)); routingMessage.header.rtm_msglen = sizeof(struct rt_msghdr); routingMessage.header.rtm_version = RTM_VERSION; routingMessage.header.rtm_type = RTM_GET; @@ -1109,11 +1108,11 @@ void PcapLiveDevice::setDefaultGateway() return; } - struct sockaddr_in *gate = nullptr; + struct in_addr *gateAddr = nullptr; struct sockaddr_dl *ifp = nullptr; struct sockaddr *sa = nullptr; spacePtr = (reinterpret_cast(&routingMessage.header+1)); - for (int i = 1; i > 0; i <<= 1) + for (int i = 1; i != 0; i <<= 1) { if (i & routingMessage.header.rtm_addrs) { @@ -1121,58 +1120,58 @@ void PcapLiveDevice::setDefaultGateway() switch (i) { case RTA_GATEWAY: - gate = (sockaddr_in* )sa; + gateAddr = internal::sockaddr2in_addr(sa); break; case RTA_IFP: if (sa->sa_family == AF_LINK && - ((sockaddr_dl *)sa)->sdl_nlen) - ifp = (sockaddr_dl *)sa; + reinterpret_cast(sa)->sdl_nlen) + ifp = reinterpret_cast(sa); break; } // Make sure the increment is the nearest multiple of the size of uint32_t spacePtr += sa->sa_len > 0 ? (1 + (((sa->sa_len) - 1) | (sizeof(uint32_t) - 1))) : sizeof(uint32_t); } } - if(gate == nullptr || ifp == nullptr) + if(gateAddr == nullptr || ifp == nullptr) { PCPP_LOG_ERROR("Error retrieving default gateway address: Empty Message related to gate"); return; } try { - m_DefaultGateway = IPv4Address(gate->sin_addr.s_addr); + m_DefaultGateway = IPv4Address(gateAddr->s_addr); } catch(const std::exception& e) { - PCPP_LOG_ERROR("Error retrieving default gateway address: "<< inet_ntoa(gate->sin_addr) << ": " << e.what()); + PCPP_LOG_ERROR("Error retrieving default gateway address: "<< inet_ntoa(*gateAddr) << ": " << e.what()); } #elif defined(__FreeBSD__) - std::string command = "netstat -nr | grep default | grep " + m_Name; - std::string ifaceInfo = executeShellCommand(command); - if (ifaceInfo == "") - { - PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get netstat output"); - return; - } - - // remove the word "default" - ifaceInfo.erase(0, 7); - - // remove spaces - while (ifaceInfo.at(0) == ' ') - ifaceInfo.erase(0,1); - - // erase string after gateway IP address - ifaceInfo.resize(ifaceInfo.find(' ', 0)); - - try - { - m_DefaultGateway = IPv4Address(ifaceInfo); - } - catch(const std::exception& e) - { - PCPP_LOG_ERROR("Error retrieving default gateway address: "<< ifaceInfo << ": " << e.what()); - } + std::string command = "netstat -nr | grep default | grep " + m_Name; + std::string ifaceInfo = executeShellCommand(command); + if (ifaceInfo == "") + { + PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get netstat output"); + return; + } + + // remove the word "default" + ifaceInfo.erase(0, 7); + + // remove spaces + while (ifaceInfo.at(0) == ' ') + ifaceInfo.erase(0,1); + + // erase string after gateway IP address + ifaceInfo.resize(ifaceInfo.find(' ', 0)); + + try + { + m_DefaultGateway = IPv4Address(ifaceInfo); + } + catch(const std::exception& e) + { + PCPP_LOG_ERROR("Error retrieving default gateway address: "<< ifaceInfo << ": " << e.what()); + } #endif } From 968f4ca28a603247140b6dde96a20d88924be636 Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Sun, 9 Jun 2024 10:18:05 +0900 Subject: [PATCH 07/13] separate MacOS and FreeBSD header files --- Pcap++/src/PcapLiveDevice.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index 8c98808fe..4b347019b 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -36,12 +36,17 @@ #include #include #endif // if defined(_WIN32) -#if defined(__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) #include #include +#endif + +#if defined(__FreeBSD__) #include +#include #endif + // TODO: FIX FreeBSD // On Mac OS X and FreeBSD timeout of -1 causes pcap_open_live to fail. // A value of 1ms first solve the issue but since Jan. 2024 an issue From 7543cbde046b49f825d0d4ffbfab8ad08fd85966 Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Sun, 9 Jun 2024 23:11:15 +0900 Subject: [PATCH 08/13] add sys header for macOS --- Pcap++/src/PcapLiveDevice.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index 3327429da..df6bdc461 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -40,6 +40,7 @@ #endif // if defined(_WIN32) #if defined(__APPLE__) #include +#include #include #endif From 407259203391b10d9aad1b5bd6739204349daf6f Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Tue, 11 Jun 2024 19:13:53 +0900 Subject: [PATCH 09/13] use tabs for indent --- Pcap++/src/PcapLiveDevice.cpp | 56 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index df6bdc461..0e5a90f44 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1123,11 +1123,11 @@ void PcapLiveDevice::setDefaultGateway() switch (i) { case RTA_GATEWAY: - gateAddr = internal::sockaddr2in_addr(sa); + gateAddr = internal::sockaddr2in_addr(sa); break; case RTA_IFP: if (sa->sa_family == AF_LINK && - reinterpret_cast(sa)->sdl_nlen) + reinterpret_cast(sa)->sdl_nlen) ifp = reinterpret_cast(sa); break; } @@ -1149,32 +1149,32 @@ void PcapLiveDevice::setDefaultGateway() PCPP_LOG_ERROR("Error retrieving default gateway address: "<< inet_ntoa(*gateAddr) << ": " << e.what()); } #elif defined(__FreeBSD__) - std::string command = "netstat -nr | grep default | grep " + m_Name; - std::string ifaceInfo = executeShellCommand(command); - if (ifaceInfo == "") - { - PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get netstat output"); - return; - } - - // remove the word "default" - ifaceInfo.erase(0, 7); - - // remove spaces - while (ifaceInfo.at(0) == ' ') - ifaceInfo.erase(0,1); - - // erase string after gateway IP address - ifaceInfo.resize(ifaceInfo.find(' ', 0)); - - try - { - m_DefaultGateway = IPv4Address(ifaceInfo); - } - catch(const std::exception& e) - { - PCPP_LOG_ERROR("Error retrieving default gateway address: "<< ifaceInfo << ": " << e.what()); - } + std::string command = "netstat -nr | grep default | grep " + m_Name; + std::string ifaceInfo = executeShellCommand(command); + if (ifaceInfo == "") + { + PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get netstat output"); + return; + } + + // remove the word "default" + ifaceInfo.erase(0, 7); + + // remove spaces + while (ifaceInfo.at(0) == ' ') + ifaceInfo.erase(0,1); + + // erase string after gateway IP address + ifaceInfo.resize(ifaceInfo.find(' ', 0)); + + try + { + m_DefaultGateway = IPv4Address(ifaceInfo); + } + catch(const std::exception& e) + { + PCPP_LOG_ERROR("Error retrieving default gateway address: "<< ifaceInfo << ": " << e.what()); + } #endif } From 494828458a0728a0ef95f563f7e6dd2b27365812 Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Thu, 20 Jun 2024 01:37:07 +0900 Subject: [PATCH 10/13] simplify logic by removing unnecessary code --- Pcap++/src/PcapLiveDevice.cpp | 58 +++++++++++++---------------------- 1 file changed, 22 insertions(+), 36 deletions(-) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index 0e5a90f44..57a47274b 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1083,22 +1083,10 @@ void PcapLiveDevice::setDefaultGateway() routingMessage.header.rtm_msglen = sizeof(struct rt_msghdr); routingMessage.header.rtm_version = RTM_VERSION; routingMessage.header.rtm_type = RTM_GET; - routingMessage.header.rtm_addrs = RTA_DST | RTA_NETMASK | RTA_IFP; + routingMessage.header.rtm_addrs = RTA_DST | RTA_NETMASK ; routingMessage.header.rtm_flags = RTF_UP | RTF_GATEWAY | RTF_STATIC; - struct sockaddr_in so_dst = {0} , so_mask = {0}; - struct sockaddr_dl so_ifp = {0}; - - size_t len = sizeof(sockaddr_in); - bcopy(reinterpret_cast(&so_dst), spacePtr, len); - spacePtr += len; - bcopy(reinterpret_cast(&so_mask), spacePtr, len); - spacePtr += len; - routingMessage.header.rtm_msglen += 2*len ; - len = sizeof(sockaddr_dl); - bcopy(reinterpret_cast(&so_ifp), spacePtr, len); - routingMessage.header.rtm_msglen += len ; - + routingMessage.header.rtm_msglen += 2*sizeof(sockaddr_in) ; if (write(sockfd, reinterpret_cast(&routingMessage), routingMessage.header.rtm_msglen) < 0) { PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't write into the routing socket"); @@ -1112,30 +1100,28 @@ void PcapLiveDevice::setDefaultGateway() } struct in_addr *gateAddr = nullptr; - struct sockaddr_dl *ifp = nullptr; struct sockaddr *sa = nullptr; spacePtr = (reinterpret_cast(&routingMessage.header+1)); - for (int i = 1; i != 0; i <<= 1) - { - if (i & routingMessage.header.rtm_addrs) - { - sa = reinterpret_cast(spacePtr); - switch (i) - { - case RTA_GATEWAY: - gateAddr = internal::sockaddr2in_addr(sa); - break; - case RTA_IFP: - if (sa->sa_family == AF_LINK && - reinterpret_cast(sa)->sdl_nlen) - ifp = reinterpret_cast(sa); - break; - } - // Make sure the increment is the nearest multiple of the size of uint32_t - spacePtr += sa->sa_len > 0 ? (1 + (((sa->sa_len) - 1) | (sizeof(uint32_t) - 1))) : sizeof(uint32_t); - } - } - if(gateAddr == nullptr || ifp == nullptr) + auto rtmAddrs = routingMessage.header.rtm_addrs; + int index = 0; + auto roundUpClosetMultiple = [](int multiple, int num){ + return ((num+multiple-1)/multiple)*multiple; + }; + while (rtmAddrs) + { + if (rtmAddrs & 1) { + sa = reinterpret_cast(spacePtr); + if(index == RTA_GATEWAY) { + gateAddr = internal::sockaddr2in_addr(sa); + break; + } + spacePtr += sa->sa_len > 0 ? roundUpClosetMultiple(sizeof(uint32_t), sa->sa_len) : sizeof(uint32_t); + } + index++; + rtmAddrs >>= 1; + } + + if(gateAddr == nullptr) { PCPP_LOG_ERROR("Error retrieving default gateway address: Empty Message related to gate"); return; From 16a9a329534043c697913a3b2f724f4995c40bfd Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Sat, 22 Jun 2024 22:55:44 +0900 Subject: [PATCH 11/13] Fix failed tests --- Pcap++/src/PcapLiveDevice.cpp | 37 ++++++++++++++++------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index 57a47274b..9a6aa7481 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1072,7 +1072,6 @@ void PcapLiveDevice::setDefaultGateway() }; struct BSDRoutingMessage routingMessage; - char* spacePtr = routingMessage.messageSpace; // It creates a raw socket that can be used for routing-related operations int sockfd = socket(PF_ROUTE, SOCK_RAW, 0); if (sockfd < 0) { @@ -1101,28 +1100,26 @@ void PcapLiveDevice::setDefaultGateway() struct in_addr *gateAddr = nullptr; struct sockaddr *sa = nullptr; - spacePtr = (reinterpret_cast(&routingMessage.header+1)); + char* spacePtr = (reinterpret_cast(&routingMessage.header+1)); auto rtmAddrs = routingMessage.header.rtm_addrs; - int index = 0; - auto roundUpClosetMultiple = [](int multiple, int num){ + int index = 1; + auto roundUpClosestMultiple = [](int multiple, int num){ return ((num+multiple-1)/multiple)*multiple; }; - while (rtmAddrs) - { - if (rtmAddrs & 1) { - sa = reinterpret_cast(spacePtr); - if(index == RTA_GATEWAY) { - gateAddr = internal::sockaddr2in_addr(sa); - break; - } - spacePtr += sa->sa_len > 0 ? roundUpClosetMultiple(sizeof(uint32_t), sa->sa_len) : sizeof(uint32_t); - } - index++; - rtmAddrs >>= 1; - } - - if(gateAddr == nullptr) - { + while (rtmAddrs) { + if (rtmAddrs & 1) { + sa = reinterpret_cast(spacePtr); + if (index == RTA_GATEWAY) { + gateAddr = internal::sockaddr2in_addr(sa); + break; + } + spacePtr += sa->sa_len > 0 ? roundUpClosestMultiple(sizeof(uint32_t), sa->sa_len) : sizeof(uint32_t); + } + index++; + rtmAddrs >>= 1; + } + + if (gateAddr == nullptr) { PCPP_LOG_ERROR("Error retrieving default gateway address: Empty Message related to gate"); return; } From 605f1ac261861c6333624c72c87263da1eacad80 Mon Sep 17 00:00:00 2001 From: zhengfeihe Date: Sun, 23 Jun 2024 10:01:33 +0900 Subject: [PATCH 12/13] fix indent problems --- Pcap++/src/PcapLiveDevice.cpp | 56 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index 9a6aa7481..e9b61a3e1 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1100,12 +1100,12 @@ void PcapLiveDevice::setDefaultGateway() struct in_addr *gateAddr = nullptr; struct sockaddr *sa = nullptr; - char* spacePtr = (reinterpret_cast(&routingMessage.header+1)); - auto rtmAddrs = routingMessage.header.rtm_addrs; - int index = 1; - auto roundUpClosestMultiple = [](int multiple, int num){ - return ((num+multiple-1)/multiple)*multiple; - }; + char* spacePtr = (reinterpret_cast(&routingMessage.header+1)); + auto rtmAddrs = routingMessage.header.rtm_addrs; + int index = 1; + auto roundUpClosestMultiple = [](int multiple, int num){ + return ((num+multiple-1)/multiple)*multiple; + }; while (rtmAddrs) { if (rtmAddrs & 1) { sa = reinterpret_cast(spacePtr); @@ -1132,32 +1132,32 @@ void PcapLiveDevice::setDefaultGateway() PCPP_LOG_ERROR("Error retrieving default gateway address: "<< inet_ntoa(*gateAddr) << ": " << e.what()); } #elif defined(__FreeBSD__) - std::string command = "netstat -nr | grep default | grep " + m_Name; - std::string ifaceInfo = executeShellCommand(command); - if (ifaceInfo == "") - { - PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get netstat output"); - return; - } + std::string command = "netstat -nr | grep default | grep " + m_Name; + std::string ifaceInfo = executeShellCommand(command); + if (ifaceInfo == "") + { + PCPP_LOG_DEBUG("Error retrieving default gateway address: couldn't get netstat output"); + return; + } - // remove the word "default" - ifaceInfo.erase(0, 7); + // remove the word "default" + ifaceInfo.erase(0, 7); - // remove spaces - while (ifaceInfo.at(0) == ' ') - ifaceInfo.erase(0,1); + // remove spaces + while (ifaceInfo.at(0) == ' ') + ifaceInfo.erase(0,1); - // erase string after gateway IP address - ifaceInfo.resize(ifaceInfo.find(' ', 0)); + // erase string after gateway IP address + ifaceInfo.resize(ifaceInfo.find(' ', 0)); - try - { - m_DefaultGateway = IPv4Address(ifaceInfo); - } - catch(const std::exception& e) - { - PCPP_LOG_ERROR("Error retrieving default gateway address: "<< ifaceInfo << ": " << e.what()); - } + try + { + m_DefaultGateway = IPv4Address(ifaceInfo); + } + catch(const std::exception& e) + { + PCPP_LOG_ERROR("Error retrieving default gateway address: "<< ifaceInfo << ": " << e.what()); + } #endif } From 32d4e297d28736f2c7c2e60c5c83427a412b41ad Mon Sep 17 00:00:00 2001 From: seladb Date: Sun, 23 Jun 2024 02:50:21 -0700 Subject: [PATCH 13/13] Fix formatting --- Pcap++/header/PcapLiveDevice.h | 4 ++-- Pcap++/src/PcapLiveDevice.cpp | 37 ++++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/Pcap++/header/PcapLiveDevice.h b/Pcap++/header/PcapLiveDevice.h index 57ae7d31e..e4b88ba2f 100644 --- a/Pcap++/header/PcapLiveDevice.h +++ b/Pcap++/header/PcapLiveDevice.h @@ -1,10 +1,10 @@ #pragma once #include -#include +#include #include #include -#include +#include #include "IpAddress.h" #include "Packet.h" diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index e9b61a3e1..a2e1a79c8 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -1066,15 +1066,17 @@ void PcapLiveDevice::setDefaultGateway() #elif defined(__APPLE__) //route message struct for communication in APPLE device - struct BSDRoutingMessage{ - struct rt_msghdr header; - char messageSpace[512]; + struct BSDRoutingMessage + { + struct rt_msghdr header; + char messageSpace[512]; }; struct BSDRoutingMessage routingMessage; // It creates a raw socket that can be used for routing-related operations int sockfd = socket(PF_ROUTE, SOCK_RAW, 0); - if (sockfd < 0) { + if (sockfd < 0) + { PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't get open routing socket"); return ; } @@ -1084,32 +1086,36 @@ void PcapLiveDevice::setDefaultGateway() routingMessage.header.rtm_type = RTM_GET; routingMessage.header.rtm_addrs = RTA_DST | RTA_NETMASK ; routingMessage.header.rtm_flags = RTF_UP | RTF_GATEWAY | RTF_STATIC; + routingMessage.header.rtm_msglen += 2 * sizeof(sockaddr_in); - routingMessage.header.rtm_msglen += 2*sizeof(sockaddr_in) ; - - if (write(sockfd, reinterpret_cast(&routingMessage), routingMessage.header.rtm_msglen) < 0) { + if (write(sockfd, reinterpret_cast(&routingMessage), routingMessage.header.rtm_msglen) < 0) + { PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't write into the routing socket"); return; } // Read the response from the route socket - if (read(sockfd, reinterpret_cast(&routingMessage), sizeof(routingMessage)) < 0) { + if (read(sockfd, reinterpret_cast(&routingMessage), sizeof(routingMessage)) < 0) + { PCPP_LOG_ERROR("Error retrieving default gateway address: couldn't read from the routing socket"); return; } struct in_addr *gateAddr = nullptr; struct sockaddr *sa = nullptr; - char* spacePtr = (reinterpret_cast(&routingMessage.header+1)); + char* spacePtr = (reinterpret_cast(&routingMessage.header + 1)); auto rtmAddrs = routingMessage.header.rtm_addrs; int index = 1; - auto roundUpClosestMultiple = [](int multiple, int num){ - return ((num+multiple-1)/multiple)*multiple; + auto roundUpClosestMultiple = [](int multiple, int num) { + return ((num+multiple - 1) / multiple) * multiple; }; - while (rtmAddrs) { - if (rtmAddrs & 1) { + while (rtmAddrs) + { + if (rtmAddrs & 1) + { sa = reinterpret_cast(spacePtr); - if (index == RTA_GATEWAY) { + if (index == RTA_GATEWAY) + { gateAddr = internal::sockaddr2in_addr(sa); break; } @@ -1119,7 +1125,8 @@ void PcapLiveDevice::setDefaultGateway() rtmAddrs >>= 1; } - if (gateAddr == nullptr) { + if (gateAddr == nullptr) + { PCPP_LOG_ERROR("Error retrieving default gateway address: Empty Message related to gate"); return; }