aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_wlan.c
diff options
context:
space:
mode:
authorDavid Brodski <david@brodski.eu>2011-04-19 11:15:25 +0000
committerDavid Brodski <david@brodski.eu>2011-04-19 11:15:25 +0000
commit10e27ef7411f47f290887a9cfe040cc171d1dff3 (patch)
tree0c8f0929de2a9e2e8edc225c70f88618769bfc92 /src/transport/plugin_transport_wlan.c
parent80886220c43050805947be8027e05cf6fd1b4832 (diff)
downloadgnunet-10e27ef7411f47f290887a9cfe040cc171d1dff3.tar.gz
gnunet-10e27ef7411f47f290887a9cfe040cc171d1dff3.zip
Cleanup and working version with hardware
Diffstat (limited to 'src/transport/plugin_transport_wlan.c')
-rw-r--r--src/transport/plugin_transport_wlan.c104
1 files changed, 69 insertions, 35 deletions
diff --git a/src/transport/plugin_transport_wlan.c b/src/transport/plugin_transport_wlan.c
index 0564e9127..f8178f101 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_NO 63#define DEBUG_wlan GNUNET_YES
64#define DEBUG_wlan_retransmission GNUNET_NO 64#define DEBUG_wlan_retransmission GNUNET_NO
65 65
66#define MESSAGE_LENGHT_UNKNOWN -1 66#define MESSAGE_LENGHT_UNKNOWN -1
@@ -811,12 +811,14 @@ set_next_beacon_time(struct Plugin * const plugin)
811} 811}
812 812
813//TODO doxigen 813//TODO doxigen
814static struct GNUNET_TIME_Relative 814/*
815get_next_frag_timeout(struct FragmentMessage * fm) 815 static struct GNUNET_TIME_Relative
816{ 816 get_next_frag_timeout(struct FragmentMessage * fm)
817 return GNUNET_TIME_relative_min(GNUNET_TIME_absolute_get_remaining( 817 {
818 fm->next_ack), GNUNET_TIME_absolute_get_remaining(fm->timeout)); 818 return GNUNET_TIME_relative_min(GNUNET_TIME_absolute_get_remaining(
819} 819 fm->next_ack), GNUNET_TIME_absolute_get_remaining(fm->timeout));
820 }
821 */
820 822
821//TODO doxigen 823//TODO doxigen
822/** 824/**
@@ -838,7 +840,8 @@ static void
838set_next_send(struct Plugin * const plugin) 840set_next_send(struct Plugin * const plugin)
839{ 841{
840 struct FragmentMessage * fm; 842 struct FragmentMessage * fm;
841 struct GNUNET_TIME_Relative next_send = GNUNET_TIME_UNIT_FOREVER_REL; 843 struct GNUNET_TIME_Relative next_send;
844 struct GNUNET_TIME_Absolute next_send_tmp;
842 845
843 //cancel old task 846 //cancel old task
844 if (plugin->server_write_delay_task != GNUNET_SCHEDULER_NO_TASK) 847 if (plugin->server_write_delay_task != GNUNET_SCHEDULER_NO_TASK)
@@ -861,15 +864,11 @@ set_next_send(struct Plugin * const plugin)
861 next_send = GNUNET_TIME_absolute_get_remaining(plugin->beacon_time); 864 next_send = GNUNET_TIME_absolute_get_remaining(plugin->beacon_time);
862 if (fm != NULL) 865 if (fm != NULL)
863 { 866 {
864 if (GNUNET_CONTAINER_node_get_cost(fm->node) != 0) 867 next_send_tmp.abs_value = GNUNET_CONTAINER_heap_node_get_cost(
865 { 868 fm->node);
866 next_send = GNUNET_TIME_relative_min(next_send, 869 next_send = GNUNET_TIME_relative_min(next_send,
867 get_next_frag_timeout(fm)); 870 GNUNET_TIME_absolute_get_remaining(next_send_tmp));
868 } 871
869 else
870 {
871 next_send = GNUNET_TIME_UNIT_ZERO;
872 }
873 } 872 }
874 } 873 }
875 874
@@ -898,10 +897,12 @@ get_next_queue_session(struct Plugin * plugin)
898 struct Sessionqueue * sessionqueue_alt; 897 struct Sessionqueue * sessionqueue_alt;
899 struct PendingMessage * pm; 898 struct PendingMessage * pm;
900 sessionqueue = plugin->pending_Sessions; 899 sessionqueue = plugin->pending_Sessions;
900
901 while (sessionqueue != NULL) 901 while (sessionqueue != NULL)
902 { 902 {
903 session = sessionqueue->content; 903 session = sessionqueue->content;
904 904
905 GNUNET_assert(session != NULL);
905 pm = session->pending_message; 906 pm = session->pending_message;
906 907
907#if DEBUG_wlan 908#if DEBUG_wlan
@@ -912,6 +913,7 @@ get_next_queue_session(struct Plugin * plugin)
912 session); 913 session);
913 } 914 }
914#endif 915#endif
916
915 GNUNET_assert(pm != NULL); 917 GNUNET_assert(pm != NULL);
916 918
917 //check for message timeout 919 //check for message timeout
@@ -1025,7 +1027,10 @@ check_fragment_queue(struct Plugin * plugin)
1025 fm->message_id_out = get_next_message_id(); 1027 fm->message_id_out = get_next_message_id();
1026 fm->ack_bitfield = 0; 1028 fm->ack_bitfield = 0;
1027 fm->node = GNUNET_CONTAINER_heap_insert( 1029 fm->node = GNUNET_CONTAINER_heap_insert(
1028 plugin->pending_Fragment_Messages, fm, 0); 1030 plugin->pending_Fragment_Messages, fm,
1031 GNUNET_TIME_absolute_get().abs_value);
1032
1033 GNUNET_assert(session !=NULL);
1029 1034
1030 if (pm->transmit_cont != NULL) 1035 if (pm->transmit_cont != NULL)
1031 { 1036 {
@@ -1093,8 +1098,6 @@ check_finished_fragment(struct Plugin * plugin, struct FragmentMessage * fm)
1093 1098
1094 free_fragment_message(plugin, fm); 1099 free_fragment_message(plugin, fm);
1095 1100
1096
1097
1098 check_fragment_queue(plugin); 1101 check_fragment_queue(plugin);
1099 1102
1100 } 1103 }
@@ -1170,13 +1173,21 @@ getRadiotapHeader(struct Plugin * plugin, struct Session * session,
1170 */ 1173 */
1171static int 1174static int
1172getWlanHeader(struct ieee80211_frame * Header, 1175getWlanHeader(struct ieee80211_frame * Header,
1173 const struct MacAddress * to_mac_addr, struct Plugin * plugin) 1176 const struct MacAddress * to_mac_addr, struct Plugin * plugin,
1177 unsigned int size)
1174{ 1178{
1175 Header->i_fc[0] = 0x80; 1179 uint16_t * tmp16;
1180 const int rate = 11000000;
1181
1182 Header->i_fc[0] = 0x08;
1176 Header->i_fc[1] = 0x00; 1183 Header->i_fc[1] = 0x00;
1177 memcpy(&Header->i_addr3, &mac_bssid, sizeof(mac_bssid)); 1184 memcpy(&Header->i_addr3, &mac_bssid, sizeof(mac_bssid));
1178 memcpy(&Header->i_addr2, plugin->mac_address.mac, sizeof(plugin->mac_address)); 1185 memcpy(&Header->i_addr2, plugin->mac_address.mac, sizeof(plugin->mac_address));
1179 memcpy(&Header->i_addr1, to_mac_addr, sizeof(plugin->mac_address)); 1186 memcpy(&Header->i_addr1, to_mac_addr, sizeof(struct MacAddress));
1187
1188 tmp16 = (uint16_t*) Header->i_dur;
1189 *tmp16 = (uint16_t) htole16((size * 1000000) / rate + 290);
1190
1180 return GNUNET_YES; 1191 return GNUNET_YES;
1181} 1192}
1182 1193
@@ -1241,7 +1252,7 @@ send_hello_beacon(struct Plugin * plugin)
1241 radioHeader = (struct Radiotap_Send*) &msgheader[1]; 1252 radioHeader = (struct Radiotap_Send*) &msgheader[1];
1242 getRadiotapHeader(plugin, NULL, radioHeader); 1253 getRadiotapHeader(plugin, NULL, radioHeader);
1243 ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1]; 1254 ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1];
1244 getWlanHeader(ieeewlanheader, &bc_all_mac, plugin); 1255 getWlanHeader(ieeewlanheader, &bc_all_mac, plugin, size);
1245 1256
1246 msgheader2 = (struct GNUNET_MessageHeader*) &ieeewlanheader[1]; 1257 msgheader2 = (struct GNUNET_MessageHeader*) &ieeewlanheader[1];
1247 msgheader2->size = htons(GNUNET_HELLO_size(*(plugin->env->our_hello)) 1258 msgheader2->size = htons(GNUNET_HELLO_size(*(plugin->env->our_hello))
@@ -1297,7 +1308,7 @@ send_ack(struct Plugin * plugin, struct AckSendQueue * ack)
1297 radioHeader = (struct Radiotap_Send*) &msgheader[1]; 1308 radioHeader = (struct Radiotap_Send*) &msgheader[1];
1298 getRadiotapHeader(plugin, ack->session, radioHeader); 1309 getRadiotapHeader(plugin, ack->session, radioHeader);
1299 ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1]; 1310 ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1];
1300 getWlanHeader(ieeewlanheader, &ack->session->addr, plugin); 1311 getWlanHeader(ieeewlanheader, &ack->session->addr, plugin, size);
1301 1312
1302 msgheader2 = (struct FragmentationAckHeader*) &ieeewlanheader[1]; 1313 msgheader2 = (struct FragmentationAckHeader*) &ieeewlanheader[1];
1303 msgheader2->header.size = htons(sizeof(struct FragmentationAckHeader)); 1314 msgheader2->header.size = htons(sizeof(struct FragmentationAckHeader));
@@ -1488,7 +1499,7 @@ do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1488 getRadiotapHeader(plugin, session, radioHeader); 1499 getRadiotapHeader(plugin, session, radioHeader);
1489 1500
1490 ieeewlanheader = (struct ieee80211_frame *) &radioHeader[1]; 1501 ieeewlanheader = (struct ieee80211_frame *) &radioHeader[1];
1491 getWlanHeader(ieeewlanheader, &fm->session->addr, plugin); 1502 getWlanHeader(ieeewlanheader, &(fm->session->addr), plugin, size);
1492 1503
1493 //could be faster if content is just send and not copyed before 1504 //could be faster if content is just send and not copyed before
1494 //fragmentheader is needed 1505 //fragmentheader is needed
@@ -1528,6 +1539,7 @@ do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1528 // if fragments have opimized timeouts 1539 // if fragments have opimized timeouts
1529 //sort_fragment_into_queue(plugin,fm); 1540 //sort_fragment_into_queue(plugin,fm);
1530 1541
1542
1531#if DEBUG_wlan_retransmission 1543#if DEBUG_wlan_retransmission
1532 GNUNET_log( 1544 GNUNET_log(
1533 GNUNET_ERROR_TYPE_DEBUG, 1545 GNUNET_ERROR_TYPE_DEBUG,
@@ -1537,6 +1549,12 @@ do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1537 fm->timeout)); 1549 fm->timeout));
1538#endif 1550#endif
1539 } 1551 }
1552 else
1553 {
1554 GNUNET_CONTAINER_heap_update_cost(
1555 plugin->pending_Fragment_Messages, fm->node,
1556 GNUNET_TIME_absolute_get().abs_value);
1557 }
1540 1558
1541 if (bytes != size) 1559 if (bytes != size)
1542 { 1560 {
@@ -1556,7 +1574,6 @@ do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1556 } 1574 }
1557 else 1575 else
1558 { 1576 {
1559 GNUNET_assert(bytes == size);
1560 GNUNET_free(msgheader); 1577 GNUNET_free(msgheader);
1561 set_next_send(plugin); 1578 set_next_send(plugin);
1562 } 1579 }
@@ -1858,6 +1875,9 @@ free_session(struct Plugin * plugin, struct Sessionqueue * queue)
1858 struct PendingMessage * pm; 1875 struct PendingMessage * pm;
1859 struct Receive_Message_Queue * receive_queue; 1876 struct Receive_Message_Queue * receive_queue;
1860 struct Plugin_Session_pair pair; 1877 struct Plugin_Session_pair pair;
1878 int check = 0;
1879
1880 GNUNET_assert(queue != NULL);
1861 1881
1862 //session found 1882 //session found
1863 //is this session pending for send 1883 //is this session pending for send
@@ -1869,7 +1889,14 @@ free_session(struct Plugin * plugin, struct Sessionqueue * queue)
1869 GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions, 1889 GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions,
1870 plugin->pending_Sessions_tail, pendingsession); 1890 plugin->pending_Sessions_tail, pendingsession);
1871 GNUNET_free(pendingsession); 1891 GNUNET_free(pendingsession);
1872 break; 1892
1893 if (check == 1)
1894 {
1895 GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
1896 "Session is more then once in pending session\n");
1897 }
1898
1899 check = 1;
1873 } 1900 }
1874 pendingsession = pendingsession->next; 1901 pendingsession = pendingsession->next;
1875 } 1902 }
@@ -1904,8 +1931,8 @@ free_session(struct Plugin * plugin, struct Sessionqueue * queue)
1904 GNUNET_free(pm); 1931 GNUNET_free(pm);
1905 } 1932 }
1906 1933
1907 GNUNET_free(queue->content);
1908 GNUNET_CONTAINER_DLL_remove(plugin->sessions, plugin->sessions_tail, queue); 1934 GNUNET_CONTAINER_DLL_remove(plugin->sessions, plugin->sessions_tail, queue);
1935 GNUNET_free(queue->content);
1909 GNUNET_free(queue); 1936 GNUNET_free(queue);
1910 plugin->session_count--; 1937 plugin->session_count--;
1911 1938
@@ -2681,7 +2708,7 @@ wlan_process_helper(void *cls, void *client,
2681 hdr->size), sizeof(struct ieee80211_frame) 2708 hdr->size), sizeof(struct ieee80211_frame)
2682 + sizeof(struct GNUNET_MessageHeader)); 2709 + sizeof(struct GNUNET_MessageHeader));
2683#endif 2710#endif
2684 GNUNET_break (0); 2711 //GNUNET_break (0);
2685 /* FIXME: restart SUID process */ 2712 /* FIXME: restart SUID process */
2686 return; 2713 return;
2687 } 2714 }
@@ -2892,6 +2919,7 @@ libgnunet_plugin_transport_wlan_done(void *cls)
2892 struct GNUNET_TRANSPORT_PluginFunctions *api = cls; 2919 struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
2893 struct Plugin *plugin = api->cls; 2920 struct Plugin *plugin = api->cls;
2894 struct Sessionqueue * queue = plugin->sessions; 2921 struct Sessionqueue * queue = plugin->sessions;
2922 struct Sessionqueue * queue_next;
2895 struct FragmentMessage * fm; 2923 struct FragmentMessage * fm;
2896 2924
2897#if DEBUG_wlan 2925#if DEBUG_wlan
@@ -2907,17 +2935,23 @@ libgnunet_plugin_transport_wlan_done(void *cls)
2907 if (plugin->data_tokenizer != NULL) 2935 if (plugin->data_tokenizer != NULL)
2908 GNUNET_SERVER_mst_destroy(plugin->data_tokenizer); 2936 GNUNET_SERVER_mst_destroy(plugin->data_tokenizer);
2909 2937
2938 fm = (struct FragmentMessage *) GNUNET_CONTAINER_heap_peek(
2939 plugin->pending_Fragment_Messages);
2910 2940
2911 fm = (struct FragmentMessage *) GNUNET_CONTAINER_heap_peek(plugin->pending_Fragment_Messages); 2941 while (fm != NULL)
2912 while (fm != NULL){ 2942 {
2913 free_fragment_message(plugin, fm); 2943 free_fragment_message(plugin, fm);
2914 fm = (struct FragmentMessage *) GNUNET_CONTAINER_heap_peek(plugin->pending_Fragment_Messages); 2944 fm = (struct FragmentMessage *) GNUNET_CONTAINER_heap_peek(
2915 } 2945 plugin->pending_Fragment_Messages);
2946 }
2916 2947
2917 //free sessions 2948 //free sessions
2918 while (queue != NULL) 2949 while (queue != NULL)
2919 { 2950 {
2951 queue_next = queue->next;
2920 free_session(plugin, queue); 2952 free_session(plugin, queue);
2953 queue = queue_next;
2954
2921 } 2955 }
2922 2956
2923 GNUNET_free_non_null(plugin->interface); 2957 GNUNET_free_non_null(plugin->interface);