/*
This file is part of GNUnet
- (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
+ (C) 2010 2011 Christian Grothoff (and other contributing authors)
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
#include "gnunet_crypto_lib.h"
#include "gnunet_fragmentation_lib.h"
#include "gnunet_constants.h"
-//#include "wlan/ieee80211.h"
-//#include <netinet/ip.h>
#include <string.h>
#define IEEE80211_FC0_TYPE_CTL 0x04
#define IEEE80211_FC0_TYPE_DATA 0x08
-/*
- * Structure of an internet header, naked of options.
- */
-struct iph
-{
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- unsigned int ip_hl:4; /* header length */
- unsigned int ip_v:4; /* version */
-#endif
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int ip_v:4; /* version */
- unsigned int ip_hl:4; /* header length */
-#endif
- u_int8_t ip_tos; /* type of service */
- u_short ip_len; /* total length */
- u_short ip_id; /* identification */
- u_short ip_off; /* fragment offset field */
-#define IP_RF 0x8000 /* reserved fragment flag */
-#define IP_DF 0x4000 /* dont fragment flag */
-#define IP_MF 0x2000 /* more fragments flag */
-#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
- u_int8_t ip_ttl; /* time to live */
- u_int8_t ip_p; /* protocol */
- u_short ip_sum; /* checksum */
- struct in_addr ip_src, ip_dst; /* source and dest address */
-};
-
-struct udphdr
-{
- u_int16_t source;
- u_int16_t dest;
- u_int16_t len;
- u_int16_t check;
-};
+GNUNET_NETWORK_STRUCT_BEGIN
/*
* generic definitions for IEEE 802.11 frames
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
u_int8_t llc[4];
-#if DEBUG_wlan_ip_udp_packets_on_air > 1
- struct iph ip;
- struct udphdr udp;
-#endif
} GNUNET_PACKED;
+GNUNET_NETWORK_STRUCT_END
/**
* Encapsulation of all of the state of the plugin.
struct GNUNET_SERVER_MessageStreamTokenizer *data_tokenizer;
/**
- * stdout pipe handle for the gnunet-wlan-helper process
+ * stdout pipe handle for the gnunet-helper-transport-wlan process
*/
struct GNUNET_DISK_PipeHandle *server_stdout;
/**
- * stdout file handle for the gnunet-wlan-helper process
+ * stdout file handle for the gnunet-helper-transport-wlan process
*/
const struct GNUNET_DISK_FileHandle *server_stdout_handle;
/**
- * stdin pipe handle for the gnunet-wlan-helper process
+ * stdin pipe handle for the gnunet-helper-transport-wlan process
*/
struct GNUNET_DISK_PipeHandle *server_stdin;
/**
- * stdin file handle for the gnunet-wlan-helper process
+ * stdin file handle for the gnunet-helper-transport-wlan process
*/
const struct GNUNET_DISK_FileHandle *server_stdin_handle;
* Tracker for bandwidth limit
*/
struct GNUNET_BANDWIDTH_Tracker tracker;
+
+ /**
+ * saves the current state of the helper process
+ */
+ int helper_is_running;
};
/**
struct Sessionqueue *next;
struct Sessionqueue *prev;
struct Session *content;
+#if !HAVE_UNALIGNED_64_ACCESS
+ void *dummy; /* for alignment, see #1909 */
+#endif
};
/**
struct Session *session;
};
+
+GNUNET_NETWORK_STRUCT_BEGIN
+
+/**
+ * Header for messages which need fragmentation
+ */
+struct WlanHeader
+{
+
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * checksum/error correction
+ */
+ uint32_t crc GNUNET_PACKED;
+
+ /**
+ * To whom are we talking to (set to our identity
+ * if we are still waiting for the welcome message)
+ */
+ struct GNUNET_PeerIdentity target;
+
+ /**
+ * Where the packet came from
+ */
+ struct GNUNET_PeerIdentity source;
+
+// followed by payload
+
+};
+GNUNET_NETWORK_STRUCT_END
+
/**
* Information kept for each message that is yet to
* be transmitted.
/**
* Session infos gathered from a messages
*/
-
struct Session_light
{
/**
/**
* Struct for Messages in the fragment queue
*/
-
struct FragmentMessage
{
/**
* Session this message belongs to
*/
-
struct Session *session;
/**
static void
do_transmit (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
+
static void
free_session (struct Plugin *plugin, struct Sessionqueue *queue,
int do_free_macendpoint);
+
static struct MacEndpoint *
create_macendpoint (struct Plugin *plugin, const struct MacAddress *addr);
t += sprintf (t, "%02X", src[j] & 0xff);
else
t += sprintf (t, " ");
- t += sprintf (t, j % 2 ? " " : "-");
+
+ t += sprintf (t, (j % 2) ? " " : "-");
}
t += sprintf (t, " ");
struct Sessionqueue *queue = cls;
GNUNET_assert (queue != NULL);
- GNUNET_assert(queue->content != NULL);
+ GNUNET_assert (queue->content != NULL);
queue->content->timeout_task = GNUNET_SCHEDULER_NO_TASK;
if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
{
(queue->content->last_activity, SESSION_TIMEOUT)).rel_value == 0)
{
- GNUNET_assert(queue->content->mac != NULL);
- GNUNET_assert(queue->content->mac->plugin != NULL);
- GNUNET_STATISTICS_update (queue->content->mac->plugin->env->stats, _("# wlan session timeouts"), 1, GNUNET_NO);
+ GNUNET_assert (queue->content->mac != NULL);
+ GNUNET_assert (queue->content->mac->plugin != NULL);
+ GNUNET_STATISTICS_update (queue->content->mac->plugin->env->stats,
+ _("# wlan session timeouts"), 1, GNUNET_NO);
free_session (queue->content->mac->plugin, queue, GNUNET_YES);
}
else
* @param peer peer identity to use for this session
* @return returns the session
*/
-
static struct Session *
create_session (struct Plugin *plugin, struct MacEndpoint *endpoint,
const struct GNUNET_PeerIdentity *peer)
{
GNUNET_assert (endpoint != NULL);
GNUNET_assert (plugin != NULL);
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan session created"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan session created"), 1,
+ GNUNET_NO);
struct Sessionqueue *queue =
GNUNET_malloc (sizeof (struct Sessionqueue) + sizeof (struct Session));
queue->content = (struct Session *) &queue[1];
queue->content->mac = endpoint;
- memcpy (&(queue->content->target), peer, sizeof (struct GNUNET_PeerIdentity));
+ queue->content->target = *peer;
queue->content->last_activity = GNUNET_TIME_absolute_get ();
queue->content->timeout_task =
GNUNET_SCHEDULER_add_delayed (SESSION_TIMEOUT, &session_timeout, queue);
GNUNET_CONTAINER_DLL_insert_tail (plugin->pending_Sessions_head,
plugin->pending_Sessions_tail, queue);
plugin->pendingsessions++;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+ plugin->pendingsessions, GNUNET_NO);
}
}
* Function to calculate the time of the next periodic "hello-beacon"
* @param plugin pointer to the plugin struct
*/
-
static void
set_next_beacon_time (struct Plugin *const plugin)
{
* Function to set the timer for the next timeout of the fragment queue
* @param plugin the handle to the plugin struct
*/
-
static void
set_next_send (struct Plugin *const plugin)
{
struct GNUNET_TIME_Relative next_send;
+ //abort if helper is not running
+ if (plugin->helper_is_running == GNUNET_NO)
+ {
+ return;
+ }
+
//cancel old task
if (plugin->server_write_delay_task != GNUNET_SCHEDULER_NO_TASK)
{
pm = session->pending_message_head;
if (pm == NULL)
- {
+ {
#if DEBUG_wlan
- GNUNET_log_from(GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- "pending message is empty, should not happen. session %p\n",
- session);
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
+ "pending message is empty, should not happen. session %p\n",
+ session);
#endif
- sessionqueue_alt = sessionqueue;
- sessionqueue = sessionqueue->next;
- plugin->pendingsessions--;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
- GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
- plugin->pending_Sessions_tail,
- sessionqueue_alt);
+ sessionqueue_alt = sessionqueue;
+ sessionqueue = sessionqueue->next;
+ plugin->pendingsessions--;
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+ plugin->pendingsessions, GNUNET_NO);
+ GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
+ plugin->pending_Sessions_tail,
+ sessionqueue_alt);
- GNUNET_free (sessionqueue_alt);
- continue;
+ GNUNET_free (sessionqueue_alt);
+ continue;
- }
+ }
//check for message timeout
if (GNUNET_TIME_absolute_get_remaining (pm->timeout).rel_value > 0)
FRAGMENT_QUEUE_MESSAGES_OUT_PER_SESSION))
{
plugin->pendingsessions--;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+ plugin->pendingsessions, GNUNET_NO);
GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
plugin->pending_Sessions_tail,
sessionqueue);
sessionqueue_alt = sessionqueue;
sessionqueue = sessionqueue->next;
plugin->pendingsessions--;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+ plugin->pendingsessions, GNUNET_NO);
GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
plugin->pending_Sessions_tail,
sessionqueue_alt);
struct FragmentMessage_queue *fmq;
struct FragmentMessage_queue *fmq_next;
- if (fm != NULL)
+ fmq = plugin->sending_messages_head;
+ while (fmq != NULL)
{
- fmq = plugin->sending_messages_head;
- while (fmq != NULL)
+ fmq_next = fmq->next;
+ if (fmq->content == fm)
{
- fmq_next = fmq->next;
- if (fmq->content == fm)
- {
- GNUNET_CONTAINER_DLL_remove (plugin->sending_messages_head,
- plugin->sending_messages_tail, fmq);
- GNUNET_free (fmq);
- }
- fmq = fmq_next;
+ GNUNET_CONTAINER_DLL_remove (plugin->sending_messages_head,
+ plugin->sending_messages_tail, fmq);
+ GNUNET_free (fmq);
}
+ fmq = fmq_next;
+ }
+
+ (session->mac->fragment_messages_out_count)--;
+ session->fragment_messages_out_count--;
+ plugin->pending_Fragment_Messages--;
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending fragments"),
+ plugin->pending_Fragment_Messages, GNUNET_NO);
+ GNUNET_CONTAINER_DLL_remove (endpoint->sending_messages_head,
+ endpoint->sending_messages_tail, fm);
+ GNUNET_FRAGMENT_context_destroy (fm->fragcontext);
+ if (fm->timeout_task != GNUNET_SCHEDULER_NO_TASK)
+ {
+ GNUNET_SCHEDULER_cancel (fm->timeout_task);
+ fm->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+ }
+
+ GNUNET_free (fm);
- (session->mac->fragment_messages_out_count)--;
- session->fragment_messages_out_count--;
- plugin->pending_Fragment_Messages--;
- GNUNET_CONTAINER_DLL_remove (endpoint->sending_messages_head,
- endpoint->sending_messages_tail, fm);
- GNUNET_FRAGMENT_context_destroy (fm->fragcontext);
- if (fm->timeout_task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel (fm->timeout_task);
- GNUNET_free (fm);
-
- queue_session (plugin, session);
+ queue_session (plugin, session);
#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Free pending fragment messages %p, session %p\n", fm,
- session);
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+ "Free pending fragment messages %p, session %p\n", fm,
+ session);
#endif
- }
}
/**
Header->i_fc[0] = IEEE80211_FC0_TYPE_DATA;
Header->i_fc[1] = 0x00;
- memcpy (&Header->i_addr3, &mac_bssid, sizeof (mac_bssid));
+ memcpy (&Header->i_addr3, &mac_bssid_gnunet, sizeof (mac_bssid_gnunet));
memcpy (&Header->i_addr2, plugin->mac_address.mac,
sizeof (plugin->mac_address));
memcpy (&Header->i_addr1, to_mac_addr, sizeof (struct MacAddress));
tmp16 = (uint16_t *) Header->i_dur;
- *tmp16 = (uint16_t) htole16 ((size * 1000000) / rate + 290);
+ *tmp16 = (uint16_t) GNUNET_htole16 ((size * 1000000) / rate + 290);
Header->llc[0] = WLAN_LLC_DSAP_FIELD;
Header->llc[1] = WLAN_LLC_SSAP_FIELD;
-#if DEBUG_wlan_ip_udp_packets_on_air > 1
- uint crc = 0;
- uint16_t *x;
- int count;
-
- Header->ip.ip_dst.s_addr = *((uint32_t *) & to_mac_addr->mac[2]);
- Header->ip.ip_src.s_addr = *((uint32_t *) & plugin->mac_address.mac[2]);
- Header->ip.ip_v = 4;
- Header->ip.ip_hl = 5;
- Header->ip.ip_p = 17;
- Header->ip.ip_ttl = 1;
- Header->ip.ip_len = htons (size + 8);
- Header->ip.ip_sum = 0;
- x = (uint16_t *) & Header->ip;
- count = sizeof (struct iph);
- while (count > 1)
- {
- /* This is the inner loop */
- crc += (unsigned short) *x++;
- count -= 2;
- }
- /* Add left-over byte, if any */
- if (count > 0)
- crc += *(unsigned char *) x;
- crc = (crc & 0xffff) + (crc >> 16);
- Header->ip.ip_sum = htons (~(unsigned short) crc);
- Header->udp.len = htons (size - sizeof (struct ieee80211_frame));
-
-#endif
-
return GNUNET_YES;
}
-/**
- * 32bit CRC
- *
- * @param msgbuf pointer tor the data
- * @param msgbuf_size size of the data
- *
- * @return 32bit crc value
- */
-
-uint32_t
-getcrc32 (const char *msgbuf, size_t msgbuf_size)
-{
-
- return GNUNET_CRYPTO_crc32_n (msgbuf, msgbuf_size);;
-}
-
-/**
- * 16bit CRC
- *
- * @param msgbuf pointer tor the data
- * @param msgbuf_size size of the data
- *
- * @return 16bit crc value
- */
-
-uint16_t
-getcrc16 (const char *msgbuf, size_t msgbuf_size)
-{
- //TODO calc some crc
- return 0;
-}
/**
* function to add a fragment of a message to send
* @param cls FragmentMessage this message belongs to
* @param hdr pointer to the start of the message
*/
-
-void
+static void
add_message_for_send (void *cls, const struct GNUNET_MessageHeader *hdr)
{
uint16_t size;
#if DEBUG_wlan_retransmission > 1
- GNUNET_loHELLO_BEACON_SCALING_FACTORg_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
"Adding fragment of message %p to send, session %p, endpoint %p, type %u\n",
fm, fm->session, endpoint, hdr->type);
#endif
/**
- * We have been notified that wlan-helper has written something to stdout.
+ * We have been notified that gnunet-helper-transport-wlan has written something to stdout.
* Handle the output, then reschedule this function to be called again once
* more is available.
*
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
_
- ("Finished reading from wlan-helper stdout with code: %d\n"),
+ ("Finished reading from gnunet-helper-transport-wlan stdout with code: %d\n"),
bytes);
#endif
return;
}
/**
- * Start the gnunet-wlan-helper process.
+ * Start the gnunet-helper-transport-wlan process.
*
* @param plugin the transport plugin
* @return GNUNET_YES if process was started, GNUNET_SYSERR on error
static int
wlan_transport_start_wlan_helper (struct Plugin *plugin)
{
- const char *filenamehw = "gnunet-transport-wlan-helper";
- const char *filenameloopback = "gnunet-transport-wlan-helper-dummy";
+ const char *filenamehw = "gnunet-helper-transport-wlan";
+ const char *filenameloopback = "gnunet-helper-transport-wlan-dummy";
+ char *absolute_filename = NULL;
+
+ if (plugin->helper_is_running == GNUNET_YES)
+ {
+#if DEBUG_wlan
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+ "wlan_transport_start_wlan_helper not needed, helper already running!");
+#endif
+ return GNUNET_YES;
+ }
- plugin->server_stdout = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_NO, GNUNET_YES);
+ plugin->server_stdout = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_NO, GNUNET_YES);
if (plugin->server_stdout == NULL)
return GNUNET_SYSERR;
- plugin->server_stdin = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_NO);
+ plugin->server_stdin = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_YES, GNUNET_NO);
if (plugin->server_stdin == NULL)
return GNUNET_SYSERR;
+ if ((plugin->testmode == 1) || (plugin->testmode == 2))
+ {
+ if (GNUNET_OS_check_helper_binary (filenameloopback) == GNUNET_YES)
+ {
+ absolute_filename = GNUNET_strdup (filenameloopback);
+ }
+ else
+ {
+ char cwd[FILENAME_MAX];
+
+ GNUNET_assert (getcwd (cwd, sizeof (cwd)) != NULL);
+
+ GNUNET_asprintf (&absolute_filename, "%s%s%s", cwd, DIR_SEPARATOR_STR,
+ filenameloopback);
+
+ if (GNUNET_DISK_file_test (filenameloopback) != GNUNET_YES)
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
+ "Helper `%s' not found! %i\n", absolute_filename);
+ GNUNET_break (0);
+ }
+ }
+ }
+
/* Start the server process */
if (plugin->testmode == 0)
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Starting gnunet-wlan-helper process cmd: %s %s %i\n",
+ "Starting gnunet-helper-transport-wlan process cmd: %s %s %i\n",
filenamehw, plugin->interface, plugin->testmode);
#endif
if (GNUNET_OS_check_helper_binary (filenamehw) == GNUNET_YES)
{
plugin->server_proc =
- GNUNET_OS_start_process (plugin->server_stdin, plugin->server_stdout,
+ GNUNET_OS_start_process (GNUNET_NO, plugin->server_stdin, plugin->server_stdout,
filenamehw, filenamehw, plugin->interface,
NULL);
}
else if (GNUNET_OS_check_helper_binary (filenamehw) == GNUNET_NO)
{
GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- "gnunet-transport-wlan-helper is not suid, please change it or look at the doku\n");
+ "gnunet-helper-transport-wlan is not suid, please change it or look at the doku\n");
GNUNET_break (0);
}
else
{
GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- "gnunet-transport-wlan-helper not found, please look if it exists and is the $PATH variable!\n");
+ "gnunet-helper-transport-wlan not found, please look if it exists and is the $PATH variable!\n");
GNUNET_break (0);
}
{
#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Starting gnunet-wlan-helper loopback 1 process cmd: %s %s %i\n",
- filenameloopback, plugin->interface, plugin->testmode);
+ GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, PLUGIN_LOG_NAME,
+ "Starting gnunet-helper-transport-wlan-dummy loopback 1 process cmd: %s %s %i\n",
+ absolute_filename, plugin->interface, plugin->testmode);
#endif
-
- if (GNUNET_OS_check_helper_binary (filenameloopback) != GNUNET_SYSERR)
- {
- plugin->server_proc =
- GNUNET_OS_start_process (plugin->server_stdin, plugin->server_stdout,
- filenameloopback, filenameloopback, "1",
- NULL);
- }
- else
+ plugin->server_proc =
+ GNUNET_OS_start_process (GNUNET_NO, plugin->server_stdin, plugin->server_stdout,
+ absolute_filename, absolute_filename, "1",
+ NULL);
+ if (plugin->server_proc == NULL)
{
GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- "gnunet-transport-wlan-helper-dummy not found, please look if it exists and is the $PATH variable!\n");
+ "`%s' not found, please look if it exists and is in the $PATH variable!\n",
+ absolute_filename);
GNUNET_break (0);
}
}
else if (plugin->testmode == 2)
{
#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Starting gnunet-wlan-helper loopback 2 process cmd: %s %s %i\n",
- filenameloopback, plugin->interface, plugin->testmode);
+ GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, PLUGIN_LOG_NAME,
+ "Starting gnunet-helper-transport-wlan-dummy loopback 2 process cmd: %s %s %i\n",
+ absolute_filename, plugin->interface, plugin->testmode);
#endif
- if (GNUNET_OS_check_helper_binary (filenameloopback) != GNUNET_SYSERR)
- {
- plugin->server_proc =
- GNUNET_OS_start_process (plugin->server_stdin, plugin->server_stdout,
- filenameloopback, filenameloopback, "2",
- NULL);
- }
- else
+
+ plugin->server_proc =
+ GNUNET_OS_start_process (GNUNET_NO, plugin->server_stdin, plugin->server_stdout,
+ absolute_filename, absolute_filename, "2",
+ NULL);
+ if (plugin->server_proc == NULL)
{
GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- "gnunet-transport-wlan-helper-dummy not found, please look if it exists and is in the $PATH variable!\n");
+ "`%s' not found, please look if it exists and is in the $PATH variable!\n",
+ absolute_filename);
GNUNET_break (0);
}
}
+ if (absolute_filename != NULL)
+ GNUNET_free (absolute_filename);
if (plugin->server_proc == NULL)
{
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Failed to start gnunet-wlan-helper process\n");
+ "Failed to start gnunet-helper-transport-wlan process\n");
#endif
return GNUNET_SYSERR;
}
+
+
/* Close the write end of the read pipe */
GNUNET_DISK_pipe_close_end (plugin->server_stdout,
GNUNET_DISK_PIPE_END_WRITE);
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Adding server_read_task for the wlan-helper\n");
+ "Adding server_read_task for the gnunet-helper-transport-wlan\n");
#endif
plugin->server_read_task =
plugin->server_stdout_handle,
&wlan_plugin_helper_read, plugin);
+ plugin->helper_is_running = GNUNET_YES;
return GNUNET_YES;
}
/**
- * Stops the gnunet-wlan-helper process.
+ * Stops the gnunet-helper-transport-wlan process.
*
* @param plugin the transport plugin
* @return GNUNET_YES if process was started, GNUNET_SYSERR on error
static int
wlan_transport_stop_wlan_helper (struct Plugin *plugin)
{
+#if DEBUG_wlan
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+ "Stoping WLAN helper process\n");
+#endif
+
+ if (plugin->helper_is_running == GNUNET_NO)
+ {
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Stoping WLAN helper process\n");
+ "wlan_transport_stop_wlan_helper not needed, helper already stopped!");
#endif
+ return GNUNET_YES;
+ }
if (plugin->server_write_delay_task != GNUNET_SCHEDULER_NO_TASK)
{
GNUNET_SCHEDULER_cancel (plugin->server_write_delay_task);
plugin->server_write_delay_task = GNUNET_SCHEDULER_NO_TASK;
}
+
if (plugin->server_write_task != GNUNET_SCHEDULER_NO_TASK)
{
GNUNET_SCHEDULER_cancel (plugin->server_write_task);
plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
}
+
if (plugin->server_read_task != GNUNET_SCHEDULER_NO_TASK)
{
GNUNET_SCHEDULER_cancel (plugin->server_read_task);
GNUNET_DISK_pipe_close (plugin->server_stdout);
GNUNET_DISK_pipe_close (plugin->server_stdin);
- GNUNET_OS_process_kill (plugin->server_proc, 9);
+ GNUNET_OS_process_kill (plugin->server_proc, SIGKILL);
+ GNUNET_OS_process_wait (plugin->server_proc);
GNUNET_OS_process_close (plugin->server_proc);
+ plugin->helper_is_running = GNUNET_NO;
+
return GNUNET_YES;
}
{
struct Finish_send *finish = cls;
struct Plugin *plugin;
+
plugin = finish->plugin;
plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
{
- GNUNET_free_non_null(finish->msgstart);
+ GNUNET_free_non_null (finish->msgstart);
GNUNET_free (finish);
return;
}
- wlan_transport_start_wlan_helper(plugin);
+ wlan_transport_start_wlan_helper (plugin);
if (finish->size != 0)
- {
- plugin->server_write_task =
- GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
- plugin->server_stdin_handle,
- &finish_sending, finish);
- }
+ {
+ plugin->server_write_task =
+ GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+ plugin->server_stdin_handle,
+ &finish_sending, finish);
+ }
else
- {
- set_next_send (plugin);
- GNUNET_free_non_null(finish->msgstart);
- GNUNET_free (finish);
- }
+ {
+ set_next_send (plugin);
+ GNUNET_free_non_null (finish->msgstart);
+ GNUNET_free (finish);
+ }
}
* @param finish pointer to the Finish_send struct to finish
*/
static void
-restart_helper(struct Plugin *plugin, struct Finish_send *finish)
+restart_helper (struct Plugin *plugin, struct Finish_send *finish)
{
- static struct GNUNET_TIME_Relative next_try = {1000};
- GNUNET_assert(finish != NULL);
+ static struct GNUNET_TIME_Relative next_try = { 1000 };
+ GNUNET_assert (finish != NULL);
- wlan_transport_stop_wlan_helper(plugin);
- plugin->server_write_task = GNUNET_SCHEDULER_add_delayed (next_try, &delay_restart_helper, finish);
- GNUNET_TIME_relative_multiply(next_try, HELPER_RESTART_SCALING_FACTOR);
+ wlan_transport_stop_wlan_helper (plugin);
+ plugin->server_write_task =
+ GNUNET_SCHEDULER_add_delayed (next_try, &delay_restart_helper, finish);
+ GNUNET_TIME_relative_multiply (next_try, HELPER_RESTART_SCALING_FACTOR);
}
return;
}
bytes =
- GNUNET_DISK_file_write (plugin->server_stdin_handle, finish->head_of_next_write,
- finish->size);
+ GNUNET_DISK_file_write (plugin->server_stdin_handle,
+ finish->head_of_next_write, finish->size);
if (bytes != finish->size)
{
if (bytes != GNUNET_SYSERR)
- {
+ {
finish->head_of_next_write += bytes;
finish->size -= bytes;
plugin->server_write_task =
GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
plugin->server_stdin_handle,
&finish_sending, finish);
- }
+ }
else
- {
- restart_helper(plugin, finish);
- }
+ {
+ restart_helper (plugin, finish);
+ }
}
else
{
struct Radiotap_Send *radioHeader;
struct GNUNET_MessageHeader *msgheader2;
const struct GNUNET_MessageHeader *hello;
- struct Finish_send * finish;
+ struct Finish_send *finish;
GNUNET_assert (plugin != NULL);
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan hello beacons send"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan hello beacons send"),
+ 1, GNUNET_NO);
hello = plugin->env->get_our_hello ();
hello_size = GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello);
msgheader2 = (struct GNUNET_MessageHeader *) &ieeewlanheader[1];
/*msgheader2->size =
- htons (GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello) +
- sizeof (struct GNUNET_MessageHeader));
-
- msgheader2->type = htons (GNUNET_MESSAGE_TYPE_WLAN_ADVERTISEMENT);*/
+ * htons (GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello) +
+ * sizeof (struct GNUNET_MessageHeader));
+ *
+ * msgheader2->type = htons (GNUNET_MESSAGE_TYPE_WLAN_ADVERTISEMENT); */
memcpy (msgheader2, hello, hello_size);
bytes = GNUNET_DISK_file_write (plugin->server_stdin_handle, msgheader, size);
{
GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
_
- ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
+ ("Error writing to wlan helper. errno == %d, ERROR: %s\n"),
errno, strerror (errno));
finish = GNUNET_malloc (sizeof (struct Finish_send));
finish->plugin = plugin;
finish->head_of_next_write = NULL;
finish->size = 0;
finish->msgstart = NULL;
- restart_helper(plugin, finish);
+ restart_helper (plugin, finish);
+
+ set_next_beacon_time (plugin);
}
else
- {
+ {
GNUNET_assert (bytes == size);
+ set_next_beacon_time (plugin);
set_next_send (plugin);
- }
+ }
GNUNET_free (msgheader);
- set_next_beacon_time (plugin);
+
}
/**
* @param hdr pointer to the hdr where the ack is stored
*
*/
-
static void
add_ack_for_send (void *cls, uint32_t msg_id,
const struct GNUNET_MessageHeader *hdr)
session->mac->fragment_messages_out_count++;
session->fragment_messages_out_count++;
plugin->pending_Fragment_Messages++;
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending fragments"),
+ plugin->pending_Fragment_Messages, GNUNET_NO);
fm = GNUNET_malloc (sizeof (struct FragmentMessage));
fm->session = session;
ssize_t bytes;
struct AckSendQueue *ack;
- struct Finish_send * finish;
+ struct Finish_send *finish;
ack = plugin->ack_send_queue_head;
#endif
GNUNET_assert (plugin != NULL);
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan acks send"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan acks send"), 1,
+ GNUNET_NO);
getRadiotapHeader (plugin, ack->endpoint, ack->radioHeader);
getWlanHeader (ack->ieeewlanheader, &ack->endpoint->addr, plugin,
{
GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
_
- ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
+ ("Error writing to wlan helper. errno == %d, ERROR: %s\n"),
errno, strerror (errno));
finish = GNUNET_malloc (sizeof (struct Finish_send));
finish->plugin = plugin;
finish->head_of_next_write = NULL;
finish->size = 0;
finish->msgstart = NULL;
- restart_helper(plugin, finish);
+ restart_helper (plugin, finish);
}
else
{
do_transmit (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
struct Plugin *plugin = cls;
+
GNUNET_assert (plugin != NULL);
plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
if (GNUNET_TIME_absolute_get_remaining (plugin->beacon_time).rel_value == 0)
{
send_hello_beacon (plugin);
- set_next_send(plugin);
return;
}
if (plugin->sending_messages_head != NULL)
{
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan fragments send"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan fragments send"), 1,
+ GNUNET_NO);
fmq = plugin->sending_messages_head;
fm = fmq->content;
{
GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
_
- ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
+ ("Error writing to wlan helper. errno == %d, ERROR: %s\n"),
errno, strerror (errno));
finish->head_of_next_write = fm->frag;
finish->size = fm->size;
- restart_helper(plugin, finish);
+ restart_helper (plugin, finish);
}
else
{
finish->head_of_next_write = fm->frag + bytes;
finish->size = fm->size - bytes;
plugin->server_write_task =
- GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
- plugin->server_stdin_handle,
- &finish_sending, finish);
+ GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+ plugin->server_stdin_handle,
+ &finish_sending, finish);
}
fm->frag = NULL;
return;
}
- GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, PLUGIN_LOG_NAME,
+#if 1
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
"do_transmit did nothing, should not happen!\n");
+#endif
+ set_next_send (plugin);
}
/**
/* TODO check for bad addresses like multicast, broadcast, etc */
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "wlan_plugin_address_suggested got good address, size %u!\n", addrlen);
+ "wlan_plugin_address_suggested got good address, size %u!\n",
+ addrlen);
#endif
return GNUNET_OK;
}
#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "wlan_plugin_address_suggested got bad address, size %u!\n", addrlen);
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+ "wlan_plugin_address_suggested got bad address, size %u!\n",
+ addrlen);
#endif
return GNUNET_SYSERR;
}
+
+/**
+ * Creates a new outbound session the transport service will use to send data to the
+ * peer
+ *
+ * @param cls the plugin
+ * @param address the address
+ * @return the session or NULL of max connections exceeded
+ */
+
+static struct Session *
+wlan_plugin_get_session (void *cls,
+ const struct GNUNET_HELLO_Address *address)
+{
+ struct Plugin *plugin = cls;
+ struct Session * s = NULL;
+
+ GNUNET_assert (plugin != NULL);
+ GNUNET_assert (address != NULL);
+
+ if (GNUNET_OK == wlan_plugin_address_suggested (plugin,
+ address->address,
+ address->address_length))
+ {
+ s = get_session (plugin, address->address, &address->peer);
+ }
+ else
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
+ _("Wlan Address len %d is wrong\n"), address->address_length);
+ return s;
+ }
+
+ return s;
+}
+
/**
* Function that can be used by the transport service to transmit
- * a message using the plugin.
+ * a message using the plugin. Note that in the case of a
+ * peer disconnecting, the continuation MUST be called
+ * prior to the disconnect notification itself. This function
+ * will be called with this peer's HELLO message to initiate
+ * a fresh connection to another peer.
*
* @param cls closure
- * @param target who should receive this message
- * @param priority how important is the message
+ * @param session which session must be used
* @param msgbuf the message to transmit
* @param msgbuf_size number of bytes in 'msgbuf'
- * @param timeout when should we time out
- * @param session which session must be used (or NULL for "any")
- * @param addr the address to use (can be NULL if the plugin
- * is "on its own" (i.e. re-use existing TCP connection))
- * @param addrlen length of the address in bytes
- * @param force_address GNUNET_YES if the plugin MUST use the given address,
- * otherwise the plugin may use other addresses or
- * existing connections (if available)
+ * @param priority how important is the message (most plugins will
+ * ignore message priority and just FIFO)
+ * @param to how long to wait at most for the transmission (does not
+ * require plugins to discard the message after the timeout,
+ * just advisory for the desired delay; most plugins will ignore
+ * this as well)
* @param cont continuation to call once the message has
* been transmitted (or if the transport is ready
* for the next transmission call; or if the
- * peer disconnected...)
+ * peer disconnected...); can be NULL
* @param cont_cls closure for cont
* @return number of bytes used (on the physical network, with overheads);
* -1 on hard errors (i.e. address invalid); 0 is a legal value
* and does NOT mean that the message was not transmitted (DV)
*/
static ssize_t
-wlan_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
- const char *msgbuf, size_t msgbuf_size, unsigned int priority,
- struct GNUNET_TIME_Relative timeout, struct Session *session,
- const void *addr, size_t addrlen, int force_address,
+wlan_plugin_send (void *cls,
+ struct Session *session,
+ const char *msgbuf, size_t msgbuf_size,
+ unsigned int priority,
+ struct GNUNET_TIME_Relative to,
GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
{
struct Plugin *plugin = cls;
struct PendingMessage *newmsg;
struct WlanHeader *wlanheader;
+
GNUNET_assert (plugin != NULL);
- //check if msglen > 0
+ GNUNET_assert (session != NULL);
GNUNET_assert (msgbuf_size > 0);
- //get session if needed
- if (session == NULL)
- {
- if (wlan_plugin_address_suggested (plugin, addr, addrlen) == GNUNET_OK)
- {
- session = get_session (plugin, addr, target);
- }
- else
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- _("Wlan Address len %d is wrong\n"), addrlen);
- return -1;
- }
- }
-
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan messages queued"), 1, GNUNET_NO);
-
//queue message:
//queue message in session
//copy msg to buffer, not fragmented / segmented yet, but with message header
wlanheader->header.size = htons (msgbuf_size + sizeof (struct WlanHeader));
wlanheader->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA);
- memcpy (&(wlanheader->target), target, sizeof (struct GNUNET_PeerIdentity));
+ memcpy (&(wlanheader->target), &session->target, sizeof (struct GNUNET_PeerIdentity));
memcpy (&(wlanheader->source), plugin->env->my_identity,
sizeof (struct GNUNET_PeerIdentity));
wlanheader->crc = 0;
memcpy (&wlanheader[1], msgbuf, msgbuf_size);
wlanheader->crc =
- htonl (getcrc32
+ htonl (GNUNET_CRYPTO_crc32_n
((char *) wlanheader, msgbuf_size + sizeof (struct WlanHeader)));
- //GNUNET_log_from(GNUNET_ERROR_TYPE_INFO, PLUGIN_LOG_NAME, "Wlan message Header crc: %u, %u\n",getcrc32((char*) wlanheader, msgbuf_size + sizeof(struct WlanHeader)), wlanheader->crc);
- //hexdump(newmsg->msg, msgbuf_size + sizeof(struct WlanHeader));
newmsg->transmit_cont = cont;
newmsg->transmit_cont_cls = cont_cls;
- newmsg->timeout = GNUNET_TIME_relative_to_absolute (timeout);
+ newmsg->timeout = GNUNET_TIME_relative_to_absolute (to);
newmsg->timeout.abs_value = newmsg->timeout.abs_value - 500;
check_fragment_queue (plugin);
//FIXME not the correct size
return msgbuf_size;
-
}
+
/**
* function to free a mac endpoint
* @param plugin pointer to the plugin struct
GNUNET_CONTAINER_DLL_remove (plugin->mac_head, plugin->mac_tail, endpoint);
if (endpoint->timeout_task != GNUNET_SCHEDULER_NO_TASK)
+ {
GNUNET_SCHEDULER_cancel (endpoint->timeout_task);
+ endpoint->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+ }
plugin->mac_count--;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan mac endpoints"), plugin->mac_count, GNUNET_NO);
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan mac endpoints"),
+ plugin->mac_count, GNUNET_NO);
GNUNET_free (endpoint);
}
* function to free a session
* @param plugin pointer to the plugin
* @param queue pointer to the sessionqueue element to free
- * @param free_macendpoint if GNUNET_YES and mac endpoint would be empty, free mac endpoint
+ * @param do_free_macendpoint if GNUNET_YES and mac endpoint would be empty, free mac endpoint
*/
static void
free_session (struct Plugin *plugin, struct Sessionqueue *queue,
if (pendingsession_tmp->content == queue->content)
{
plugin->pendingsessions--;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+ plugin->pendingsessions, GNUNET_NO);
GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
plugin->pending_Sessions_tail,
pendingsession_tmp);
GNUNET_CONTAINER_DLL_remove (endpoint->sessions_head, endpoint->sessions_tail,
queue);
//Check that no ohter session on this endpoint for this session exits
- GNUNET_assert(search_session(plugin, endpoint, &queue->content->target) == NULL);
+ GNUNET_assert (search_session (plugin, endpoint, &queue->content->target) ==
+ NULL);
if (endpoint->sessions_head == NULL && do_free_macendpoint == GNUNET_YES)
{
free_macendpoint (plugin, endpoint);
//check if no endpoint with the same address exists
- GNUNET_assert(get_macendpoint(plugin, &endpoint->addr, GNUNET_NO) == NULL);
+ GNUNET_assert (get_macendpoint (plugin, &endpoint->addr, GNUNET_NO) ==
+ NULL);
}
if (queue->content->timeout_task != GNUNET_SCHEDULER_NO_TASK)
+ {
GNUNET_SCHEDULER_cancel (queue->content->timeout_task);
+ queue->content->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+ }
GNUNET_free (queue);
check_fragment_queue (plugin);
const unsigned char *input;
//GNUNET_assert(cls !=NULL);
- if (addrlen != sizeof(struct MacAddress))
+ if (addrlen != sizeof (struct MacAddress))
{
/* invalid address (MAC addresses have 6 bytes) */
//GNUNET_break (0);
#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Func wlan_plugin_address_pretty_printer got size: %u, worng size!\n",
- addrlen);
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
+ "Func wlan_plugin_address_pretty_printer got size: %u, worng size!\n",
+ addrlen);
#endif
- asc(asc_cls, NULL);
+ asc (asc_cls, NULL);
return;
}
input = (const unsigned char *) addr;
GNUNET_asprintf (&ret,
- "Transport %s: %s Mac-Address %.2X:%.2X:%.2X:%.2X:%.2X:%.2X",type,
- PROTOCOL_PREFIX, input[0], input[1], input[2], input[3],
- input[4], input[5]);
+ "Transport %s: %s Mac-Address %.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
+ type, PROTOCOL_PREFIX, input[0], input[1], input[2],
+ input[3], input[4], input[5]);
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
"Func wlan_plugin_address_pretty_printer got size: %u, nummeric %u, type %s; made string: %s\n",
addrlen, numeric, type, ret);
#endif
- asc ( asc_cls, ret);
+ asc (asc_cls, ret);
//only one mac address per plugin
- asc ( asc_cls, NULL);
+ asc (asc_cls, NULL);
}
return;
}
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan whole messages received"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats,
+ _("# wlan whole messages received"), 1,
+ GNUNET_NO);
wlanheader = (struct WlanHeader *) hdr;
session = search_session (plugin, endpoint, &wlanheader->source);
temp_hdr = (const struct GNUNET_MessageHeader *) &wlanheader[1];
crc = ntohl (wlanheader->crc);
wlanheader->crc = 0;
- if (getcrc32 ((char *) wlanheader, ntohs (wlanheader->header.size)) != crc)
+ if (GNUNET_CRYPTO_crc32_n
+ ((char *) wlanheader, ntohs (wlanheader->header.size)) != crc)
{
//wrong crc, dispose message
GNUNET_log_from (GNUNET_ERROR_TYPE_INFO, PLUGIN_LOG_NAME,
"Wlan message header crc was wrong: %u != %u\n",
- getcrc32 ((char *) wlanheader,
- ntohs (wlanheader->header.size)), crc);
+ GNUNET_CRYPTO_crc32_n ((char *) wlanheader,
+ ntohs (wlanheader->header.size)),
+ crc);
hexdump ((void *) hdr, ntohs (hdr->size));
return;
}
GNUNET_assert (cls != NULL);
struct Session *session = (struct Session *) client;
struct Plugin *plugin = (struct Plugin *) cls;
+ struct GNUNET_ATS_Information ats[2];
- struct GNUNET_ATS_Information distance;
-
- distance.type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
- distance.value = htonl (1);
+ ats[0].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
+ ats[0].value = htonl (1);
+ ats[1].type = htonl (GNUNET_ATS_NETWORK_TYPE);
+ ats[1].value = htonl (GNUNET_ATS_NET_WLAN);
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
#endif
plugin->env->receive (plugin->env->cls, &(session->target), hdr,
- (const struct GNUNET_ATS_Information *)
- &distance, 1, session,
- (const char *) &session->mac->addr,
+ (const struct GNUNET_ATS_Information *) &ats, 2,
+ session, (const char *) &session->mac->addr,
sizeof (session->mac->addr));
}
* @param cls the plugin handle
* @param session_light pointer to the struct holding known informations
* @param hdr hdr of the GNUNET_MessageHeader
- * @param rxinfo pointer to the radiotap informations got with this packet
+ * @param rxinfo pointer to the radiotap informations got with this packet FIXME: give ATS for info
*/
static void
wlan_data_helper (void *cls, struct Session_light *session_light,
struct FragmentMessage *fm2;
struct GNUNET_PeerIdentity tmpsource;
- GNUNET_assert(plugin != NULL);
+ GNUNET_assert (plugin != NULL);
//ADVERTISEMENT
if (ntohs (hdr->type) == GNUNET_MESSAGE_TYPE_HELLO)
if (GNUNET_HELLO_get_id
- ((const struct GNUNET_HELLO_Message *) hdr,
- &tmpsource) == GNUNET_OK)
+ ((const struct GNUNET_HELLO_Message *) hdr, &tmpsource) == GNUNET_OK)
{
- session_light->session = search_session (plugin, session_light->macendpoint, &tmpsource);
+ session_light->session =
+ search_session (plugin, session_light->macendpoint, &tmpsource);
if (session_light->session == NULL)
- {
- session_light->session = create_session (plugin, session_light->macendpoint, &tmpsource);
- }
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan hello messages received"), 1, GNUNET_NO);
- plugin->env->receive(plugin->env->cls,&session_light->session->target,hdr, NULL, 0, session_light->session,
- (const char *) &session_light->session->mac->addr,
- sizeof (session_light->session->mac->addr));
+ {
+ session_light->session =
+ create_session (plugin, session_light->macendpoint, &tmpsource);
+ }
+ GNUNET_STATISTICS_update (plugin->env->stats,
+ _("# wlan hello messages received"), 1,
+ GNUNET_NO);
+ plugin->env->receive (plugin->env->cls, &session_light->session->target,
+ hdr, NULL, 0, session_light->session,
+ (const char *) &session_light->session->mac->addr,
+ sizeof (session_light->session->mac->addr));
}
else
{
6));
#endif
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan fragments received"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats,
+ _("# wlan fragments received"), 1, GNUNET_NO);
int ret =
GNUNET_DEFRAGMENT_process_fragment (session_light->macendpoint->defrag,
hdr);
while (fm != NULL)
{
fm2 = fm->next;
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan acks received"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan acks received"),
+ 1, GNUNET_NO);
int ret = GNUNET_FRAGMENT_process_ack (fm->fragcontext, hdr);
if (ret == GNUNET_OK)
}
+#if DEBUG_wlan
/**
* Function to print mac addresses nice *
* @param pointer to 6 byte with the mac address
* @return pointer to the chars which hold the print out
*/
-const char *
+static const char *
macprinter (const u_int8_t * mac)
{
static char macstr[20];
mac[2], mac[3], mac[4], mac[5]);
return macstr;
}
+#endif
/**
* Function for the scheduler if a mac endpoint times out
(GNUNET_TIME_absolute_add
(endpoint->last_activity, MACENDPOINT_TIMEOUT)).rel_value == 0)
{
- GNUNET_assert(endpoint->plugin != NULL);
- GNUNET_STATISTICS_update (endpoint->plugin->env->stats, _("# wlan mac endpoints timeouts"), 1, GNUNET_NO);
+ GNUNET_assert (endpoint->plugin != NULL);
+ GNUNET_STATISTICS_update (endpoint->plugin->env->stats,
+ _("# wlan mac endpoints timeouts"), 1, GNUNET_NO);
free_macendpoint (endpoint->plugin, endpoint);
}
else
{
struct MacEndpoint *newend = GNUNET_malloc (sizeof (struct MacEndpoint));
- GNUNET_assert(plugin != NULL);
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan mac endpoints created"), 1, GNUNET_NO);
+ GNUNET_assert (plugin != NULL);
+ GNUNET_STATISTICS_update (plugin->env->stats,
+ _("# wlan mac endpoints created"), 1, GNUNET_NO);
newend->addr = *addr;
newend->plugin = plugin;
newend->addr = *addr;
newend);
plugin->mac_count++;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan mac endpoints"), plugin->mac_count, GNUNET_NO);
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan mac endpoints"),
+ plugin->mac_count, GNUNET_NO);
GNUNET_CONTAINER_DLL_insert_tail (plugin->mac_head, plugin->mac_tail, newend);
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
int datasize = 0;
int pos;
- GNUNET_assert(plugin != NULL);
+ GNUNET_assert (plugin != NULL);
switch (ntohs (hdr->type))
{
case GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA:
ntohs (hdr->size));
#endif
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan WLAN_HELPER_DATA received"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats,
+ _("# wlan WLAN_HELPER_DATA received"), 1,
+ GNUNET_NO);
//call wlan_process_helper with the message inside, later with wlan: analyze signal
if (ntohs (hdr->size) <
- sizeof (struct ieee80211_frame) + 2*sizeof (struct GNUNET_MessageHeader) +
- sizeof (struct Radiotap_rx))
+ sizeof (struct ieee80211_frame) +
+ 2 * sizeof (struct GNUNET_MessageHeader) + sizeof (struct Radiotap_rx))
{
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
//check for bssid
if (memcmp
- (&(wlanIeeeHeader->i_addr3), &mac_bssid,
+ (&(wlanIeeeHeader->i_addr3), &mac_bssid_gnunet,
sizeof (struct MacAddress)) == 0)
{
//check for broadcast or mac
if ((memcmp
- (&(wlanIeeeHeader->i_addr1), &bc_all_mac,
- sizeof (struct MacAddress)) == 0) ||
- (memcmp (&(wlanIeeeHeader->i_addr1), &(plugin->mac_address),
- sizeof (struct MacAddress)) == 0))
+ (&(wlanIeeeHeader->i_addr1), &bc_all_mac,
+ sizeof (struct MacAddress)) == 0) ||
+ (memcmp
+ (&(wlanIeeeHeader->i_addr1), &(plugin->mac_address),
+ sizeof (struct MacAddress)) == 0))
{
- //if packet is from us return
- if ((memcmp (&(wlanIeeeHeader->i_addr2), &(plugin->mac_address),
- sizeof (struct MacAddress)) == 0)){
- return;
- }
+ //if packet is from us return
+ if ((memcmp
+ (&(wlanIeeeHeader->i_addr2), &(plugin->mac_address),
+ sizeof (struct MacAddress)) == 0))
+ {
+ return;
+ }
// process the inner data
memcpy (&session_light->addr, &(wlanIeeeHeader->i_addr2),
sizeof (struct MacAddress));
//session_light->session = search_session(plugin,session_light->addr);
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan messaged for this client received"), 1, GNUNET_NO);
+ GNUNET_STATISTICS_update (plugin->env->stats,
+ _("# wlan messages for this client received"),
+ 1, GNUNET_NO);
pos = 0;
while (pos < datasize)
{
temp_hdr = (struct GNUNET_MessageHeader *) &wlanIeeeHeader[1] + pos;
- if (ntohs(temp_hdr->size) <= datasize + pos)
- {
- GNUNET_STATISTICS_update (plugin->env->stats, _("# wlan messaged inside WLAN_HELPER_DATA received"), 1, GNUNET_NO);
- wlan_data_helper (plugin, session_light, temp_hdr, rxinfo);
- }
+ if (ntohs (temp_hdr->size) <= datasize + pos)
+ {
+ GNUNET_STATISTICS_update (plugin->env->stats,
+ _
+ ("# wlan messages inside WLAN_HELPER_DATA received"),
+ 1, GNUNET_NO);
+ wlan_data_helper (plugin, session_light, temp_hdr, rxinfo);
+ }
else
- {
+ {
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Size of packet is too small; size: %u > size of packet: %u\n",
- ntohs(temp_hdr->size),datasize + pos);
+ "Size of packet is too small; size: %u > size of packet: %u\n",
+ ntohs (temp_hdr->size), datasize + pos);
#endif
- }
+ }
pos += ntohs (temp_hdr->size);
}
break;
case GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL:
//TODO more control messages
- if (ntohs (hdr->size) != sizeof (struct Wlan_Helper_Control_Message))
+ if (ntohs (hdr->size) != sizeof (struct GNUNET_TRANSPORT_WLAN_HelperControlMessage))
{
GNUNET_break (0);
/* FIXME: restart SUID process */
"libgnunet_plugin_transport_wlan_done started\n");
#endif
- wlan_transport_stop_wlan_helper(plugin);
+ wlan_transport_stop_wlan_helper (plugin);
GNUNET_assert (cls != NULL);
//free sessions
plugin = GNUNET_malloc (sizeof (struct Plugin));
plugin->env = env;
plugin->pendingsessions = 0;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan pending sessions"), plugin->pendingsessions, GNUNET_NO);
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan pending sessions"),
+ plugin->pendingsessions, GNUNET_NO);
plugin->mac_count = 0;
- GNUNET_STATISTICS_set(plugin->env->stats, _("# wlan mac endpoints"), plugin->mac_count, GNUNET_NO);
+ GNUNET_STATISTICS_set (plugin->env->stats, _("# wlan mac endpoints"),
+ plugin->mac_count, GNUNET_NO);
plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
plugin->server_read_task = GNUNET_SCHEDULER_NO_TASK;
plugin->server_write_delay_task = GNUNET_SCHEDULER_NO_TASK;
api = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_PluginFunctions));
api->cls = plugin;
api->send = &wlan_plugin_send;
+ api->get_session = &wlan_plugin_get_session;
api->disconnect = &wlan_plugin_disconnect;
api->address_pretty_printer = &wlan_plugin_address_pretty_printer;
api->check_address = &wlan_plugin_address_suggested;
if (GNUNET_SYSERR ==
GNUNET_CONFIGURATION_get_value_number (env->cfg, "transport-wlan",
"TESTMODE", &(plugin->testmode)))
- plugin->testmode = 0; //default value
+ plugin->testmode = 0; //default value
}
if (GNUNET_CONFIGURATION_have_value (env->cfg, "transport-wlan", "INTERFACE"))
//start the plugin
wlan_transport_start_wlan_helper (plugin);
set_next_beacon_time (plugin);
- set_next_send(plugin);
+ set_next_send (plugin);
#if DEBUG_wlan
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
"wlan init finished\n");