-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->session->fragment_messages_in_count > 0);
-
- plugin->pending_receive_messages--;
- rx_message->session->fragment_messages_in_count--;
- GNUNET_free(rx_message);
-}
-
-/**
- * function to get the receive message of a session
- * @param plugin pointer to the plugin struct
- * @param session session this fragment belongs to
- */
-static void
-check_receive_message_timeouts(struct Plugin * plugin, struct Session * session)
-{
- 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;
- }
-
-}
-
-//TODO DOXIGEN
-static void
-free_session(struct Plugin * plugin, struct Sessionqueue * queue)
-{
- struct Sessionqueue * pendingsession;
- struct Sessionqueue * pendingsession_tmp;
- struct PendingMessage * pm;
- struct Receive_Message_Queue * receive_queue;
- struct Plugin_Session_pair pair;
- 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_log(GNUNET_ERROR_TYPE_DEBUG,
- "Remove session %p from pending session queue\n", queue->content
- );
-
-
- if (check == 1)
- {
- GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
- "Session is more then once in pending session\n");
- }
-
- 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;
- if (pm != NULL)
- {
- GNUNET_free_non_null(pm->msg);
- GNUNET_free(pm);
- }
-
- // remove PendingMessage
- pm = queue->content->pending_message2;
- if (pm != NULL)
- {
- GNUNET_free_non_null(pm->msg);
- GNUNET_free(pm);
- }
-
- GNUNET_CONTAINER_DLL_remove(plugin->sessions, plugin->sessions_tail, queue);
- GNUNET_free(queue->content);
- GNUNET_free(queue);
- plugin->session_count--;
-
- 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 = plugin->sessions;
-
- // just look at all the session for the needed one
- while (queue != NULL)
- {
- // content is never NULL
- GNUNET_assert (queue->content != NULL);
- if (memcmp(target, &(queue->content->target),
- sizeof(struct GNUNET_PeerIdentity)) == 0)
- {
- free_session(plugin, queue);
- return;
- }
- // try next
- queue = queue->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 check if bitfield is representation of fragments of the message
- * @param rec_message message to check
- */
-
-void
-check_message_fragment_bitfield(struct Receive_Message_Queue * rx_msg)
-{
- uint64_t checkfragments = 0;
- struct Receive_Fragment_Queue * rx_frag = rx_msg->frag_head;
-
- while (rx_frag != NULL)
- {
- setBit((char*) &checkfragments, rx_frag->num);
- rx_frag = rx_frag->next;
-
- }
- GNUNET_assert(checkfragments == rx_msg->received_fragments);
-}
-
-/**
- * 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 const int
-is_double_msg(struct Receive_Message_Queue * rx_msg,
- struct FragmentationHeader * fh)
-{
- //test if bitfield is okay
-#if DEBUG_wlan
- check_message_fragment_bitfield(rx_msg);
-#endif
-
- 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 tmptarget;
-
- 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);
- if (session_light->session == NULL)
- {
- session_light->session = search_session(plugin, &session_light->addr);
- }
- session = session_light->session;
- wlanheader = (struct WlanHeader *) hdr;
-
- tempmsg = (char*) &wlanheader[1];
- temp_hdr = (const struct GNUNET_MessageHeader *) &wlanheader[1];
-
- if (getcrc32(tempmsg, ntohs(wlanheader->header.size)) != ntohl(
- wlanheader->crc))
- {
- //wrong crc, dispose message
- GNUNET_log(GNUNET_ERROR_TYPE_INFO,
- "Wlan message Header crc was wrong\n");
- 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,
- &tmptarget) == GNUNET_OK)
- {
- session = create_session(plugin, &session_light->addr);
- session_light->session = session;
- memcpy(&session->target, &tmptarget,
- sizeof(struct GNUNET_PeerIdentity));
- }
- else
- {
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING,
- "WLAN client not in session list and hello message 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
-
-
- 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 session session the message belongs to
- * @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 Session * session,
- 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;
- }