diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-10-24 21:04:38 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-10-24 21:04:38 +0000 |
commit | 23b1580d020611e4f8de6c8964231d1ef6cf0342 (patch) | |
tree | 7802554213f99b1c5110669ac167e35ebcda54a5 /src/nat/nat_api.c | |
parent | 0cda05a0cbbe53f97f74062cbd3fedca7d602925 (diff) | |
download | gnunet-23b1580d020611e4f8de6c8964231d1ef6cf0342.tar.gz gnunet-23b1580d020611e4f8de6c8964231d1ef6cf0342.zip |
more work on new nat library
Diffstat (limited to 'src/nat/nat_api.c')
-rw-r--r-- | src/nat/nat_api.c | 108 |
1 files changed, 97 insertions, 11 deletions
diff --git a/src/nat/nat_api.c b/src/nat/nat_api.c index e7320eb50..e0c83f41e 100644 --- a/src/nat/nat_api.c +++ b/src/nat/nat_api.c | |||
@@ -155,8 +155,21 @@ static int | |||
155 | check_connection_reversal_request (void *cls, | 155 | check_connection_reversal_request (void *cls, |
156 | const struct GNUNET_NAT_ConnectionReversalRequestedMessage *crm) | 156 | const struct GNUNET_NAT_ConnectionReversalRequestedMessage *crm) |
157 | { | 157 | { |
158 | GNUNET_break (0); | 158 | if (ntohs (crm->header.size) != |
159 | return GNUNET_SYSERR; | 159 | sizeof (*crm) + |
160 | ntohs (crm->local_addr_size) + | ||
161 | ntohs (crm->remote_addr_size) ) | ||
162 | { | ||
163 | GNUNET_break (0); | ||
164 | return GNUNET_SYSERR; | ||
165 | } | ||
166 | if ( (sizeof (struct sockaddr_in) != ntohs (crm->local_addr_size)) || | ||
167 | (sizeof (struct sockaddr_in) != ntohs (crm->remote_addr_size)) ) | ||
168 | { | ||
169 | GNUNET_break (0); | ||
170 | return GNUNET_SYSERR; | ||
171 | } | ||
172 | return GNUNET_OK; | ||
160 | } | 173 | } |
161 | 174 | ||
162 | 175 | ||
@@ -170,9 +183,15 @@ static void | |||
170 | handle_connection_reversal_request (void *cls, | 183 | handle_connection_reversal_request (void *cls, |
171 | const struct GNUNET_NAT_ConnectionReversalRequestedMessage *crm) | 184 | const struct GNUNET_NAT_ConnectionReversalRequestedMessage *crm) |
172 | { | 185 | { |
173 | // FIXME: parse | 186 | struct GNUNET_NAT_Handle *nh = cls; |
174 | // FIXME: call callback! | 187 | const struct sockaddr_in *local_sa = (const struct sockaddr_in *) &crm[1]; |
175 | GNUNET_break (0); | 188 | const struct sockaddr_in *remote_sa = &local_sa[1]; |
189 | |||
190 | nh->reversal_callback (nh->callback_cls, | ||
191 | (const struct sockaddr *) local_sa, | ||
192 | sizeof (struct sockaddr_in), | ||
193 | (const struct sockaddr *) remote_sa, | ||
194 | sizeof (struct sockaddr_in)); | ||
176 | } | 195 | } |
177 | 196 | ||
178 | 197 | ||
@@ -187,8 +206,37 @@ static int | |||
187 | check_address_change_notification (void *cls, | 206 | check_address_change_notification (void *cls, |
188 | const struct GNUNET_NAT_AddressChangeNotificationMessage *acn) | 207 | const struct GNUNET_NAT_AddressChangeNotificationMessage *acn) |
189 | { | 208 | { |
190 | GNUNET_break (0); | 209 | size_t alen = ntohs (acn->header.size) - sizeof (*acn); |
191 | return GNUNET_SYSERR; | 210 | |
211 | switch (alen) | ||
212 | { | ||
213 | case sizeof (struct sockaddr_in): | ||
214 | { | ||
215 | const struct sockaddr_in *s4 | ||
216 | = (const struct sockaddr_in *) &acn[1]; | ||
217 | if (AF_INET != s4->sin_family) | ||
218 | { | ||
219 | GNUNET_break (0); | ||
220 | return GNUNET_SYSERR; | ||
221 | } | ||
222 | } | ||
223 | break; | ||
224 | case sizeof (struct sockaddr_in6): | ||
225 | { | ||
226 | const struct sockaddr_in6 *s6 | ||
227 | = (const struct sockaddr_in6 *) &acn[1]; | ||
228 | if (AF_INET6 != s6->sin6_family) | ||
229 | { | ||
230 | GNUNET_break (0); | ||
231 | return GNUNET_SYSERR; | ||
232 | } | ||
233 | } | ||
234 | break; | ||
235 | default: | ||
236 | GNUNET_break (0); | ||
237 | return GNUNET_SYSERR; | ||
238 | } | ||
239 | return GNUNET_OK; | ||
192 | } | 240 | } |
193 | 241 | ||
194 | 242 | ||
@@ -202,10 +250,48 @@ static void | |||
202 | handle_address_change_notification (void *cls, | 250 | handle_address_change_notification (void *cls, |
203 | const struct GNUNET_NAT_AddressChangeNotificationMessage *acn) | 251 | const struct GNUNET_NAT_AddressChangeNotificationMessage *acn) |
204 | { | 252 | { |
205 | // FIXME: parse | 253 | struct GNUNET_NAT_Handle *nh = cls; |
206 | // FIXME: update ae-DLL | 254 | size_t alen = ntohs (acn->header.size) - sizeof (*acn); |
207 | // FIXME: call callback! | 255 | const struct sockaddr *sa = (const struct sockaddr *) &acn[1]; |
208 | GNUNET_break (0); | 256 | enum GNUNET_NAT_AddressClass ac; |
257 | struct AddrEntry *ae; | ||
258 | |||
259 | ac = (enum GNUNET_NAT_AddressClass) ntohl (acn->addr_class); | ||
260 | if (GNUNET_YES == ntohl (acn->add_remove)) | ||
261 | { | ||
262 | ae = GNUNET_malloc (sizeof (*ae) + alen); | ||
263 | ae->addrlen = alen; | ||
264 | GNUNET_memcpy (&ae[1], | ||
265 | sa, | ||
266 | alen); | ||
267 | GNUNET_CONTAINER_DLL_insert (nh->ae_head, | ||
268 | nh->ae_tail, | ||
269 | ae); | ||
270 | } | ||
271 | else | ||
272 | { | ||
273 | for (ae = nh->ae_head; NULL != ae; ae = ae->next) | ||
274 | if ( (ae->addrlen == alen) && | ||
275 | (0 == memcmp (&ae[1], | ||
276 | sa, | ||
277 | alen)) ) | ||
278 | break; | ||
279 | if (NULL == ae) | ||
280 | { | ||
281 | GNUNET_break (0); | ||
282 | reconnect (nh); | ||
283 | return; | ||
284 | } | ||
285 | GNUNET_CONTAINER_DLL_remove (nh->ae_head, | ||
286 | nh->ae_tail, | ||
287 | ae); | ||
288 | GNUNET_free (ae); | ||
289 | } | ||
290 | nh->address_callback (nh->callback_cls, | ||
291 | ntohl (acn->add_remove), | ||
292 | ac, | ||
293 | sa, | ||
294 | alen); | ||
209 | } | 295 | } |
210 | 296 | ||
211 | 297 | ||