aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_udp_broadcasting.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/plugin_transport_udp_broadcasting.c')
-rw-r--r--src/transport/plugin_transport_udp_broadcasting.c126
1 files changed, 109 insertions, 17 deletions
diff --git a/src/transport/plugin_transport_udp_broadcasting.c b/src/transport/plugin_transport_udp_broadcasting.c
index c53665f10..493b98898 100644
--- a/src/transport/plugin_transport_udp_broadcasting.c
+++ b/src/transport/plugin_transport_udp_broadcasting.c
@@ -41,6 +41,24 @@
41 41
42#define LOG(kind,...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__) 42#define LOG(kind,...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__)
43 43
44/* *********** Cryogenic ********** */
45
46#include <sys/stat.h>
47#include <fcntl.h>
48
49#include <sys/ioctl.h>
50#include <sys/select.h>
51#include <sys/time.h>
52
53#define PM_MAGIC 'k'
54#define PM_SET_DELAY_AND_TIMEOUT _IOW(PM_MAGIC, 1, struct pm_times)
55
56struct pm_times {
57 unsigned long delay_msecs;
58 unsigned long timeout_msecs;
59};
60/************************************/
61
44 62
45struct UDP_Beacon_Message 63struct UDP_Beacon_Message
46{ 64{
@@ -72,6 +90,13 @@ struct BroadcastAddress
72 void *addr; 90 void *addr;
73 91
74 socklen_t addrlen; 92 socklen_t addrlen;
93
94 /*
95 * Cryogenic fields
96 */
97 struct GNUNET_DISK_FileHandle cryogenic_fd;
98
99 struct pm_times cryogenic_times;
75}; 100};
76 101
77 102
@@ -315,13 +340,33 @@ udp_ipv4_broadcast_send (void *cls,
315 GNUNET_a2s (baddr->addr, baddr->addrlen)); 340 GNUNET_a2s (baddr->addr, baddr->addrlen));
316 } 341 }
317 } 342 }
318 // if (-1 != baddr->cryogenic_fd) { 343
319 // ioctl (baddr->cryogenic_fd, broadcast_interval +/- X) 344 /*
320 // GNUNET_SCHEDULER_add_write_file (baddr->cryogenic_fd, &udp_ipv4_broadcast_send, baddr); 345 * Cryogenic
321 // } else 346 */
322 baddr->broadcast_task = 347 if (baddr->cryogenic_fd.fd > 0)
323 GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval, 348 {
324 &udp_ipv4_broadcast_send, baddr); 349 baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval/1000.0)*0.5;
350 baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval/1000.0)*1.5;
351
352 if (ioctl(baddr->cryogenic_fd.fd,
353 PM_SET_DELAY_AND_TIMEOUT,
354 &baddr->cryogenic_times) < 0)
355 {
356 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "ioctl");
357 baddr->broadcast_task =
358 GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
359 &udp_ipv4_broadcast_send, baddr);
360 }
361 else
362 GNUNET_SCHEDULER_add_write_file (&baddr->cryogenic_fd,
363 &udp_ipv4_broadcast_send, baddr);
364
365 }
366 else
367 baddr->broadcast_task =
368 GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
369 &udp_ipv4_broadcast_send, baddr);
325} 370}
326 371
327 372
@@ -376,10 +421,31 @@ udp_ipv6_broadcast_send (void *cls,
376 GNUNET_a2s ((const struct sockaddr *) &plugin->ipv6_multicast_address, 421 GNUNET_a2s ((const struct sockaddr *) &plugin->ipv6_multicast_address,
377 sizeof (struct sockaddr_in6))); 422 sizeof (struct sockaddr_in6)));
378 } 423 }
379 // cryogenic... 424 /*
380 baddr->broadcast_task = 425 * Cryogenic
381 GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval, 426 */
382 &udp_ipv6_broadcast_send, baddr); 427 if (baddr->cryogenic_fd.fd > 0)
428 {
429 baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval/1000.0)*0.5;
430 baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval/1000.0)*1.5;
431
432 if (ioctl(baddr->cryogenic_fd.fd,
433 PM_SET_DELAY_AND_TIMEOUT,
434 &baddr->cryogenic_times) < 0)
435 {
436 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "ioctl");
437 baddr->broadcast_task =
438 GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
439 &udp_ipv6_broadcast_send, baddr);
440 }
441 else
442 GNUNET_SCHEDULER_add_write_file (&baddr->cryogenic_fd,
443 &udp_ipv4_broadcast_send, baddr);
444 }
445 else
446 baddr->broadcast_task =
447 GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
448 &udp_ipv6_broadcast_send, baddr);
383} 449}
384 450
385 451
@@ -428,15 +494,22 @@ iface_proc (void *cls,
428 (NULL != plugin->sockv4) && 494 (NULL != plugin->sockv4) &&
429 (addrlen == sizeof (struct sockaddr_in)) ) 495 (addrlen == sizeof (struct sockaddr_in)) )
430 { 496 {
497
498 /*
499 * setup Cryogenic FD for ipv4 broadcasting
500 */
431 char *filename; 501 char *filename;
432
433 GNUNET_asprintf (&filename, 502 GNUNET_asprintf (&filename,
434 "/dev/power/net-%s", 503 "/dev/power/%s",
435 name); 504 name);
436 // ba->cryogenic_fd = GNUNET_DISK_file_open (filename, ...); 505 ba->cryogenic_fd =
506 GNUNET_DISK_file_open (filename,
507 GNUNET_DISK_OPEN_WRITE,
508 GNUNET_DISK_PERM_NONE);
437 GNUNET_free (filename); 509 GNUNET_free (filename);
510
438 ba->broadcast_task = 511 ba->broadcast_task =
439 GNUNET_SCHEDULER_add_now (&udp_ipv4_broadcast_send, ba); 512 GNUNET_SCHEDULER_add_now (&udp_ipv4_broadcast_send, ba);
440 } 513 }
441 if ((GNUNET_YES == plugin->enable_ipv6) && 514 if ((GNUNET_YES == plugin->enable_ipv6) &&
442 (NULL != plugin->sockv6) && 515 (NULL != plugin->sockv6) &&
@@ -474,7 +547,21 @@ iface_proc (void *cls,
474 { 547 {
475 LOG (GNUNET_ERROR_TYPE_DEBUG, 548 LOG (GNUNET_ERROR_TYPE_DEBUG,
476 "IPv6 multicasting running\n"); 549 "IPv6 multicasting running\n");
477 // setup cryogenic FD... 550
551 /*
552 * setup Cryogenic FD for ipv6 broadcasting
553 */
554 char *filename;
555 GNUNET_asprintf (&filename,
556 "/dev/power/%s",
557 name);
558 ba->cryogenic_fd =
559 GNUNET_DISK_file_open (filename,
560 GNUNET_DISK_OPEN_WRITE,
561 GNUNET_DISK_PERM_NONE);
562 GNUNET_free (filename);
563
564
478 ba->broadcast_task = 565 ba->broadcast_task =
479 GNUNET_SCHEDULER_add_now (&udp_ipv6_broadcast_send, ba); 566 GNUNET_SCHEDULER_add_now (&udp_ipv6_broadcast_send, ba);
480 } 567 }
@@ -572,7 +659,12 @@ stop_broadcast (struct Plugin *plugin)
572 LOG (GNUNET_ERROR_TYPE_DEBUG, "IPv6 multicasting stopped\n"); 659 LOG (GNUNET_ERROR_TYPE_DEBUG, "IPv6 multicasting stopped\n");
573 } 660 }
574 } 661 }
575 // close cryogenic FD... 662
663 /*
664 * Close Cryogenic FD
665 */
666 GNUNET_DISK_file_cose(p->cryogenic_fd);
667
576 GNUNET_CONTAINER_DLL_remove (plugin->broadcast_head, 668 GNUNET_CONTAINER_DLL_remove (plugin->broadcast_head,
577 plugin->broadcast_tail, p); 669 plugin->broadcast_tail, p);
578 GNUNET_free (p->addr); 670 GNUNET_free (p->addr);