- GNUNET_assert (pm != NULL);
-
- //check for message timeout
- if (GNUNET_TIME_absolute_get_remaining (pm->timeout).rel_value > 0)
- {
- //check if session has no message in the fragment queue
- if ((session->mac->fragment_messages_out_count <
- FRAGMENT_QUEUE_MESSAGES_OUT_PER_MACENDPOINT) &&
- (session->fragment_messages_out_count <
- FRAGMENT_QUEUE_MESSAGES_OUT_PER_SESSION))
- {
- plugin->pendingsessions--;
- GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
- plugin->pending_Sessions_tail,
- sessionqueue);
- GNUNET_free (sessionqueue);
-
- 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
- * @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);
-
-#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->llc[0] = 6;
- Header->llc[1] = 6;
- 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\n",
- fm, fm->session, endpoint);
-#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) + sizeof (struct GNUNET_MessageHeader) +
- 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[1], 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);
-}