1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 /*
7 WARNING: This file was generated by the dkct program (see
8 http://dktools.sourceforge.net/ for details).
9 Changes you make here will be lost if dkct is run again!
10 You should modify the original source and run dkct on it.
11 Original source: dk4sock28.ctr
12 */
13
14 /** @file dk4sock28.c The dk4sock28 module.
15 */
16
17
18 #include "dk4conf.h"
19 #include <libdk4base/dk4types.h>
20 #include <libdk4base/dk4error.h>
21 #include <libdk4sock/dk4sock.h>
22 #include <libdk4c/dk4sto.h>
23
24
25
26
27
28
29
30 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
31
32 /** Compare IPv6 address structures.
33 @param left Left address in comparison.
34 @param mask Network mask to use, may be NULL.
35 @param right Right address in comparison.
36 @return -1, 0 or 1 if l<r, l==r or l>r.
37 */
38 static
39 int
dk4socket_compare_in6_addr3(const struct in6_addr * left,const struct in6_addr * mask,const struct in6_addr * right)40 dk4socket_compare_in6_addr3(
41 const struct in6_addr *left,
42 const struct in6_addr *mask,
43 const struct in6_addr *right
44 )
45 {
46 const unsigned char *ucl;
47 const unsigned char *ucm;
48 const unsigned char *ucr;
49 unsigned char ul;
50 unsigned char ur;
51 size_t i;
52
53 int back = 0;
54 ucl = &(left->s6_addr[0]);
55 ucm = &(mask->s6_addr[0]);
56 ucr = &(right->s6_addr[0]);
57 for (i = 0; ((16 > i) && (0 == back)); i++) {
58 ul = ucl[i];
59 ur = ucr[i];
60 if (NULL != mask) {
61 ul &= ucm[i];
62 ur &= ucm[i];
63 }
64 if (ul > ur) {
65 back = 1;
66 } else {
67 if (ul < ur) {
68 back = -1;
69 }
70 }
71 }
72 return back;
73 }
74
75 #endif
76
77
78
79 int
dk4socket_allowed_peer_compare(const void * pl,const void * pr,int cr)80 dk4socket_allowed_peer_compare(
81 const void *pl,
82 const void *pr,
83 int cr
84 )
85 {
86 const dk4_allowed_peer_t *ppl;
87 const dk4_allowed_peer_t *ppr;
88 const struct sockaddr *pso;
89 const struct sockaddr_in *ps4;
90 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
91 const struct sockaddr_in6 *ps6;
92 #endif
93 unsigned long ul1;
94 unsigned long ul2;
95 unsigned long ul3;
96 int back = 0;
97
98 if (NULL != pl) {
99 if (NULL != pr) {
100 switch (cr) {
101 case 1: {
102 ppl = (const dk4_allowed_peer_t *)pl;
103 pso = (const struct sockaddr *)pr;
104
105 if (ppl->af < pso->sa_family) {
106 back = -1;
107 } else {
108 if (ppl->af > pso->sa_family) {
109 back = 1;
110 }
111 }
112 if (0 == back) {
113 switch (ppl->af) {
114 case AF_INET : {
115 ul1 = (ppl->data).ipv4.ad.s_addr;
116 ul3 = (ppl->data).ipv4.ma.s_addr;
117 ps4 = (const struct sockaddr_in *)pso;
118 ul2 = ps4->sin_addr.s_addr;
119 ul1 = (unsigned long)dk4socket_ntohl((uint32_t)ul1);
120 ul2 = (unsigned long)dk4socket_ntohl((uint32_t)ul2);
121 ul3 = (unsigned long)dk4socket_ntohl((uint32_t)ul3);
122
123
124
125 ul1 &= ul3;
126 ul2 &= ul3;
127
128
129 if (ul1 > ul2) {
130 back = 1;
131 } else {
132 if (ul1 < ul2) {
133 back = -1;
134 }
135 }
136 } break;
137 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
138 case AF_INET6 : {
139 ps6 = (const struct sockaddr_in6 *)pso;
140 back = dk4socket_compare_in6_addr3(
141 &((ppl->data).ipv6.ad),
142 &((ppl->data).ipv6.ma),
143 &(ps6->sin6_addr)
144 );
145 } break;
146 #endif
147 }
148 }
149 } break;
150 default : {
151 ppl = (const dk4_allowed_peer_t *)pl;
152 ppr = (const dk4_allowed_peer_t *)pr;
153 if (ppl->af < ppr->af) {
154 back = -1;
155 } else {
156 if (ppl->af > ppr->af) {
157 back = 1;
158 }
159 }
160 if (0 == back) {
161 switch (ppl->af) {
162 case AF_INET : {
163 ul1 = (ppl->data).ipv4.ad.s_addr;
164 ul2 = (ppr->data).ipv4.ad.s_addr;
165 ul1 = (unsigned long)dk4socket_ntohl((uint32_t)ul1);
166 ul2 = (unsigned long)dk4socket_ntohl((uint32_t)ul2);
167 if (ul1 > ul2) {
168 back = 1;
169 } else {
170 if (ul1 < ul2) {
171 back = -1;
172 }
173 }
174 ul1 = (ppl->data).ipv4.ma.s_addr;
175 ul2 = (ppr->data).ipv4.ma.s_addr;
176 ul1 = (unsigned long)dk4socket_ntohl((uint32_t)ul1);
177 ul2 = (unsigned long)dk4socket_ntohl((uint32_t)ul2);
178 if (ul1 > ul2) {
179 back = 1;
180 } else {
181 if (ul1 < ul2) {
182 back = -1;
183 }
184 }
185 } break;
186 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
187 case AF_INET6 : {
188 back = dk4socket_compare_in6_addr3(
189 &((ppl->data).ipv6.ad),
190 NULL,
191 &((ppr->data).ipv6.ad)
192 );
193 if (0 == back) {
194 back = dk4socket_compare_in6_addr3(
195 &((ppl->data).ipv6.ma),
196 NULL,
197 &((ppr->data).ipv6.ma)
198 );
199 }
200 } break;
201 #endif
202 }
203 }
204 } break;
205 }
206 } else { back= 1; }
207 } else {
208 if (NULL != pr) { back = -1; }
209 }
210 return back;
211 }
212
213