aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_wlan.c
diff options
context:
space:
mode:
authorDavid Brodski <david@brodski.eu>2011-03-28 21:52:47 +0000
committerDavid Brodski <david@brodski.eu>2011-03-28 21:52:47 +0000
commit76b1f350c95e6f4e28a0bc9d915f20e354fff1ab (patch)
tree939433ea0a6937ae5326539a62d1ea9e0ebb9597 /src/transport/plugin_transport_wlan.c
parentc31a1ce379ec7ade3225ddda0364cf09a65d1689 (diff)
downloadgnunet-76b1f350c95e6f4e28a0bc9d915f20e354fff1ab.tar.gz
gnunet-76b1f350c95e6f4e28a0bc9d915f20e354fff1ab.zip
First test of wlan driver, sends beacon every 2 seconds
Diffstat (limited to 'src/transport/plugin_transport_wlan.c')
-rw-r--r--src/transport/plugin_transport_wlan.c137
1 files changed, 75 insertions, 62 deletions
diff --git a/src/transport/plugin_transport_wlan.c b/src/transport/plugin_transport_wlan.c
index b96414a71..245f0d795 100644
--- a/src/transport/plugin_transport_wlan.c
+++ b/src/transport/plugin_transport_wlan.c
@@ -34,6 +34,7 @@
34#include "plugin_transport_wlan.h" 34#include "plugin_transport_wlan.h"
35#include "gnunet_common.h" 35#include "gnunet_common.h"
36#include "gnunet_crypto_lib.h" 36#include "gnunet_crypto_lib.h"
37#include "wlan/ieee80211.h"
37 38
38#define PROTOCOL_PREFIX "wlan" 39#define PROTOCOL_PREFIX "wlan"
39 40
@@ -473,6 +474,11 @@ struct Session
473 474
474 int fragment_messages_in_count; 475 int fragment_messages_in_count;
475 476
477 //TODO DOXIGEN
478 uint8_t rate;
479 uint16_t tx_power;
480 uint8_t antenna;
481
476}; 482};
477 483
478/** 484/**
@@ -606,10 +612,11 @@ struct FragmentationAckHeader
606}; 612};
607 613
608int 614int
609getRadiotapHeader(struct RadiotapHeader * Header); 615getRadiotapHeader(struct Plugin * plugin, struct Session * session,
616 struct Radiotap_Send * Header);
610 617
611int 618int
612getWlanHeader(struct IeeeHeader * Header, const char * to_mac_addr, 619getWlanHeader(struct ieee80211_frame * Header, const char * to_mac_addr,
613 struct Plugin * plugin); 620 struct Plugin * plugin);
614 621
615static int 622static int
@@ -696,15 +703,15 @@ setBit(char *bitArray, unsigned int bitIdx)
696 * @param bitIdx which bit to unset 703 * @param bitIdx which bit to unset
697 */ 704 */
698/*static void 705/*static void
699clearBit(char *bitArray, unsigned int bitIdx) 706 clearBit(char *bitArray, unsigned int bitIdx)
700{ 707 {
701 size_t slot; 708 size_t slot;
702 unsigned int targetBit; 709 unsigned int targetBit;
703 710
704 slot = bitIdx / 8; 711 slot = bitIdx / 8;
705 targetBit = (1L << (bitIdx % 8)); 712 targetBit = (1L << (bitIdx % 8));
706 bitArray[slot] = bitArray[slot] & (~targetBit); 713 bitArray[slot] = bitArray[slot] & (~targetBit);
707}*/ 714 }*/
708 715
709/** 716/**
710 * Checks if a bit is active in the bitArray 717 * Checks if a bit is active in the bitArray
@@ -1012,12 +1019,14 @@ get_next_queue_Session(struct Plugin * plugin)
1012 session = sessionqueue->content; 1019 session = sessionqueue->content;
1013 1020
1014 pm = session->pending_message; 1021 pm = session->pending_message;
1015 if (pm == NULL){ 1022 if (pm == NULL)
1023 {
1016#if DEBUG_wlan 1024#if DEBUG_wlan
1017 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 1025 GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
1018 "pending message is empty, should not happen. session %p\n", session); 1026 "pending message is empty, should not happen. session %p\n",
1027 session);
1019#endif 1028#endif
1020 } 1029 }
1021 GNUNET_assert(pm != NULL); 1030 GNUNET_assert(pm != NULL);
1022 1031
1023 //check for message timeout 1032 //check for message timeout
@@ -1180,12 +1189,13 @@ check_fragment_queue(struct Plugin * plugin)
1180 } 1189 }
1181 GNUNET_free(pm); 1190 GNUNET_free(pm);
1182 1191
1183 if (session->pending_message2 != NULL){ 1192 if (session->pending_message2 != NULL)
1184 session->pending_message = session->pending_message2; 1193 {
1185 session->pending_message2 = NULL; 1194 session->pending_message = session->pending_message2;
1186 //requeue session 1195 session->pending_message2 = NULL;
1187 queue_Session(plugin, session); 1196 //requeue session
1188 } 1197 queue_Session(plugin, session);
1198 }
1189 1199
1190 //check if timeout changed 1200 //check if timeout changed
1191 check_next_fragment_timeout(plugin); 1201 check_next_fragment_timeout(plugin);
@@ -1270,23 +1280,23 @@ send_hello_beacon(struct Plugin * plugin)
1270 uint16_t size = 0; 1280 uint16_t size = 0;
1271 ssize_t bytes; 1281 ssize_t bytes;
1272 struct GNUNET_MessageHeader * msgheader = NULL; 1282 struct GNUNET_MessageHeader * msgheader = NULL;
1273 struct IeeeHeader * ieeewlanheader = NULL; 1283 struct ieee80211_frame * ieeewlanheader = NULL;
1274 struct RadiotapHeader * radioHeader = NULL; 1284 struct Radiotap_Send * radioHeader = NULL;
1275 struct GNUNET_MessageHeader * msgheader2 = NULL; 1285 struct GNUNET_MessageHeader * msgheader2 = NULL;
1276 1286
1277 GNUNET_assert(sizeof(struct WlanHeader) + GNUNET_HELLO_size( 1287 GNUNET_assert(sizeof(struct WlanHeader) + GNUNET_HELLO_size(
1278 *(plugin->env->our_hello)) <= WLAN_MTU); 1288 *(plugin->env->our_hello)) <= WLAN_MTU);
1279 size = sizeof(struct GNUNET_MessageHeader) + sizeof(struct RadiotapHeader) 1289 size = sizeof(struct GNUNET_MessageHeader) + sizeof(struct Radiotap_Send)
1280 + sizeof(struct IeeeHeader) + sizeof(struct GNUNET_MessageHeader) 1290 + sizeof(struct ieee80211_frame) + sizeof(struct GNUNET_MessageHeader)
1281 + GNUNET_HELLO_size(*(plugin->env->our_hello)); 1291 + GNUNET_HELLO_size(*(plugin->env->our_hello));
1282 1292
1283 msgheader = GNUNET_malloc(size); 1293 msgheader = GNUNET_malloc(size);
1284 msgheader->size = htons(size); 1294 msgheader->size = htons(size);
1285 msgheader->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA); 1295 msgheader->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
1286 1296
1287 radioHeader = (struct RadiotapHeader*) &msgheader[1]; 1297 radioHeader = (struct Radiotap_Send*) &msgheader[1];
1288 getRadiotapHeader(radioHeader); 1298 getRadiotapHeader(plugin, NULL, radioHeader);
1289 ieeewlanheader = (struct IeeeHeader*) &radioHeader[1]; 1299 ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1];
1290 getWlanHeader(ieeewlanheader, bc_all_mac, plugin); 1300 getWlanHeader(ieeewlanheader, bc_all_mac, plugin);
1291 1301
1292 msgheader2 = (struct GNUNET_MessageHeader*) &ieeewlanheader[1]; 1302 msgheader2 = (struct GNUNET_MessageHeader*) &ieeewlanheader[1];
@@ -1321,8 +1331,8 @@ send_ack(struct Plugin * plugin, struct AckSendQueue * ack)
1321 uint16_t size = 0; 1331 uint16_t size = 0;
1322 ssize_t bytes; 1332 ssize_t bytes;
1323 struct GNUNET_MessageHeader * msgheader = NULL; 1333 struct GNUNET_MessageHeader * msgheader = NULL;
1324 struct IeeeHeader * ieeewlanheader = NULL; 1334 struct ieee80211_frame * ieeewlanheader = NULL;
1325 struct RadiotapHeader * radioHeader = NULL; 1335 struct Radiotap_Send * radioHeader = NULL;
1326 struct FragmentationAckHeader * msgheader2 = NULL; 1336 struct FragmentationAckHeader * msgheader2 = NULL;
1327 1337
1328 GNUNET_assert(sizeof(struct FragmentationAckHeader) <= WLAN_MTU); 1338 GNUNET_assert(sizeof(struct FragmentationAckHeader) <= WLAN_MTU);
@@ -1333,15 +1343,15 @@ send_ack(struct Plugin * plugin, struct AckSendQueue * ack)
1333 ack->message_id, ack->fragments_field); 1343 ack->message_id, ack->fragments_field);
1334#endif 1344#endif
1335 1345
1336 size = sizeof(struct GNUNET_MessageHeader) + sizeof(struct RadiotapHeader) 1346 size = sizeof(struct GNUNET_MessageHeader) + sizeof(struct Radiotap_Send)
1337 + sizeof(struct IeeeHeader) + sizeof(struct FragmentationAckHeader); 1347 + sizeof(struct ieee80211_frame) + sizeof(struct FragmentationAckHeader);
1338 msgheader = GNUNET_malloc(size); 1348 msgheader = GNUNET_malloc(size);
1339 msgheader->size = htons(size); 1349 msgheader->size = htons(size);
1340 msgheader->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA); 1350 msgheader->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
1341 1351
1342 radioHeader = (struct RadiotapHeader*) &msgheader[1]; 1352 radioHeader = (struct Radiotap_Send*) &msgheader[1];
1343 getRadiotapHeader(radioHeader); 1353 getRadiotapHeader(plugin, ack->session, radioHeader);
1344 ieeewlanheader = (struct IeeeHeader*) &radioHeader[1]; 1354 ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1];
1345 getWlanHeader(ieeewlanheader, ack->session->addr, plugin); 1355 getWlanHeader(ieeewlanheader, ack->session->addr, plugin);
1346 1356
1347 msgheader2 = (struct FragmentationAckHeader*) &ieeewlanheader[1]; 1357 msgheader2 = (struct FragmentationAckHeader*) &ieeewlanheader[1];
@@ -1383,8 +1393,8 @@ do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1383 1393
1384 struct Session * session = NULL; 1394 struct Session * session = NULL;
1385 struct FragmentMessage * fm = NULL; 1395 struct FragmentMessage * fm = NULL;
1386 struct IeeeHeader * ieeewlanheader = NULL; 1396 struct ieee80211_frame * ieeewlanheader = NULL;
1387 struct RadiotapHeader * radioHeader = NULL; 1397 struct Radiotap_Send * radioHeader = NULL;
1388 struct GNUNET_MessageHeader * msgheader = NULL; 1398 struct GNUNET_MessageHeader * msgheader = NULL;
1389 1399
1390 struct FragmentationHeader fragheader; 1400 struct FragmentationHeader fragheader;
@@ -1486,16 +1496,16 @@ do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1486 }*/ 1496 }*/
1487 1497
1488 size += copysize; 1498 size += copysize;
1489 size += sizeof(struct RadiotapHeader) + sizeof(struct IeeeHeader) 1499 size += sizeof(struct Radiotap_Send) + sizeof(struct ieee80211_frame)
1490 + sizeof(struct GNUNET_MessageHeader); 1500 + sizeof(struct GNUNET_MessageHeader);
1491 msgheader = GNUNET_malloc(size); 1501 msgheader = GNUNET_malloc(size);
1492 msgheader->size = htons(size); 1502 msgheader->size = htons(size);
1493 msgheader->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA); 1503 msgheader->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
1494 1504
1495 radioHeader = (struct RadiotapHeader*) &msgheader[1]; 1505 radioHeader = (struct Radiotap_Send*) &msgheader[1];
1496 getRadiotapHeader(radioHeader); 1506 getRadiotapHeader(plugin, session, radioHeader);
1497 1507
1498 ieeewlanheader = (struct IeeeHeader *) &radioHeader[1]; 1508 ieeewlanheader = (struct ieee80211_frame *) &radioHeader[1];
1499 getWlanHeader(ieeewlanheader, fm->session->addr, plugin); 1509 getWlanHeader(ieeewlanheader, fm->session->addr, plugin);
1500 1510
1501 //could be faster if content is just send and not copyed before 1511 //could be faster if content is just send and not copyed before
@@ -1607,8 +1617,13 @@ finish_sending(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1607} 1617}
1608 1618
1609int 1619int
1610getRadiotapHeader(struct RadiotapHeader * Header) 1620getRadiotapHeader(struct Plugin * plugin, struct Session * session,
1621 struct Radiotap_Send * header)
1611{ 1622{
1623
1624 header->rate = session->rate;
1625 header->tx_power = session->tx_power;
1626 header->antenna = session->antenna;
1612 return GNUNET_YES; 1627 return GNUNET_YES;
1613} 1628}
1614; 1629;
@@ -1622,12 +1637,12 @@ getRadiotapHeader(struct RadiotapHeader * Header)
1622 */ 1637 */
1623 1638
1624int 1639int
1625getWlanHeader(struct IeeeHeader * Header, const char * const to_mac_addr, 1640getWlanHeader(struct ieee80211_frame * Header, const char * const to_mac_addr,
1626 struct Plugin * plugin) 1641 struct Plugin * plugin)
1627{ 1642{
1628 memcpy(&Header->mac3, mac_bssid, sizeof(mac_bssid)); 1643 memcpy(&Header->i_addr3, mac_bssid, sizeof(mac_bssid));
1629 memcpy(&Header->mac2, plugin->mac_address.mac, sizeof(plugin->mac_address)); 1644 memcpy(&Header->i_addr2, plugin->mac_address.mac, sizeof(plugin->mac_address));
1630 memcpy(&Header->mac1, to_mac_addr, sizeof(plugin->mac_address)); 1645 memcpy(&Header->i_addr1, to_mac_addr, sizeof(plugin->mac_address));
1631 return GNUNET_YES; 1646 return GNUNET_YES;
1632} 1647}
1633 1648
@@ -1722,7 +1737,7 @@ wlan_plugin_send(void *cls, const struct GNUNET_PeerIdentity * target,
1722 //if (session->target != NULL){ 1737 //if (session->target != NULL){
1723 // GNUNET_assert(session->target == *target); 1738 // GNUNET_assert(session->target == *target);
1724 //} else { 1739 //} else {
1725 session->target = *target; 1740 session->target = *target;
1726 //} 1741 //}
1727 1742
1728 1743
@@ -1781,7 +1796,6 @@ wlan_plugin_send(void *cls, const struct GNUNET_PeerIdentity * target,
1781 newmsg->message_size); 1796 newmsg->message_size);
1782#endif 1797#endif
1783 1798
1784
1785 //queue session 1799 //queue session
1786 queue_Session(plugin, session); 1800 queue_Session(plugin, session);
1787 1801
@@ -2494,7 +2508,7 @@ insert_fragment_in_in_message_queue(struct Plugin * plugin,
2494 rec_queue->num = ntohs(fh->fragment_off_or_num); 2508 rec_queue->num = ntohs(fh->fragment_off_or_num);
2495 rec_queue->msg = (char*) &(rec_queue[1]); 2509 rec_queue->msg = (char*) &(rec_queue[1]);
2496 //copy msg to buffer 2510 //copy msg to buffer
2497 memcpy((char *)rec_queue->msg, tempmsg, rec_queue->size); 2511 memcpy((char *) rec_queue->msg, tempmsg, rec_queue->size);
2498 insert_fragment_in_queue(rec_message, rec_queue); 2512 insert_fragment_in_queue(rec_message, rec_queue);
2499 //save bitfield 2513 //save bitfield
2500 retval = rec_message->received_fragments; 2514 retval = rec_message->received_fragments;
@@ -2679,10 +2693,9 @@ wlan_data_helper(void *cls, struct Session_light * session_light,
2679} 2693}
2680 2694
2681char * 2695char *
2682macprinter(struct MacAddress macx) 2696macprinter(u_int8_t * mac)
2683{ 2697{
2684 static char macstr[20]; 2698 static char macstr[20];
2685 char * mac = macx.mac;
2686 sprintf(macstr, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", mac[0], mac[1], mac[2], 2699 sprintf(macstr, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", mac[0], mac[1], mac[2],
2687 mac[3], mac[4], mac[5]); 2700 mac[3], mac[4], mac[5]);
2688 return macstr; 2701 return macstr;
@@ -2701,7 +2714,7 @@ wlan_process_helper(void *cls, void *client,
2701 const struct GNUNET_MessageHeader *hdr) 2714 const struct GNUNET_MessageHeader *hdr)
2702{ 2715{
2703 struct Plugin *plugin = cls; 2716 struct Plugin *plugin = cls;
2704 struct IeeeHeader * wlanIeeeHeader = NULL; 2717 struct ieee80211_frame * wlanIeeeHeader = NULL;
2705 struct Session_light * session_light = NULL; 2718 struct Session_light * session_light = NULL;
2706 const struct GNUNET_MessageHeader * temp_hdr = NULL; 2719 const struct GNUNET_MessageHeader * temp_hdr = NULL;
2707 2720
@@ -2718,30 +2731,30 @@ wlan_process_helper(void *cls, void *client,
2718#endif 2731#endif
2719 2732
2720 //call wlan_process_helper with the message inside, later with wlan: analyze signal 2733 //call wlan_process_helper with the message inside, later with wlan: analyze signal
2721 GNUNET_assert(ntohs(hdr->size) >= sizeof(struct IeeeHeader) + sizeof(struct GNUNET_MessageHeader)); 2734 GNUNET_assert(ntohs(hdr->size) >= sizeof(struct ieee80211_frame) + sizeof(struct GNUNET_MessageHeader));
2722 wlanIeeeHeader = (struct IeeeHeader *) &hdr[1]; 2735 wlanIeeeHeader = (struct ieee80211_frame *) &hdr[1];
2723 2736
2724 //process only if it is an broadcast or for this computer both with the gnunet bssid 2737 //process only if it is an broadcast or for this computer both with the gnunet bssid
2725 2738
2726 //check for bssid 2739 //check for bssid
2727 if (memcmp(&(wlanIeeeHeader->mac3), mac_bssid, sizeof(struct MacAddress)) 2740 if (memcmp(&(wlanIeeeHeader->i_addr3), mac_bssid,
2728 == 0) 2741 sizeof(struct MacAddress)) == 0)
2729 { 2742 {
2730 //check for broadcast or mac 2743 //check for broadcast or mac
2731 if (memcmp(&(wlanIeeeHeader->mac1), bc_all_mac, 2744 if (memcmp(&(wlanIeeeHeader->i_addr1), bc_all_mac,
2732 sizeof(struct MacAddress) == 0) || memcmp( 2745 sizeof(struct MacAddress) == 0) || memcmp(
2733 &(wlanIeeeHeader->mac1), &(plugin->mac_address), 2746 &(wlanIeeeHeader->i_addr1), &(plugin->mac_address),
2734 sizeof(struct MacAddress)) == 0) 2747 sizeof(struct MacAddress)) == 0)
2735 { 2748 {
2736 2749
2737 // process the inner data 2750 // process the inner data
2738 2751
2739 2752
2740 datasize = ntohs(hdr->size) - sizeof(struct IeeeHeader) 2753 datasize = ntohs(hdr->size) - sizeof(struct ieee80211_frame)
2741 - sizeof(struct GNUNET_MessageHeader); 2754 - sizeof(struct GNUNET_MessageHeader);
2742 2755
2743 session_light = GNUNET_malloc(sizeof(struct Session_light)); 2756 session_light = GNUNET_malloc(sizeof(struct Session_light));
2744 memcpy(session_light->addr, &(wlanIeeeHeader->mac2), 2757 memcpy(session_light->addr, &(wlanIeeeHeader->i_addr2),
2745 sizeof(struct MacAddress)); 2758 sizeof(struct MacAddress));
2746 //session_light->session = search_session(plugin,session_light->addr); 2759 //session_light->session = search_session(plugin,session_light->addr);
2747 2760
@@ -2765,7 +2778,7 @@ wlan_process_helper(void *cls, void *client,
2765#if DEBUG_wlan 2778#if DEBUG_wlan
2766 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 2779 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2767 "Func wlan_process_helper got wrong MAC: %s\n", macprinter( 2780 "Func wlan_process_helper got wrong MAC: %s\n", macprinter(
2768 wlanIeeeHeader->mac1)); 2781 wlanIeeeHeader->i_addr1));
2769#endif 2782#endif
2770 } 2783 }
2771 } 2784 }
@@ -2774,7 +2787,7 @@ wlan_process_helper(void *cls, void *client,
2774#if DEBUG_wlan 2787#if DEBUG_wlan
2775 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 2788 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2776 "Func wlan_process_helper got wrong BSSID: %s\n", macprinter( 2789 "Func wlan_process_helper got wrong BSSID: %s\n", macprinter(
2777 wlanIeeeHeader->mac2)); 2790 wlanIeeeHeader->i_addr2));
2778#endif 2791#endif
2779 } 2792 }
2780 2793
@@ -2807,7 +2820,7 @@ wlan_process_helper(void *cls, void *client,
2807 else 2820 else
2808 { 2821 {
2809 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Wrong wlan mac address %s\n", 2822 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Wrong wlan mac address %s\n",
2810 macprinter(plugin->mac_address)); 2823 macprinter(plugin->mac_address.mac));
2811 } 2824 }
2812 2825
2813 } 2826 }