int shutdown;
};
+enum dns_server_type {
+ DNS_SERVER_DGRAM = 0,
+ DNS_SERVER_STREAM,
+};
+
/* Structure describing a name server
*/
struct dns_nameserver {
int line; /* line where the section appears */
} conf; /* config information */
- int (*process_responses)(struct dns_nameserver *ns); /* callback used to process responses */
+ int (*process_responses)(struct dns_nameserver *ns, enum dns_server_type type); /* callback used to process responses */
struct dns_dgram_server *dgram; /* used for dgram dns */
struct dns_stream_server *stream; /* used for tcp dns */
#include <haproxy/dns-t.h>
#include <haproxy/server-t.h>
-int dns_send_nameserver(struct dns_nameserver *ns, void *buf, size_t len);
-ssize_t dns_recv_nameserver(struct dns_nameserver *ns, void *data, size_t size);
+int dns_send_nameserver(struct dns_nameserver *ns, enum dns_server_type type, void *buf, size_t len);
+ssize_t dns_recv_nameserver(struct dns_nameserver *ns, enum dns_server_type type, void *data, size_t size);
int dns_dgram_init(struct dns_nameserver *ns, struct sockaddr_storage *sk);
int dns_stream_init(struct dns_nameserver *ns, struct server *s);
void dns_nameserver_deinit(struct dns_nameserver *ns);
+/* Returns nonzero if <type> selects a datagram server. */
+static inline int dns_server_type_is_dgram(enum dns_server_type type)
+{
+ return type == DNS_SERVER_DGRAM;
+}
+
+/* Returns nonzero if <type> selects a stream server. */
+static inline int dns_server_type_is_stream(enum dns_server_type type)
+{
+ return type == DNS_SERVER_STREAM;
+}
+
#endif // _HAPROXY_DNS_H
return 0;
}
-/* Sends a message to a name server
+/* Sends a message using server type <type> on nameserver <ns>.
* It returns message length on success
* or -1 in error case
* 0 is returned in case of output ring buffer is full
*/
-int dns_send_nameserver(struct dns_nameserver *ns, void *buf, size_t len)
+int dns_send_nameserver(struct dns_nameserver *ns, enum dns_server_type type, void *buf, size_t len)
{
int ret = -1;
- if (ns->dgram) {
+ if (dns_server_type_is_dgram(type) && ns->dgram) {
struct dgram_conn *dgram = &ns->dgram->conn;
int fd;
ns->counters->sent++;
HA_SPIN_UNLOCK(DNS_LOCK, &dgram->lock);
}
- else if (ns->stream) {
+ else if (dns_server_type_is_stream(type) && ns->stream) {
struct ist myist;
myist = ist2(buf, len);
void dns_session_free(struct dns_session *);
-/* Receives a dns message
+/* Receives a DNS message using server type <type> on nameserver <ns>.
* Returns message length
* 0 is returned if no more message available
* -1 in error case
*/
-ssize_t dns_recv_nameserver(struct dns_nameserver *ns, void *data, size_t size)
+ssize_t dns_recv_nameserver(struct dns_nameserver *ns, enum dns_server_type type, void *data, size_t size)
{
ssize_t ret = -1;
- if (ns->dgram) {
+ if (dns_server_type_is_dgram(type) && ns->dgram) {
struct dgram_conn *dgram = &ns->dgram->conn;
struct sockaddr_storage from = {0};
socklen_t fromlen = sizeof(from);
}
HA_SPIN_UNLOCK(DNS_LOCK, &dgram->lock);
}
- else if (ns->stream) {
+ else if (dns_server_type_is_stream(type) && ns->stream) {
struct dns_stream_server *dss = ns->stream;
struct dns_session *ds;
HA_SPIN_UNLOCK(DNS_LOCK, &dgram->lock);
- ns->process_responses(ns);
+ ns->process_responses(ns, DNS_SERVER_DGRAM);
}
/* Called when a dns network socket is ready to send data */
{
struct dns_nameserver *ns = (struct dns_nameserver *)context;
- ns->process_responses(ns);
+ ns->process_responses(ns, DNS_SERVER_STREAM);
return t;
}
}
list_for_each_entry(ns, &resolvers->nameservers, list) {
- if (dns_send_nameserver(ns, trash.area, len) >= 0)
+ enum dns_server_type type;
+
+ type = ns->dgram ? DNS_SERVER_DGRAM : DNS_SERVER_STREAM;
+ if (dns_send_nameserver(ns, type, trash.area, len) >= 0)
resolution->nb_queries++;
}
leave_resolver_code();
}
-/* Called when a network IO is generated on a name server socket for an incoming
- * packet. It performs the following actions:
+/* Called when a network IO is generated on server type <type> of nameserver
+ * <ns> for an incoming packet. It performs the following actions:
* - check if the packet requires processing (not outdated resolution)
* - ensure the DNS packet received is valid and call requester's callback
* - call requester's error callback if invalid response
* - check the dn_name in the packet against the one sent
*/
-static int resolv_process_responses(struct dns_nameserver *ns)
+static int resolv_process_responses(struct dns_nameserver *ns, enum dns_server_type type)
{
struct dns_counters *tmpcounters;
struct resolvers *resolvers;
/* process all pending input messages */
while (1) {
/* read message received */
- if ((buflen = dns_recv_nameserver(ns, (void *)buf, sizeof(buf))) <= 0) {
+ buflen = dns_recv_nameserver(ns, type, (void *)buf, sizeof(buf));
+ if (buflen <= 0)
break;
- }
/* message too big */
if (buflen > resolvers->accepted_payload_size) {