aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-transport-wlan-helper.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/gnunet-transport-wlan-helper.c
parent80886220c43050805947be8027e05cf6fd1b4832 (diff)
downloadgnunet-10e27ef7411f47f290887a9cfe040cc171d1dff3.tar.gz
gnunet-10e27ef7411f47f290887a9cfe040cc171d1dff3.zip
Cleanup and working version with hardware
Diffstat (limited to 'src/transport/gnunet-transport-wlan-helper.c')
-rw-r--r--src/transport/gnunet-transport-wlan-helper.c124
1 files changed, 72 insertions, 52 deletions
diff --git a/src/transport/gnunet-transport-wlan-helper.c b/src/transport/gnunet-transport-wlan-helper.c
index aaa34284d..2cb14b4c6 100644
--- a/src/transport/gnunet-transport-wlan-helper.c
+++ b/src/transport/gnunet-transport-wlan-helper.c
@@ -31,6 +31,7 @@
31#include <sys/socket.h> 31#include <sys/socket.h>
32#include <sys/ioctl.h> 32#include <sys/ioctl.h>
33#include <sys/types.h> 33#include <sys/types.h>
34#include <unistd.h>
34#include <sys/wait.h> 35#include <sys/wait.h>
35#include <sys/time.h> 36#include <sys/time.h>
36#include <sys/stat.h> 37#include <sys/stat.h>
@@ -259,7 +260,6 @@ usage()
259 "1 = first loopback file\n" 260 "1 = first loopback file\n"
260 "2 = second loopback file\n" 261 "2 = second loopback file\n"
261 "\n"); 262 "\n");
262 exit(1);
263} 263}
264 264
265static unsigned long 265static unsigned long
@@ -412,7 +412,7 @@ static int
412linux_read(struct Hardware_Infos * dev, unsigned char *buf, int count, 412linux_read(struct Hardware_Infos * dev, unsigned char *buf, int count,
413 struct Radiotap_rx * ri) 413 struct Radiotap_rx * ri)
414{ 414{
415 unsigned char tmpbuf[4096]; 415 unsigned char tmpbuf[4096 * 4];
416 416
417 int caplen, n, got_signal, got_noise, got_channel, fcs_removed; 417 int caplen, n, got_signal, got_noise, got_channel, fcs_removed;
418 418
@@ -604,14 +604,15 @@ linux_read(struct Hardware_Infos * dev, unsigned char *buf, int count,
604static int 604static int
605linux_write(struct Hardware_Infos * dev, unsigned char *buf, unsigned int count) 605linux_write(struct Hardware_Infos * dev, unsigned char *buf, unsigned int count)
606{ 606{
607 int ret, usedrtap = 0; 607 int ret;
608 unsigned short int *p_rtlen; 608 //int usedrtap;
609 //unsigned short int *p_rtlen;
609 610
610 unsigned char * u8aRadiotap = buf; 611 //unsigned char * u8aRadiotap = buf;
611 612
612 /* Pointer to the radiotap header length field for later use. */ 613 /* Pointer to the radiotap header length field for later use. */
613 p_rtlen = (unsigned short int*) (u8aRadiotap + 2); 614 //p_rtlen = (unsigned short int*) (u8aRadiotap + 2);
614 usedrtap = 0; 615 //usedrtap = 0;
615 ret = write(dev->fd_out, buf, count); 616 ret = write(dev->fd_out, buf, count);
616 617
617 if (ret < 0) 618 if (ret < 0)
@@ -628,21 +629,21 @@ linux_write(struct Hardware_Infos * dev, unsigned char *buf, unsigned int count)
628 } 629 }
629 630
630 /* radiotap header length is stored little endian on all systems */ 631 /* radiotap header length is stored little endian on all systems */
631 if (usedrtap) 632 /*if (usedrtap)
632 ret -= letoh16(*p_rtlen); 633 ret -= letoh16(*p_rtlen);
633 634
634 if (ret < 0) 635 if (ret < 0)
635 { 636 {
636 if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS || errno 637 if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS || errno
637 == ENOMEM) 638 == ENOMEM)
638 { 639 {
639 usleep(10000); 640 usleep(10000);
640 return (0); 641 return (0);
641 } 642 }
642 643
643 perror("write failed"); 644 perror("write failed");
644 return (-1); 645 return (-1);
645 } 646 }*/
646 647
647 return (ret); 648 return (ret);
648} 649}
@@ -672,12 +673,7 @@ openraw(struct Hardware_Infos * dev, char * iface, int fd, int * arptype,
672 sll.sll_family = AF_PACKET; 673 sll.sll_family = AF_PACKET;
673 sll.sll_ifindex = ifr.ifr_ifindex; 674 sll.sll_ifindex = ifr.ifr_ifindex;
674 675
675 switch (dev->drivertype) 676 sll.sll_protocol = htons(ETH_P_ALL);
676 {
677 default:
678 sll.sll_protocol = htons(ETH_P_ALL);
679 break;
680 }
681 677
682 /* lookup the hardware type */ 678 /* lookup the hardware type */
683 679
@@ -886,12 +882,12 @@ mac_test(unsigned char * buf, struct Hardware_Infos * dev)
886 u8aIeeeHeader = (struct ieee80211_frame *) buf; 882 u8aIeeeHeader = (struct ieee80211_frame *) buf;
887 if (0 == memcmp(u8aIeeeHeader->i_addr3, &mac_bssid, 6)) 883 if (0 == memcmp(u8aIeeeHeader->i_addr3, &mac_bssid, 6))
888 { 884 {
889 if (0 == memcmp(u8aIeeeHeader->i_addr2, dev->pl_mac, 6)) 885 if (0 == memcmp(u8aIeeeHeader->i_addr1, dev->pl_mac, 6))
890 { 886 {
891 return 0; 887 return 0;
892 } 888 }
893 889
894 if (0 == memcmp(u8aIeeeHeader->i_addr2, &bc_all_mac, 6)) 890 if (0 == memcmp(u8aIeeeHeader->i_addr1, &bc_all_mac, 6))
895 { 891 {
896 return 0; 892 return 0;
897 } 893 }
@@ -912,7 +908,7 @@ mac_set(unsigned char * buf, struct Hardware_Infos * dev)
912 struct ieee80211_frame * u8aIeeeHeader; 908 struct ieee80211_frame * u8aIeeeHeader;
913 u8aIeeeHeader = (struct ieee80211_frame *) buf; 909 u8aIeeeHeader = (struct ieee80211_frame *) buf;
914 910
915 u8aIeeeHeader->i_fc[0] = 0x80; 911 u8aIeeeHeader->i_fc[0] = 0x08;
916 u8aIeeeHeader->i_fc[1] = 0x00; 912 u8aIeeeHeader->i_fc[1] = 0x00;
917 913
918 memcpy(u8aIeeeHeader->i_addr2, dev->pl_mac, 6); 914 memcpy(u8aIeeeHeader->i_addr2, dev->pl_mac, 6);
@@ -954,8 +950,7 @@ stdin_send_hw(void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
954 exit(1); 950 exit(1);
955 } 951 }
956 952
957 if (sendsize < sizeof(struct ieee80211_frame) + sizeof(struct WlanHeader) 953 if (sendsize < sizeof(struct ieee80211_frame)
958 + sizeof(struct FragmentationHeader)
959 + sizeof(struct GNUNET_MessageHeader)) 954 + sizeof(struct GNUNET_MessageHeader))
960 { 955 {
961 fprintf(stderr, "Function stdin_send: packet too small\n"); 956 fprintf(stderr, "Function stdin_send: packet too small\n");
@@ -970,9 +965,7 @@ stdin_send_hw(void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
970 965
971 case DT_MAC80211_RT: 966 case DT_MAC80211_RT:
972 memcpy(write_pout->buf, u8aRadiotap, sizeof(u8aRadiotap)); 967 memcpy(write_pout->buf, u8aRadiotap, sizeof(u8aRadiotap));
973 memcpy(write_pout->buf + sizeof(u8aRadiotap), write_pout->buf 968 memcpy(write_pout->buf + sizeof(u8aRadiotap), &header[1], sendsize);
974 + sizeof(struct Radiotap_Send) + sizeof(struct GNUNET_MessageHeader),
975 sendsize);
976 969
977 wlanheader = write_pout->buf + sizeof(u8aRadiotap); 970 wlanheader = write_pout->buf + sizeof(u8aRadiotap);
978 mac_set(wlanheader, dev); 971 mac_set(wlanheader, dev);
@@ -1067,12 +1060,15 @@ int
1067hardwaremode(int argc, char *argv[]) 1060hardwaremode(int argc, char *argv[])
1068{ 1061{
1069 1062
1063 uid_t uid;
1070 struct Hardware_Infos dev; 1064 struct Hardware_Infos dev;
1071 struct ifreq ifreq; 1065 //struct ifreq ifreq;
1072 struct Radiotap_rx * rxinfo; 1066 struct Radiotap_rx * rxinfo;
1073 uint8_t * mac = dev.pl_mac; 1067 uint8_t * mac = dev.pl_mac;
1074 int fdpin, fdpout; 1068 int fdpin, fdpout;
1075 1069
1070 struct GNUNET_MessageHeader * header;
1071
1076 signal(SIGINT, &sigfunc_hw); 1072 signal(SIGINT, &sigfunc_hw);
1077 signal(SIGTERM, &sigfunc_hw); 1073 signal(SIGTERM, &sigfunc_hw);
1078 1074
@@ -1081,9 +1077,16 @@ hardwaremode(int argc, char *argv[])
1081 return 1; 1077 return 1;
1082 } 1078 }
1083 1079
1084 printf("Device %s -> Ethernet %02x:%02x:%02x:%02x:%02x:%02x\n", 1080 uid = getuid();
1085 ifreq.ifr_name, (int) mac[0], (int) mac[1], (int) mac[2], (int) mac[3], 1081 //if (0 != setresuid(uid, uid, uid))
1086 (int) mac[4], (int) mac[5]); 1082 //{
1083 // fprintf(stderr, "Failed to setresuid: %s\n", strerror(errno));
1084 /* not critical, continue anyway */
1085 //}
1086
1087 /*printf("Device %s -> Ethernet %02x:%02x:%02x:%02x:%02x:%02x\n",
1088 ifreq.ifr_name, (int) mac[0], (int) mac[1], (int) mac[2], (int) mac[3],
1089 (int) mac[4], (int) mac[5]);*/
1087 1090
1088 //return 0; 1091 //return 0;
1089 1092
@@ -1127,10 +1130,10 @@ hardwaremode(int argc, char *argv[])
1127 while (0 == closeprog) 1130 while (0 == closeprog)
1128 { 1131 {
1129 1132
1130 write_pout.size = maketest(write_pout.buf, &dev); 1133 //write_pout.size = maketest(write_pout.buf, &dev);
1131 tv.tv_sec = 2; 1134 //tv.tv_sec = 2;
1132 tv.tv_usec = 0; 1135 //tv.tv_usec = 0;
1133 select(0, NULL, NULL, NULL, &tv); 1136 //select(0, NULL, NULL, NULL, &tv);
1134 1137
1135 maxfd = 0; 1138 maxfd = 0;
1136 1139
@@ -1147,8 +1150,8 @@ hardwaremode(int argc, char *argv[])
1147 } 1150 }
1148 if (0 == write_std.size) 1151 if (0 == write_std.size)
1149 { 1152 {
1150 //FD_SET(fdpin, &rfds); 1153 FD_SET(fdpin, &rfds);
1151 //maxfd = fdpin; 1154 maxfd = fdpin;
1152 } 1155 }
1153 FD_ZERO(&wfds); 1156 FD_ZERO(&wfds);
1154 // if there is something to write 1157 // if there is something to write
@@ -1253,12 +1256,13 @@ hardwaremode(int argc, char *argv[])
1253 1256
1254 if (FD_ISSET(fdpin, &rfds)) 1257 if (FD_ISSET(fdpin, &rfds))
1255 { 1258 {
1256 rxinfo = (struct Radiotap_rx *) (write_pout.buf 1259 rxinfo = (struct Radiotap_rx *) (write_std.buf
1257 + sizeof(struct GNUNET_MessageHeader)); 1260 + sizeof(struct GNUNET_MessageHeader));
1258 datastart = (unsigned char *) readbuf + sizeof(struct Radiotap_rx) 1261 datastart = (unsigned char *) write_std.buf
1262 + sizeof(struct Radiotap_rx)
1259 + sizeof(struct GNUNET_MessageHeader); 1263 + sizeof(struct GNUNET_MessageHeader);
1260 1264
1261 readsize = linux_read(&dev, datastart, sizeof(readbuf) 1265 readsize = linux_read(&dev, datastart, sizeof(write_std.buf)
1262 - sizeof(struct Radiotap_rx) 1266 - sizeof(struct Radiotap_rx)
1263 - sizeof(struct GNUNET_MessageHeader), rxinfo); 1267 - sizeof(struct GNUNET_MessageHeader), rxinfo);
1264 1268
@@ -1273,8 +1277,20 @@ hardwaremode(int argc, char *argv[])
1273 if (1 == mac_test(datastart, &dev)) 1277 if (1 == mac_test(datastart, &dev))
1274 { 1278 {
1275 // mac wrong 1279 // mac wrong
1276 write_pout.pos = 0; 1280 write_std.pos = 0;
1277 write_pout.size = 0; 1281 write_std.size = 0;
1282 }
1283 else
1284 {
1285 header = (struct GNUNET_MessageHeader *) write_std.buf;
1286 write_std.size = readsize
1287 + sizeof(struct GNUNET_MessageHeader)
1288 + sizeof(struct Radiotap_rx);
1289 header->size = htons(write_std.size);
1290 header->type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
1291 fprintf(stderr, "Got packet with size: %u, size std %u\n",
1292 readsize, write_std.size);
1293
1278 } 1294 }
1279 } 1295 }
1280 else 1296 else
@@ -1297,6 +1313,7 @@ hardwaremode(int argc, char *argv[])
1297int 1313int
1298main(int argc, char *argv[]) 1314main(int argc, char *argv[])
1299{ 1315{
1316 int ret = 0;
1300 if (3 != argc) 1317 if (3 != argc)
1301 { 1318 {
1302 fprintf( 1319 fprintf(
@@ -1309,11 +1326,12 @@ main(int argc, char *argv[])
1309 if (strstr(argv[2], "1") || strstr(argv[2], "2")) 1326 if (strstr(argv[2], "1") || strstr(argv[2], "2"))
1310 { 1327 {
1311 1328
1312 return testmode(argc, argv); 1329 ret = testmode(argc, argv);
1313 } 1330 }
1314 else 1331 else
1315 { 1332 {
1316 return hardwaremode(argc, argv); 1333
1334 ret = hardwaremode(argc, argv);
1317 } 1335 }
1318 1336
1319#if 0 1337#if 0
@@ -1578,6 +1596,8 @@ main(int argc, char *argv[])
1578 } 1596 }
1579 1597
1580#endif 1598#endif
1581 return (0); 1599
1600 return ret;
1601 maketest(NULL, NULL);
1582} 1602}
1583 1603