- typo in check caused subquery errors to be ignored, fixed.
- make lint happy about rlim_t.
- freeup of modules after freeup of module-states.
+ - duplicate replies work, this uses secondary udp buffer in outnet.
19 June 2007: Wouter
- nicer layout in stats.c, review 0.3 change.
outnet->num_tcp = num_tcp;
outnet->infra = infra;
outnet->rnd = rnd;
+ outnet->udp_second = 0;
#ifndef INET6
do_ip6 = 0;
#endif
return outnet;
}
+void
+outside_network_set_secondary_buffer(struct outside_network* outnet,
+ ldns_buffer* buf)
+{
+ outnet->udp_second = buf;
+}
+
/** helper pending delete */
static void
pending_node_del(rbnode_t* node, void* arg)
struct comm_reply* rep)
{
struct service_callback* p = sq->cblist, *n;
+ int dobackup = (sq->cblist && sq->cblist->next); /* >1 cb*/
rbnode_t* rem;
/* remove from tree, and schedule for deletion, so that callbacks
* can safely deregister themselves and even create new serviced
rem = rbtree_delete(sq->outnet->serviced, sq);
log_assert(rem); /* should have been present */
sq->to_be_deleted = 1;
+ if(dobackup) {
+ /* make a backup of the query, since the querystate processing
+ * may send outgoing queries that overwrite the buffer.
+ * use secondary buffer to store the query.
+ * This is a data copy, but faster than packet to server */
+ log_assert(ldns_buffer_capacity(sq->outnet->udp_second) >=
+ ldns_buffer_limit(c->buffer));
+ ldns_buffer_clear(sq->outnet->udp_second);
+ ldns_buffer_write(sq->outnet->udp_second,
+ ldns_buffer_begin(c->buffer),
+ ldns_buffer_limit(c->buffer));
+ ldns_buffer_flip(sq->outnet->udp_second);
+ }
while(p) {
n = p->next;
+ if(dobackup) {
+ ldns_buffer_clear(c->buffer);
+ ldns_buffer_write(c->buffer,
+ ldns_buffer_begin(sq->outnet->udp_second),
+ ldns_buffer_limit(sq->outnet->udp_second));
+ ldns_buffer_flip(c->buffer);
+ }
(void)(*p->cb)(c, p->cb_arg, error, rep);
p = n;
}
datagram at any time. */
ldns_buffer* udp_buff;
+ /** buffer for storage. (buffer for incoming connections, since
+ * either an event to outside or incoming happens, but not both
+ * This buffer is used during callbacks, so that the datagram
+ * that just arrived does not collide with new datagrams sent out. */
+ ldns_buffer* udp_second;
+
/**
* Array of udp comm point* that are used to listen to pending events.
* Each is on a different port. This is for ip4 ports.
*/
void outside_network_delete(struct outside_network* outnet);
+/**
+ * Set secondary UDP buffer. Make sure it is not used during outside network
+ * callbacks. Such as the incoming network UDP buffer. Caller responsible
+ * for deletion.
+ * @param outnet: outside network.
+ * @param buf: buffer to use as secondary buffer.
+ */
+void outside_network_set_secondary_buffer(struct outside_network* outnet,
+ ldns_buffer* buf);
+
/**
* Send UDP query, create pending answer.
* Changes the ID for the query to be random and unique for that destination.
free(outnet);
}
+void
+outside_network_set_secondary_buffer(struct outside_network*
+ ATTR_UNUSED(outnet), ldns_buffer* ATTR_UNUSED(buf))
+{
+ /* nothing to do */
+}
+
struct pending*
pending_udp_query(struct outside_network* outnet, ldns_buffer* packet,
struct sockaddr_storage* addr, socklen_t addrlen, int timeout,