X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fvpn%2Fgnunet-daemon-vpn.c;h=cc8001eae412119f28ab7389e5e26f443e17b2b4;hb=83b19539f4d322b43683f5838b72e9ec2c8e6073;hp=47eb9cf82cd951f78c8b3f89b584fecdf687de0b;hpb=bc1e3b8f0874c6b0672d1bd626c789afde15b03e;p=oweals%2Fgnunet.git diff --git a/src/vpn/gnunet-daemon-vpn.c b/src/vpn/gnunet-daemon-vpn.c index 47eb9cf82..cc8001eae 100644 --- a/src/vpn/gnunet-daemon-vpn.c +++ b/src/vpn/gnunet-daemon-vpn.c @@ -183,7 +183,7 @@ collect_mappings (void *cls /* FIXME! GNUNET_MESH_close_tunnel(me->tunnel); */ GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_remove (hashmap, &me->hash, me)); + GNUNET_CONTAINER_multihashmap_remove (hashmap, &me->hash, me)); GNUNET_free (me); } @@ -282,32 +282,33 @@ send_pkt_to_peer_notify_callback (void *cls, size_t size, void *buf) { struct GNUNET_MESH_Tunnel **tunnel = cls; - GNUNET_MESH_tunnel_set_data (*tunnel, NULL); - struct GNUNET_MessageHeader *hdr = - (struct GNUNET_MessageHeader *) (tunnel + 1); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "send_pkt_to_peer_notify_callback: buf = %x; size = %u;\n", buf, - size); - GNUNET_assert (size >= ntohs (hdr->size)); - memcpy (buf, hdr, ntohs (hdr->size)); - size = ntohs (hdr->size); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sent!\n"); - - if (NULL != GNUNET_MESH_tunnel_get_head (*tunnel)) + struct tunnel_state *ts = GNUNET_MESH_tunnel_get_data (*tunnel); + + ts->th = NULL; + + if (NULL != buf) { - struct tunnel_notify_queue *element = GNUNET_MESH_tunnel_get_head (*tunnel); - struct tunnel_notify_queue *head = GNUNET_MESH_tunnel_get_head (*tunnel); - struct tunnel_notify_queue *tail = GNUNET_MESH_tunnel_get_tail (*tunnel); + struct GNUNET_MessageHeader *hdr = + (struct GNUNET_MessageHeader *) (tunnel + 1); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "send_pkt_to_peer_notify_callback: buf = %x; size = %u;\n", buf, + size); + GNUNET_assert (size >= ntohs (hdr->size)); + memcpy (buf, hdr, ntohs (hdr->size)); + size = ntohs (hdr->size); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sent!\n"); + } + else + size = 0; - GNUNET_CONTAINER_DLL_remove (head, tail, element); + if (NULL != ts->head) + { + struct tunnel_notify_queue *element = ts->head; - GNUNET_MESH_tunnel_set_head (*tunnel, head); - GNUNET_MESH_tunnel_set_tail (*tunnel, tail); + GNUNET_CONTAINER_DLL_remove (ts->head, ts->tail, element); - struct GNUNET_MESH_TransmitHandle *th = - GNUNET_MESH_notify_transmit_ready (*tunnel, - GNUNET_NO, - 42, + ts->th = + GNUNET_MESH_notify_transmit_ready (*tunnel, GNUNET_NO, 42, GNUNET_TIME_relative_divide (GNUNET_CONSTANTS_MAX_CORK_DELAY, 2), (const struct GNUNET_PeerIdentity *) @@ -316,7 +317,6 @@ send_pkt_to_peer_notify_callback (void *cls, size_t size, void *buf) element->cls); /* save the handle */ - GNUNET_MESH_tunnel_set_data (*tunnel, th); GNUNET_free (element); } GNUNET_free (cls); @@ -329,12 +329,13 @@ port_in_ports (uint64_t ports, uint16_t port) { uint16_t *ps = (uint16_t *) & ports; - return ps[0] == port || ps[1] == port || ps[2] == port || ps[3] == port; + return ports == 0 || ps[0] == port || ps[1] == port || ps[2] == port || + ps[3] == port; } void send_pkt_to_peer (void *cls, const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_TRANSPORT_ATS_Information *atsi + const struct GNUNET_ATS_Information *atsi __attribute__ ((unused))) { /* peer == NULL means that all peers in this request are connected */ @@ -347,35 +348,27 @@ send_pkt_to_peer (void *cls, const struct GNUNET_PeerIdentity *peer, GNUNET_assert (NULL != tunnel); GNUNET_assert (NULL != *tunnel); - if (NULL == GNUNET_MESH_tunnel_get_data (*tunnel)) + struct tunnel_state *ts = GNUNET_MESH_tunnel_get_data (*tunnel); + + if (NULL == ts->th) { - struct GNUNET_MESH_TransmitHandle *th = - GNUNET_MESH_notify_transmit_ready (*tunnel, - GNUNET_NO, - 42, + ts->th = + GNUNET_MESH_notify_transmit_ready (*tunnel, GNUNET_NO, 42, GNUNET_TIME_relative_divide (GNUNET_CONSTANTS_MAX_CORK_DELAY, 2), (const struct GNUNET_PeerIdentity *) - NULL, - ntohs (hdr->size), + NULL, ntohs (hdr->size), send_pkt_to_peer_notify_callback, cls); - - GNUNET_MESH_tunnel_set_data (*tunnel, th); } else { - struct tunnel_notify_queue *head = GNUNET_MESH_tunnel_get_head (*tunnel); - struct tunnel_notify_queue *tail = GNUNET_MESH_tunnel_get_tail (*tunnel); struct tunnel_notify_queue *element = GNUNET_malloc (sizeof *element); element->cls = cls; element->len = ntohs (hdr->size); - GNUNET_CONTAINER_DLL_insert_tail (head, tail, element); - - GNUNET_MESH_tunnel_set_head (*tunnel, head); - GNUNET_MESH_tunnel_set_tail (*tunnel, tail); + GNUNET_CONTAINER_DLL_insert_tail (ts->head, ts->tail, element); } } @@ -580,7 +573,8 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) list = GNUNET_malloc (htons (pkt->hdr.size) + - 2 * sizeof (struct answer_packet_list *)); + sizeof (struct answer_packet_list) - + sizeof (struct answer_packet)); memcpy (&list->pkt, pkt, htons (pkt->hdr.size)); @@ -628,7 +622,8 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) char *name = (char *) (map_entry + 1); list = - GNUNET_malloc (2 * sizeof (struct answer_packet_list *) + offset + 2 + + GNUNET_malloc (sizeof (struct answer_packet_list) - + sizeof (struct answer_packet) + offset + 2 + ntohs (namelen)); struct answer_packet *rpkt = &list->pkt; @@ -647,7 +642,8 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { list = GNUNET_malloc (htons (pkt->hdr.size) + - 2 * sizeof (struct answer_packet_list *)); + sizeof (struct answer_packet_list) - + sizeof (struct answer_packet)); memcpy (&list->pkt, pkt, htons (pkt->hdr.size)); } else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA) @@ -707,7 +703,8 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) list = GNUNET_malloc (htons (pkt->hdr.size) + - 2 * sizeof (struct answer_packet_list *)); + sizeof (struct answer_packet_list) - + sizeof (struct answer_packet)); memcpy (&list->pkt, pkt, htons (pkt->hdr.size)); } @@ -769,7 +766,8 @@ process_answer (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) list = GNUNET_malloc (htons (pkt->hdr.size) + - 2 * sizeof (struct answer_packet_list *)); + sizeof (struct answer_packet_list) - + sizeof (struct answer_packet)); memcpy (&list->pkt, pkt, htons (pkt->hdr.size)); } @@ -860,20 +858,18 @@ add_additional_port (struct map_entry *me, uint16_t port) static int receive_udp_back (void *cls __attribute__ ((unused)), struct GNUNET_MESH_Tunnel *tunnel, - void **tunnel_ctx - __attribute__ ((unused)), - const struct GNUNET_PeerIdentity *sender - __attribute__ ((unused)), + void **tunnel_ctx, const struct GNUNET_PeerIdentity *sender, const struct GNUNET_MessageHeader *message, - const struct GNUNET_TRANSPORT_ATS_Information *atsi + const struct GNUNET_ATS_Information *atsi __attribute__ ((unused))) { GNUNET_HashCode *desc = (GNUNET_HashCode *) (message + 1); struct remote_addr *s = (struct remote_addr *) desc; struct udp_pkt *pkt = (struct udp_pkt *) (desc + 1); - const struct GNUNET_PeerIdentity *other = GNUNET_MESH_get_peer (tunnel); + const struct GNUNET_PeerIdentity *other = sender; + struct tunnel_state *ts = *tunnel_ctx; - if (16 == s->addrlen) + if (16 == ts->addrlen) { size_t size = sizeof (struct ip6_udp) + ntohs (pkt->len) - 1 - @@ -1039,24 +1035,27 @@ receive_udp_back (void *cls static int receive_tcp_back (void *cls __attribute__ ((unused)), struct GNUNET_MESH_Tunnel *tunnel, - void **tunnel_ctx - __attribute__ ((unused)), - const struct GNUNET_PeerIdentity *sender + void **tunnel_ctx, const struct GNUNET_PeerIdentity *sender __attribute__ ((unused)), const struct GNUNET_MessageHeader *message, - const struct GNUNET_TRANSPORT_ATS_Information *atsi + const struct GNUNET_ATS_Information *atsi __attribute__ ((unused))) { GNUNET_HashCode *desc = (GNUNET_HashCode *) (message + 1); struct remote_addr *s = (struct remote_addr *) desc; struct tcp_pkt *pkt = (struct tcp_pkt *) (desc + 1); - const struct GNUNET_PeerIdentity *other = GNUNET_MESH_get_peer (tunnel); + const struct GNUNET_PeerIdentity *other = sender; + struct tunnel_state *ts = *tunnel_ctx; size_t pktlen = ntohs (message->size) - sizeof (struct GNUNET_MessageHeader) - sizeof (GNUNET_HashCode); - if (s->addrlen == 16) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received TCP-Packet back, addrlen = %d\n", s->addrlen); + + if (ntohs (message->type) == GNUNET_MESSAGE_TYPE_VPN_SERVICE_TCP_BACK || + ts->addrlen == 16) { size_t size = pktlen + sizeof (struct ip6_tcp) - 1; @@ -1202,7 +1201,7 @@ receive_tcp_back (void *cls tmp = pkt4->ip_hdr.dadr; sum = calculate_checksum_update (sum, (uint16_t *) & tmp, 4); - tmp = (0x06 << 16) | (0xffff & pktlen); // 0x06 for TCP? + tmp = (0x06 << 16) | (0xffff & pktlen); // 0x06 for TCP? tmp = htonl (tmp); @@ -1220,6 +1219,23 @@ receive_tcp_back (void *cls return GNUNET_OK; } +static void * +new_tunnel (void *cls, struct GNUNET_MESH_Tunnel *tunnel, + const struct GNUNET_PeerIdentity *initiator, + const struct GNUNET_ATS_Information *atsi) +{ + /* Why should anyone open an inbound tunnel to vpn? */ + GNUNET_break (0); + return NULL; +} + +static void +cleaner (void *cls, const struct GNUNET_MESH_Tunnel *tunnel, void *tunnel_ctx) +{ + /* Why should anyone open an inbound tunnel to vpn? */ + GNUNET_break (0); +} + /** * Main function that will be run by the scheduler. * @@ -1244,7 +1260,9 @@ run (void *cls, char *const *args __attribute__ ((unused)), const char *cfgfilep GNUNET_APPLICATION_TYPE_END }; - mesh_handle = GNUNET_MESH_connect (cfg_, NULL, NULL, handlers, types); + mesh_handle = + GNUNET_MESH_connect (cfg_, 42, NULL, new_tunnel, cleaner, handlers, + types); cfg = cfg_; restart_hijack = 0; hashmap = GNUNET_CONTAINER_multihashmap_create (65536);