aboutsummaryrefslogtreecommitdiff
path: root/src/nat/nat_api.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-10-24 21:04:38 +0000
committerChristian Grothoff <christian@grothoff.org>2016-10-24 21:04:38 +0000
commit23b1580d020611e4f8de6c8964231d1ef6cf0342 (patch)
tree7802554213f99b1c5110669ac167e35ebcda54a5 /src/nat/nat_api.c
parent0cda05a0cbbe53f97f74062cbd3fedca7d602925 (diff)
downloadgnunet-23b1580d020611e4f8de6c8964231d1ef6cf0342.tar.gz
gnunet-23b1580d020611e4f8de6c8964231d1ef6cf0342.zip
more work on new nat library
Diffstat (limited to 'src/nat/nat_api.c')
-rw-r--r--src/nat/nat_api.c108
1 files changed, 97 insertions, 11 deletions
diff --git a/src/nat/nat_api.c b/src/nat/nat_api.c
index e7320eb50..e0c83f41e 100644
--- a/src/nat/nat_api.c
+++ b/src/nat/nat_api.c
@@ -155,8 +155,21 @@ static int
155check_connection_reversal_request (void *cls, 155check_connection_reversal_request (void *cls,
156 const struct GNUNET_NAT_ConnectionReversalRequestedMessage *crm) 156 const struct GNUNET_NAT_ConnectionReversalRequestedMessage *crm)
157{ 157{
158 GNUNET_break (0); 158 if (ntohs (crm->header.size) !=
159 return GNUNET_SYSERR; 159 sizeof (*crm) +
160 ntohs (crm->local_addr_size) +
161 ntohs (crm->remote_addr_size) )
162 {
163 GNUNET_break (0);
164 return GNUNET_SYSERR;
165 }
166 if ( (sizeof (struct sockaddr_in) != ntohs (crm->local_addr_size)) ||
167 (sizeof (struct sockaddr_in) != ntohs (crm->remote_addr_size)) )
168 {
169 GNUNET_break (0);
170 return GNUNET_SYSERR;
171 }
172 return GNUNET_OK;
160} 173}
161 174
162 175
@@ -170,9 +183,15 @@ static void
170handle_connection_reversal_request (void *cls, 183handle_connection_reversal_request (void *cls,
171 const struct GNUNET_NAT_ConnectionReversalRequestedMessage *crm) 184 const struct GNUNET_NAT_ConnectionReversalRequestedMessage *crm)
172{ 185{
173 // FIXME: parse 186 struct GNUNET_NAT_Handle *nh = cls;
174 // FIXME: call callback! 187 const struct sockaddr_in *local_sa = (const struct sockaddr_in *) &crm[1];
175 GNUNET_break (0); 188 const struct sockaddr_in *remote_sa = &local_sa[1];
189
190 nh->reversal_callback (nh->callback_cls,
191 (const struct sockaddr *) local_sa,
192 sizeof (struct sockaddr_in),
193 (const struct sockaddr *) remote_sa,
194 sizeof (struct sockaddr_in));
176} 195}
177 196
178 197
@@ -187,8 +206,37 @@ static int
187check_address_change_notification (void *cls, 206check_address_change_notification (void *cls,
188 const struct GNUNET_NAT_AddressChangeNotificationMessage *acn) 207 const struct GNUNET_NAT_AddressChangeNotificationMessage *acn)
189{ 208{
190 GNUNET_break (0); 209 size_t alen = ntohs (acn->header.size) - sizeof (*acn);
191 return GNUNET_SYSERR; 210
211 switch (alen)
212 {
213 case sizeof (struct sockaddr_in):
214 {
215 const struct sockaddr_in *s4
216 = (const struct sockaddr_in *) &acn[1];
217 if (AF_INET != s4->sin_family)
218 {
219 GNUNET_break (0);
220 return GNUNET_SYSERR;
221 }
222 }
223 break;
224 case sizeof (struct sockaddr_in6):
225 {
226 const struct sockaddr_in6 *s6
227 = (const struct sockaddr_in6 *) &acn[1];
228 if (AF_INET6 != s6->sin6_family)
229 {
230 GNUNET_break (0);
231 return GNUNET_SYSERR;
232 }
233 }
234 break;
235 default:
236 GNUNET_break (0);
237 return GNUNET_SYSERR;
238 }
239 return GNUNET_OK;
192} 240}
193 241
194 242
@@ -202,10 +250,48 @@ static void
202handle_address_change_notification (void *cls, 250handle_address_change_notification (void *cls,
203 const struct GNUNET_NAT_AddressChangeNotificationMessage *acn) 251 const struct GNUNET_NAT_AddressChangeNotificationMessage *acn)
204{ 252{
205 // FIXME: parse 253 struct GNUNET_NAT_Handle *nh = cls;
206 // FIXME: update ae-DLL 254 size_t alen = ntohs (acn->header.size) - sizeof (*acn);
207 // FIXME: call callback! 255 const struct sockaddr *sa = (const struct sockaddr *) &acn[1];
208 GNUNET_break (0); 256 enum GNUNET_NAT_AddressClass ac;
257 struct AddrEntry *ae;
258
259 ac = (enum GNUNET_NAT_AddressClass) ntohl (acn->addr_class);
260 if (GNUNET_YES == ntohl (acn->add_remove))
261 {
262 ae = GNUNET_malloc (sizeof (*ae) + alen);
263 ae->addrlen = alen;
264 GNUNET_memcpy (&ae[1],
265 sa,
266 alen);
267 GNUNET_CONTAINER_DLL_insert (nh->ae_head,
268 nh->ae_tail,
269 ae);
270 }
271 else
272 {
273 for (ae = nh->ae_head; NULL != ae; ae = ae->next)
274 if ( (ae->addrlen == alen) &&
275 (0 == memcmp (&ae[1],
276 sa,
277 alen)) )
278 break;
279 if (NULL == ae)
280 {
281 GNUNET_break (0);
282 reconnect (nh);
283 return;
284 }
285 GNUNET_CONTAINER_DLL_remove (nh->ae_head,
286 nh->ae_tail,
287 ae);
288 GNUNET_free (ae);
289 }
290 nh->address_callback (nh->callback_cls,
291 ntohl (acn->add_remove),
292 ac,
293 sa,
294 alen);
209} 295}
210 296
211 297