#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/types.h>
+#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/stat.h>
"1 = first loopback file\n"
"2 = second loopback file\n"
"\n");
- exit(1);
}
static unsigned long
linux_read(struct Hardware_Infos * dev, unsigned char *buf, int count,
struct Radiotap_rx * ri)
{
- unsigned char tmpbuf[4096];
+ unsigned char tmpbuf[4096 * 4];
int caplen, n, got_signal, got_noise, got_channel, fcs_removed;
static int
linux_write(struct Hardware_Infos * dev, unsigned char *buf, unsigned int count)
{
- int ret, usedrtap = 0;
- unsigned short int *p_rtlen;
+ int ret;
+ //int usedrtap;
+ //unsigned short int *p_rtlen;
- unsigned char * u8aRadiotap = buf;
+ //unsigned char * u8aRadiotap = buf;
/* Pointer to the radiotap header length field for later use. */
- p_rtlen = (unsigned short int*) (u8aRadiotap + 2);
- usedrtap = 0;
+ //p_rtlen = (unsigned short int*) (u8aRadiotap + 2);
+ //usedrtap = 0;
ret = write(dev->fd_out, buf, count);
if (ret < 0)
}
/* radiotap header length is stored little endian on all systems */
- if (usedrtap)
- ret -= letoh16(*p_rtlen);
+ /*if (usedrtap)
+ ret -= letoh16(*p_rtlen);
- if (ret < 0)
- {
- if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS || errno
- == ENOMEM)
- {
- usleep(10000);
- return (0);
- }
+ if (ret < 0)
+ {
+ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS || errno
+ == ENOMEM)
+ {
+ usleep(10000);
+ return (0);
+ }
- perror("write failed");
- return (-1);
- }
+ perror("write failed");
+ return (-1);
+ }*/
return (ret);
}
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
- switch (dev->drivertype)
- {
- default:
- sll.sll_protocol = htons(ETH_P_ALL);
- break;
- }
+ sll.sll_protocol = htons(ETH_P_ALL);
/* lookup the hardware type */
u8aIeeeHeader = (struct ieee80211_frame *) buf;
if (0 == memcmp(u8aIeeeHeader->i_addr3, &mac_bssid, 6))
{
- if (0 == memcmp(u8aIeeeHeader->i_addr2, dev->pl_mac, 6))
+ if (0 == memcmp(u8aIeeeHeader->i_addr1, dev->pl_mac, 6))
{
return 0;
}
- if (0 == memcmp(u8aIeeeHeader->i_addr2, &bc_all_mac, 6))
+ if (0 == memcmp(u8aIeeeHeader->i_addr1, &bc_all_mac, 6))
{
return 0;
}
struct ieee80211_frame * u8aIeeeHeader;
u8aIeeeHeader = (struct ieee80211_frame *) buf;
- u8aIeeeHeader->i_fc[0] = 0x80;
+ u8aIeeeHeader->i_fc[0] = 0x08;
u8aIeeeHeader->i_fc[1] = 0x00;
memcpy(u8aIeeeHeader->i_addr2, dev->pl_mac, 6);
exit(1);
}
- if (sendsize < sizeof(struct ieee80211_frame) + sizeof(struct WlanHeader)
- + sizeof(struct FragmentationHeader)
+ if (sendsize < sizeof(struct ieee80211_frame)
+ sizeof(struct GNUNET_MessageHeader))
{
fprintf(stderr, "Function stdin_send: packet too small\n");
case DT_MAC80211_RT:
memcpy(write_pout->buf, u8aRadiotap, sizeof(u8aRadiotap));
- memcpy(write_pout->buf + sizeof(u8aRadiotap), write_pout->buf
- + sizeof(struct Radiotap_Send) + sizeof(struct GNUNET_MessageHeader),
- sendsize);
+ memcpy(write_pout->buf + sizeof(u8aRadiotap), &header[1], sendsize);
wlanheader = write_pout->buf + sizeof(u8aRadiotap);
mac_set(wlanheader, dev);
hardwaremode(int argc, char *argv[])
{
+ uid_t uid;
struct Hardware_Infos dev;
- struct ifreq ifreq;
+ //struct ifreq ifreq;
struct Radiotap_rx * rxinfo;
uint8_t * mac = dev.pl_mac;
int fdpin, fdpout;
+ struct GNUNET_MessageHeader * header;
+
signal(SIGINT, &sigfunc_hw);
signal(SIGTERM, &sigfunc_hw);
return 1;
}
- printf("Device %s -> Ethernet %02x:%02x:%02x:%02x:%02x:%02x\n",
- ifreq.ifr_name, (int) mac[0], (int) mac[1], (int) mac[2], (int) mac[3],
- (int) mac[4], (int) mac[5]);
+ uid = getuid();
+ //if (0 != setresuid(uid, uid, uid))
+ //{
+ // fprintf(stderr, "Failed to setresuid: %s\n", strerror(errno));
+ /* not critical, continue anyway */
+ //}
+
+ /*printf("Device %s -> Ethernet %02x:%02x:%02x:%02x:%02x:%02x\n",
+ ifreq.ifr_name, (int) mac[0], (int) mac[1], (int) mac[2], (int) mac[3],
+ (int) mac[4], (int) mac[5]);*/
//return 0;
while (0 == closeprog)
{
- write_pout.size = maketest(write_pout.buf, &dev);
- tv.tv_sec = 2;
- tv.tv_usec = 0;
- select(0, NULL, NULL, NULL, &tv);
+ //write_pout.size = maketest(write_pout.buf, &dev);
+ //tv.tv_sec = 2;
+ //tv.tv_usec = 0;
+ //select(0, NULL, NULL, NULL, &tv);
maxfd = 0;
}
if (0 == write_std.size)
{
- //FD_SET(fdpin, &rfds);
- //maxfd = fdpin;
+ FD_SET(fdpin, &rfds);
+ maxfd = fdpin;
}
FD_ZERO(&wfds);
// if there is something to write
if (FD_ISSET(fdpin, &rfds))
{
- rxinfo = (struct Radiotap_rx *) (write_pout.buf
+ rxinfo = (struct Radiotap_rx *) (write_std.buf
+ sizeof(struct GNUNET_MessageHeader));
- datastart = (unsigned char *) readbuf + sizeof(struct Radiotap_rx)
+ datastart = (unsigned char *) write_std.buf
+ + sizeof(struct Radiotap_rx)
+ sizeof(struct GNUNET_MessageHeader);
- readsize = linux_read(&dev, datastart, sizeof(readbuf)
+ readsize = linux_read(&dev, datastart, sizeof(write_std.buf)
- sizeof(struct Radiotap_rx)
- sizeof(struct GNUNET_MessageHeader), rxinfo);
if (1 == mac_test(datastart, &dev))
{
// mac wrong
- write_pout.pos = 0;
- write_pout.size = 0;
+ write_std.pos = 0;
+ write_std.size = 0;
+ }
+ else
+ {
+ header = (struct GNUNET_MessageHeader *) write_std.buf;
+ write_std.size = readsize
+ + sizeof(struct GNUNET_MessageHeader)
+ + sizeof(struct Radiotap_rx);
+ header->size = htons(write_std.size);
+ header->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
+ fprintf(stderr, "Got packet with size: %u, size std %u\n",
+ readsize, write_std.size);
+
}
}
else
int
main(int argc, char *argv[])
{
+ int ret = 0;
if (3 != argc)
{
fprintf(
if (strstr(argv[2], "1") || strstr(argv[2], "2"))
{
- return testmode(argc, argv);
+ ret = testmode(argc, argv);
}
else
{
- return hardwaremode(argc, argv);
+
+ ret = hardwaremode(argc, argv);
}
#if 0
}
#endif
- return (0);
+
+ return ret;
+ maketest(NULL, NULL);
}
#define HALLO_BEACON_SCALING_FACTOR 900
-#define DEBUG_wlan GNUNET_NO
+#define DEBUG_wlan GNUNET_YES
#define DEBUG_wlan_retransmission GNUNET_NO
#define MESSAGE_LENGHT_UNKNOWN -1
}
//TODO doxigen
-static struct GNUNET_TIME_Relative
-get_next_frag_timeout(struct FragmentMessage * fm)
-{
- return GNUNET_TIME_relative_min(GNUNET_TIME_absolute_get_remaining(
- fm->next_ack), GNUNET_TIME_absolute_get_remaining(fm->timeout));
-}
+/*
+ static struct GNUNET_TIME_Relative
+ get_next_frag_timeout(struct FragmentMessage * fm)
+ {
+ return GNUNET_TIME_relative_min(GNUNET_TIME_absolute_get_remaining(
+ fm->next_ack), GNUNET_TIME_absolute_get_remaining(fm->timeout));
+ }
+ */
//TODO doxigen
/**
set_next_send(struct Plugin * const plugin)
{
struct FragmentMessage * fm;
- struct GNUNET_TIME_Relative next_send = GNUNET_TIME_UNIT_FOREVER_REL;
+ struct GNUNET_TIME_Relative next_send;
+ struct GNUNET_TIME_Absolute next_send_tmp;
//cancel old task
if (plugin->server_write_delay_task != GNUNET_SCHEDULER_NO_TASK)
next_send = GNUNET_TIME_absolute_get_remaining(plugin->beacon_time);
if (fm != NULL)
{
- if (GNUNET_CONTAINER_node_get_cost(fm->node) != 0)
- {
- next_send = GNUNET_TIME_relative_min(next_send,
- get_next_frag_timeout(fm));
- }
- else
- {
- next_send = GNUNET_TIME_UNIT_ZERO;
- }
+ next_send_tmp.abs_value = GNUNET_CONTAINER_heap_node_get_cost(
+ fm->node);
+ next_send = GNUNET_TIME_relative_min(next_send,
+ GNUNET_TIME_absolute_get_remaining(next_send_tmp));
+
}
}
struct Sessionqueue * sessionqueue_alt;
struct PendingMessage * pm;
sessionqueue = plugin->pending_Sessions;
+
while (sessionqueue != NULL)
{
session = sessionqueue->content;
+ GNUNET_assert(session != NULL);
pm = session->pending_message;
#if DEBUG_wlan
session);
}
#endif
+
GNUNET_assert(pm != NULL);
//check for message timeout
fm->message_id_out = get_next_message_id();
fm->ack_bitfield = 0;
fm->node = GNUNET_CONTAINER_heap_insert(
- plugin->pending_Fragment_Messages, fm, 0);
+ plugin->pending_Fragment_Messages, fm,
+ GNUNET_TIME_absolute_get().abs_value);
+
+ GNUNET_assert(session !=NULL);
if (pm->transmit_cont != NULL)
{
free_fragment_message(plugin, fm);
-
-
check_fragment_queue(plugin);
}
*/
static int
getWlanHeader(struct ieee80211_frame * Header,
- const struct MacAddress * to_mac_addr, struct Plugin * plugin)
+ const struct MacAddress * to_mac_addr, struct Plugin * plugin,
+ unsigned int size)
{
- Header->i_fc[0] = 0x80;
+ uint16_t * tmp16;
+ const int rate = 11000000;
+
+ Header->i_fc[0] = 0x08;
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));
- memcpy(&Header->i_addr1, to_mac_addr, sizeof(plugin->mac_address));
+ memcpy(&Header->i_addr1, to_mac_addr, sizeof(struct MacAddress));
+
+ tmp16 = (uint16_t*) Header->i_dur;
+ *tmp16 = (uint16_t) htole16((size * 1000000) / rate + 290);
+
return GNUNET_YES;
}
radioHeader = (struct Radiotap_Send*) &msgheader[1];
getRadiotapHeader(plugin, NULL, radioHeader);
ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1];
- getWlanHeader(ieeewlanheader, &bc_all_mac, plugin);
+ getWlanHeader(ieeewlanheader, &bc_all_mac, plugin, size);
msgheader2 = (struct GNUNET_MessageHeader*) &ieeewlanheader[1];
msgheader2->size = htons(GNUNET_HELLO_size(*(plugin->env->our_hello))
radioHeader = (struct Radiotap_Send*) &msgheader[1];
getRadiotapHeader(plugin, ack->session, radioHeader);
ieeewlanheader = (struct ieee80211_frame*) &radioHeader[1];
- getWlanHeader(ieeewlanheader, &ack->session->addr, plugin);
+ getWlanHeader(ieeewlanheader, &ack->session->addr, plugin, size);
msgheader2 = (struct FragmentationAckHeader*) &ieeewlanheader[1];
msgheader2->header.size = htons(sizeof(struct FragmentationAckHeader));
getRadiotapHeader(plugin, session, radioHeader);
ieeewlanheader = (struct ieee80211_frame *) &radioHeader[1];
- getWlanHeader(ieeewlanheader, &fm->session->addr, plugin);
+ getWlanHeader(ieeewlanheader, &(fm->session->addr), plugin, size);
//could be faster if content is just send and not copyed before
//fragmentheader is needed
// if fragments have opimized timeouts
//sort_fragment_into_queue(plugin,fm);
+
#if DEBUG_wlan_retransmission
GNUNET_log(
GNUNET_ERROR_TYPE_DEBUG,
fm->timeout));
#endif
}
+ else
+ {
+ GNUNET_CONTAINER_heap_update_cost(
+ plugin->pending_Fragment_Messages, fm->node,
+ GNUNET_TIME_absolute_get().abs_value);
+ }
if (bytes != size)
{
}
else
{
- GNUNET_assert(bytes == size);
GNUNET_free(msgheader);
set_next_send(plugin);
}
struct PendingMessage * pm;
struct Receive_Message_Queue * receive_queue;
struct Plugin_Session_pair pair;
+ int check = 0;
+
+ GNUNET_assert(queue != NULL);
//session found
//is this session pending for send
GNUNET_CONTAINER_DLL_remove (plugin->pending_Sessions,
plugin->pending_Sessions_tail, pendingsession);
GNUNET_free(pendingsession);
- break;
+
+ if (check == 1)
+ {
+ GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
+ "Session is more then once in pending session\n");
+ }
+
+ check = 1;
}
pendingsession = pendingsession->next;
}
GNUNET_free(pm);
}
- GNUNET_free(queue->content);
GNUNET_CONTAINER_DLL_remove(plugin->sessions, plugin->sessions_tail, queue);
+ GNUNET_free(queue->content);
GNUNET_free(queue);
plugin->session_count--;
hdr->size), sizeof(struct ieee80211_frame)
+ sizeof(struct GNUNET_MessageHeader));
#endif
- GNUNET_break (0);
+ //GNUNET_break (0);
/* FIXME: restart SUID process */
return;
}
struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
struct Plugin *plugin = api->cls;
struct Sessionqueue * queue = plugin->sessions;
+ struct Sessionqueue * queue_next;
struct FragmentMessage * fm;
#if DEBUG_wlan
if (plugin->data_tokenizer != NULL)
GNUNET_SERVER_mst_destroy(plugin->data_tokenizer);
+ fm = (struct FragmentMessage *) GNUNET_CONTAINER_heap_peek(
+ plugin->pending_Fragment_Messages);
- fm = (struct FragmentMessage *) GNUNET_CONTAINER_heap_peek(plugin->pending_Fragment_Messages);
- while (fm != NULL){
- free_fragment_message(plugin, fm);
- fm = (struct FragmentMessage *) GNUNET_CONTAINER_heap_peek(plugin->pending_Fragment_Messages);
- }
+ while (fm != NULL)
+ {
+ free_fragment_message(plugin, fm);
+ fm = (struct FragmentMessage *) GNUNET_CONTAINER_heap_peek(
+ plugin->pending_Fragment_Messages);
+ }
//free sessions
while (queue != NULL)
{
+ queue_next = queue->next;
free_session(plugin, queue);
+ queue = queue_next;
+
}
GNUNET_free_non_null(plugin->interface);
AUTOSTART = NO
[transport-wlan]
-INTERFACE = wlan0
-TESTMODE = 1
+INTERFACE = mon0
+TESTMODE = 0
#PREFIX = gdbserver :2345
[hostlist]
UNIXPATH = /tmp/gnunet-p1-service-transport.sock
#PREFIX = xterm -T transport2 -e gdb --command=cmd --args
#PREFIX = valgrind --leak-check=full --show-reachable=yes --main-stacksize=104857600
+#PREFIX = valgrind --leak-check=full --show-reachable=yes
#PREFIX = valgrind --leak-check=full
#PREFIX = valgrind --tool=massif
#PREFIX = gdbserver :2345
AUTOSTART = NO
[transport-wlan]
-INTERFACE = wlan1
-TESTMODE = 2
+INTERFACE = mon1
+TESTMODE = 0
#PREFIX = gdbserver :2346
[hostlist]
UNIXPATH = /tmp/gnunet-p2-service-transport.sock
#PREFIX = xterm -T transport1 -e gdb --command=cmd --args
#PREFIX = valgrind --leak-check=full --show-reachable=yes --main-stacksize=104857600
+#PREFIX = valgrind --leak-check=full --show-reachable=yes
#PREFIX = valgrind --leak-check=full
#PREFIX = valgrind --tool=massif
#PREFIX = gdbserver :2346