diff options
author | David Brodski <david@brodski.eu> | 2011-04-19 11:15:25 +0000 |
---|---|---|
committer | David Brodski <david@brodski.eu> | 2011-04-19 11:15:25 +0000 |
commit | 10e27ef7411f47f290887a9cfe040cc171d1dff3 (patch) | |
tree | 0c8f0929de2a9e2e8edc225c70f88618769bfc92 /src/transport/plugin_transport_wlan.c | |
parent | 80886220c43050805947be8027e05cf6fd1b4832 (diff) | |
download | gnunet-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.c | 104 |
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 |
814 | static struct GNUNET_TIME_Relative | 814 | /* |
815 | get_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 | |||
838 | set_next_send(struct Plugin * const plugin) | 840 | set_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 | */ |
1171 | static int | 1174 | static int |
1172 | getWlanHeader(struct ieee80211_frame * Header, | 1175 | getWlanHeader(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); |