aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_wlan.c
diff options
context:
space:
mode:
authorDavid Brodski <david@brodski.eu>2011-04-06 00:47:00 +0000
committerDavid Brodski <david@brodski.eu>2011-04-06 00:47:00 +0000
commitd99bd9118c9e6328f4a476457d3f86e7b8cd11b0 (patch)
tree2bdce97b2e0f15af26c82e546cac67f6a73baa68 /src/transport/plugin_transport_wlan.c
parent8de8a462ddd6c327f7134763a8e89b523e8ffa6b (diff)
downloadgnunet-d99bd9118c9e6328f4a476457d3f86e7b8cd11b0.tar.gz
gnunet-d99bd9118c9e6328f4a476457d3f86e7b8cd11b0.zip
reliability test and fragmentation are working now
Diffstat (limited to 'src/transport/plugin_transport_wlan.c')
-rw-r--r--src/transport/plugin_transport_wlan.c173
1 files changed, 94 insertions, 79 deletions
diff --git a/src/transport/plugin_transport_wlan.c b/src/transport/plugin_transport_wlan.c
index a2e9bbe60..9d79e2d01 100644
--- a/src/transport/plugin_transport_wlan.c
+++ b/src/transport/plugin_transport_wlan.c
@@ -60,7 +60,7 @@
60 60
61#define HALLO_BEACON_SCALING_FACTOR 900 61#define HALLO_BEACON_SCALING_FACTOR 900
62 62
63#define DEBUG_wlan GNUNET_YES 63#define DEBUG_wlan GNUNET_NO
64 64
65#define MESSAGE_LENGHT_UNKNOWN -1 65#define MESSAGE_LENGHT_UNKNOWN -1
66//#define NO_MESSAGE_OR_MESSAGE_FINISHED -2 66//#define NO_MESSAGE_OR_MESSAGE_FINISHED -2
@@ -1175,12 +1175,12 @@ check_finished_fragment(struct Plugin * plugin, struct FragmentMessage * fm)
1175 uint64_t tmpfield = UINT64_MAX; 1175 uint64_t tmpfield = UINT64_MAX;
1176 tmpfield = tmpfield >> maxack; 1176 tmpfield = tmpfield >> maxack;
1177 1177
1178 //#if DEBUG_wlan 1178#if DEBUG_wlan
1179 if (maxack != 63) 1179 if (maxack != 63)
1180 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1180 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
1181 "Test bitfields %X and %X, maxack is %u, fm size %u\n", 1181 "Test bitfields %X and %X, maxack is %u, fm size %u\n",
1182 fm->ack_bitfield, tmpfield, maxack, fm->message_size); 1182 fm->ack_bitfield, tmpfield, maxack, fm->message_size);
1183 //#endif 1183#endif
1184 1184
1185 if (fm->ack_bitfield == tmpfield) 1185 if (fm->ack_bitfield == tmpfield)
1186 { 1186 {
@@ -1294,14 +1294,16 @@ send_ack(struct Plugin * plugin, struct AckSendQueue * ack)
1294 1294
1295 GNUNET_assert(sizeof(struct FragmentationAckHeader) <= WLAN_MTU); 1295 GNUNET_assert(sizeof(struct FragmentationAckHeader) <= WLAN_MTU);
1296 1296
1297 size = sizeof(struct GNUNET_MessageHeader) + sizeof(struct Radiotap_Send)
1298 + sizeof(struct ieee80211_frame) + sizeof(struct FragmentationAckHeader);
1299
1297#if DEBUG_wlan 1300#if DEBUG_wlan
1298 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1301 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
1299 "Sending ack for message_id %u with fragment field %u\n", 1302 "Sending ack for message_id %u with fragment field %u, size %u\n",
1300 ack->message_id, ack->fragments_field); 1303 ack->message_id, ack->fragments_field, size
1304 - sizeof(struct Radiotap_Send));
1301#endif 1305#endif
1302 1306
1303 size = sizeof(struct GNUNET_MessageHeader) + sizeof(struct Radiotap_Send)
1304 + sizeof(struct ieee80211_frame) + sizeof(struct FragmentationAckHeader);
1305 msgheader = GNUNET_malloc(size); 1307 msgheader = GNUNET_malloc(size);
1306 msgheader->size = htons(size); 1308 msgheader->size = htons(size);
1307 msgheader->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA); 1309 msgheader->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
@@ -1405,13 +1407,21 @@ do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1405 1407
1406 //if (fm->message_size > WLAN_MTU) 1408 //if (fm->message_size > WLAN_MTU)
1407 // { 1409 // {
1408 size += sizeof(struct FragmentationHeader); 1410 size = sizeof(struct FragmentationHeader);
1409 1411
1410 set_next_message_fragment_pos(fm); 1412 set_next_message_fragment_pos(fm);
1411 1413
1412 copyoffset = (WLAN_MTU - sizeof(struct FragmentationHeader)) 1414 copyoffset = (WLAN_MTU - sizeof(struct FragmentationHeader))
1413 * fm->message_pos; 1415 * fm->message_pos;
1414 1416
1417
1418
1419 fragheader.fragment_off_or_num = htons(fm->message_pos);
1420 fragheader.message_id = htonl(fm->message_id_out);
1421 copystart = fm->msg + copyoffset;
1422 copysize = GNUNET_MIN(fm->message_size - copyoffset,
1423 WLAN_MTU - sizeof(struct FragmentationHeader));
1424
1415#if DEBUG_wlan 1425#if DEBUG_wlan
1416 GNUNET_log( 1426 GNUNET_log(
1417 GNUNET_ERROR_TYPE_DEBUG, 1427 GNUNET_ERROR_TYPE_DEBUG,
@@ -1421,12 +1431,6 @@ do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1421 GNUNET_TIME_absolute_get_remaining(fm->timeout)); 1431 GNUNET_TIME_absolute_get_remaining(fm->timeout));
1422#endif 1432#endif
1423 1433
1424 fragheader.fragment_off_or_num = htons(fm->message_pos);
1425 fragheader.message_id = htonl(fm->message_id_out);
1426 copystart = fm->msg + copyoffset;
1427 copysize = GNUNET_MIN(fm->message_size - copyoffset,
1428 WLAN_MTU - sizeof(struct FragmentationHeader));
1429
1430 if (copyoffset >= fm->message_size) 1434 if (copyoffset >= fm->message_size)
1431 { 1435 {
1432 GNUNET_log( 1436 GNUNET_log(
@@ -2044,38 +2048,40 @@ is_double_msg(struct Receive_Message_Queue * rec_message,
2044 */ 2048 */
2045 2049
2046static void 2050static void
2047insert_fragment_in_queue(struct Receive_Message_Queue * rec_message, 2051insert_fragment_in_queue(struct Receive_Message_Queue * rx_message,
2048 struct Receive_Fragment_Queue * rec_queue) 2052 struct Receive_Fragment_Queue * rx_frag)
2049{ 2053{
2050 GNUNET_assert(rec_message != NULL); 2054 GNUNET_assert(rx_message != NULL);
2051 GNUNET_assert(rec_queue != NULL); 2055 GNUNET_assert(rx_frag != NULL);
2052 2056
2053 struct Receive_Fragment_Queue * rec_queue2 = rec_message->frag_head; 2057 struct Receive_Fragment_Queue * rx_frag2 = rx_message->frag_head;
2054 struct WlanHeader * wlanheader = NULL; 2058 struct WlanHeader * wlanheader = NULL;
2055 2059
2060
2056 //this is the first fragment of the message (fragment id 0) 2061 //this is the first fragment of the message (fragment id 0)
2057 if (rec_queue->num == 0) 2062 if (rx_frag->num == 0)
2058 { 2063 {
2059 wlanheader = (struct WlanHeader *) rec_queue->msg; 2064 wlanheader = (struct WlanHeader *) rx_frag->msg;
2060 rec_message->rec_size = ntohs(wlanheader->header.size); 2065 rx_message->rec_size = ntohs(wlanheader->header.size);
2061 } 2066 }
2062 2067
2063 //sort into list 2068 //sort into list
2064 while (rec_queue2 != NULL) 2069 while (rx_frag2 != NULL)
2065 { 2070 {
2066 if (rec_queue2->num > rec_queue->num) 2071 if (rx_frag2->num > rx_frag->num)
2067 { 2072 {
2068 //next element number is grater than the current num 2073 //next element number is grater than the current num
2069 GNUNET_CONTAINER_DLL_insert_before(rec_message->frag_head, rec_message->frag_tail, rec_queue2, rec_queue); 2074 GNUNET_CONTAINER_DLL_insert_before(rx_message->frag_head, rx_message->frag_tail, rx_frag2, rx_frag);
2070 setBit((char *) &rec_message->received_fragments, rec_queue->num); 2075 setBit((char *) &rx_message->received_fragments, rx_frag->num);
2071 return; 2076 return;
2072 } 2077 }
2073 rec_queue = rec_queue->next; 2078 rx_frag2 = rx_frag2->next;
2074 } 2079 }
2080
2075 //no element has a grater number 2081 //no element has a grater number
2076 GNUNET_CONTAINER_DLL_insert_tail(rec_message->frag_head, rec_message->frag_tail, rec_queue); 2082 GNUNET_CONTAINER_DLL_insert_tail(rx_message->frag_head, rx_message->frag_tail, rx_frag);
2077 2083
2078 setBit((char *) &rec_message->received_fragments, rec_queue->num); 2084 setBit((char *) &rx_message->received_fragments, rx_frag->num);
2079} 2085}
2080 2086
2081/** 2087/**
@@ -2151,52 +2157,51 @@ check_rec_finished_msg(struct Plugin* plugin,
2151 check_message_fragment_bitfield(rx_message); 2157 check_message_fragment_bitfield(rx_message);
2152#endif 2158#endif
2153 2159
2154 if (rx_message->frag_tail->num == ffsl(rx_message->received_fragments)) 2160 // if (rx_message->frag_tail->num == ffsl(rx_message->received_fragments))
2161 // {
2162 bitfield = ~bitfield;
2163 bitfield = bitfield >> (63 - rx_message->frag_tail->num);
2164 if (rx_message->received_fragments == bitfield)
2155 { 2165 {
2156 bitfield = ~bitfield; 2166
2157 bitfield = bitfield << (63 - ffsl(rx_message->received_fragments)); 2167 while (rx_frag != NULL)
2158 if (rx_message->received_fragments == bitfield) 2168 {
2169 sum += rx_frag->size;
2170 rx_frag = rx_frag->next;
2171 }
2172 //sum should always be smaller or equal of
2173 GNUNET_assert(sum <= packetsize);
2174 if (sum == packetsize)
2159 { 2175 {
2160 2176
2177#if DEBUG_wlan
2178 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2179 "check_rec_finished_msg: A message for %p is complete\n", session);
2180#endif
2181
2182 //TODO use mst
2183 //copy fragments together
2184 msg = GNUNET_malloc(packetsize);
2185 rx_frag = rx_message->frag_head;
2186 aktnum = 0;
2161 while (rx_frag != NULL) 2187 while (rx_frag != NULL)
2162 { 2188 {
2163 sum += rx_frag->size; 2189 //TODO SAVE SOME COPY OPS AND CHECK CRC WITHOUT COPY
2190 memcpy(msg + aktnum, rx_frag->msg, rx_frag->size);
2191 aktnum += rx_frag->size;
2164 rx_frag = rx_frag->next; 2192 rx_frag = rx_frag->next;
2165 } 2193 }
2166 //sum should always be smaller or equal of
2167 GNUNET_assert(sum <= packetsize);
2168 if (sum == packetsize)
2169 {
2170
2171#if DEBUG_wlan
2172 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2173 "check_rec_finished_msg: A message for %p is complete\n",
2174 session);
2175#endif
2176 2194
2177 //TODO use mst 2195 free_receive_message(plugin, rx_message);
2178 //copy fragments together 2196 //call wlan_process_helper to process the message
2179 msg = GNUNET_malloc(packetsize); 2197 wlan_data_massage_handler(plugin, session_light,
2180 rx_frag = rx_message->frag_head; 2198 (struct GNUNET_MessageHeader*) msg);
2181 aktnum = 0; 2199 //wlan_data_helper (plugin, session_light, (struct GNUNET_MessageHeader*) msg);
2182 while (rx_frag != NULL)
2183 {
2184 //TODO SAVE SOME COPY OPS AND CHECK CRC WITHOUT COPY
2185 memcpy(msg + aktnum, rx_frag->msg, rx_frag->size);
2186 aktnum += rx_frag->size;
2187 rx_frag = rx_frag->next;
2188 }
2189
2190 free_receive_message(plugin, rx_message);
2191 //call wlan_process_helper to process the message
2192 wlan_data_massage_handler(plugin, session_light,
2193 (struct GNUNET_MessageHeader*) msg);
2194 //wlan_data_helper (plugin, session_light, (struct GNUNET_MessageHeader*) msg);
2195 2200
2196 GNUNET_free(msg); 2201 GNUNET_free(msg);
2197 }
2198 } 2202 }
2199 } 2203 }
2204 // }
2200} 2205}
2201 2206
2202static void 2207static void
@@ -2216,8 +2221,8 @@ process_data(void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
2216 2221
2217#if DEBUG_wlan 2222#if DEBUG_wlan
2218 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 2223 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2219 "Calling plugin->env->receive for session %p; %s\n", session, 2224 "Calling plugin->env->receive for session %p; %s; size: %u\n", session,
2220 wlan_plugin_address_to_string(NULL, session->addr, 6)); 2225 wlan_plugin_address_to_string(NULL, session->addr, 6), htons(hdr->size));
2221#endif 2226#endif
2222 2227
2223 plugin->env->receive(plugin->env->cls, &(session->target), hdr, 2228 plugin->env->receive(plugin->env->cls, &(session->target), hdr,
@@ -2444,7 +2449,7 @@ insert_fragment_in_in_message_queue(struct Plugin * plugin,
2444 //check if message_id is right or it is a new msg 2449 //check if message_id is right or it is a new msg
2445 GNUNET_assert(fh != NULL); 2450 GNUNET_assert(fh != NULL);
2446 2451
2447 rx_message = get_receive_message(plugin, session, ntohs(fh->message_id)); 2452 rx_message = get_receive_message(plugin, session, ntohl(fh->message_id));
2448 2453
2449 if (rx_message == NULL) 2454 if (rx_message == NULL)
2450 { 2455 {
@@ -2453,7 +2458,7 @@ insert_fragment_in_in_message_queue(struct Plugin * plugin,
2453 2458
2454 //new message incoming 2459 //new message incoming
2455 rx_message = GNUNET_malloc(sizeof (struct Receive_Message_Queue)); 2460 rx_message = GNUNET_malloc(sizeof (struct Receive_Message_Queue));
2456 rx_message->message_id_in = ntohs(fh->message_id); 2461 rx_message->message_id_in = ntohl(fh->message_id);
2457 rx_message->rec_size = MESSAGE_LENGHT_UNKNOWN; 2462 rx_message->rec_size = MESSAGE_LENGHT_UNKNOWN;
2458 rx_message->session = session; 2463 rx_message->session = session;
2459 rx_message->timeout = GNUNET_TIME_absolute_add( 2464 rx_message->timeout = GNUNET_TIME_absolute_add(
@@ -2487,6 +2492,7 @@ insert_fragment_in_in_message_queue(struct Plugin * plugin,
2487 if (is_double_msg(rx_message, fh) != GNUNET_YES) 2492 if (is_double_msg(rx_message, fh) != GNUNET_YES)
2488 { 2493 {
2489 2494
2495
2490 //report size 2496 //report size
2491 rx_frag = GNUNET_malloc(sizeof (struct Receive_Fragment_Queue) + 2497 rx_frag = GNUNET_malloc(sizeof (struct Receive_Fragment_Queue) +
2492 ntohs(fh->header.size) - sizeof(struct FragmentationHeader)); 2498 ntohs(fh->header.size) - sizeof(struct FragmentationHeader));
@@ -2505,8 +2511,8 @@ insert_fragment_in_in_message_queue(struct Plugin * plugin,
2505 GNUNET_log( 2511 GNUNET_log(
2506 GNUNET_ERROR_TYPE_DEBUG, 2512 GNUNET_ERROR_TYPE_DEBUG,
2507 "New fragment: size %u, fragsize %u, message id %u, bitfield %X, session %u\n", 2513 "New fragment: size %u, fragsize %u, message id %u, bitfield %X, session %u\n",
2508 rx_message->rec_size, rx_frag->size, rx_message->received_fragments, 2514 rx_message->rec_size, rx_frag->size, rx_message->message_id_in,
2509 rx_message->message_id_in, session); 2515 rx_message->received_fragments, session);
2510#endif 2516#endif
2511 2517
2512 check_rec_finished_msg(plugin, session_light, session, rx_message); 2518 check_rec_finished_msg(plugin, session_light, session, rx_message);
@@ -2611,7 +2617,7 @@ wlan_data_helper(void *cls, struct Session_light * session_light,
2611 GNUNET_log( 2617 GNUNET_log(
2612 GNUNET_ERROR_TYPE_INFO, 2618 GNUNET_ERROR_TYPE_INFO,
2613 "WLAN client not in session list, fragment num %u, message id %u\n", 2619 "WLAN client not in session list, fragment num %u, message id %u\n",
2614 ntohs(fh->fragment_off_or_num), ntohs(fh->message_id)); 2620 ntohs(fh->fragment_off_or_num), ntohl(fh->message_id));
2615 wlan_data_massage_handler(plugin, session_light, 2621 wlan_data_massage_handler(plugin, session_light,
2616 (struct GNUNET_MessageHeader *) tempmsg); 2622 (struct GNUNET_MessageHeader *) tempmsg);
2617 session = session_light->session; 2623 session = session_light->session;
@@ -2668,8 +2674,11 @@ wlan_data_helper(void *cls, struct Session_light * session_light,
2668 else 2674 else
2669 { 2675 {
2670 // TODO Wrong data? 2676 // TODO Wrong data?
2671 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2677 GNUNET_log(
2672 "WLAN packet inside the WLAN helper packet has not the right type\n"); 2678 GNUNET_ERROR_TYPE_INFO,
2679 "WLAN packet inside the WLAN helper packet has not the right type: %u size: %u\n",
2680 ntohs(hdr->type), ntohs(hdr->size));
2681 GNUNET_assert(0);
2673 return; 2682 return;
2674 } 2683 }
2675 2684
@@ -2724,6 +2733,12 @@ wlan_process_helper(void *cls, void *client,
2724 if (ntohs(hdr->size) < sizeof(struct ieee80211_frame) 2733 if (ntohs(hdr->size) < sizeof(struct ieee80211_frame)
2725 + sizeof(struct GNUNET_MessageHeader) + sizeof(struct Radiotap_rx)) 2734 + sizeof(struct GNUNET_MessageHeader) + sizeof(struct Radiotap_rx))
2726 { 2735 {
2736#if DEBUG_wlan
2737 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2738 "Size of packet is too small; size: %u min size: %u\n", ntohs(
2739 hdr->size), sizeof(struct ieee80211_frame)
2740 + sizeof(struct GNUNET_MessageHeader));
2741#endif
2727 GNUNET_break (0); 2742 GNUNET_break (0);
2728 /* FIXME: restart SUID process */ 2743 /* FIXME: restart SUID process */
2729 return; 2744 return;
@@ -2748,7 +2763,8 @@ wlan_process_helper(void *cls, void *client,
2748 2763
2749 2764
2750 datasize = ntohs(hdr->size) - sizeof(struct ieee80211_frame) 2765 datasize = ntohs(hdr->size) - sizeof(struct ieee80211_frame)
2751 - sizeof(struct GNUNET_MessageHeader); 2766 - sizeof(struct GNUNET_MessageHeader)
2767 - sizeof(struct Radiotap_rx);
2752 2768
2753 session_light = GNUNET_malloc(sizeof(struct Session_light)); 2769 session_light = GNUNET_malloc(sizeof(struct Session_light));
2754 memcpy(session_light->addr, &(wlanIeeeHeader->i_addr2), 2770 memcpy(session_light->addr, &(wlanIeeeHeader->i_addr2),
@@ -2798,12 +2814,11 @@ wlan_process_helper(void *cls, void *client,
2798 return; 2814 return;
2799 } 2815 }
2800 memcpy(&plugin->mac_address, &hdr[1], sizeof(struct MacAddress)); 2816 memcpy(&plugin->mac_address, &hdr[1], sizeof(struct MacAddress));
2801#if DEBUG_WLAN 2817#if DEBUG_wlan
2802 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2818 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2803 "Received WLAN_HELPER_CONTROL message with transport of address %s\n", 2819 "Received WLAN_HELPER_CONTROL message with transport of address %s\n",
2804 wlan_plugin_address_to_string (cls, 2820 wlan_plugin_address_to_string(cls, &plugin->mac_address,
2805 &plugin->mac_address, 2821 sizeof(struct MacAddress)));
2806 sizeof (struct MacAddress)));
2807#endif 2822#endif
2808 plugin->env->notify_address(plugin->env->cls, "wlan", &plugin->mac_address, 2823 plugin->env->notify_address(plugin->env->cls, "wlan", &plugin->mac_address,
2809 sizeof(struct MacAddress), GNUNET_TIME_UNIT_FOREVER_REL); 2824 sizeof(struct MacAddress), GNUNET_TIME_UNIT_FOREVER_REL);