summaryrefslogtreecommitdiff
path: root/src/sp_network_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sp_network_utils.c')
-rw-r--r--src/sp_network_utils.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/src/sp_network_utils.c b/src/sp_network_utils.c
index 4b78ca5..206ae5b 100644
--- a/src/sp_network_utils.c
+++ b/src/sp_network_utils.c
@@ -32,9 +32,8 @@ static inline bool cidr6_match(const struct in6_addr address,
32 const uint32_t *n = network.__u6_addr.__u6_addr32; 32 const uint32_t *n = network.__u6_addr.__u6_addr32;
33#endif 33#endif
34*/ 34*/
35 int bits_whole, bits_incomplete; 35 int bits_whole = bits >> 5; // number of whole u32
36 bits_whole = bits >> 5; // number of whole u32 36 int bits_incomplete = bits & 0x1F; // number of bits in incomplete u32
37 bits_incomplete = bits & 0x1F; // number of bits in incomplete u32
38 if (bits_whole) { 37 if (bits_whole) {
39 if (memcmp(a, n, bits_whole << 2)) { 38 if (memcmp(a, n, bits_whole << 2)) {
40 return false; 39 return false;
@@ -53,12 +52,8 @@ static inline int get_ip_version(const char *ip) {
53 struct in_addr out4; 52 struct in_addr out4;
54 struct in6_addr out6; 53 struct in6_addr out6;
55 int res = inet_pton(AF_INET, ip, &out4); 54 int res = inet_pton(AF_INET, ip, &out4);
56 if (0 == res) { 55 if ((0 == res) && (1 == inet_pton(AF_INET6, ip, &out6))) {
57 if (1 == inet_pton(AF_INET6, ip, &out6)) { 56 return AF_INET6;
58 return AF_INET6;
59 } else {
60 return -1;
61 }
62 } else if (1 == res) { 57 } else if (1 == res) {
63 return AF_INET; 58 return AF_INET;
64 } else { 59 } else {
@@ -66,7 +61,6 @@ static inline int get_ip_version(const char *ip) {
66 } 61 }
67} 62}
68 63
69// TODO factorise a bit this function
70bool cidr_match(const char *ip, const sp_cidr *cidr) { 64bool cidr_match(const char *ip, const sp_cidr *cidr) {
71 struct in_addr out4; 65 struct in_addr out4;
72 struct in6_addr out6; 66 struct in6_addr out6;
@@ -86,7 +80,6 @@ bool cidr_match(const char *ip, const sp_cidr *cidr) {
86 return cidr6_match(out6, cidr->ip.ipv6, cidr->mask); 80 return cidr6_match(out6, cidr->ip.ipv6, cidr->mask);
87 default: 81 default:
88 sp_log_err("cidr_match", "Weird ip (%s) family", ip); 82 sp_log_err("cidr_match", "Weird ip (%s) family", ip);
89 break;
90 } 83 }
91 return false; 84 return false;
92} 85}
@@ -111,6 +104,8 @@ int get_ip_and_cidr(char *ip, sp_cidr *cidr) {
111 104
112 cidr->ip_version = get_ip_version(ip); 105 cidr->ip_version = get_ip_version(ip);
113 106
107 assert(cidr->ip_version == AF_INET6 || cidr->ip_version == AF_INET);
108
114 if (AF_INET == cidr->ip_version) { 109 if (AF_INET == cidr->ip_version) {
115 if (cidr->mask > 32) { 110 if (cidr->mask > 32) {
116 sp_log_err("config", "'%d' isn't a valid ipv4 mask.", cidr->mask); 111 sp_log_err("config", "'%d' isn't a valid ipv4 mask.", cidr->mask);
@@ -119,8 +114,6 @@ int get_ip_and_cidr(char *ip, sp_cidr *cidr) {
119 inet_pton(AF_INET, ip, &(cidr->ip.ipv4)); 114 inet_pton(AF_INET, ip, &(cidr->ip.ipv4));
120 } else if (AF_INET6 == cidr->ip_version) { 115 } else if (AF_INET6 == cidr->ip_version) {
121 inet_pton(AF_INET6, ip, &(cidr->ip.ipv6)); 116 inet_pton(AF_INET6, ip, &(cidr->ip.ipv6));
122 } else {
123 return -1;
124 } 117 }
125 118
126 ip[mask - ip] = '/'; 119 ip[mask - ip] = '/';