72 lines
1.9 KiB
C
72 lines
1.9 KiB
C
#include "ipaddr.h"
|
|
|
|
const ipaddr_t error_addr = {{0, 0, 0, 0, 0, 0, 0, 0}, -1};
|
|
|
|
ipaddr_t glv_ip_aton(const char* addr) {
|
|
ipaddr_t addr_out = {{0, 0, 0, 0, 0, 0, 0, 0}, 0};
|
|
char token[5] = {0, 0, 0, 0, 0};
|
|
const int length = strlen(addr);
|
|
int i, j = 0, k = 0, tmp;
|
|
|
|
if(strchr(addr, ':') != NULL && strchr(addr, '.') != NULL)
|
|
return error_addr;
|
|
if(strcnt(addr, '/') > 1)
|
|
return error_addr;
|
|
|
|
if(strchr(addr, '.') != NULL) {
|
|
if(strcnt(addr, '.') != 3)
|
|
return error_addr;
|
|
|
|
addr_out.addr[5] = 0xFFFF;
|
|
for(i = 0; i < length; ++i) {
|
|
if(addr[i] == ' ')
|
|
continue;
|
|
else if(addr[i] == '.' || addr[i] == '/' || i == length - 1) {
|
|
if(j == 0)
|
|
return error_addr;
|
|
|
|
token[j] = 0;
|
|
if((tmp = atoi(token)) > 255)
|
|
return error_addr;
|
|
|
|
if(k < 4) {
|
|
addr_out.addr[6 + (k / 2)] |=
|
|
(tmp << (k % 2 == 0 ? 8 : 0));
|
|
j = 0;
|
|
++k;
|
|
} else {
|
|
if(tmp > 32)
|
|
return error_addr;
|
|
addr_out.cidr = tmp;
|
|
}
|
|
|
|
if(addr[i] == '/' && k != 4)
|
|
return error_addr;
|
|
} else if(addr[i] >= '0' && addr[i] <= '9') {
|
|
if(j == 3)
|
|
return error_addr;
|
|
token[j++] = addr[i];
|
|
} else
|
|
return error_addr;
|
|
}
|
|
} else {
|
|
if(strcnt(addr, ':') > 7)
|
|
return error_addr;
|
|
|
|
|
|
}
|
|
|
|
return addr_out;
|
|
}
|
|
|
|
ipaddr_t glv_ip_raw(const uint16_t* addr, uint8_t cidr) {
|
|
ipaddr_t addr_out;
|
|
memcpy(addr_out.addr, addr, 16);
|
|
addr_out.cidr = cidr;
|
|
|
|
return addr_out;
|
|
}
|
|
|
|
int glv_ip_valid(const ipaddr_t* addr) {
|
|
return addr->cidr == -1;
|
|
} |