diff --git a/src/server/main.c b/src/server/main.c index 0ef11a0..3910e36 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -2,6 +2,8 @@ #include "util/ipaddr.h" int main(int argc, char** argv) { - ipaddr_t test = glv_ip_aton("1234::/64"); + ipaddr_t a = glv_ip_aton("1234:5678::b00b:d00d:def0/62"); + ipaddr_t b = glv_ip_aton("1234:5678::b00b:b00b:def0"); + int out = glv_ip_compare(&a, &b); return 0; } \ No newline at end of file diff --git a/src/server/util/ipaddr.c b/src/server/util/ipaddr.c index db909a9..2399234 100644 --- a/src/server/util/ipaddr.c +++ b/src/server/util/ipaddr.c @@ -1,5 +1,8 @@ #include "ipaddr.h" +#define MAX(X,Y) (((X)>(Y))?(X):(Y)) +#define MIN(X,Y) (((X)<(Y))?(X):(Y)) + const ipaddr_t error_addr = {{0, 0, 0, 0, 0, 0, 0, 0}, -1}; ipaddr_t glv_ip_aton(const char* addr) { @@ -137,6 +140,45 @@ ipaddr_t glv_ip_raw(const uint16_t* addr, uint8_t cidr) { return addr_out; } +int glv_ip_check(const char* addr) { + ipaddr_t test = glv_ip_aton(addr); + return glv_ip_valid(&test); +} + +int glv_ip_compare(const ipaddr_t* lhs, const ipaddr_t* rhs) { + int i = 0, lhs_cidr = lhs->cidr, rhs_cidr = rhs->cidr, mask; + for(i = 0; i < 8; ++i) { + mask = 0xFFFF + & ~((1 << (16 - MIN(16, lhs_cidr))) - 1) + & ~((1 << (16 - MIN(16, rhs_cidr))) - 1); + if(mask == 0) + break; + + if((lhs->addr[i] & mask) != (rhs->addr[i] & mask)) + return 0; + + lhs_cidr = MAX(0, lhs_cidr - 16); + rhs_cidr = MAX(0, rhs_cidr - 16); + } + + return 1; +} + +int glv_ip_identical(const ipaddr_t* lhs, const ipaddr_t* rhs) { + int i; + for(i = 0; i < 8; ++i) + if(lhs->addr[i] != rhs->addr[i]) + return 0; + + return 1; +} + +int glv_ip_isv4(const ipaddr_t* addr) { + return addr->addr[0] == 0 && addr->addr[1] == 0 && + addr->addr[2] == 0 && addr->addr[3] == 0 && + addr->addr[4] == 0 && addr->addr[5] == 0xFFFF; +} + int glv_ip_valid(const ipaddr_t* addr) { return addr->cidr == -1; } \ No newline at end of file diff --git a/src/server/util/ipaddr.h b/src/server/util/ipaddr.h index 8be7466..7df518d 100644 --- a/src/server/util/ipaddr.h +++ b/src/server/util/ipaddr.h @@ -1,12 +1,13 @@ #ifndef GLV_UTIL_IPADDR_H #define GLV_UTIL_IPADDR_H -#include "util/string.h" #include #include #include #include +#include "util/string.h" + typedef struct { uint16_t addr[8]; uint8_t cidr;