aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-service-dns.c
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-09-21 08:06:55 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-09-21 08:06:55 +0000
commitcfdf6645607118d33149a8b7a3b66fab4cae6ff3 (patch)
tree4f395d279d98f75f7edf6ed1fa7caae25fb7bf61 /src/vpn/gnunet-service-dns.c
parent4810b4cceb07ca6a325376bfcc4e5abdb1586685 (diff)
downloadgnunet-cfdf6645607118d33149a8b7a3b66fab4cae6ff3.tar.gz
gnunet-cfdf6645607118d33149a8b7a3b66fab4cae6ff3.zip
do not notify more than one transmit at a time
Diffstat (limited to 'src/vpn/gnunet-service-dns.c')
-rw-r--r--src/vpn/gnunet-service-dns.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c
index ac81526e0..d87086ea7 100644
--- a/src/vpn/gnunet-service-dns.c
+++ b/src/vpn/gnunet-service-dns.c
@@ -43,6 +43,8 @@
43 43
44struct GNUNET_MESH_Handle *mesh_handle; 44struct GNUNET_MESH_Handle *mesh_handle;
45 45
46struct GNUNET_CONNECTION_TransmitHandle *server_notify;
47
46/** 48/**
47 * The UDP-Socket through which DNS-Resolves will be sent if they are not to be 49 * The UDP-Socket through which DNS-Resolves will be sent if they are not to be
48 * sent through gnunet. The port of this socket will not be hijacked. 50 * sent through gnunet. The port of this socket will not be hijacked.
@@ -193,6 +195,7 @@ unhijack (unsigned short port)
193static size_t 195static size_t
194send_answer (void *cls, size_t size, void *buf) 196send_answer (void *cls, size_t size, void *buf)
195{ 197{
198 server_notify = NULL;
196 struct answer_packet_list *query = head; 199 struct answer_packet_list *query = head;
197 size_t len = ntohs (query->pkt.hdr.size); 200 size_t len = ntohs (query->pkt.hdr.size);
198 201
@@ -206,9 +209,9 @@ send_answer (void *cls, size_t size, void *buf)
206 209
207 /* When more data is to be sent, reschedule */ 210 /* When more data is to be sent, reschedule */
208 if (head != NULL) 211 if (head != NULL)
209 GNUNET_SERVER_notify_transmit_ready (cls, ntohs (head->pkt.hdr.size), 212 server_notify = GNUNET_SERVER_notify_transmit_ready (cls, ntohs (head->pkt.hdr.size),
210 GNUNET_TIME_UNIT_FOREVER_REL, 213 GNUNET_TIME_UNIT_FOREVER_REL,
211 &send_answer, cls); 214 &send_answer, cls);
212 215
213 return len; 216 return len;
214} 217}
@@ -231,6 +234,8 @@ mesh_send_response (void *cls, size_t size, void *buf)
231 struct GNUNET_MESH_Tunnel **tunnel = (struct GNUNET_MESH_Tunnel **) (sz + 1); 234 struct GNUNET_MESH_Tunnel **tunnel = (struct GNUNET_MESH_Tunnel **) (sz + 1);
232 struct dns_pkt *dns = (struct dns_pkt *) (tunnel + 1); 235 struct dns_pkt *dns = (struct dns_pkt *) (tunnel + 1);
233 236
237 GNUNET_MESH_tunnel_set_data (*tunnel, NULL);
238
234 hdr->type = htons (GNUNET_MESSAGE_TYPE_VPN_REMOTE_ANSWER_DNS); 239 hdr->type = htons (GNUNET_MESSAGE_TYPE_VPN_REMOTE_ANSWER_DNS);
235 hdr->size = htons (*sz + sizeof (struct GNUNET_MessageHeader)); 240 hdr->size = htons (*sz + sizeof (struct GNUNET_MessageHeader));
236 241
@@ -530,10 +535,11 @@ receive_mesh_answer (void *cls
530 535
531 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); 536 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
532 537
533 GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, len, 538 if (server_notify == NULL)
534 GNUNET_TIME_UNIT_FOREVER_REL, 539 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, len,
535 &send_answer, 540 GNUNET_TIME_UNIT_FOREVER_REL,
536 query_states[dns->s.id].client); 541 &send_answer,
542 query_states[dns->s.id].client);
537 543
538 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 544 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
539 "Sent answer of length %d on to client, addroffset = %d\n", len, 545 "Sent answer of length %d on to client, addroffset = %d\n", len,
@@ -622,9 +628,10 @@ send_rev_query (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
622 628
623 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); 629 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
624 630
625 GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len, 631 if (server_notify == NULL)
626 GNUNET_TIME_UNIT_FOREVER_REL, 632 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len,
627 &send_answer, query_states[id].client); 633 GNUNET_TIME_UNIT_FOREVER_REL,
634 &send_answer, query_states[id].client);
628} 635}
629 636
630/** 637/**
@@ -731,9 +738,10 @@ receive_dht (void *cls, struct GNUNET_TIME_Absolute exp
731 738
732 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); 739 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
733 740
734 GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len, 741 if (server_notify == NULL)
735 GNUNET_TIME_UNIT_FOREVER_REL, 742 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[id].client, len,
736 &send_answer, query_states[id].client); 743 GNUNET_TIME_UNIT_FOREVER_REL,
744 &send_answer, query_states[id].client);
737 745
738 GNUNET_DHT_get_stop (handle); 746 GNUNET_DHT_get_stop (handle);
739} 747}
@@ -1088,10 +1096,11 @@ read_response (void *cls
1088 1096
1089 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer); 1097 GNUNET_CONTAINER_DLL_insert_after (head, tail, tail, answer);
1090 1098
1091 GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client, 1099 if (server_notify == NULL)
1092 len, GNUNET_TIME_UNIT_FOREVER_REL, 1100 server_notify = GNUNET_SERVER_notify_transmit_ready (query_states[dns->s.id].client,
1093 &send_answer, 1101 len, GNUNET_TIME_UNIT_FOREVER_REL,
1094 query_states[dns->s.id].client); 1102 &send_answer,
1103 query_states[dns->s.id].client);
1095 } 1104 }
1096 } 1105 }
1097 } 1106 }