/*
 * rrdns - Rapid Reverse DNS lookup plugin for the UBUS RPC server
 *
 *   Copyright (C) 2016-2017 Jo-Philipp Wich <jo@mein.io>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <libubus.h>
#include <libubox/avl.h>
#include <libubox/uloop.h>

#define RRDNS_MAX_TIMEOUT 5000
#define RRDNS_DEF_TIMEOUT 250

#define RRDNS_MAX_LIMIT 1000
#define RRDNS_DEF_LIMIT 10


struct rrdns_request {
	struct avl_node by_id;
	struct avl_node by_addr;
	uint16_t id;
	uint16_t family;
	union {
		struct in_addr in;
		struct in6_addr in6;
	} addr;
};

struct rrdns_context {
	struct ubus_context *context;
	struct ubus_request_data request;
	struct uloop_timeout timeout;
	struct blob_attr *addr_cur;
	int addr_rem;
	struct uloop_fd socket;
	struct blob_buf blob;
	struct avl_tree request_ids;
	struct avl_tree request_addrs;
};
