* @brief transport plugin for wlan
* @author David Brodski
* @author Christian Grothoff
- *
- * TODO:
- * - HELPER-continuation may be called after fragment times out (-> use after free, see FIXME)
*/
#include "platform.h"
#include "gnunet_hello_lib.h"
#include "gnunet_fragmentation_lib.h"
#include "gnunet_constants.h"
-#define PROTOCOL_PREFIX "wlan"
-
#define LOG(kind,...) GNUNET_log_from (kind, "transport-wlan",__VA_ARGS__)
/**
*/
struct Session
{
+ /**
+ * To whom are we talking to (set to our identity
+ * if we are still waiting for the welcome message)
+ */
+ struct GNUNET_PeerIdentity target;
/**
* API requirement (must be first).
*/
struct PendingMessage *pending_message_tail;
- /**
- * To whom are we talking to (set to our identity
- * if we are still waiting for the welcome message)
- */
- struct GNUNET_PeerIdentity target;
-
/**
* When should this session time out?
*/
/**
* Generate the WLAN hardware header for one packet
*
+ * @param plugin the plugin handle
* @param header address to write the header to
* @param to_mac_addr address of the recipient
* @param size size of the whole packet, needed to calculate the time to send the packet
GNUNET_CONTAINER_DLL_remove (plugin->mac_head,
plugin->mac_tail,
endpoint);
+
+ if (NULL != endpoint->defrag)
+ {
+ GNUNET_DEFRAGMENT_context_destroy(endpoint->defrag);
+ endpoint->defrag = NULL;
+ }
+
plugin->mac_count--;
if (GNUNET_SCHEDULER_NO_TASK != endpoint->timeout_task)
{
* @param client pointer to the session this message belongs to
* @param hdr start of the message
*/
-static void
+static int
process_data (void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
{
struct Plugin *plugin = cls;
(mas->endpoint == NULL) ? 0 : sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress));
break;
}
+ return GNUNET_OK;
}
#undef NUM_ATS
* @param client client that send the data (not used)
* @param hdr header of the GNUNET_MessageHeader
*/
-static void
+static int
handle_helper_message (void *cls, void *client,
const struct GNUNET_MessageHeader *hdr)
{
/* remove old address */
plugin->env->notify_address (plugin->env->cls, GNUNET_NO,
&plugin->mac_address,
- sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress));
+ sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress),
+ "wlan");
}
plugin->mac_address = cm->mac;
plugin->have_mac = GNUNET_YES;
GNUNET_i2s (plugin->env->my_identity));
plugin->env->notify_address (plugin->env->cls, GNUNET_YES,
&plugin->mac_address,
- sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress));
+ sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress),
+ "wlan");
break;
case GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER:
LOG (GNUNET_ERROR_TYPE_DEBUG,
ntohs (hdr->type), ntohs (hdr->size));
break;
}
+ return GNUNET_OK;
}
static const char *
wlan_plugin_address_to_string (void *cls, const void *addr, size_t addrlen)
{
- static char ret[40];
const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac;
if (sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress) != addrlen)
return NULL;
}
mac = addr;
- GNUNET_snprintf (ret, sizeof (ret), "%s MAC address %s",
- PROTOCOL_PREFIX,
- mac_to_string (mac));
- return ret;
+ return mac_to_string (mac);
}
return;
}
mac = addr;
- GNUNET_asprintf (&ret,
- "%s MAC address %s",
- PROTOCOL_PREFIX,
- mac_to_string (mac));
+ ret = GNUNET_strdup (mac_to_string (mac));
asc (asc_cls, ret);
GNUNET_free (ret);
asc (asc_cls, NULL);
GNUNET_free (api);
return NULL;
}
+
+ if (GNUNET_YES == plugin->have_mac)
+ {
+ plugin->env->notify_address (plugin->env->cls, GNUNET_NO,
+ &plugin->mac_address,
+ sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress),
+ "wlan");
+ plugin->have_mac = GNUNET_NO;
+ }
+
if (GNUNET_SCHEDULER_NO_TASK != plugin->beacon_task)
{
GNUNET_SCHEDULER_cancel (plugin->beacon_task);
}
+/**
+ * Function called to convert a string address to
+ * a binary address.
+ *
+ * @param cls closure ('struct Plugin*')
+ * @param addr string address
+ * @param addrlen length of the address
+ * @param buf location to store the buffer
+ * @param added location to store the number of bytes in the buffer.
+ * If the function returns GNUNET_SYSERR, its contents are undefined.
+ * @return GNUNET_OK on success, GNUNET_SYSERR on failure
+ */
+static int
+wlan_string_to_address (void *cls, const char *addr, uint16_t addrlen,
+ void **buf, size_t *added)
+{
+ struct GNUNET_TRANSPORT_WLAN_MacAddress *mac;
+ unsigned int a[6];
+ unsigned int i;
+
+ if ((NULL == addr) || (addrlen == 0))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if ('\0' != addr[addrlen - 1])
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (strlen (addr) != addrlen - 1)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (6 != SSCANF (addr,
+ "%X:%X:%X:%X:%X:%X",
+ &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ mac = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress));
+ for (i=0;i<6;i++)
+ mac->mac[i] = a[i];
+ *buf = mac;
+ *added = sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress);
+ return GNUNET_OK;
+}
+
+
/**
* Entry point for the plugin.
*
api->cls = NULL;
api->address_pretty_printer = &wlan_plugin_address_pretty_printer;
api->address_to_string = &wlan_plugin_address_to_string;
- api->string_to_address = NULL; // FIXME!
+ api->string_to_address = &wlan_string_to_address;
return api;
}
plugin->helper_argv[0] = (char *) "gnunet-helper-transport-wlan";
plugin->helper_argv[1] = interface;
plugin->helper_argv[2] = NULL;
- plugin->suid_helper = GNUNET_HELPER_start ("gnunet-helper-transport-wlan",
+ plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO,
+ "gnunet-helper-transport-wlan",
plugin->helper_argv,
&handle_helper_message,
+ NULL,
plugin);
break;
case 1: /* testmode, peer 1 */
plugin->helper_argv[0] = (char *) "gnunet-helper-transport-wlan-dummy";
plugin->helper_argv[1] = (char *) "1";
plugin->helper_argv[2] = NULL;
- plugin->suid_helper = GNUNET_HELPER_start ("gnunet-helper-transport-wlan-dummy",
+ plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO,
+ "gnunet-helper-transport-wlan-dummy",
plugin->helper_argv,
&handle_helper_message,
+ NULL,
plugin);
break;
case 2: /* testmode, peer 2 */
plugin->helper_argv[0] = (char *) "gnunet-helper-transport-wlan-dummy";
plugin->helper_argv[1] = (char *) "2";
plugin->helper_argv[2] = NULL;
- plugin->suid_helper = GNUNET_HELPER_start ("gnunet-helper-transport-wlan-dummy",
+ plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO,
+ "gnunet-helper-transport-wlan-dummy",
plugin->helper_argv,
&handle_helper_message,
+ NULL,
plugin);
break;
default:
api->address_pretty_printer = &wlan_plugin_address_pretty_printer;
api->check_address = &wlan_plugin_address_suggested;
api->address_to_string = &wlan_plugin_address_to_string;
+ api->string_to_address = &wlan_string_to_address;
return api;
}