-/**
- * Function to set the next fragment number
- * @param fm use this FragmentMessage
- */
-
-static void
-set_next_message_fragment_pos(struct Plugin * plugin,
- struct FragmentMessage * fm)
-{
-
- fm->message_pos++;
-
- //check if retransmit is needed
- if (GNUNET_TIME_absolute_get_remaining(fm->next_ack).rel_value == 0)
- {
-
- // be positive and try again later :-D
- fm->next_ack = GNUNET_TIME_relative_to_absolute(get_ack_timeout(fm));
- // find first missing fragment
-
- fm->message_pos = 0;
-
- GNUNET_CONTAINER_heap_update_cost(plugin->pending_Fragment_Messages,
- fm->node, 0);
-
-#if DEBUG_wlan_retransmission
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "Retransmit; message_id %u; fragment number %i, size: %u\n",
- fm->message_id_out, fm->message_pos, fm->message_size);
-#endif
- }
-
- //test if ack 0 (or X) was already received
- while (testBit((char*) &fm->ack_bitfield, fm->message_pos) == GNUNET_YES)
- {
- fm->message_pos++;
- }
-
-}
-
-/**
- * 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;
-}
-
-//TODO DOXIGEN
-static void
-send_hello_beacon(struct Plugin * plugin)
-{
-
-#if DEBUG_wlan
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "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;
-
- hallo_size = GNUNET_HELLO_size(*(plugin->env->our_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(*(plugin->env->our_hello))
- + sizeof(struct GNUNET_MessageHeader));
-
- msgheader2->type = htons(GNUNET_MESSAGE_TYPE_WLAN_ADVERTISEMENT);
- memcpy(&msgheader2[1], *plugin->env->our_hello, hallo_size);
-
- bytes = GNUNET_DISK_file_write(plugin->server_stdin_handle, msgheader, size);
-
- if (bytes == GNUNET_SYSERR)
- {
- GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
- _("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);
-}
-
-//TODO DOXIGEN
-static void
-send_ack(struct Plugin * plugin, struct AckSendQueue * ack)
-{
-
- uint16_t size;
- ssize_t bytes;
- struct GNUNET_MessageHeader * msgheader;
- struct ieee80211_frame * ieeewlanheader;
- struct Radiotap_Send * radioHeader;
- struct FragmentationAckHeader * msgheader2;
-
- GNUNET_assert(sizeof(struct FragmentationAckHeader) <= WLAN_MTU);
-
- size = sizeof(struct GNUNET_MessageHeader) + sizeof(struct Radiotap_Send)
- + sizeof(struct ieee80211_frame) + sizeof(struct FragmentationAckHeader);
-
-#if DEBUG_wlan
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "Sending ack for message_id %u with fragment field %u, size %u\n",
- ack->message_id, ack->fragments_field,
- size - sizeof(struct Radiotap_Send));
-#endif
-
- 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, ack->endpoint, radioHeader);
- ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1];
- getWlanHeader(ieeewlanheader, &ack->endpoint->addr, plugin, size);
-
- msgheader2 = (struct FragmentationAckHeader*) &ieeewlanheader[1];
- msgheader2->header.size = htons(sizeof(struct FragmentationAckHeader));
- msgheader2->header.type = htons(GNUNET_MESSAGE_TYPE_WLAN_FRAGMENT_ACK);
- msgheader2->message_id = htonl(ack->message_id);
- msgheader2->fragment_field = GNUNET_htonll(ack->fragments_field);
-
- bytes = GNUNET_DISK_file_write(plugin->server_stdin_handle, msgheader, size);
- if (bytes == GNUNET_SYSERR)
- {
- GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
- _("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_send(plugin);
-}
-
-//TODO DOXIGEN
-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 ieee80211_frame * ieeewlanheader;
- struct Radiotap_Send * radioHeader;
- struct GNUNET_MessageHeader * msgheader;
- struct FragmentationHeader fragheader;
- struct FragmentationHeader * fragheaderptr;
- struct Finish_send * finish;
- struct AckSendQueue * ack;
- uint16_t size;
- ssize_t bytes;
- const char * copystart;
- uint16_t copysize;
- uint copyoffset;
-
- 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;
- }
-
- fm = GNUNET_CONTAINER_heap_peek(plugin->pending_Fragment_Messages);
-
- if (fm != NULL)
- {
- session = fm->session;
- GNUNET_assert(session != NULL);
-
- // test if message timed out
- if (GNUNET_TIME_absolute_get_remaining(fm->timeout).rel_value == 0)
- {
-#if DEBUG_wlan
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "message timeout\n");
-#endif
-
- free_fragment_message(plugin, fm);
- check_fragment_queue(plugin);
-
- }
- else
- {
-
- //if (fm->message_size > WLAN_MTU)
- // {
- size = sizeof(struct FragmentationHeader);
-
- set_next_message_fragment_pos(plugin, fm);
-
- copyoffset = (WLAN_MTU - sizeof(struct FragmentationHeader))
- * fm->message_pos;
-
- fragheader.fragment_off_or_num = htons(fm->message_pos);
- fragheader.message_id = htonl(fm->message_id_out);
- copystart = fm->msg + copyoffset;
- copysize = GNUNET_MIN(fm->message_size - copyoffset,
- WLAN_MTU - sizeof(struct FragmentationHeader));
-
-#if DEBUG_wlan
- GNUNET_log(
- GNUNET_ERROR_TYPE_DEBUG,
- "Sending GNUNET_MESSAGE_TYPE_WLAN_FRAGMENT with message_id %u with fragment number %i, size: %u, offset %u, time until timeout %u\n",
- fm->message_id_out, fm->message_pos,
- copysize + sizeof(struct FragmentationHeader), copyoffset,
- GNUNET_TIME_absolute_get_remaining(fm->timeout));
-#endif
-
- if (copyoffset >= fm->message_size)
- {
- GNUNET_log(
- GNUNET_ERROR_TYPE_ERROR,
- "offset in message for fragment too large, offset %u, size %u, max size %u, copysize %u, message_pos %u,\n",
- copyoffset, fm->message_size,
- WLAN_MTU - sizeof(struct FragmentationHeader), copysize,
- fm->message_pos);
- }
- GNUNET_assert(copyoffset < fm->message_size);
-
- fragheader.header.size = htons(
- copysize + sizeof(struct FragmentationHeader));
- fragheader.header.type = htons(GNUNET_MESSAGE_TYPE_WLAN_FRAGMENT);
-
- size += copysize;
- size += sizeof(struct Radiotap_Send) + sizeof(struct ieee80211_frame)
- + sizeof(struct GNUNET_MessageHeader);
- 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, session->mac, radioHeader);
-
- ieeewlanheader = (struct ieee80211_frame *) &radioHeader[1];
- getWlanHeader(ieeewlanheader, &(fm->session->mac->addr), plugin, size);
-
- //could be faster if content is just send and not copyed before
- //fragmentheader is needed
- fragheader.message_crc = htons(getcrc16(copystart, copysize));
- memcpy(&ieeewlanheader[1], &fragheader,
- sizeof(struct FragmentationHeader));
- fragheaderptr = (struct FragmentationHeader *) &ieeewlanheader[1];
- memcpy(&fragheaderptr[1], copystart, copysize);
-
- bytes = GNUNET_DISK_file_write(plugin->server_stdin_handle,
- msgheader, size);
- if (bytes == GNUNET_SYSERR)
- {
- GNUNET_log(
- GNUNET_ERROR_TYPE_ERROR,
- _("Error writing to wlan healper. errno == %d, ERROR: %s\n"),
- errno, strerror(errno));
-
- }
- GNUNET_assert(bytes != GNUNET_SYSERR);
-
- //check if this was the last fragment of this message, if true then queue at the end of the list
- if (copysize + copyoffset >= fm->message_size)
- {
- GNUNET_assert(copysize + copyoffset == fm->message_size);
-
- GNUNET_CONTAINER_heap_update_cost(
- plugin->pending_Fragment_Messages, fm->node,
- MIN(fm->timeout.abs_value, fm->next_ack.abs_value));
- // if fragments have opimized timeouts
- //sort_fragment_into_queue(plugin,fm);
-
-
-#if DEBUG_wlan_retransmission
- GNUNET_log(
- GNUNET_ERROR_TYPE_DEBUG,
- "Finished sending all fragments waiting for acks; message_id %u; message_id %u; fragment number %i, size: %u, time until timeout %u\n",
- fm->message_id_out, fm->message_id_out, fm->message_pos,
- fm->message_size,
- GNUNET_TIME_absolute_get_remaining(fm->timeout));
-#endif
- }
- else
- {
- GNUNET_CONTAINER_heap_update_cost(
- plugin->pending_Fragment_Messages, fm->node,
- GNUNET_TIME_absolute_get().abs_value);
- }
-
- if (bytes != size)
- {
- finish = GNUNET_malloc(sizeof( struct Finish_send));
- finish->plugin = plugin;
- finish->msgheader = (char *) msgheader + bytes;
- finish->size = size - bytes;
- finish->msgstart = msgheader;
-
- 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);
-
- }
- else
- {
- GNUNET_free(msgheader);
- set_next_send(plugin);
- }
-
- }
- return;
- }
-
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
- "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(GNUNET_ERROR_TYPE_ERROR,
- _("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(
- GNUNET_ERROR_TYPE_ERROR,
- "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 = (struct 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(GNUNET_ERROR_TYPE_INFO, "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(GNUNET_ERROR_TYPE_DEBUG,
- "New message for %p with size (incl wlan header) %u added\n", session,
- newmsg->message_size);
-#endif
-
- //queue session
- queue_session(plugin, session);
-
- check_fragment_queue(plugin);
- //FIXME not the correct size
- return msgbuf_size;
-
-}
-
-/**
- * Iterate over the fragment messages of the given session.
- *
- * @param cls argument to give to iterator
- * @param node node to iterate over
- * @param element value stored at the node
- * @param cost cost associated with the node
- * @return GNUNET_YES if we should continue to iterate,
- * GNUNET_NO if not.
- */
-static int
-free_fragment_message_from_session(void *cls,
- struct GNUNET_CONTAINER_HeapNode *node, void *element,
- GNUNET_CONTAINER_HeapCostType cost)
-{
- struct Plugin_Session_pair * pair = (struct Plugin_Session_pair *) cls;
- struct FragmentMessage * fm = (struct FragmentMessage*) element;
-
- if (fm->session == pair->session)
- {
-
- free_fragment_message(pair->plugin, fm);
- }
- return GNUNET_YES;
-
-}
-
-/**
- * Search for fragment message with given id and session
- *
- * @param cls argument to give to iterator
- * @param node node to iterate over
- * @param element value stored at the node
- * @param cost cost associated with the node
- * @return GNUNET_YES if we should continue to iterate,
- * GNUNET_NO if not.
- */
-static int
-search_fragment_message_from_endpoint_and_id(void *cls,
- struct GNUNET_CONTAINER_HeapNode *node, void *element,
- GNUNET_CONTAINER_HeapCostType cost)
-{
- struct MacEndpoint_id_fragment_triple * triple =
- (struct MacEndpoint_id_fragment_triple *) cls;
- struct FragmentMessage * fm = (struct FragmentMessage*) element;
-
- if ((fm->session->mac == triple->endpoint) && (fm->message_id_out
- == triple->message_id))
- {
- triple->fm = fm;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-
-}
-
-/**
- * function to get the message in the fragement queue (out) of a session with a specific id
- * @param session pointer to the session
- * @param message_id id of the message
- * @return pointer to the struct FragmentMessage
- */
-static struct FragmentMessage *
-get_fragment_message_from_endpoint_and_id(struct Plugin * plugin,
- struct MacEndpoint * endpoint, uint32_t message_id)
-{
- struct MacEndpoint_id_fragment_triple triple;
- triple.endpoint = endpoint;
- triple.message_id = message_id;
- triple.fm = NULL;
- GNUNET_CONTAINER_heap_iterate(plugin->pending_Fragment_Messages,
- &search_fragment_message_from_endpoint_and_id, &triple);
- return triple.fm;
-}
-
-/**
- * function to get the receive message of a session
- * @param plugin pointer to the plugin struct
- * @param endpoint MacEndpoint this fragment belongs to
- * @param message_id id of the message
- */
-static struct Receive_Message_Queue *
-get_receive_message(struct Plugin * plugin, struct MacEndpoint * endpoint,
- uint32_t message_id)
-{
- struct Receive_Message_Queue * rec_message = plugin->receive_messages_head;
- while (rec_message != NULL)
- {
- if (rec_message->endpoint == endpoint && message_id
- == rec_message->message_id_in)
- {
- return rec_message;
- }
- rec_message = rec_message->next;
- }
- return NULL;
-}
-
-/**
- * Function to dispose the fragments received for a message and the message
- * @param plugin pointer to the plugin struct
- * @param rec_message pointer to the struct holding the message which should be freed
- */
-static void
-free_receive_message(struct Plugin* plugin,
- struct Receive_Message_Queue * rx_message)
-{
- GNUNET_assert(rx_message !=NULL);
- struct Receive_Fragment_Queue * rec_queue = rx_message->frag_head;
- struct Receive_Fragment_Queue * rec_queue2;
-
- while (rec_queue != NULL)
- {
- rec_queue2 = rec_queue;
- rec_queue = rec_queue->next;
- GNUNET_free(rec_queue2);
- }
-
- GNUNET_CONTAINER_DLL_remove(plugin->receive_messages_head,plugin->receive_messages_teil, rx_message);
-
- GNUNET_assert(plugin->pending_receive_messages > 0);
- GNUNET_assert(rx_message->endpoint != NULL);
- GNUNET_assert(rx_message->endpoint !=NULL);
- GNUNET_assert(rx_message->endpoint->fragment_messages_in_count > 0);
-
- plugin->pending_receive_messages--;
- rx_message->endpoint->fragment_messages_in_count--;
- GNUNET_free(rx_message);
-}
-
-/**
- * function to check for timeouts
- * @param plugin pointer to the plugin struct
- */
-static void
-check_receive_message_timeouts(struct Plugin * plugin)
-{
- struct Receive_Message_Queue * rec_message = plugin->receive_messages_head;
- while (rec_message != NULL)
- {
- if (GNUNET_TIME_absolute_get_remaining(rec_message->timeout).rel_value
- == 0)
- {
- free_receive_message(plugin, rec_message);
- }
- rec_message = rec_message->next;
- }
-
-}
-
-/**
- * function to free a mac endpoint
- * @param plugin pointer to the plugin struct
- * @param endpoin pointer to the MacEndpoint to free
- */
-static void
-free_macendpoint(struct Plugin * plugin, struct MacEndpoint * endpoin)
-{
- struct Sessionqueue * sessions;
- struct Sessionqueue * sessions_next;
- GNUNET_assert(endpoin != NULL);
- sessions = endpoin->sessions_head;
- while (sessions != NULL)
- {
- sessions_next = sessions->next;
- free_session(plugin, sessions, GNUNET_NO);
- sessions = sessions_next;
- }
-
- GNUNET_CONTAINER_DLL_remove(plugin->mac_head,plugin->mac_tail,endpoin);
- GNUNET_free(endpoin);
-
-}
-
-/**
- * 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
- */
-static void
-free_session(struct Plugin * plugin, struct Sessionqueue * queue,
- int do_free_macendpoint)
-{
- struct Sessionqueue * pendingsession;
- struct Sessionqueue * pendingsession_tmp;
- struct PendingMessage * pm;
- //struct Receive_Message_Queue * receive_queue;
- struct Plugin_Session_pair pair;
- struct MacEndpoint * endpoint;
- int check = 0;
-
- GNUNET_assert(queue != NULL);
- GNUNET_assert(queue->content != NULL);
-
- //session found
- //is this session pending for send
- pendingsession = plugin->pending_Sessions_head;
- while (pendingsession != NULL)
- {
- pendingsession_tmp = pendingsession->next;
- if (pendingsession->content == queue->content)
- {
- plugin->pendingsessions--;
- GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
- plugin->pending_Sessions_tail,
- pendingsession);
- GNUNET_free(pendingsession);
-
- GNUNET_assert (check == 0);
- check = 1;
- }
- pendingsession = pendingsession_tmp;
- }
-
- //is something of this session in the fragment queue?
- pair.plugin = plugin;
- pair.session = queue->content;
- GNUNET_CONTAINER_heap_iterate(plugin->pending_Fragment_Messages,
- &free_fragment_message_from_session, &pair);
-
- //dispose all received fragments
- /*receive_queue = get_receive_message_from_session(plugin, queue->content);
- while (receive_queue != NULL)
- {
- free_receive_message(plugin, receive_queue);
- receive_queue = get_receive_message_from_session(plugin, queue->content);
- }*/
-
- // remove PendingMessage
- pm = queue->content->pending_message_head;
- while (pm != NULL)
- {
- GNUNET_CONTAINER_DLL_remove(queue->content->pending_message_head,queue->content->pending_message_tail,pm);
- GNUNET_free_non_null(pm->msg);
- GNUNET_free(pm);
- pm = queue->content->pending_message_head;
- }
-
- endpoint = queue->content->mac;
- GNUNET_CONTAINER_DLL_remove(endpoint->sessions_head ,
- endpoint->sessions_tail,
- queue);
-
- if (endpoint->sessions_head == NULL && do_free_macendpoint == GNUNET_YES)
- {
- free_macendpoint(plugin, endpoint);
- }
- GNUNET_free(queue->content);
- GNUNET_free(queue);
- check_fragment_queue(plugin);
-}
-
-/**
- * Function that can be used to force the plugin to disconnect
- * from the given peer and cancel all previous transmissions
- * (and their continuation).
- *
- * @param cls closure
- * @param target peer from which to disconnect
- */
-static void
-wlan_plugin_disconnect(void *cls, const struct GNUNET_PeerIdentity *target)
-{
- struct Plugin *plugin = cls;
- struct Sessionqueue * queue;
- struct Sessionqueue * queue_next;
- struct MacEndpoint * endpoint = plugin->mac_head;
- struct MacEndpoint * endpoint_next;
- // just look at all the session for the needed one
- while (endpoint != NULL)
- {
- queue = endpoint->sessions_head;
- endpoint_next = endpoint->next;
- while (queue != NULL)
- {
- // content is never NULL
- GNUNET_assert (queue->content != NULL);
- queue_next = queue->next;
- if (memcmp(target, &(queue->content->target),
- sizeof(struct GNUNET_PeerIdentity)) == 0)
- {
- free_session(plugin, queue, GNUNET_YES);
- }
- // try next
- queue = queue_next;
- }
- endpoint = endpoint_next;
- }
-}
-
-/**
- * Convert the transports address to a nice, human-readable
- * format.
- *
- * @param cls closure
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- * the specific address format depends on the transport
- * @param addrlen length of the address
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for asc
- */
-static void
-wlan_plugin_address_pretty_printer(void *cls, const char *type,
- const void *addr, size_t addrlen, int numeric,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressStringCallback asc, void *asc_cls)
-{
- char ret[92];
- const unsigned char * input;
-
- //GNUNET_assert(cls !=NULL);
- if (addrlen != 6)
- {
- /* invalid address (MAC addresses have 6 bytes) */GNUNET_break (0);
- asc(asc_cls, NULL);
- return;
- }
- input = (const unsigned char*) addr;
- GNUNET_snprintf(ret, sizeof(ret),
- "%s Mac-Address %.2X:%.2X:%.2X:%.2X:%.2X:%.2X", PROTOCOL_PREFIX,
- input[0], input[1], input[2], input[3], input[4], input[5]);
- asc(asc_cls, ret);
-}
-
-/**
- * Function to test if fragment number already exists in the fragments received
- *
- * @param rec_message message this fragment belongs to
- * @param fh Fragmentheader of the fragment
- * @return GNUNET_YES if fragment exists already, GNUNET_NO if it does not exists in the queue of the session
- */
-static int
-is_double_msg(struct Receive_Message_Queue * rx_msg,
- struct FragmentationHeader * fh)
-{
-
- return testBit((char *) &rx_msg->received_fragments,
- ntohs(fh->fragment_off_or_num));
-
-}
-
-/**
- * Function to insert a fragment in a queue of a message
- * @param session session the fragment belongs to
- * @param rec_queue fragment to add
- */
-static void
-insert_fragment_in_queue(struct Receive_Message_Queue * rx_message,
- struct Receive_Fragment_Queue * rx_frag)
-{
- GNUNET_assert(rx_message != NULL);
- GNUNET_assert(rx_frag != NULL);
-
- struct Receive_Fragment_Queue * rx_frag2 = rx_message->frag_head;
- struct WlanHeader * wlanheader;
-
- //this is the first fragment of the message (fragment id 0)
- if (rx_frag->num == 0)
- {
- wlanheader = (struct WlanHeader *) rx_frag->msg;
- rx_message->rec_size = ntohs(wlanheader->header.size);
- }
-
- //sort into list
- while (rx_frag2 != NULL)
- {
- if (rx_frag2->num > rx_frag->num)
- {
- //next element number is grater than the current num
- GNUNET_CONTAINER_DLL_insert_before(rx_message->frag_head, rx_message->frag_tail, rx_frag2, rx_frag);
- setBit((char *) &rx_message->received_fragments, rx_frag->num);
- return;
- }
- rx_frag2 = rx_frag2->next;
- }
-
- //no element has a grater number
- GNUNET_CONTAINER_DLL_insert_tail(rx_message->frag_head, rx_message->frag_tail, rx_frag);
-
- setBit((char *) &rx_message->received_fragments, rx_frag->num);
-}
-
-/**
- * handels the data after all fragments are put together
- * @param plugin
- * @param session_light
- * @param hdr pointer to the data
- */
-static void
-wlan_data_message_handler(void *cls, void *client,
- const struct GNUNET_MessageHeader *hdr)
-{
- struct Plugin * plugin = (struct Plugin*) cls;
- struct Session_light * session_light = (struct Session_light *) client;
- struct WlanHeader * wlanheader;
- struct Session * session;
- //const char * tempmsg;
- const struct GNUNET_MessageHeader * temp_hdr;
- struct GNUNET_PeerIdentity tmpsource;
- int crc;
-
- if (ntohs(hdr->type) == GNUNET_MESSAGE_TYPE_WLAN_DATA)
- {
-
-#if DEBUG_wlan
- GNUNET_log(
- GNUNET_ERROR_TYPE_DEBUG,
- "Func wlan_data_message_handler got GNUNET_MESSAGE_TYPE_WLAN_DATA size: %u\n",
- ntohs(hdr->size));
-#endif
-
- if (ntohs(hdr->size) < sizeof(struct WlanHeader)
- + sizeof(struct GNUNET_MessageHeader))
- {
- //packet not big enought
- return;
- }
-
- GNUNET_assert(session_light != NULL);
- wlanheader = (struct WlanHeader *) hdr;
-
- if (session_light->session == NULL)
- {
- session_light->session = search_session(plugin, &session_light->addr,
- &wlanheader->source);
- }
- session = session_light->session;
-
- //tempmsg = (char*) &wlanheader[1];
- temp_hdr = (const struct GNUNET_MessageHeader *) &wlanheader[1];
- crc = ntohl(wlanheader->crc);
- wlanheader->crc = 0;
- if (getcrc32((char *) wlanheader, ntohs(wlanheader->header.size)) != crc)
- {
- //wrong crc, dispose message
- GNUNET_log(GNUNET_ERROR_TYPE_INFO,
- "Wlan message Header crc was wrong: %u != %u\n",
- getcrc32((char *) wlanheader, ntohs(wlanheader->header.size)),
- crc);
- hexdump((void *) hdr, ntohs(hdr->size));
- return;
- }
-
- //if not in session list
- if (session == NULL)
- {
-#if DEBUG_wlan
- GNUNET_log(
- GNUNET_ERROR_TYPE_DEBUG,
- "WLAN client not in session list: packet size = %u, inner size = %u, header size = %u\n",
- ntohs(wlanheader->header.size), ntohs(temp_hdr->size),
- sizeof(struct WlanHeader));
-#endif
- //try if it is a hello message
- if (ntohs(wlanheader->header.size) >= ntohs(temp_hdr->size)
- + sizeof(struct WlanHeader))
- {
- if (ntohs(temp_hdr->type) == GNUNET_MESSAGE_TYPE_HELLO)
- {
- if (GNUNET_HELLO_get_id(
- (const struct GNUNET_HELLO_Message *) temp_hdr,
- &tmpsource) == GNUNET_OK)
- {
- session_light->macendpoint = get_macendpoint(plugin,
- &session_light->addr, GNUNET_YES);
- session = create_session(plugin,
- session_light->macendpoint, &tmpsource);
- session_light->session = session;
-
- }
- else
- {
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
- "WLAN client not in session list and hello message is not okay\n");
- return;
- }
-
- }
- else
- {
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
- "WLAN client not in session list and not a hello message\n");
- return;
- }
- }
- else
- {
- GNUNET_log(
- GNUNET_ERROR_TYPE_WARNING,
- "WLAN client not in session list and message size in does not fit\npacket size = %u, inner size = %u, header size = %u\n",
- ntohs(wlanheader->header.size), ntohs(temp_hdr->size),
- sizeof(struct WlanHeader));
- return;
- }
- }
-
- //"receive" the message
-
- if (memcmp(&wlanheader->source, &session->target,
- sizeof(struct GNUNET_PeerIdentity)) != 0)
- {
- //wrong peer id
-#if DEBUG_wlan
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "WLAN peer source id doesn't match packet peer source id: session %p\n",
- session);
-#endif
- return;
- }
-
- if (memcmp(&wlanheader->target, plugin->env->my_identity,
- sizeof(struct GNUNET_PeerIdentity)) != 0)
- {
- //wrong peer id
-#if DEBUG_wlan
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "WLAN peer target id doesn't match our peer id: session %p\n",
- session);
-#endif
- return;
- }
-
- GNUNET_SERVER_mst_receive(plugin->data_tokenizer, session,
- (const char *) temp_hdr,
- ntohs(hdr->size) - sizeof(struct WlanHeader), GNUNET_YES, GNUNET_NO);
-
- return;
- }
- else
- {
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
- "wlan_data_message_handler got wrong message type\n");
- return;
- }
-}
-
-/**
- * Function to check if all fragments of a message have been received
- * @param plugin the plugin handle
- * @param session_light information of the message sender
- * @param rec_message pointer to the message that should be checked
- */
-
-static void
-check_rx_finished_msg(struct Plugin* plugin,
- struct Session_light * session_light,
- struct Receive_Message_Queue * rx_message)
-{
- GNUNET_assert(rx_message !=NULL);
-
- struct Receive_Fragment_Queue * rx_frag = rx_message->frag_head;
- int packetsize = rx_message->rec_size;
- int sum;
- //TODO CLEANUP
- //int aktnum;
- uint64_t bitfield = 0;
- //char * msg;
-
- //check if first fragment is present
- if (packetsize == MESSAGE_LENGHT_UNKNOWN)
- {
- return;
- }
- // test if message has at least the size of the WlanHeader and a GNUNET_MessageHeader
-
- else if (packetsize < sizeof(struct WlanHeader)
- + sizeof(struct GNUNET_MessageHeader))
- {
-#if DEBUG_wlan
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Message not big enough\n");
-#endif
- free_receive_message(plugin, rx_message);
- return;
- }
-
- // if (rx_message->frag_tail->num == ffsl(rx_message->received_fragments))
- // {
- bitfield = ~bitfield;
- bitfield = bitfield >> (63 - rx_message->frag_tail->num);
- if (rx_message->received_fragments == bitfield)
- {
- sum = 0;
- while (rx_frag != NULL)
- {
- sum += rx_frag->size;
- rx_frag = rx_frag->next;
- }
- //sum should always be smaller or equal of
- GNUNET_assert(sum <= packetsize);
- if (sum == packetsize)
- {
-
-#if DEBUG_wlan
- GNUNET_log(
- GNUNET_ERROR_TYPE_DEBUG,
- "check_rec_finished_msg: A message for endpoint %p is complete\n",
- rx_message->endpoint);
-#endif
-
- //TODO cleanup
-
- //copy fragments together
- //msg = GNUNET_malloc(packetsize);
- rx_frag = rx_message->frag_head;
- //aktnum = 0;
- /*while (rx_frag != NULL)
- {
- //TODO SAVE SOME COPY OPS AND CHECK CRC WITHOUT COPY
- memcpy(msg + aktnum, rx_frag->msg, rx_frag->size);
- aktnum += rx_frag->size;
- rx_frag = rx_frag->next;
- }*/
-
- while (rx_frag != NULL)
- {
- if (rx_frag->next != NULL)
- {
- GNUNET_SERVER_mst_receive(plugin->fragment_tokenizer,
- session_light, rx_frag->msg, rx_frag->size, GNUNET_NO,
- GNUNET_NO);
- }
- else
- {
- //if it is the last fragment just kill all leftover
- GNUNET_SERVER_mst_receive(plugin->fragment_tokenizer,
- session_light, rx_frag->msg, rx_frag->size, GNUNET_YES,
- GNUNET_NO);
- }
- rx_frag = rx_frag->next;
- }
- session_light->macendpoint->message_id_backlog[session_light->macendpoint->message_id_backlog_pos]
- = rx_message->message_id_in;
- session_light->macendpoint->message_id_backlog_pos
- = (session_light->macendpoint->message_id_backlog_pos + 1)
- % MESSAGE_ID_BACKLOG_SIZE;
- free_receive_message(plugin, rx_message);
- //call wlan_process_helper to process the message
- //wlan_data_message_handler(plugin, session_light,
- // (struct GNUNET_MessageHeader*) msg);
- //wlan_data_helper (plugin, session_light, (struct GNUNET_MessageHeader*) msg);
-
- //GNUNET_free(msg);
- }
- }
- // }
-}
-
-//TODO DOXIGEN
-static void
-process_data(void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
-{
-
- GNUNET_assert(client != NULL);
- GNUNET_assert(cls != NULL);
- struct Session * session = (struct Session *) client;
- struct Plugin * plugin = (struct Plugin *) cls;
-
- struct GNUNET_TRANSPORT_ATS_Information distance[2];
- distance[0].type = htonl(GNUNET_TRANSPORT_ATS_QUALITY_NET_DISTANCE);
- distance[0].value = htonl(1);
- distance[1].type = htonl(GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR);
- distance[1].value = htonl(0);
-
-#if DEBUG_wlan
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "Calling plugin->env->receive for session %p; %s; size: %u\n", session,
- wlan_plugin_address_to_string(NULL, session->mac->addr.mac, 6),
- htons(hdr->size));
-#endif
-
- plugin->env->receive(plugin->env->cls, &(session->target), hdr,
- (const struct GNUNET_TRANSPORT_ATS_Information *) &distance, 2, session,
- (const char*) &session->mac->addr, sizeof(session->mac->addr));
-}
-
-/**
- * function to add an ack to send it for a received fragment
- * @param plugin pointer to the global plugin structure
- * @param endpoint pointer to the MacEndpoint this ack belongs to
- * @param bitfield bitfield to send
- * @param fh pointer to the fragmentation header which we would like to acknolage
- */
-
-void
-add_ack_for_send(struct Plugin * plugin, struct MacEndpoint * endpoint,
- uint64_t bitfield, struct FragmentationHeader * fh)
-{
- struct AckSendQueue * ack;
-
- GNUNET_assert(plugin != NULL);
- GNUNET_assert(endpoint != NULL);
- GNUNET_assert(fh != NULL);
-
- ack = GNUNET_malloc(sizeof(struct AckSendQueue));
- ack->fragments_field = bitfield;
- ack->message_id = ntohl(fh->message_id);
- ack->endpoint = endpoint;
-
- GNUNET_CONTAINER_DLL_insert_tail(plugin->ack_send_queue_head,
- plugin->ack_send_queue_tail, ack);
-
-}
-
-/**
- * function to get the receive message from the message id and the session
- * @param plugin pointer to the plugin struct
- * @param endpoint MacEndpoint this fragment belongs to
- * @param message_id id of the message
- */
-
-/*struct Receive_Message_Queue *
- get_receive_message(struct Plugin * plugin, struct MacEndpoint * endpoint,
- uint32_t message_id)
- {
- struct Receive_Message_Queue * rec_message = plugin->receive_messages_head;
- while (rec_message != NULL)
- {
- if ((rec_message->message_id_in == message_id) && (rec_message->endpoint
- == endpoint))
- {
- return rec_message;
- }
- rec_message = rec_message->next;
- }
- return NULL;
- }*/
-
-/**
- * function to insert a received fragment into the right fragment queue of the right message
- * @param plugin pointer to the plugin struct
- * @param session_light pointer to the session_light struct of this message
- * @param fh pointer to the header of the fragment
- * @return new fragment bitfield for the message
- */
-
-uint64_t
-insert_fragment_in_in_message_queue(struct Plugin * plugin,
- struct Session_light * session_light, struct FragmentationHeader * fh,
- const struct Radiotap_rx * rxinfo)
-{
- struct Receive_Fragment_Queue * rx_frag = NULL;
- struct Receive_Message_Queue * rx_message;
- struct MacEndpoint * endpoint = session_light->macendpoint;
- const char * tempmsg = (char*) &fh[1];
- uint64_t retval = 0;
- int i;
-
- //TODO fragments do not timeout
- //check if message_id is right or it is a new msg
- GNUNET_assert(fh != NULL);
-
- //check for receive of old messages
- for (i = 0; i < MESSAGE_ID_BACKLOG_SIZE; i++)
- {
- if (endpoint->message_id_backlog[i] == ntohl(fh->message_id))
- {
- setBit((char *) &retval, ntohs(fh->fragment_off_or_num));
- return retval;
- }
- }
-
- rx_message = get_receive_message(plugin, endpoint, ntohl(fh->message_id));
-
- if (rx_message == NULL)
- {
- if (endpoint->fragment_messages_in_count < MESSAGES_IN_QUEUE_PER_SESSION)
- {
- check_receive_message_timeouts(plugin);
- }
-
- if (endpoint->fragment_messages_in_count < MESSAGES_IN_QUEUE_PER_SESSION)
- {
-
- //new message incoming
- rx_message = GNUNET_malloc(sizeof (struct Receive_Message_Queue));
- rx_message->message_id_in = ntohl(fh->message_id);
- rx_message->rec_size = MESSAGE_LENGHT_UNKNOWN;
- rx_message->endpoint = endpoint;
- rx_message->received_fragments = 0;
-
- GNUNET_CONTAINER_DLL_insert(plugin->receive_messages_head, plugin->receive_messages_teil, rx_message);
-
- endpoint->fragment_messages_in_count++;
- plugin->pending_receive_messages++;
-
-#if DEBUG_wlan
- GNUNET_log(
- GNUNET_ERROR_TYPE_DEBUG,
- "New fragmented message started: message id %u, messages in for this session %u, messages in %u\n",
- rx_message->message_id_in,
- rx_message->endpoint->fragment_messages_in_count,
- plugin->pending_receive_messages);
-#endif
- }
- else
- {
-
- GNUNET_log(
- GNUNET_ERROR_TYPE_INFO,
- "WLAN fragment message_id and session message_id do not exist, max MESSAGES_IN_QUEUE_PER_SESSION reached\n");
- setBit((char *) &retval, ntohs(fh->fragment_off_or_num));
- return retval;
- }
- }
-
- //reset timeout
- rx_message->timeout = GNUNET_TIME_absolute_add(GNUNET_TIME_absolute_get(),
- MESSAGE_IN_TIMEOUT);
-
- if (is_double_msg(rx_message, fh) != GNUNET_YES)
- {
-
- //report size
- rx_frag = GNUNET_malloc(sizeof (struct Receive_Fragment_Queue) +
- ntohs(fh->header.size) - sizeof(struct FragmentationHeader));
- rx_frag->size = ntohs(fh->header.size)
- - sizeof(struct FragmentationHeader);
- rx_frag->num = ntohs(fh->fragment_off_or_num);
- rx_frag->msg = (char*) &(rx_frag[1]);
- //copy msg to buffer
- memcpy((char *) rx_frag->msg, tempmsg, rx_frag->size);
- memcpy((char *) &(rx_frag->rxinfo), rxinfo, sizeof(rxinfo));
- insert_fragment_in_queue(rx_message, rx_frag);
- //save bitfield
- retval = rx_message->received_fragments;
-
-#if DEBUG_wlan
- GNUNET_log(
- GNUNET_ERROR_TYPE_DEBUG,
- "New fragment: size %u, fragsize %u, message id %u, bitfield %X, endpoint %p\n",
- rx_message->rec_size, rx_frag->size, rx_message->message_id_in,
- rx_message->received_fragments, rx_message->endpoint);
-#endif
-
- check_rx_finished_msg(plugin, session_light, rx_message);
- }
- else
- {
- GNUNET_log(GNUNET_ERROR_TYPE_INFO, "WLAN fragment is a clone\n");
- retval = rx_message->received_fragments;
-
- }
- return retval;
-
-}