More IPv6 updates.

This commit is contained in:
Jonathan Naylor
2020-09-05 20:15:23 +01:00
parent 5e3e9f10b9
commit 7e2f4d3c6e
5 changed files with 70 additions and 27 deletions

View File

@@ -237,19 +237,29 @@ bool CConf::read()
continue; continue;
} }
char* key = ::strtok(buffer, " \t=\r\n"); char* key = ::strtok(buffer, " \t=\r\n");
if (key == NULL) if (key == NULL)
continue; continue;
char* value = ::strtok(NULL, "\r\n"); char* value = ::strtok(NULL, "\r\n");
if (value == NULL) if (value == NULL)
continue; continue;
// Remove quotes from the value // Remove quotes from the value
size_t len = ::strlen(value); size_t len = ::strlen(value);
if (len > 1U && *value == '"' && value[len - 1U] == '"') { if (len > 1U && *value == '"' && value[len - 1U] == '"') {
value[len - 1U] = '\0'; value[len - 1U] = '\0';
value++; value++;
} else {
char *p;
// if value is not quoted, remove after # (to make comment)
if ((p = strchr(value, '#')) != NULL)
*p = '\0';
// remove trailing tab/space
for (p = value + strlen(value) - 1U; p >= value && (*p == '\t' || *p == ' '); p--)
*p = '\0';
} }
if (section == SECTION_GENERAL) { if (section == SECTION_GENERAL) {

View File

@@ -89,7 +89,7 @@ bool CMMDVMNetwork::open()
{ {
LogMessage("MMDVM Network, Opening"); LogMessage("MMDVM Network, Opening");
return m_socket.open(); return m_socket.open(m_rptAddress);
} }
bool CMMDVMNetwork::read(CDMRData& data) bool CMMDVMNetwork::read(CDMRData& data)

View File

@@ -96,28 +96,47 @@ int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_
return 0; return 0;
} }
bool CUDPSocket::match(const sockaddr_storage& addr1, const sockaddr_storage& addr2) bool CUDPSocket::match(const sockaddr_storage& addr1, const sockaddr_storage& addr2, IPMATCHTYPE type)
{ {
if (addr1.ss_family != addr2.ss_family) if (addr1.ss_family != addr2.ss_family)
return false; return false;
switch (addr1.ss_family) { if (type == IMT_ADDRESS_AND_PORT) {
case AF_INET: switch (addr1.ss_family) {
struct sockaddr_in *in_1, *in_2; case AF_INET:
in_1 = (struct sockaddr_in*)&addr1; struct sockaddr_in *in_1, *in_2;
in_2 = (struct sockaddr_in*)&addr2; in_1 = (struct sockaddr_in*)&addr1;
return ((in_1->sin_addr.s_addr == in_2->sin_addr.s_addr) && (in_1->sin_port == in_2->sin_port)); in_2 = (struct sockaddr_in*)&addr2;
case AF_INET6: return (in_1->sin_addr.s_addr == in_2->sin_addr.s_addr) && (in_1->sin_port == in_2->sin_port);
struct sockaddr_in6 *in6_1, *in6_2; case AF_INET6:
in6_1 = (struct sockaddr_in6*)&addr1; struct sockaddr_in6 *in6_1, *in6_2;
in6_2 = (struct sockaddr_in6*)&addr2; in6_1 = (struct sockaddr_in6*)&addr1;
return (IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr) && (in6_1->sin6_port == in6_2->sin6_port)); in6_2 = (struct sockaddr_in6*)&addr2;
default: return IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr) && (in6_1->sin6_port == in6_2->sin6_port);
default:
return false;
}
} else if (type == IMT_ADDRESS_ONLY) {
switch (addr1.ss_family) {
case AF_INET:
struct sockaddr_in *in_1, *in_2;
in_1 = (struct sockaddr_in*)&addr1;
in_2 = (struct sockaddr_in*)&addr2;
return in_1->sin_addr.s_addr == in_2->sin_addr.s_addr;
case AF_INET6:
struct sockaddr_in6 *in6_1, *in6_2;
in6_1 = (struct sockaddr_in6*)&addr1;
in6_2 = (struct sockaddr_in6*)&addr2;
return IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr);
default:
return false;
}
} else {
return false; return false;
} }
} }
bool CUDPSocket::isnone(const sockaddr_storage& addr) bool CUDPSocket::isNone(const sockaddr_storage& addr)
{ {
struct sockaddr_in *in = (struct sockaddr_in *)&addr; struct sockaddr_in *in = (struct sockaddr_in *)&addr;
@@ -129,14 +148,19 @@ bool CUDPSocket::open()
return open(AF_UNSPEC); return open(AF_UNSPEC);
} }
bool CUDPSocket::open(const unsigned int af) bool CUDPSocket::open(const sockaddr_storage& address)
{
return open(address.ss_family);
}
bool CUDPSocket::open(unsigned int af)
{ {
sockaddr_storage addr; sockaddr_storage addr;
unsigned int addrlen; unsigned int addrlen;
struct addrinfo hints; struct addrinfo hints;
::memset(&hints, 0, sizeof(hints)); ::memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_PASSIVE; hints.ai_flags = AI_PASSIVE;
hints.ai_family = af; hints.ai_family = af;
/* to determine protocol family, call lookup() first. */ /* to determine protocol family, call lookup() first. */
@@ -235,6 +259,7 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storag
} }
address_length = size; address_length = size;
return len; return len;
} }

View File

@@ -35,6 +35,11 @@
#include <ws2tcpip.h> #include <ws2tcpip.h>
#endif #endif
enum IPMATCHTYPE {
IMT_ADDRESS_AND_PORT,
IMT_ADDRESS_ONLY
};
class CUDPSocket { class CUDPSocket {
public: public:
CUDPSocket(const std::string& address, unsigned int port = 0U); CUDPSocket(const std::string& address, unsigned int port = 0U);
@@ -42,7 +47,8 @@ public:
~CUDPSocket(); ~CUDPSocket();
bool open(); bool open();
bool open(const unsigned int af); bool open(unsigned int af);
bool open(const sockaddr_storage& address);
int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length); int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length);
bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length); bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length);
@@ -51,8 +57,10 @@ public:
static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage& address, unsigned int& address_length); static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage& address, unsigned int& address_length);
static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage& address, unsigned int& address_length, struct addrinfo& hints); static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage& address, unsigned int& address_length, struct addrinfo& hints);
static bool match(const sockaddr_storage& addr1, const sockaddr_storage& addr2);
static bool isnone(const sockaddr_storage& addr); static bool match(const sockaddr_storage& addr1, const sockaddr_storage& addr2, IPMATCHTYPE type = IMT_ADDRESS_AND_PORT);
static bool isNone(const sockaddr_storage& addr);
private: private:
std::string m_address; std::string m_address;

View File

@@ -19,6 +19,6 @@
#if !defined(VERSION_H) #if !defined(VERSION_H)
#define VERSION_H #define VERSION_H
const char* VERSION = "20200903"; const char* VERSION = "20200905";
#endif #endif