diff options
Diffstat (limited to 'src/vpn/gnunet-daemon-vpn-helper.c')
-rw-r--r-- | src/vpn/gnunet-daemon-vpn-helper.c | 137 |
1 files changed, 92 insertions, 45 deletions
diff --git a/src/vpn/gnunet-daemon-vpn-helper.c b/src/vpn/gnunet-daemon-vpn-helper.c index fdb5dddaa..3ac11a2b2 100644 --- a/src/vpn/gnunet-daemon-vpn-helper.c +++ b/src/vpn/gnunet-daemon-vpn-helper.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <gnunet_container_lib.h> | 33 | #include <gnunet_container_lib.h> |
34 | #include <block_dns.h> | 34 | #include <block_dns.h> |
35 | #include <gnunet_configuration_lib.h> | 35 | #include <gnunet_configuration_lib.h> |
36 | #include <gnunet_applications.h> | ||
36 | 37 | ||
37 | #include "gnunet-daemon-vpn-dns.h" | 38 | #include "gnunet-daemon-vpn-dns.h" |
38 | #include "gnunet-daemon-vpn.h" | 39 | #include "gnunet-daemon-vpn.h" |
@@ -44,6 +45,13 @@ | |||
44 | 45 | ||
45 | struct GNUNET_VPN_HELPER_Handle *helper_handle; | 46 | struct GNUNET_VPN_HELPER_Handle *helper_handle; |
46 | 47 | ||
48 | struct remote_addr | ||
49 | { | ||
50 | char addrlen; | ||
51 | unsigned char addr[16]; | ||
52 | char proto; | ||
53 | }; | ||
54 | |||
47 | /** | 55 | /** |
48 | * Start the helper-process | 56 | * Start the helper-process |
49 | * | 57 | * |
@@ -250,63 +258,102 @@ message_token (void *cls, | |||
250 | sizeof (GNUNET_HashCode) + | 258 | sizeof (GNUNET_HashCode) + |
251 | ntohs (pkt6->ip6_hdr.paylgth)); | 259 | ntohs (pkt6->ip6_hdr.paylgth)); |
252 | 260 | ||
253 | memcpy (hc, &me->desc.service_descriptor, | 261 | GNUNET_MESH_ApplicationType app_type; |
254 | sizeof (GNUNET_HashCode)); | 262 | if (me->addrlen == 0) |
255 | |||
256 | if (0x11 == pkt6->ip6_hdr.nxthdr | ||
257 | && (me->desc. | ||
258 | service_type & htonl (GNUNET_DNS_SERVICE_TYPE_UDP)) | ||
259 | && (port_in_ports (me->desc.ports, pkt6_udp->udp_hdr.dpt) | ||
260 | || testBit (me->additional_ports, | ||
261 | ntohs (pkt6_udp->udp_hdr.dpt)))) | ||
262 | { | 263 | { |
263 | hdr->type = ntohs (GNUNET_MESSAGE_TYPE_SERVICE_UDP); | 264 | /* This is a mapping to a gnunet-service */ |
264 | 265 | memcpy (hc, &me->desc.service_descriptor, | |
265 | memcpy (hc + 1, &pkt6_udp->udp_hdr, | 266 | sizeof (GNUNET_HashCode)); |
266 | ntohs (pkt6_udp->udp_hdr.len)); | 267 | |
267 | 268 | if (0x11 == pkt6->ip6_hdr.nxthdr | |
268 | } | 269 | && (me->desc. |
269 | else if (0x06 == pkt6->ip6_hdr.nxthdr | 270 | service_type & htonl (GNUNET_DNS_SERVICE_TYPE_UDP)) |
270 | && (me->desc. | 271 | && (port_in_ports (me->desc.ports, pkt6_udp->udp_hdr.dpt) |
271 | service_type & htonl (GNUNET_DNS_SERVICE_TYPE_TCP)) | 272 | || testBit (me->additional_ports, |
272 | && | 273 | ntohs (pkt6_udp->udp_hdr.dpt)))) |
273 | (port_in_ports (me->desc.ports, pkt6_tcp->tcp_hdr.dpt))) | 274 | { |
274 | { | 275 | hdr->type = ntohs (GNUNET_MESSAGE_TYPE_SERVICE_UDP); |
275 | hdr->type = ntohs (GNUNET_MESSAGE_TYPE_SERVICE_TCP); | 276 | |
276 | 277 | memcpy (hc + 1, &pkt6_udp->udp_hdr, | |
277 | memcpy (hc + 1, &pkt6_tcp->tcp_hdr, | 278 | ntohs (pkt6_udp->udp_hdr.len)); |
278 | ntohs (pkt6->ip6_hdr.paylgth)); | 279 | |
279 | 280 | } | |
281 | else if (0x06 == pkt6->ip6_hdr.nxthdr | ||
282 | && (me->desc. | ||
283 | service_type & htonl (GNUNET_DNS_SERVICE_TYPE_TCP)) | ||
284 | && | ||
285 | (port_in_ports (me->desc.ports, pkt6_tcp->tcp_hdr.dpt))) | ||
286 | { | ||
287 | hdr->type = ntohs (GNUNET_MESSAGE_TYPE_SERVICE_TCP); | ||
288 | |||
289 | memcpy (hc + 1, &pkt6_tcp->tcp_hdr, | ||
290 | ntohs (pkt6->ip6_hdr.paylgth)); | ||
291 | |||
292 | } | ||
293 | if (me->tunnel == NULL && NULL != cls) | ||
294 | { | ||
295 | *cls = | ||
296 | GNUNET_MESH_peer_request_connect_all (mesh_handle, | ||
297 | GNUNET_TIME_UNIT_FOREVER_REL, | ||
298 | 1, | ||
299 | (struct | ||
300 | GNUNET_PeerIdentity | ||
301 | *) &me->desc.peer, | ||
302 | send_pkt_to_peer, | ||
303 | NULL, cls); | ||
304 | me->tunnel = *cls; | ||
305 | } | ||
306 | else if (NULL != cls) | ||
307 | { | ||
308 | *cls = me->tunnel; | ||
309 | send_pkt_to_peer (cls, (struct GNUNET_PeerIdentity *) 1, | ||
310 | NULL); | ||
311 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
312 | "Queued to send to peer %x, type %d\n", | ||
313 | *((unsigned int *) &me->desc.peer), ntohs(hdr->type)); | ||
314 | } | ||
280 | } | 315 | } |
281 | else | 316 | else |
282 | { | 317 | { |
283 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Dropping packet. nxthdr=%d, type=%d, dpt=%x, flg=%d, ports=%x\n", | 318 | /* This is a mapping to a "real" address */ |
284 | pkt6->ip6_hdr.nxthdr, ntohl(me->desc.service_type), | 319 | struct remote_addr *s = (struct remote_addr*) hc; |
285 | ntohs(pkt6_tcp->tcp_hdr.dpt), pkt6_tcp->tcp_hdr.flg, me->desc.ports); | 320 | s->addrlen = me->addrlen; |
286 | GNUNET_free (cls); | 321 | memcpy(s->addr, me->addr, me->addrlen); |
287 | cls = NULL; | 322 | s->proto= pkt6->ip6_hdr.nxthdr; |
323 | if (s->proto == 0x11) | ||
324 | { | ||
325 | hdr->type = GNUNET_MESSAGE_TYPE_REMOTE_UDP; | ||
326 | memcpy (hc + 1, &pkt6_udp->udp_hdr, | ||
327 | ntohs (pkt6_udp->udp_hdr.len)); | ||
328 | app_type = GNUNET_APPLICATION_TYPE_INTERNET_UDP_GATEWAY; | ||
329 | } | ||
330 | else if (s->proto == 0x06) | ||
331 | { | ||
332 | hdr->type = GNUNET_MESSAGE_TYPE_REMOTE_TCP; | ||
333 | memcpy (hc + 1, &pkt6_tcp->tcp_hdr, | ||
334 | ntohs (pkt6->ip6_hdr.paylgth)); | ||
335 | if (ntohs(pkt6_tcp->tcp_hdr.dpt) == 443) | ||
336 | app_type = GNUNET_APPLICATION_TYPE_INTERNET_HTTPS_GATEWAY; | ||
337 | else if (ntohs(pkt6_tcp->tcp_hdr.dpt) == 80) | ||
338 | app_type = GNUNET_APPLICATION_TYPE_INTERNET_HTTP_GATEWAY; | ||
339 | else | ||
340 | app_type = GNUNET_APPLICATION_TYPE_INTERNET_TCP_GATEWAY; | ||
341 | } | ||
288 | } | 342 | } |
289 | if (me->tunnel == NULL && NULL != cls) | 343 | if (me->tunnel == NULL && NULL != cls) |
290 | { | 344 | { |
291 | *cls = | 345 | *cls = GNUNET_MESH_peer_request_connect_by_type(mesh_handle, |
292 | GNUNET_MESH_peer_request_connect_all (mesh_handle, | 346 | GNUNET_TIME_UNIT_FOREVER_REL, |
293 | GNUNET_TIME_UNIT_FOREVER_REL, | 347 | app_type, |
294 | 1, | 348 | send_pkt_to_peer, |
295 | (struct | 349 | NULL, |
296 | GNUNET_PeerIdentity | 350 | cls); |
297 | *) &me->desc.peer, | ||
298 | send_pkt_to_peer, | ||
299 | NULL, cls); | ||
300 | me->tunnel = *cls; | 351 | me->tunnel = *cls; |
301 | } | 352 | } |
302 | else if (NULL != cls) | 353 | else if (NULL != cls) |
303 | { | 354 | { |
304 | *cls = me->tunnel; | 355 | *cls = me->tunnel; |
305 | send_pkt_to_peer (cls, (struct GNUNET_PeerIdentity *) 1, | 356 | send_pkt_to_peer(cls, (struct GNUNET_PeerIdentity*) 1, NULL); |
306 | NULL); | ||
307 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
308 | "Queued to send to peer %x, type %d\n", | ||
309 | *((unsigned int *) &me->desc.peer), ntohs(hdr->type)); | ||
310 | } | 357 | } |
311 | } | 358 | } |
312 | break; | 359 | break; |