[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r15280 - gnunet/src/transport
From: |
gnunet |
Subject: |
[GNUnet-SVN] r15280 - gnunet/src/transport |
Date: |
Tue, 24 May 2011 01:14:47 +0200 |
Author: brodski
Date: 2011-05-24 01:14:47 +0200 (Tue, 24 May 2011)
New Revision: 15280
Modified:
gnunet/src/transport/Makefile.am
gnunet/src/transport/gnunet-transport-wlan-helper.c
gnunet/src/transport/plugin_transport_wlan.c
gnunet/src/transport/test_plugin_transport_wlan_dummy.c
gnunet/src/transport/test_transport_api_unreliability.c
Log:
Some bugfixes, udp packets can now be send over wlan, unrel test added, clean up
Modified: gnunet/src/transport/Makefile.am
===================================================================
--- gnunet/src/transport/Makefile.am 2011-05-23 16:26:40 UTC (rev 15279)
+++ gnunet/src/transport/Makefile.am 2011-05-23 23:14:47 UTC (rev 15280)
@@ -34,10 +34,12 @@
if HAVE_PCAP
if LINUX
- WANBIN = gnunet-transport-wlan-helper
+ WLAN_BIN = gnunet-transport-wlan-helper
+ WLAN_BIN_DUMMY = gnunet-transport-wlan-helper-dummy
WLAN_PLUGIN_LA = libgnunet_plugin_transport_wlan.la
WLAN_API_TEST = test_transport_api_wlan
WLAN_REL_TEST = test_transport_api_reliability_wlan
+ WLAN_UREL_TEST = test_transport_api_unreliability_wlan
endif
endif
@@ -78,8 +80,9 @@
bin_PROGRAMS = \
gnunet-transport \
- $(WANBIN) \
- gnunet-service-transport $(NATBIN)
+ $(WLAN_BIN) \
+ gnunet-service-transport $(NATBIN) \
+ $(WLAN_BIN_DUMMY)
bin_SCRIPTS = \
gnunet-transport-certificate-creation
@@ -91,13 +94,21 @@
gnunet_transport_wlan_helper_SOURCES = \
wlan/radiotap-parser.c \
wlan/helper_common.c \
- wlan/loopback_helper.c \
gnunet-transport-wlan-helper.c
+gnunet_transport_wlan_helper_dummy_SOURCES = \
+ wlan/radiotap-parser.c \
+ wlan/helper_common.c \
+ test_plugin_transport_wlan_dummy.c
+
gnunet_transport_wlan_helper_LDADD = \
$(top_builddir)/src/util/libgnunetutil.la \
-lpcap
+gnunet_transport_wlan_helper_dummy_LDADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ -lpcap
+
gnunet_nat_client_SOURCES = \
$(NATCLIENT)
@@ -238,7 +249,8 @@
$(HTTP_QUOTA_TEST) \
$(HTTPS_QUOTA_TEST) \
$(WLAN_API_TEST) \
- $(WLAN_REL_TEST)
+ $(WLAN_REL_TEST) \
+ $(WLAN_UREL_TEST)
# TODO: add tests for nat, etc.
if !DISABLE_TEST_RUN
@@ -268,9 +280,12 @@
$(UNIX_QUOTA_TEST) \
$(HTTP_QUOTA_TEST) \
$(HTTPS_QUOTA_TEST) \
- $(WLAN_REL_TEST)
+ $(WLAN_UREL_TEST)
endif
+# $(WLAN_API_TEST)
+# $(WLAN_REL_TEST)
+
test_transport_ats_SOURCES = \
test_transport_ats.c
test_transport_ats_LDADD = -lm \
@@ -322,8 +337,14 @@
$(top_builddir)/src/transport/libgnunettransport.la \
$(top_builddir)/src/hello/libgnunethello.la \
$(top_builddir)/src/util/libgnunetutil.la
+
+test_transport_api_unreliability_wlan_SOURCES = \
+ test_transport_api_unreliability.c
+test_transport_api_unreliability_wlan_LDADD = \
+ $(top_builddir)/src/transport/libgnunettransport.la \
+ $(top_builddir)/src/hello/libgnunethello.la \
+ $(top_builddir)/src/util/libgnunetutil.la
-
test_transport_api_udp_SOURCES = \
test_transport_api.c
test_transport_api_udp_LDADD = \
Modified: gnunet/src/transport/gnunet-transport-wlan-helper.c
===================================================================
--- gnunet/src/transport/gnunet-transport-wlan-helper.c 2011-05-23 16:26:40 UTC
(rev 15279)
+++ gnunet/src/transport/gnunet-transport-wlan-helper.c 2011-05-23 23:14:47 UTC
(rev 15280)
@@ -378,7 +378,7 @@
if (-1 == ioctl(dev->fd_raw, SIOCGIFINDEX, &ifr))
{
fprintf (stderr,
- "ioctl(SIOCGIFINDEX) on interface `%.*s' failed: %s\n",
+ "Line: 381 ioctl(SIOCGIFINDEX) on interface `%.*s' failed: %s\n",
IFNAMSIZ,
dev->iface,
strerror (errno));
@@ -428,10 +428,10 @@
/* Bring interface up*/
ifr.ifr_flags |= IFF_UP | IFF_BROADCAST | IFF_RUNNING;
- if (-1 != ioctl(dev->fd_raw, SIOCSIFFLAGS, &ifr))
+ if (-1 == ioctl(dev->fd_raw, SIOCSIFFLAGS, &ifr))
{
fprintf (stderr,
- "ioctl(SIOCSIFFLAGS) on interface `%.*s' failed: %s\n",
+ "Line: 434 ioctl(SIOCSIFFLAGS) on interface `%.*s' failed:
%s\n",
IFNAMSIZ,
dev->iface,
strerror (errno));
@@ -451,10 +451,10 @@
}
/* lookup the hardware type */
- if (-1 != ioctl(dev->fd_raw, SIOCGIFHWADDR, &ifr))
+ if (-1 == ioctl(dev->fd_raw, SIOCGIFHWADDR, &ifr))
{
fprintf (stderr,
- "ioctl(SIOCGIFHWADDR) on interface `%.*s' failed: %s\n",
+ "Line: 457 ioctl(SIOCGIFHWADDR) on interface `%.*s' failed:
%s\n",
IFNAMSIZ,
dev->iface,
strerror (errno));
@@ -588,6 +588,13 @@
}
+struct RadioTapheader
+{
+ struct ieee80211_radiotap_header header;
+ u8 rate;
+ u8 pad1;
+ u16 txflags;
+};
static void
stdin_send_hw (void *cls,
@@ -601,15 +608,21 @@
size_t sendsize;
// struct? // FIXME: make nice...
- unsigned char u8aRadiotap[] =
- { 0x00, 0x00, // <-- radiotap version
- 0x0c, 0x00, // <- radiotap header length
- 0x04, 0x80, 0x00, 0x00, // <-- bitmap
- 0x00, // <-- rate
- 0x00, // <-- padding for natural alignment
- 0x18, 0x00, // <-- TX flags
- };
+ struct RadioTapheader rtheader;
+ rtheader.header.it_version = 0;
+ rtheader.header.it_len = htole16(0x0c);
+ rtheader.header.it_present = htole32(0x00008004);
+ rtheader.rate = 0x00;
+ rtheader.txflags = htole16(IEEE80211_RADIOTAP_F_TX_NOACK |
IEEE80211_RADIOTAP_F_TX_NOSEQ);
+ /* { 0x00, 0x00, <-- radiotap version
+ 0x0c, 0x00, <- radiotap header length
+ 0x04, 0x80, 0x00, 0x00, <-- bitmap
+ 0x00, <-- rate
+ 0x00, <-- padding for natural alignment
+ 0x18, 0x00, <-- TX flags
+ };*/
+
sendsize = ntohs(hdr->size);
if (sendsize < sizeof(struct Radiotap_Send) + sizeof(struct
GNUNET_MessageHeader))
{
@@ -631,15 +644,15 @@
exit(1);
}
- u8aRadiotap[2] = htole16(sizeof(u8aRadiotap)); // WTF?
- u8aRadiotap[8] = header->rate;
- memcpy(write_pout->buf, u8aRadiotap, sizeof(u8aRadiotap));
- memcpy(write_pout->buf + sizeof(u8aRadiotap), &header[1], sendsize);
+ rtheader.header.it_len = htole16(sizeof(rtheader));
+ rtheader.rate = header->rate;
+ memcpy(write_pout->buf, &rtheader, sizeof(rtheader));
+ memcpy(write_pout->buf + sizeof(rtheader), &header[1], sendsize);
/* payload contains MAC address, but we don't trust it, so we'll
overwrite it with OUR MAC address again to prevent mischief */
- wlanheader = (struct ieee80211_frame *) (write_pout->buf +
sizeof(u8aRadiotap));
+ wlanheader = (struct ieee80211_frame *) (write_pout->buf + sizeof(rtheader));
mac_set(wlanheader, dev);
- write_pout->size = sendsize + sizeof(u8aRadiotap);
+ write_pout->size = sendsize + sizeof(rtheader);
}
#if 0
@@ -757,14 +770,6 @@
int stdin_open;
struct GNUNET_SERVER_MessageStreamTokenizer * stdin_mst;
- if (2 != argc)
- {
- fprintf (stderr,
- "This program must be started with the interface argument.\n");
- fprintf (stderr,
- "Usage: interface-name\n");
- return 1;
- }
if (0 != wlaninit(&dev, argv[1]))
return 1;
uid = getuid();
@@ -930,19 +935,14 @@
int
main(int argc, char *argv[])
{
- if (3 != argc)
+ if (2 != argc)
{
fprintf (stderr,
- "This program must be started with the interface and the
operating mode as argument.\n");
+ "This program must be started with the interface as
argument.\n");
fprintf (stderr,
- "Usage: interface-name options\n"
- "options: 0 = with hardware\n"
- "1 = first loopback file\n"
- "2 = second loopback file\n"
+ "Usage: interface-name\n"
"\n");
return 1;
}
- if (strstr(argv[2], "1") || strstr(argv[2], "2"))
- return testmode(argc, argv);
- return hardwaremode(argc - 1, argv);
+ return hardwaremode(argc , argv);
}
Modified: gnunet/src/transport/plugin_transport_wlan.c
===================================================================
--- gnunet/src/transport/plugin_transport_wlan.c 2011-05-23 16:26:40 UTC
(rev 15279)
+++ gnunet/src/transport/plugin_transport_wlan.c 2011-05-23 23:14:47 UTC
(rev 15280)
@@ -34,7 +34,8 @@
#include "plugin_transport_wlan.h"
#include "gnunet_common.h"
#include "gnunet_crypto_lib.h"
-#include "wlan/ieee80211.h"
+//#include "wlan/ieee80211.h"
+//#include <netinet/ip.h>
#include <string.h>
@@ -43,7 +44,7 @@
/**
* Max size of packet from helper
*/
-#define WLAN_MTU 3000
+#define WLAN_MTU 2100
/**
* Time until retransmission of a fragment in ms
@@ -60,8 +61,9 @@
#define HALLO_BEACON_SCALING_FACTOR 900
-#define DEBUG_wlan GNUNET_YES
+#define DEBUG_wlan GNUNET_NO
#define DEBUG_wlan_retransmission GNUNET_NO
+#define DEBUG_wlan_ip_udp_packets_on_air GNUNET_NO
#define MESSAGE_LENGHT_UNKNOWN -1
//#define NO_MESSAGE_OR_MESSAGE_FINISHED -2
@@ -73,6 +75,68 @@
*/
#define LEARNED_ADDRESS_EXPIRATION GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_HOURS, 6)
+#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
+
+#define IEEE80211_FC0_VERSION_MASK 0x03
+#define IEEE80211_FC0_VERSION_SHIFT 0
+#define IEEE80211_FC0_VERSION_0 0x00
+#define IEEE80211_FC0_TYPE_MASK 0x0c
+#define IEEE80211_FC0_TYPE_SHIFT 2
+#define IEEE80211_FC0_TYPE_MGT 0x00
+#define IEEE80211_FC0_TYPE_CTL 0x04
+#define IEEE80211_FC0_TYPE_DATA 0x08
+
+/*
+ * Structure of an internet header, naked of options.
+ */
+struct iph
+ {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ unsigned int ip_hl:4; /* header length */
+ unsigned int ip_v:4; /* version */
+#endif
+#if __BYTE_ORDER == __BIG_ENDIAN
+ unsigned int ip_v:4; /* version */
+ unsigned int ip_hl:4; /* header length */
+#endif
+ u_int8_t ip_tos; /* type of service */
+ u_short ip_len; /* total length */
+ u_short ip_id; /* identification */
+ u_short ip_off; /* fragment offset field */
+#define IP_RF 0x8000 /* reserved fragment flag */
+#define IP_DF 0x4000 /* dont fragment flag */
+#define IP_MF 0x2000 /* more fragments flag */
+#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
+ u_int8_t ip_ttl; /* time to live */
+ u_int8_t ip_p; /* protocol */
+ u_short ip_sum; /* checksum */
+ struct in_addr ip_src, ip_dst; /* source and dest address */
+ };
+
+struct udphdr
+{
+ u_int16_t source;
+ u_int16_t dest;
+ u_int16_t len;
+ u_int16_t check;
+};
+
+/*
+ * generic definitions for IEEE 802.11 frames
+ */
+struct ieee80211_frame {
+ u_int8_t i_fc[2];
+ u_int8_t i_dur[2];
+ u_int8_t i_addr1[IEEE80211_ADDR_LEN];
+ u_int8_t i_addr2[IEEE80211_ADDR_LEN];
+ u_int8_t i_addr3[IEEE80211_ADDR_LEN];
+ u_int8_t i_seq[2];
+#if DEBUG_wlan_ip_udp_packets_on_air
+ u_int8_t llc[4];
+ struct iph ip;
+ struct udphdr udp;
+#endif
+} GNUNET_PACKED;
/**
* Initial handshake message for a session.
*/
@@ -583,6 +647,54 @@
do_transmit(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
/**
+ * Generates a nice hexdump of a memory area.
+ *
+ * \param mem pointer to memory to dump
+ * \param length how many bytes to dump
+ */
+void hexdump(void *mem, unsigned length)
+{
+ char line[80];
+ char *src = (char*)mem;
+
+ printf(
+ "dumping %u bytes from %p\r\n"
+ " 0 1 2 3 4 5 6 7 8 9 A B C D E F
0123456789ABCDEF\r\n"
+ , length, src
+ );
+ unsigned i;
+ int j;
+
+ for (i=0; i<length; i+=16, src+=16) {
+ char *t = line;
+
+ t += sprintf(t, "%04x: ", i);
+ for ( j=0; j<16; j++) {
+ if (i+j < length)
+ t += sprintf(t, "%02X", src[j] & 0xff);
+ else
+ t += sprintf(t, " ");
+ t += sprintf(t, j%2 ? " " : "-");
+ }
+
+ t += sprintf(t, " ");
+ for (j=0; j<16; j++) {
+ if (i+j < length) {
+ if (isprint((unsigned char)src[j]))
+ t += sprintf(t, "%c", src[j]);
+ else
+ t += sprintf(t, ".");
+ } else {
+ t += sprintf(t, " ");
+ }
+ }
+
+ t += sprintf(t, "\r\n");
+ printf("%s", line);
+ }
+}
+
+/**
* Sets a bit active in the bitArray. Increment bit-specific
* usage counter on disk only if below 4bit max (==15).
*
@@ -892,9 +1004,8 @@
}
else
{
- plugin->server_write_delay_task
- = GNUNET_SCHEDULER_add_delayed(next_send,
- &delay_fragment_task, plugin);
+ plugin->server_write_delay_task = GNUNET_SCHEDULER_add_delayed(next_send,
+ &delay_fragment_task, plugin);
}
}
@@ -919,7 +1030,6 @@
GNUNET_assert(session != NULL);
pm = session->pending_message;
-
#if DEBUG_wlan
if (pm == NULL)
{
@@ -1195,7 +1305,7 @@
uint16_t * tmp16;
const int rate = 11000000;
- Header->i_fc[0] = 0x08;
+ Header->i_fc[0] = IEEE80211_FC0_TYPE_DATA;
Header->i_fc[1] = 0x00;
memcpy(&Header->i_addr3, &mac_bssid, sizeof(mac_bssid));
memcpy(&Header->i_addr2, plugin->mac_address.mac,
sizeof(plugin->mac_address));
@@ -1204,6 +1314,36 @@
tmp16 = (uint16_t*) Header->i_dur;
*tmp16 = (uint16_t) htole16((size * 1000000) / rate + 290);
+#if DEBUG_wlan_ip_udp_packets_on_air
+ uint crc = 0;
+ uint16_t * x;
+ int count;
+ Header->ip.ip_dst.s_addr = *((uint32_t*) &to_mac_addr->mac[2]);
+ Header->ip.ip_src.s_addr = *((uint32_t*) &plugin->mac_address.mac[2]);
+ Header->ip.ip_v = 4;
+ Header->ip.ip_hl = 5;
+ Header->ip.ip_p = 17;
+ Header->ip.ip_ttl = 1;
+ Header->ip.ip_len = htons(size + 8);
+ Header->ip.ip_sum = 0;
+ x =(uint16_t *) &Header->ip;
+ count = sizeof(struct iph);
+ while (count > 1) {
+ /* This is the inner loop */
+ crc += (unsigned short) * x++;
+ count -= 2;
+ }
+ /* Add left-over byte, if any */
+ if( count > 0 )
+ crc += * (unsigned char *) x;
+ crc = (crc & 0xffff) + (crc >> 16);
+ Header->ip.ip_sum = htons(~ (unsigned short) crc);
+ Header->llc[0] = 6;
+ Header->llc[1] = 6;
+ Header->udp.len = htons(size - sizeof(struct ieee80211_frame));
+
+#endif
+
return GNUNET_YES;
}
@@ -1219,8 +1359,8 @@
uint32_t
getcrc32(const char *msgbuf, size_t msgbuf_size)
{
- //TODO calc some crc
- return 0;
+
+ return GNUNET_CRYPTO_crc32_n(msgbuf, msgbuf_size);;
}
/**
@@ -1350,8 +1490,7 @@
//TODO DOXIGEN
static void
-finish_sending(void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
+finish_sending(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
struct Finish_send * finish = cls;
struct Plugin * plugin;
@@ -1366,19 +1505,17 @@
GNUNET_free (finish);
return;
}
- bytes = GNUNET_DISK_file_write (plugin->server_stdin_handle,
- finish->msgheader,
- finish->size);
+ bytes = GNUNET_DISK_file_write(plugin->server_stdin_handle,
+ finish->msgheader, finish->size);
GNUNET_assert (bytes != GNUNET_SYSERR);
if (bytes != finish->size)
{
finish->msgheader = finish->msgheader + bytes;
finish->size = finish->size - bytes;
- plugin->server_write_task
- = GNUNET_SCHEDULER_add_write_file(GNUNET_TIME_UNIT_FOREVER_REL,
- plugin->server_stdin_handle,
- &finish_sending, finish);
+ plugin->server_write_task = GNUNET_SCHEDULER_add_write_file(
+ GNUNET_TIME_UNIT_FOREVER_REL, plugin->server_stdin_handle,
+ &finish_sending, finish);
}
else
{
@@ -1508,6 +1645,7 @@
ieeewlanheader = (struct ieee80211_frame *) &radioHeader[1];
getWlanHeader(ieeewlanheader, &(fm->session->addr), plugin, size);
+
//could be faster if content is just send and not copyed before
//fragmentheader is needed
fragheader.message_crc = htons(getcrc16(copystart, copysize));
@@ -1710,8 +1848,12 @@
wlanheader->header.size = htons(msgbuf_size + sizeof(struct WlanHeader));
wlanheader->header.type = htons(GNUNET_MESSAGE_TYPE_WLAN_DATA);
memcpy(&(wlanheader->target), target, sizeof(struct GNUNET_PeerIdentity));
- wlanheader->crc = htonl(getcrc32(msgbuf, msgbuf_size));
+ wlanheader->crc = 0;
memcpy(&wlanheader[1], msgbuf, msgbuf_size);
+ wlanheader->crc = htonl(getcrc32((char*) wlanheader, msgbuf_size +
sizeof(struct WlanHeader)));
+ //GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Wlan message Header crc: %u,
%u\n",getcrc32((char*) wlanheader, msgbuf_size + sizeof(struct WlanHeader)),
wlanheader->crc);
+ //hexdump(newmsg->msg, msgbuf_size + sizeof(struct WlanHeader));
+
newmsg->transmit_cont = cont;
newmsg->transmit_cont_cls = cont_cls;
newmsg->timeout = GNUNET_TIME_relative_to_absolute(timeout);
@@ -1813,6 +1955,7 @@
struct Session_id_fragment_triple triple;
triple.session = session;
triple.message_id = message_id;
+ triple.fm = NULL;
GNUNET_CONTAINER_heap_iterate(plugin->pending_Fragment_Messages,
&search_fragment_message_from_session_and_id, &triple);
return triple.fm;
@@ -1914,8 +2057,8 @@
{
plugin->pendingsessions--;
GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions_head,
- plugin->pending_Sessions_tail,
- pendingsession);
+ plugin->pending_Sessions_tail,
+ pendingsession);
GNUNET_free(pendingsession);
GNUNET_assert (check == 0);
@@ -1954,9 +2097,9 @@
GNUNET_free(pm);
}
- GNUNET_CONTAINER_DLL_remove(plugin->sessions,
- plugin->sessions_tail,
- queue);
+ GNUNET_CONTAINER_DLL_remove(plugin->sessions,
+ plugin->sessions_tail,
+ queue);
GNUNET_free(queue->content);
GNUNET_free(queue);
plugin->session_count--;
@@ -2031,7 +2174,6 @@
asc(asc_cls, ret);
}
-
/**
* Function to test if fragment number already exists in the fragments received
*
@@ -2044,7 +2186,6 @@
struct FragmentationHeader * fh)
{
-
return testBit((char *) &rx_msg->received_fragments, ntohs(
fh->fragment_off_or_num));
@@ -2108,6 +2249,7 @@
const char * tempmsg;
const struct GNUNET_MessageHeader * temp_hdr;
struct GNUNET_PeerIdentity tmptarget;
+ int crc;
if (ntohs(hdr->type) == GNUNET_MESSAGE_TYPE_WLAN_DATA)
{
@@ -2136,13 +2278,14 @@
tempmsg = (char*) &wlanheader[1];
temp_hdr = (const struct GNUNET_MessageHeader *) &wlanheader[1];
-
- if (getcrc32(tempmsg, ntohs(wlanheader->header.size)) != ntohl(
- wlanheader->crc))
+ crc = ntohl(wlanheader->crc);
+ wlanheader->crc = 0;
+ if (getcrc32((char *) wlanheader, ntohs(wlanheader->header.size)) != crc)
{
//wrong crc, dispose message
GNUNET_log(GNUNET_ERROR_TYPE_INFO,
- "Wlan message Header crc was wrong\n");
+ "Wlan message Header crc was wrong: %u != %u\n",getcrc32((char
*) wlanheader, ntohs(wlanheader->header.size)), crc);
+ hexdump((void *)hdr, ntohs(hdr->size));
return;
}
@@ -2877,7 +3020,8 @@
static int
wlan_transport_start_wlan_helper(struct Plugin *plugin, int testmode)
{
- const char * filename = "gnunet-transport-wlan-helper";
+ const char * filenamehw = "gnunet-transport-wlan-helper";
+ const char * filenameloopback = "gnunet-transport-wlan-helper-dummy";
plugin->server_stdout = GNUNET_DISK_pipe(GNUNET_YES, GNUNET_NO, GNUNET_YES);
if (plugin->server_stdout == NULL)
return GNUNET_SYSERR;
@@ -2886,16 +3030,43 @@
if (plugin->server_stdin == NULL)
return GNUNET_SYSERR;
+
+ /* Start the server process */
+
+ if (testmode == 0)
+ {
+
#if DEBUG_wlan
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
- "Starting gnunet-wlan-helper process cmd: %s %s %i\n", filename,
+ "Starting gnunet-wlan-helper process cmd: %s %s %i\n", filenamehw,
plugin->interface, testmode);
#endif
- /* Start the server process */
- plugin->server_proc = GNUNET_OS_start_process(plugin->server_stdin,
- plugin->server_stdout, filename, filename, plugin->interface, ((testmode
- == 1) ? "1" : (testmode == 2) ? "2" : "0"), NULL);
+ plugin->server_proc = GNUNET_OS_start_process(plugin->server_stdin,
+ plugin->server_stdout, filenamehw, filenamehw, plugin->interface,
NULL);
+ }
+ else if (testmode == 1)
+ {
+
+#if DEBUG_wlan
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+ "Starting gnunet-wlan-helper loopback 1 process cmd: %s %s %i\n",
filenameloopback,
+ plugin->interface, testmode);
+#endif
+
+ plugin->server_proc = GNUNET_OS_start_process(plugin->server_stdin,
+ plugin->server_stdout, filenameloopback, filenameloopback, "1",
NULL);
+ }
+ else if (testmode == 2)
+ {
+#if DEBUG_wlan
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+ "Starting gnunet-wlan-helper loopback 2 process cmd: %s %s %i\n",
filenameloopback,
+ plugin->interface, testmode);
+#endif
+ plugin->server_proc = GNUNET_OS_start_process(plugin->server_stdin,
+ plugin->server_stdout, filenameloopback, filenameloopback, "2",
NULL);
+ }
if (plugin->server_proc == NULL)
{
#if DEBUG_wlan
@@ -2951,10 +3122,12 @@
#endif
- GNUNET_OS_process_close(plugin->server_proc);
GNUNET_DISK_pipe_close(plugin->server_stdout);
GNUNET_DISK_pipe_close(plugin->server_stdin);
+ GNUNET_OS_process_kill(plugin->server_proc,9);
+ GNUNET_OS_process_close(plugin->server_proc);
+
GNUNET_assert (cls !=NULL);
//free sessions
while (queue != NULL)
@@ -2980,7 +3153,6 @@
plugin->server_read_task = GNUNET_SCHEDULER_NO_TASK;
}
-
if (plugin->suid_tokenizer != NULL)
GNUNET_SERVER_mst_destroy(plugin->suid_tokenizer);
@@ -3051,7 +3223,6 @@
api->address_pretty_printer = &wlan_plugin_address_pretty_printer;
api->check_address = &wlan_plugin_address_suggested;
api->address_to_string = &wlan_plugin_address_to_string;
-
//read config
if (GNUNET_CONFIGURATION_have_value(env->cfg, "transport-wlan", "TESTMODE"))
Modified: gnunet/src/transport/test_plugin_transport_wlan_dummy.c
===================================================================
--- gnunet/src/transport/test_plugin_transport_wlan_dummy.c 2011-05-23
16:26:40 UTC (rev 15279)
+++ gnunet/src/transport/test_plugin_transport_wlan_dummy.c 2011-05-23
23:14:47 UTC (rev 15280)
@@ -19,241 +19,447 @@
*/
/**
* @file transport/test_transport_wlan_dummy.c
- * @brief helper for the testcase for plugin_transport_wlan.c
+ * @brief helper for the testcases for plugin_transport_wlan.c
* @author David Brodski
*/
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <errno.h>
+#include <resolv.h>
+#include <string.h>
+#include <utime.h>
+#include <unistd.h>
+#include <getopt.h>
+
#include "platform.h"
#include "gnunet_constants.h"
#include "gnunet_os_lib.h"
#include "gnunet_transport_plugin.h"
#include "transport.h"
+#include "gnunet_util_lib.h"
#include "plugin_transport_wlan.h"
#include "gnunet_common.h"
#include "gnunet-transport-wlan-helper.h"
+#include "gnunet_crypto_lib.h"
+#include "wlan/loopback_helper.h"
+#include "wlan/helper_common.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
+int first;
-#define FIFO_FILE1 "MYFIFOin"
-#define FIFO_FILE2 "MYFIFOout"
-#define MAXLINE 5000
+static void
+sigfunc(int sig)
+{
+ closeprog = 1;
+ unlink(FIFO_FILE1);
+ unlink(FIFO_FILE2);
+}
-int closeprog = 0;
+static void
+stdin_send(void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
+{
+ struct sendbuf *write_pout = cls;
+ int sendsize;
+ struct GNUNET_MessageHeader newheader;
+ unsigned char * from_data;
+ unsigned char * to_data;
+ //unsigned char * from_radiotap;
+ unsigned char * to_radiotap;
+ //unsigned char * from_start;
+ unsigned char * to_start;
-void sigfunc(int sig)
+ sendsize = ntohs(hdr->size) - sizeof(struct Radiotap_Send)
+ + sizeof(struct Radiotap_rx);
+
+ if (GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA != ntohs(hdr->type))
+ {
+ fprintf(stderr, "Function stdin_send: wrong packet type\n");
+ exit(1);
+ }
+ if ((sendsize + write_pout->size) > MAXLINE * 2)
+ {
+ fprintf(stderr, "Function stdin_send: Packet too big for buffer\n");
+ exit(1);
+ }
+
+ newheader.size = htons(sendsize);
+ newheader.type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
+
+ to_start = write_pout->buf + write_pout->size;
+ to_radiotap = to_start + sizeof(struct GNUNET_MessageHeader);
+ to_data = to_radiotap + sizeof(struct Radiotap_rx);
+
+ from_data = ((unsigned char *) hdr) + sizeof(struct Radiotap_Send)
+ + sizeof(struct GNUNET_MessageHeader);
+
+ memcpy(to_start, &newheader, sizeof(struct GNUNET_MessageHeader));
+ write_pout->size += sizeof(struct GNUNET_MessageHeader);
+
+ write_pout->size += sizeof(struct Radiotap_rx);
+
+ memcpy(to_data, from_data, ntohs(hdr->size) - sizeof(struct Radiotap_Send)
+ - sizeof(struct GNUNET_MessageHeader));
+ write_pout->size += ntohs(hdr->size) - sizeof(struct Radiotap_Send)
+ - sizeof(struct GNUNET_MessageHeader);
+}
+
+static void
+file_in_send(void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
{
+ struct sendbuf * write_std = cls;
+ uint16_t sendsize;
- if(sig != SIGINT || sig != SIGTERM || sig != SIGKILL)
- return;
- else
- {
- closeprog = 1;
- exit(0);
- }
+ sendsize = ntohs(hdr->size);
+
+ if (GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA != ntohs(hdr->type))
+ {
+ fprintf(stderr, "Function file_in_send: wrong packet type\n");
+ exit(1);
+ }
+ if ((sendsize + write_std->size) > MAXLINE * 2)
+ {
+ fprintf(stderr, "Function file_in_send: Packet too big for buffer\n");
+ exit(1);
+ }
+
+ memcpy(write_std->buf + write_std->size, hdr, sendsize);
+ write_std->size += sendsize;
}
+int closeprog;
-
int
-main(int argc, char *argv[])
+testmode(int argc, char *argv[])
{
struct stat st;
- struct stat st2;
int erg;
- int first;
- FILE *fpin;
- FILE *fpout;
- pid_t pid;
- perror("Test");
+ FILE *fpin = NULL;
+ FILE *fpout = NULL;
+ int fdpin;
+ int fdpout;
//make the fifos if needed
- if (stat(FIFO_FILE1, &st) != 0)
+ if (0 != stat(FIFO_FILE1, &st))
{
- if (stat(FIFO_FILE2, &st2) == 0)
+ if (0 == stat(FIFO_FILE2, &st))
{
- perror("FIFO 2 exists, but FIFO 1 not, blub");
+ fprintf(stderr, "FIFO_FILE2 exists, but FIFO_FILE1 not\n");
exit(1);
}
- first = 1;
- perror("First");
+
umask(0);
- erg = mknod(FIFO_FILE1, S_IFIFO | 0666, 0);
+ //unlink(FIFO_FILE1);
+ //unlink(FIFO_FILE2);
+ // FIXME: use mkfifo!
+ erg = mknod(FIFO_FILE1, S_IFIFO | 0666, 0);
+ if (0 != erg)
+ {
+ fprintf(stderr, "Error at mknode1 \n");
+ //exit(1);
+ }
erg = mknod(FIFO_FILE2, S_IFIFO | 0666, 0);
+ if (0 != erg)
+ {
+ fprintf(stderr, "Error at mknode2 \n");
+ //exit(1);
+ }
- if ((fpin = fopen(FIFO_FILE1, "r")) == NULL)
+ }
+ else
+ {
+
+ if (0 != stat(FIFO_FILE2, &st))
{
- perror("fopen");
+ fprintf(stderr, "FIFO_FILE1 exists, but FIFO_FILE2 not\n");
exit(1);
}
- if ((fpout = fopen(FIFO_FILE2, "w")) == NULL)
+
+ }
+
+ if (strstr(argv[1], "1"))
+ {
+ //fprintf(stderr, "First\n");
+ first = 1;
+ fpin = fopen(FIFO_FILE1, "r");
+ if (NULL == fpin)
{
- perror("fopen");
- exit(1);
+ fprintf(stderr, "fopen of read FIFO_FILE1\n");
+ goto end;
}
+ fpout = fopen(FIFO_FILE2, "w");
+ if (NULL == fpout)
+ {
+ fprintf(stderr, "fopen of write FIFO_FILE2\n");
+ goto end;
+ }
+
}
else
{
first = 0;
- perror("Second");
- if (stat(FIFO_FILE2, &st2) != 0)
+ //fprintf(stderr, "Second\n");
+ fpout = fopen(FIFO_FILE1, "w");
+ if (NULL == fpout)
{
- perror("FIFO 1 exists, but FIFO 2 not, mäh");
- exit(1);
+ fprintf(stderr, "fopen of write FIFO_FILE1\n");
+ goto end;
}
- if ((fpout = fopen(FIFO_FILE1, "w")) == NULL)
+ fpin = fopen(FIFO_FILE2, "r");
+ if (NULL == fpin)
{
- perror("fopen");
- exit(1);
+ fprintf(stderr, "fopen of read FIFO_FILE2\n");
+ goto end;
}
- if ((fpin = fopen(FIFO_FILE2, "r")) == NULL)
- {
- perror("fopen");
- exit(1);
- }
}
- // fork
+ fdpin = fileno(fpin);
+ GNUNET_assert(fpin >= 0);
- if ((pid = fork()) < 0)
+ if (fdpin >= FD_SETSIZE)
{
- perror("FORK ERROR");
+ fprintf(stderr, "File fdpin number too large (%d > %u)\n", fdpin,
+ (unsigned int) FD_SETSIZE);
+ goto end;
+ }
- //clean up
- if (first == 1)
- {
- unlink(FIFO_FILE1);
- unlink(FIFO_FILE2);
- }
- fclose(fpin);
- fclose(fpout);
- return -3;
- }
- else if (pid == 0) // CHILD PROCESS
+ fdpout = fileno(fpout);
+ GNUNET_assert(fdpout >= 0 );
+
+ if (fdpout >= FD_SETSIZE)
{
- perror("Child");
- signal(SIGINT, sigfunc);
- signal(SIGTERM, sigfunc);
- signal(SIGKILL, sigfunc);
- int rv = 0;
- int readc = 0;
- int pos = 0;
- char line[MAXLINE];
+ fprintf(stderr, "File fdpout number too large (%d > %u)\n", fdpout,
+ (unsigned int) FD_SETSIZE);
+ goto end;
- fd_set rfds;
- fd_set wfds;
- struct timeval tv;
- int retval;
+ }
+ signal(SIGINT, &sigfunc);
+ signal(SIGTERM, &sigfunc);
- tv.tv_sec = 5;
- tv.tv_usec = 0;
+ char readbuf[MAXLINE];
+ int readsize = 0;
+ struct sendbuf write_std;
+ write_std.size = 0;
+ write_std.pos = 0;
+ struct sendbuf write_pout;
+ write_pout.size = 0;
+ write_pout.pos = 0;
- FD_ZERO(&rfds);
- FD_SET(STDIN_FILENO, &rfds);
+ int ret = 0;
+ int maxfd = 0;
- FD_ZERO(&wfds);
- FD_SET(STDOUT_FILENO, &wfds);
+ fd_set rfds;
+ fd_set wfds;
+ struct timeval tv;
+ int retval;
- struct GNUNET_SERVER_MessageStreamTokenizer * stdin_mst;
- struct GNUNET_SERVER_MessageStreamTokenizer * file_in_mst;
+ struct GNUNET_SERVER_MessageStreamTokenizer * stdin_mst;
+ struct GNUNET_SERVER_MessageStreamTokenizer * file_in_mst;
- stdin_mst = GNUNET_SERVER_mst_create(&stdin_send, NULL);
- file_in_mst = GNUNET_SERVER_mst_create(&file_in_send, NULL);
+ stdin_mst = GNUNET_SERVER_mst_create(&stdin_send, &write_pout);
+ file_in_mst = GNUNET_SERVER_mst_create(&file_in_send, &write_std);
- while (closeprog == 0)
- {
- readc = 0;
+ //send mac first
+ struct MacAddress macaddr;
- while (readc < sizeof( struct RadiotapHeader) + sizeof(struct
GNUNET_MessageHeader)){
- if ((rv = read(STDIN_FILENO, line, MAXLINE)) < 0)
- {
- perror("READ ERROR FROM STDIN");
- }
- readc += rv;
- }
+ //Send random mac address
+ macaddr.mac[0] = 0x13;
+ macaddr.mac[1] = 0x22;
+ macaddr.mac[2] = 0x33;
+ macaddr.mac[3] = 0x44;
+ macaddr.mac[4] = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_STRONG, 256);
+ macaddr.mac[5] = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_NONCE, 256);
- pos = 0;
+ write_std.size = send_mac_to_plugin((char *) write_std.buf, macaddr.mac);
- //fwrite(&line[pos], 1, sizeof(struct GNUNET_MessageHeader), fpout);
+ while (0 == closeprog)
+ {
- //pos += sizeof(struct GNUNET_MessageHeader);
+ maxfd = 0;
- //do not send radiotap header
- pos += sizeof( struct RadiotapHeader);
+ //set timeout
+ tv.tv_sec = 5;
+ tv.tv_usec = 0;
- while (pos < readc)
- {
- pos += fwrite(&line[pos], 1, readc - pos, fpout);
- }
+ FD_ZERO(&rfds);
+ // if output queue is empty
+ if (0 == write_pout.size)
+ {
+ FD_SET(STDIN_FILENO, &rfds);
+
}
+ if (0 == write_std.size)
+ {
+ FD_SET(fdpin, &rfds);
+ maxfd = fdpin;
+ }
+ FD_ZERO(&wfds);
+ // if there is something to write
+ if (0 < write_std.size)
+ {
+ FD_SET(STDOUT_FILENO, &wfds);
+ maxfd = MAX(maxfd, STDOUT_FILENO);
+ }
+ if (0 < write_pout.size)
+ {
+ FD_SET(fdpout, &wfds);
+ maxfd = MAX(maxfd, fdpout);
+ }
- //clean up
- fclose(fpout);
- }
- else // PARENT PROCESS
- {
- perror("Parent");
- signal(SIGINT, sigfunc);
- signal(SIGTERM, sigfunc);
- signal(SIGKILL, sigfunc);
- int rv = 0;
- ssize_t pos = 0;
- char line[MAXLINE];
- struct Wlan_Helper_Control_Message macmsg;
+ retval = select(maxfd + 1, &rfds, &wfds, NULL, &tv);
+ if (-1 == retval && EINTR == errno)
+ {
+ continue;
+ }
+ if (0 > retval)
+ {
+ fprintf(stderr, "select failed: %s\n", strerror(errno));
+ closeprog = 1;
+ break;
+ }
- //Send random mac address
- macmsg.mac.mac[0] = 0x13;
- macmsg.mac.mac[1] = 0x22;
- macmsg.mac.mac[2] = 0x33;
- macmsg.mac.mac[3] = 0x44;
- macmsg.mac.mac[4] = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK,
255);
- macmsg.mac.mac[5] = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK,
255);
- macmsg.hdr.size = sizeof(struct Wlan_Helper_Control_Message);
+ if (FD_ISSET(STDOUT_FILENO, &wfds))
+ {
+ ret = write(STDOUT_FILENO, write_std.buf + write_std.pos,
+ write_std.size - write_std.pos);
- pos = 0;
- /*
- while (pos < sizeof(struct Wlan_Helper_Control_Message))
+ if (0 > ret)
+ {
+ closeprog = 1;
+ fprintf(stderr, "Write ERROR to STDOUT\n");
+ break;
+ }
+ else
+ {
+ write_std.pos += ret;
+ // check if finished
+ if (write_std.pos == write_std.size)
+ {
+ write_std.pos = 0;
+ write_std.size = 0;
+ }
+ }
+ }
+
+ if (FD_ISSET(fdpout, &wfds))
{
- pos += write(STDOUT_FILENO, &macmsg + pos, sizeof(struct
Wlan_Helper_Control_Message) - pos);
+ ret = write(fdpout, write_pout.buf + write_pout.pos, write_pout.size
+ - write_pout.pos);
+
+ if (0 > ret)
+ {
+ closeprog = 1;
+ fprintf(stderr, "Write ERROR to fdpout\n");
+ }
+ else
+ {
+ write_pout.pos += ret;
+ // check if finished
+ if (write_pout.pos == write_pout.size)
+ {
+ write_pout.pos = 0;
+ write_pout.size = 0;
+ }
+ }
}
- */
- while (closeprog == 0)
+
+ if (FD_ISSET(STDIN_FILENO, &rfds))
{
- if ((rv = fread(line, 1, MAXLINE, fpin)) < 0)
+ readsize = read(STDIN_FILENO, readbuf, sizeof(readbuf));
+
+ if (0 > readsize)
{
- perror("READ ERROR FROM fpin");
+ closeprog = 1;
+ fprintf(stderr, "Read ERROR to STDIN_FILENO\n");
}
+ else if (0 < readsize)
+ {
+ GNUNET_SERVER_mst_receive(stdin_mst, NULL, readbuf, readsize,
+ GNUNET_NO, GNUNET_NO);
- pos = 0;
- while (pos < rv)
+ }
+ else
{
- pos += write(STDOUT_FILENO, &line[pos], rv - pos);
+ //eof
+ closeprog = 1;
}
}
+ if (FD_ISSET(fdpin, &rfds))
+ {
+ readsize = read(fdpin, readbuf, sizeof(readbuf));
- //clean up
- fclose(fpin);
+ if (0 > readsize)
+ {
+ closeprog = 1;
+ fprintf(stderr, "Read ERROR to fdpin: %s\n", strerror(errno));
+ break;
+ }
+ else if (0 < readsize)
+ {
+ GNUNET_SERVER_mst_receive(file_in_mst, NULL, readbuf, readsize,
+ GNUNET_NO, GNUNET_NO);
- if (first == 1)
- {
- unlink(FIFO_FILE1);
- unlink(FIFO_FILE2);
+ }
+ else
+ {
+ //eof
+ closeprog = 1;
+ }
}
+
}
- // Write the input to the output
+ //clean up
+ GNUNET_SERVER_mst_destroy(stdin_mst);
+ GNUNET_SERVER_mst_destroy(file_in_mst);
+
+ end: if (fpout != NULL)
+ fclose(fpout);
+ if (fpin != NULL)
+ fclose(fpin);
+
+ if (1 == first)
+ {
+ unlink(FIFO_FILE1);
+ unlink(FIFO_FILE2);
+ }
+
return (0);
}
+int
+main(int argc, char *argv[])
+{
+ if (2 != argc)
+ {
+ fprintf (stderr,
+ "This program must be started with the operating mode as
argument.\n");
+ fprintf (stderr,
+ "Usage: options\n"
+ "options:\n"
+ "1 = first loopback file\n"
+ "2 = second loopback file\n"
+ "\n");
+ return 1;
+ }
+ if (strstr(argv[1], "1") || strstr(argv[1], "2"))
+ return testmode(argc, argv);
+ return 1;
+}
Modified: gnunet/src/transport/test_transport_api_unreliability.c
===================================================================
--- gnunet/src/transport/test_transport_api_unreliability.c 2011-05-23
16:26:40 UTC (rev 15279)
+++ gnunet/src/transport/test_transport_api_unreliability.c 2011-05-23
23:14:47 UTC (rev 15280)
@@ -88,6 +88,8 @@
static int is_unix;
+static int is_wlan;
+
static int connected;
static unsigned long long total_bytes;
@@ -779,6 +781,11 @@
setup_peer (&p1, "test_transport_api_tcp_nat_peer1.conf");
setup_peer (&p2, "test_transport_api_tcp_nat_peer2.conf");
}
+ else if (is_wlan)
+ {
+ setup_peer (&p1, "test_transport_api_wlan_peer1.conf");
+ setup_peer (&p2, "test_transport_api_wlan_peer2.conf");
+ }
else
GNUNET_assert (0);
GNUNET_assert(p1.th != NULL);
@@ -904,6 +911,10 @@
is_unix = GNUNET_YES;
GNUNET_asprintf(&test_name, "unix");
}
+ else if (strstr(argv[0], "wlan") != NULL)
+ {
+ is_wlan = GNUNET_YES;
+ }
GNUNET_log_setup ("test-transport-api-reliability",
#if VERBOSE
"DEBUG",
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r15280 - gnunet/src/transport,
gnunet <=