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/gnunet-transport-wlan-helper.c | |
parent | 80886220c43050805947be8027e05cf6fd1b4832 (diff) | |
download | gnunet-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.c | 124 |
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 | ||
265 | static unsigned long | 265 | static unsigned long |
@@ -412,7 +412,7 @@ static int | |||
412 | linux_read(struct Hardware_Infos * dev, unsigned char *buf, int count, | 412 | linux_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, | |||
604 | static int | 604 | static int |
605 | linux_write(struct Hardware_Infos * dev, unsigned char *buf, unsigned int count) | 605 | linux_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 | |||
1067 | hardwaremode(int argc, char *argv[]) | 1060 | hardwaremode(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[]) | |||
1297 | int | 1313 | int |
1298 | main(int argc, char *argv[]) | 1314 | main(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 | ||