- return session;
- }
- else
- {
- sessionqueue = sessionqueue->next;
- }
- }
- else
- {
- GNUNET_CONTAINER_DLL_remove (session->pending_message_head,
- session->pending_message_tail, pm);
-
- //call the cont func that it did not work
- if (pm->transmit_cont != NULL)
- pm->transmit_cont (pm->transmit_cont_cls, &(session->target),
- GNUNET_SYSERR);
- GNUNET_free (pm->msg);
- GNUNET_free (pm);
-
- if (session->pending_message_head == NULL)
- {
- sessionqueue_alt = sessionqueue;
- sessionqueue = sessionqueue->next;
- plugin->pendingsessions--;
- GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
- plugin->pending_Sessions_tail,
- sessionqueue_alt);
-
- GNUNET_free (sessionqueue_alt);
- }
- }
-
- }
- return NULL;
-}
-
-/**
- * frees the space of a message in the fragment queue (send queue)
- * @param plugin the plugin struct
- * @param fm message to free
- */
-static void
-free_fragment_message (struct Plugin *plugin, struct FragmentMessage *fm)
-{
- struct Session *session = fm->session;
- struct MacEndpoint *endpoint = session->mac;
- struct FragmentMessage_queue *fmq;
- struct FragmentMessage_queue *fmq_next;
-
- if (fm != NULL)
- {
- fmq = plugin->sending_messages_head;
- while (fmq != NULL)
- {
- 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;
- }
-
- (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);
-#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Free pending fragment messages %p, session %p\n", fm,
- session);
-#endif
- }
-}
-
-/**
- * function to fill the radiotap header
- * @param plugin pointer to the plugin struct
- * @param endpoint pointer to the endpoint
- * @param header pointer to the radiotap header
- * @return GNUNET_YES at success
- */
-static int
-getRadiotapHeader (struct Plugin *plugin, struct MacEndpoint *endpoint,
- struct Radiotap_Send *header)
-{
-
- if (endpoint != NULL)
- {
- header->rate = endpoint->rate;
- header->tx_power = endpoint->tx_power;
- header->antenna = endpoint->antenna;
- }
- else
- {
- header->rate = 255;
- header->tx_power = 0;
- header->antenna = 0;
- }
-
- return GNUNET_YES;
-}
-
-/**
- * function to generate the wlan hardware header for one packet
- * @param Header address to write the header to
- * @param to_mac_addr address of the recipient
- * @param plugin pointer to the plugin struct
- * @param size size of the whole packet, needed to calculate the time to send the packet
- * @return GNUNET_YES if there was no error
- */
-static int
-getWlanHeader (struct ieee80211_frame *Header,
- const struct MacAddress *to_mac_addr, struct Plugin *plugin,
- unsigned int size)
-{
- uint16_t *tmp16;
- const int rate = 11000000;
-
- 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_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);
- Header->llc[0] = WLAN_LLC_DSAP_FIELD;
- Header->llc[1] = WLAN_LLC_SSAP_FIELD;
-
-#if DEBUG_wlan_ip_udp_packets_on_air
- 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
-add_message_for_send (void *cls, const struct GNUNET_MessageHeader *hdr)
-{
-
- struct FragmentMessage *fm = cls;
- struct FragmentMessage_queue *fmqueue;
-
- GNUNET_assert (cls != NULL);
- GNUNET_assert (fm->frag == NULL);
- struct MacEndpoint *endpoint = fm->session->mac;
- struct Plugin *plugin = endpoint->plugin;
- struct GNUNET_MessageHeader *msgheader;
- struct GNUNET_MessageHeader *msgheader2;
- uint16_t size;
-
-#if DEBUG_wlan_retransmission
- 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
-
- size =
- sizeof (struct GNUNET_MessageHeader) + sizeof (struct Radiotap_Send) +
- sizeof (struct ieee80211_frame) + ntohs (hdr->size);
- fm->frag = GNUNET_malloc (size);
- fm->size = size;
-
- msgheader = (struct GNUNET_MessageHeader *) fm->frag;
- msgheader->size = htons (size);
- msgheader->type = htons (GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
-
- fm->radioHeader = (struct Radiotap_Send *) &msgheader[1];
- fm->ieeewlanheader = (struct ieee80211_frame *) &fm->radioHeader[1];
- msgheader2 = (struct GNUNET_MessageHeader *) &fm->ieeewlanheader[1];
- memcpy (msgheader2, hdr, ntohs (hdr->size));
-
- fmqueue = GNUNET_malloc (sizeof (struct FragmentMessage_queue));
- fmqueue->content = fm;
-
- GNUNET_CONTAINER_DLL_insert_tail (plugin->sending_messages_head,
- plugin->sending_messages_tail, fmqueue);
- set_next_send (plugin);
-}
-
-/**
- * function to send a hallo beacon
- * @param plugin pointer to the plugin struct
- */
-static void
-send_hello_beacon (struct Plugin *plugin)
-{
-
-#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Sending hello beacon\n");
-#endif
-
- uint16_t size;
- ssize_t bytes;
- uint16_t hallo_size;
- struct GNUNET_MessageHeader *msgheader;
- struct ieee80211_frame *ieeewlanheader;
- struct Radiotap_Send *radioHeader;
- struct GNUNET_MessageHeader *msgheader2;
- const struct GNUNET_MessageHeader *hello;
-
- hello = plugin->env->get_our_hello ();
- hallo_size = GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello);
- GNUNET_assert (sizeof (struct WlanHeader) + hallo_size <= WLAN_MTU);
- size =
- sizeof (struct GNUNET_MessageHeader) + sizeof (struct Radiotap_Send) +
- sizeof (struct ieee80211_frame) + hallo_size;
-
- msgheader = GNUNET_malloc (size);
- msgheader->size = htons (size);
- msgheader->type = htons (GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
-
- radioHeader = (struct Radiotap_Send *) &msgheader[1];
- getRadiotapHeader (plugin, NULL, radioHeader);
- ieeewlanheader = (struct ieee80211_frame *) &radioHeader[1];
- getWlanHeader (ieeewlanheader, &bc_all_mac, plugin, size);
-
- 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);*/
- memcpy (msgheader2, hello, hallo_size);
-
- bytes = GNUNET_DISK_file_write (plugin->server_stdin_handle, msgheader, size);
-
- if (bytes == GNUNET_SYSERR)
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- _
- ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
- errno, strerror (errno));
-
- }
- GNUNET_assert (bytes != GNUNET_SYSERR);
- GNUNET_assert (bytes == size);
- GNUNET_free (msgheader);
-
- set_next_beacon_time (plugin);
- set_next_send (plugin);
-}
-
-/**
- * function to add an ack to send it for a received fragment
- * @param cls MacEndpoint this ack belongs to
- * @param msg_id id of the message
- * @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)
-{
-
- struct AckSendQueue *ack;
-
- GNUNET_assert (cls != NULL);
- struct MacEndpoint *endpoint = cls;
- struct Plugin *plugin = endpoint->plugin;
- struct GNUNET_MessageHeader *msgheader;
- struct GNUNET_MessageHeader *msgheader2;
- uint16_t size;
-
- size =
- sizeof (struct GNUNET_MessageHeader) + sizeof (struct Radiotap_Send) +
- sizeof (struct ieee80211_frame) + ntohs (hdr->size) +
- sizeof (struct AckSendQueue);
-
- ack = GNUNET_malloc (size);
- ack->message_id = msg_id;
- ack->endpoint = endpoint;
-
- size =
- sizeof (struct GNUNET_MessageHeader) + sizeof (struct Radiotap_Send) +
- sizeof (struct ieee80211_frame) + ntohs (hdr->size);
-
- msgheader = (struct GNUNET_MessageHeader *) &ack[1];
- ack->hdr = (struct GNUNET_MessageHeader *) &ack[1];
- msgheader->size = htons (size);
- msgheader->type = htons (GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
-
- ack->radioHeader = (struct Radiotap_Send *) &msgheader[1];
- ack->ieeewlanheader = (struct ieee80211_frame *) &(ack->radioHeader)[1];
- msgheader2 = (struct GNUNET_MessageHeader *) &(ack->ieeewlanheader)[1];
- memcpy (msgheader2, hdr, ntohs (hdr->size));
-
- GNUNET_CONTAINER_DLL_insert_tail (plugin->ack_send_queue_head,
- plugin->ack_send_queue_tail, ack);
-
-#if DEBUG_wlan_retransmission
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Adding ack with message id %u to send, AckSendQueue %p, endpoint %p\n",
- msg_id, ack, endpoint);
-#endif
-
- set_next_send (plugin);
-}
-
-/**
- * Function for the scheduler if a FragmentMessage times out
- * @param cls pointer to the FragmentMessage
- * @param tc pointer to the GNUNET_SCHEDULER_TaskContext
- */
-static void
-fragmentmessage_timeout (void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
- struct FragmentMessage *fm = cls;
-
- GNUNET_assert (fm != NULL);
- fm->timeout_task = GNUNET_SCHEDULER_NO_TASK;
- if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
- {
- return;
- }
- free_fragment_message (fm->session->mac->plugin, fm);
-}
-
-/**
- * Function to check if there is some space in the fragment queue
- * inserts a message if space is available
- * @param plugin the plugin struct
- */
-
-static void
-check_fragment_queue (struct Plugin *plugin)
-{
- struct Session *session;
- struct FragmentMessage *fm;
- struct GNUNET_PeerIdentity pid;
-
- struct PendingMessage *pm;
-
- if (plugin->pending_Fragment_Messages < FRAGMENT_QUEUE_SIZE)
- {
- session = get_next_queue_session (plugin);
- if (session != NULL)
- {
- pm = session->pending_message_head;
- GNUNET_CONTAINER_DLL_remove (session->pending_message_head,
- session->pending_message_tail, pm);
- session->mac->fragment_messages_out_count++;
- session->fragment_messages_out_count++;
- plugin->pending_Fragment_Messages++;
- GNUNET_assert (pm != NULL);
-
- fm = GNUNET_malloc (sizeof (struct FragmentMessage));
- fm->session = session;
- fm->timeout.abs_value = pm->timeout.abs_value;
- fm->frag = NULL;
- fm->fragcontext =
- GNUNET_FRAGMENT_context_create (plugin->env->stats, WLAN_MTU,
- &plugin->tracker,
- GNUNET_TIME_UNIT_SECONDS,
- &(pm->msg->header),
- &add_message_for_send, fm);
- fm->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining
- (fm->timeout), fragmentmessage_timeout,
- fm);
- GNUNET_CONTAINER_DLL_insert_tail (session->mac->sending_messages_head,
- session->mac->sending_messages_tail,
- fm);
-
- if (pm->transmit_cont != NULL)
- {
- pid = session->target;
- pm->transmit_cont (pm->transmit_cont_cls, &pid, GNUNET_OK);
-#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "called pm->transmit_cont for %p\n", session);
-#endif
- }
- else
- {
-#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "no pm->transmit_cont for %p\n", session);
-#endif
- }
- GNUNET_free (pm);
-
- if (session->pending_message_head != NULL)
- {
- //requeue session
- queue_session (plugin, session);
- }
-
- }
- }
-
- //check if timeout changed
- set_next_send (plugin);
-}
-
-/**
- * Function to send an ack, does not free the ack
- * @param plugin pointer to the plugin
- * @param ack pointer to the ack to send
- */
-static void
-send_ack (struct Plugin *plugin, struct AckSendQueue *ack)
-{
-
- ssize_t bytes;
-
-#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Sending ack for message_id %u for mac endpoint %p, size %u\n",
- ack->message_id, ack->endpoint,
- ntohs (ack->hdr->size) - sizeof (struct Radiotap_Send));
-#endif
-
- getRadiotapHeader (plugin, ack->endpoint, ack->radioHeader);
- getWlanHeader (ack->ieeewlanheader, &ack->endpoint->addr, plugin,
- ntohs (ack->hdr->size));
-
- bytes =
- GNUNET_DISK_file_write (plugin->server_stdin_handle, ack->hdr,
- ntohs (ack->hdr->size));
- if (bytes == GNUNET_SYSERR)
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- _
- ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
- errno, strerror (errno));
-
- }
- GNUNET_assert (bytes != GNUNET_SYSERR);
- GNUNET_assert (bytes == ntohs (ack->hdr->size));
- set_next_send (plugin);
-}
-
-/**
- * function to finish a sending if not all could have been writen befor
- * @param cls pointer to the Finish_send struct
- * @param tc TaskContext
- */
-static void
-finish_sending (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
- struct Finish_send *finish = cls;
- struct Plugin *plugin;
- ssize_t bytes;
-
- plugin = finish->plugin;
- plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
-
- if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
- {
- GNUNET_free (finish->msgstart);
- GNUNET_free (finish);
- return;
- }
- bytes =
- GNUNET_DISK_file_write (plugin->server_stdin_handle, finish->msgheader,
- finish->size);
- GNUNET_assert (bytes != GNUNET_SYSERR);
-
- if (bytes != finish->size)
- {
- finish->msgheader = finish->msgheader + bytes;
- finish->size = 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
- {
- GNUNET_free (finish->msgstart);
- GNUNET_free (finish);
- set_next_send (plugin);
- }
-}
-
-/**
- * Function called when wlan helper is ready to get some data
- *
- * @param cls closure
- * @param tc GNUNET_SCHEDULER_TaskContext
- */
-static void
-do_transmit (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
- struct Plugin *plugin = cls;
-
- plugin->server_write_task = GNUNET_SCHEDULER_NO_TASK;
- if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
- return;
-
- struct Session *session;
- struct FragmentMessage *fm;
- struct Finish_send *finish;
- struct FragmentMessage_queue *fmq;
- struct AckSendQueue *ack;
- ssize_t bytes;
-
- if (plugin->ack_send_queue_head != NULL)
- {
- ack = plugin->ack_send_queue_head;
- GNUNET_CONTAINER_DLL_remove (plugin->ack_send_queue_head,
- plugin->ack_send_queue_tail, ack);
- send_ack (plugin, ack);
- GNUNET_free (ack);
- return;
- }
-
- //test if a "hello-beacon" has to be send
- if (GNUNET_TIME_absolute_get_remaining (plugin->beacon_time).rel_value == 0)
- {
- send_hello_beacon (plugin);
- return;
- }
-
- if (plugin->sending_messages_head != NULL)
- {
- fmq = plugin->sending_messages_head;
- fm = fmq->content;
- GNUNET_CONTAINER_DLL_remove (plugin->sending_messages_head,
- plugin->sending_messages_tail, fmq);
- GNUNET_free (fmq);
-
- session = fm->session;
- GNUNET_assert (session != NULL);
-
-#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "Sending GNUNET_MESSAGE_TYPE_WLAN_FRAGMENT for fragment message %p, size: %u\n",
- fm, fm->size);
-#endif
-
- getRadiotapHeader (plugin, session->mac, fm->radioHeader);
- getWlanHeader (fm->ieeewlanheader, &(fm->session->mac->addr), plugin,
- fm->size);
-
- bytes =
- GNUNET_DISK_file_write (plugin->server_stdin_handle, fm->frag,
- fm->size);
- if (bytes == GNUNET_SYSERR)
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- _
- ("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
- errno, strerror (errno));
-
- }
- GNUNET_assert (bytes != GNUNET_SYSERR);
-
- if (bytes != fm->size)
- {
- finish = GNUNET_malloc (sizeof (struct Finish_send));
- finish->plugin = plugin;
- finish->msgheader = fm->frag + bytes;
- finish->size = fm->size - bytes;
- finish->msgstart = (struct GNUNET_MessageHeader *) fm->frag;
-
- GNUNET_assert (plugin->server_write_task == GNUNET_SCHEDULER_NO_TASK);
-
- plugin->server_write_task =
- GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
- plugin->server_stdin_handle,
- &finish_sending, finish);
- fm->frag = NULL;
- }
- else
- {
- GNUNET_free (fm->frag);
- fm->frag = NULL;
- set_next_send (plugin);
- }
- GNUNET_FRAGMENT_context_transmission_done (fm->fragcontext);
- return;
- }
-
- GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, PLUGIN_LOG_NAME,
- "do_transmit did nothing, should not happen!\n");
-}
-
-/**
- * Another peer has suggested an address for this
- * peer and transport plugin. Check that this could be a valid
- * address. If so, consider adding it to the list
- * of addresses.
- *
- * @param cls closure
- * @param addr pointer to the address
- * @param addrlen length of addr
- * @return GNUNET_OK if this is a plausible address for this peer
- * and transport
- */
-static int
-wlan_plugin_address_suggested (void *cls, const void *addr, size_t addrlen)
-{
- //struct Plugin *plugin = cls;
-
- /* check if the address is plausible; if so,
- * add it to our list! */
-
- GNUNET_assert (cls != NULL);
- //FIXME mitm is not checked
- //Mac Address has 6 bytes
- if (addrlen == 6)
- {
- /* TODO check for bad addresses like multicast, broadcast, etc */
- return GNUNET_OK;
- }
-
- return GNUNET_SYSERR;
-}
-
-/**
- * Function that can be used by the transport service to transmit
- * a message using the plugin.
- *
- * @param cls closure
- * @param target who should receive this message
- * @param priority how important is the message
- * @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 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...)
- * @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,
- GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
-{
- struct Plugin *plugin = cls;
- struct PendingMessage *newmsg;
- struct WlanHeader *wlanheader;
-
- //check if msglen > 0
- 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;
- }
- }
-
- //queue message:
-
- //queue message in session
- //test if there is no other message in the "queue"
- //FIXME: to many send requests
- if (session->pending_message_head != NULL)
- {
- newmsg = session->pending_message_head;
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, PLUGIN_LOG_NAME,
- "wlan_plugin_send: a pending message is already in the queue for this client\n remaining time to send this message is %u, queued fragment messages for this mac connection %u\n",
- GNUNET_TIME_absolute_get_remaining (newmsg->
- timeout).rel_value,
- session->mac->fragment_messages_out_count);
- }
-
- newmsg = GNUNET_malloc (sizeof (struct PendingMessage));
- newmsg->msg = GNUNET_malloc (msgbuf_size + sizeof (struct WlanHeader));
- wlanheader = newmsg->msg;
- //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->source), plugin->env->my_identity,
- sizeof (struct GNUNET_PeerIdentity));
- wlanheader->crc = 0;
- memcpy (&wlanheader[1], msgbuf, msgbuf_size);
- wlanheader->crc =
- htonl (getcrc32
- ((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.abs_value = newmsg->timeout.abs_value - 500;
-
- newmsg->message_size = msgbuf_size + sizeof (struct WlanHeader);
-
- GNUNET_CONTAINER_DLL_insert_tail (session->pending_message_head,
- session->pending_message_tail, newmsg);
-
-#if DEBUG_wlan
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, PLUGIN_LOG_NAME,
- "New message for %p with size (incl wlan header) %u added\n",
- session, newmsg->message_size);
-#endif
-#if DEBUG_wlan_msg_dump
- hexdump (msgbuf, GNUNET_MIN (msgbuf_size, 256));
-#endif
- //queue session
- queue_session (plugin, session);
-
- 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
- * @param endpoint pointer to the MacEndpoint to free
- */
-static void
-free_macendpoint (struct Plugin *plugin, struct MacEndpoint *endpoint)
-{
- struct Sessionqueue *sessions;
- struct Sessionqueue *sessions_next;
-
- GNUNET_assert (endpoint != NULL);
-
- sessions = endpoint->sessions_head;
- while (sessions != NULL)