aboutsummaryrefslogtreecommitdiff
path: root/src/include/gnunet_dns_service.h
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-01-15 20:41:40 +0000
committerChristian Grothoff <christian@grothoff.org>2012-01-15 20:41:40 +0000
commit1574e0f8c2a55363c024a95f440ba7be647efbe1 (patch)
tree5e4507d9aa404ac983c5774b71b25ec6174ee7cc /src/include/gnunet_dns_service.h
parent5ec7048ed9ffeddbe06e34a31d388080fae143e5 (diff)
downloadgnunet-1574e0f8c2a55363c024a95f440ba7be647efbe1.tar.gz
gnunet-1574e0f8c2a55363c024a95f440ba7be647efbe1.zip
-removing legacy dns/vpn/exit code and renaming -new versions to current
Diffstat (limited to 'src/include/gnunet_dns_service.h')
-rw-r--r--src/include/gnunet_dns_service.h236
1 files changed, 107 insertions, 129 deletions
diff --git a/src/include/gnunet_dns_service.h b/src/include/gnunet_dns_service.h
index 329a083ff..3517a4609 100644
--- a/src/include/gnunet_dns_service.h
+++ b/src/include/gnunet_dns_service.h
@@ -1,6 +1,6 @@
1/* 1/*
2 This file is part of GNUnet 2 This file is part of GNUnet
3 (C) 2010, 2011, 2012 Christian Grothoff (and other contributing authors) 3 (C) 2012 Christian Grothoff (and other contributing authors)
4 4
5 GNUnet is free software; you can redistribute it and/or modify 5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published 6 it under the terms of the GNU General Public License as published
@@ -19,190 +19,168 @@
19 */ 19 */
20 20
21/** 21/**
22 * @file include/gnunet_dns_service.h 22 * @file include/gnunet_dns_service-new.h
23 * @brief API to access the DNS service. Not finished at all, 23 * @brief API to access the DNS service.
24 * currently only contains the structs for the IPC, which 24 * @author Christian Grothoff
25 * don't even belong here (legacy code in transition)
26 * @author Philipp Toelke
27 *
28 * TODO:
29 * - replace (most?) structs with nice function (prototypes) that take
30 * the appropriate arguments to pass the data
31 * - clean up API implementation itself (nicer reconnect, etc.)
32 */ 25 */
33#ifndef GNUNET_DNS_SERVICE_H 26#ifndef GNUNET_DNS_SERVICE_NEW_H
34#define GNUNET_DNS_SERVICE_H 27#define GNUNET_DNS_SERVICE_NEW_H
35 28
36#include "gnunet_common.h" 29#include "gnunet_common.h"
37#include "gnunet_util_lib.h" 30#include "gnunet_util_lib.h"
38 31
39 32
40/** 33/**
41 * Subtypes of DNS answers. 34 * Opaque DNS handle
35 */
36struct GNUNET_DNS_Handle;
37
38/**
39 * Handle to identify an individual DNS request.
42 */ 40 */
43enum GNUNET_DNS_ANSWER_Subtype 41struct GNUNET_DNS_RequestHandle;
42
43/**
44 * Flags that specify when to call the client's handler.
45 */
46enum GNUNET_DNS_Flags
44{ 47{
48
45 /** 49 /**
46 * Answers of this type contain a dns-packet that just has to be transmitted 50 * Useless option: never call the client.
47 */ 51 */
48 GNUNET_DNS_ANSWER_TYPE_IP, 52 GNUNET_DNS_FLAG_NEVER = 0,
49 53
50 /** 54 /**
51 * Answers of this type contain an incomplete dns-packet. The IP-Address 55 * Set this flag to see all requests first prior to resolution
52 * is all 0s. The addroffset points to it. 56 * (for monitoring). Clients that set this flag must then
57 * call "GNUNET_DNS_request_forward" when they process a request
58 * for the first time. Caling "GNUNET_DNS_request_answer" is
59 * not allowed for MONITOR peers.
53 */ 60 */
54 GNUNET_DNS_ANSWER_TYPE_SERVICE, 61 GNUNET_DNS_FLAG_REQUEST_MONITOR = 1,
55 62
56 /** 63 /**
57 * Answers of this type contain an incomplete dns-packet as answer to a 64 * This client should be called on requests that have not
58 * PTR-Query. The resolved name is not allocated. The addroffset points to it. 65 * yet been resolved as this client provides a resolution
66 * service. Note that this does not guarantee that the
67 * client will see all requests as another client might be
68 * called first and that client might have already done the
69 * resolution, in which case other pre-resolution clients
70 * won't see the request anymore.
59 */ 71 */
60 GNUNET_DNS_ANSWER_TYPE_REV, 72 GNUNET_DNS_FLAG_PRE_RESOLUTION = 2,
61 73
62 /** 74 /**
63 * Answers of this type contains an IP6-Address but traffic to this IP should 75 * This client wants to be called on the results of a DNS resolution
64 * be routed through the GNUNet. 76 * (either resolved by PRE-RESOLUTION clients or the global DNS).
77 * The client then has a chance to modify the answer (or cause it to
78 * be dropped). There is no guarantee that other POST-RESOLUTION
79 * client's won't modify (or drop) the answer afterwards.
65 */ 80 */
66 GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA, 81 GNUNET_DNS_FLAG_POST_RESOLUTION = 4,
67 82
68 /** 83 /**
69 * Answers of this type contains an IP4-Address but traffic to this IP should 84 * Set this flag to see all requests just before they are
70 * be routed through the GNUNet. 85 * returned to the network. Clients that set this flag must then
86 * call "GNUNET_DNS_request_forward" when they process a request
87 * for the last time. Caling "GNUNET_DNS_request_answer" is
88 * not allowed for MONITOR peers.
71 */ 89 */
72 GNUNET_DNS_ANSWER_TYPE_REMOTE_A 90 GNUNET_DNS_FLAG_RESPONSE_MONITOR = 8
73 91
74}; 92};
75 93
76 94
77GNUNET_NETWORK_STRUCT_BEGIN
78struct GNUNET_vpn_service_descriptor
79{
80 GNUNET_HashCode peer GNUNET_PACKED;
81 GNUNET_HashCode service_descriptor GNUNET_PACKED;
82 uint64_t ports GNUNET_PACKED;
83 uint32_t service_type GNUNET_PACKED;
84};
85
86
87struct answer_packet
88{
89 /* General data */
90 struct GNUNET_MessageHeader hdr;
91 enum GNUNET_DNS_ANSWER_Subtype subtype GNUNET_PACKED;
92
93 char from[16];
94 char to[16];
95 char addrlen;
96 unsigned dst_port:16 GNUNET_PACKED;
97 /* -- */
98
99 /* Data for GNUNET_DNS_ANSWER_TYPE_SERVICE */
100 struct GNUNET_vpn_service_descriptor service_descr;
101 /* -- */
102
103 /* Data for GNUNET_DNS_ANSWER_TYPE_REV */
104 /* The offsett in octets from the beginning of the struct to the field
105 * in data where the IP-Address has to go. */
106 uint16_t addroffset GNUNET_PACKED;
107 /* -- */
108
109 /* Data for GNUNET_DNS_ANSWER_TYPE_REMOTE */
110 /* either 4 or 16 */
111 char addrsize;
112 unsigned char addr[16];
113 /* -- */
114
115 unsigned char data[1];
116};
117GNUNET_NETWORK_STRUCT_END
118
119
120 95
121/** 96/**
122 * Type of a function to be called by the DNS API whenever 97 * Signature of a function that is called whenever the DNS service
123 * a DNS reply is obtained. 98 * encounters a DNS request and needs to do something with it. The
99 * function has then the chance to generate or modify the response by
100 * calling one of the three "GNUNET_DNS_request_*" continuations.
101 *
102 * When a request is intercepted, this function is called first to
103 * give the client a chance to do the complete address resolution;
104 * "rdata" will be NULL for this first call for a DNS request, unless
105 * some other client has already filled in a response.
106 *
107 * If multiple clients exist, all of them are called before the global
108 * DNS. The global DNS is only called if all of the clients'
109 * functions call GNUNET_DNS_request_forward. Functions that call
110 * GNUNET_DNS_request_forward will be called again before a final
111 * response is returned to the application. If any of the clients'
112 * functions call GNUNET_DNS_request_drop, the response is dropped.
124 * 113 *
125 * @param cls closure 114 * @param cls closure
126 * @param pkt reply that we got 115 * @param rh request handle to user for reply
116 * @param request_length number of bytes in request
117 * @param request udp payload of the DNS request
127 */ 118 */
128typedef void (*GNUNET_DNS_ResponseCallback)(void *cls, 119typedef void (*GNUNET_DNS_RequestHandler)(void *cls,
129 const struct answer_packet *pkt); 120 struct GNUNET_DNS_RequestHandle *rh,
121 size_t request_length,
122 const char *request);
130 123
131 124
132/** 125/**
133 * Opaque DNS handle 126 * If a GNUNET_DNS_RequestHandler calls this function, the client
134 */ 127 * has no desire to interfer with the request and it should
135struct GNUNET_DNS_Handle; 128 * continue to be processed normally.
136
137
138/**
139 * Connect to the service-dns
140 * 129 *
141 * @param cfg configuration to use 130 * @param rh request that should now be forwarded
142 * @param cb function to call with DNS replies
143 * @param cb_cls closure to pass to cb
144 * @return DNS handle
145 */ 131 */
146struct GNUNET_DNS_Handle * 132void
147GNUNET_DNS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, 133GNUNET_DNS_request_forward (struct GNUNET_DNS_RequestHandle *rh);
148 GNUNET_DNS_ResponseCallback cb,
149 void *cb_cls);
150 134
151 135
152/** 136/**
153 * Signal the DNS service that it needs to re-initialize the DNS 137 * If a GNUNET_DNS_RequestHandler calls this function, the request is
154 * hijacking (the network setup has changed significantly). 138 * to be dropped and no response should be generated.
155 * 139 *
156 * @param h DNS handle 140 * @param rh request that should now be dropped
157 */ 141 */
158void 142void
159GNUNET_DNS_restart_hijack (struct GNUNET_DNS_Handle *h); 143GNUNET_DNS_request_drop (struct GNUNET_DNS_RequestHandle *rh);
160 144
161 145
162/** 146/**
163 * Process a DNS request sent to an IPv4 resolver. Pass it 147 * If a GNUNET_DNS_RequestHandler calls this function, the request is
164 * to the DNS service for resolution. 148 * supposed to be answered with the data provided to this call (with
149 * the modifications the function might have made). The reply given
150 * must always be a valid DNS reply and not a mutated DNS request.
165 * 151 *
166 * @param h DNS handle 152 * @param rh request that should now be answered
167 * @param dst_ip destination IPv4 address 153 * @param reply_length size of reply (uint16_t to force sane size)
168 * @param src_ip source IPv4 address (usually local machine) 154 * @param reply reply data
169 * @param src_port source port (to be used for reply)
170 * @param udp_packet_len length of the UDP payload in bytes
171 * @param udp_packet UDP payload
172 */ 155 */
173void 156void
174GNUNET_DNS_queue_request_v4 (struct GNUNET_DNS_Handle *h, 157GNUNET_DNS_request_answer (struct GNUNET_DNS_RequestHandle *rh,
175 const struct in_addr *dst_ip, 158 uint16_t reply_length,
176 const struct in_addr *src_ip, 159 const char *reply);
177 uint16_t src_port, 160
178 size_t udp_packet_len,
179 const char *udp_packet);
180 161
181/** 162/**
182 * Process a DNS request sent to an IPv6 resolver. Pass it 163 * Connect to the service-dns
183 * to the DNS service for resolution.
184 * 164 *
185 * @param h DNS handle 165 * @param cfg configuration to use
186 * @param dst_ip destination IPv6 address 166 * @param flags when to call rh
187 * @param src_ip source IPv6 address (usually local machine) 167 * @param rh function to call with DNS requests
188 * @param src_port source port (to be used for reply) 168 * @param rh_cls closure to pass to rh
189 * @param udp_packet_len length of the UDP payload in bytes 169 * @return DNS handle
190 * @param udp_packet UDP payload
191 */ 170 */
192void 171struct GNUNET_DNS_Handle *
193GNUNET_DNS_queue_request_v6 (struct GNUNET_DNS_Handle *h, 172GNUNET_DNS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
194 const struct in6_addr *dst_ip, 173 enum GNUNET_DNS_Flags flags,
195 const struct in6_addr *src_ip, 174 GNUNET_DNS_RequestHandler rh,
196 uint16_t src_port, 175 void *rh_cls);
197 size_t udp_packet_len, 176
198 const char *udp_packet);
199 177
200/** 178/**
201 * Disconnect from the DNS service. 179 * Disconnect from the DNS service.
202 * 180 *
203 * @param h DNS handle 181 * @param dh DNS handle
204 */ 182 */
205void 183void
206GNUNET_DNS_disconnect (struct GNUNET_DNS_Handle *h); 184GNUNET_DNS_disconnect (struct GNUNET_DNS_Handle *dh);
207 185
208#endif 186#endif