summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opienet/onetutils.h23
-rw-r--r--libopie2/opienet/onetwork.cpp199
-rw-r--r--libopie2/opienet/onetwork.h6
-rw-r--r--libopie2/opienet/opienet.pro2
-rw-r--r--libopie2/opienet/ostation.h3
5 files changed, 207 insertions, 26 deletions
diff --git a/libopie2/opienet/onetutils.h b/libopie2/opienet/onetutils.h
index f1d34a0..32f5355 100644
--- a/libopie2/opienet/onetutils.h
+++ b/libopie2/opienet/onetutils.h
@@ -1,7 +1,6 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3 3              (C) 2003-2005 Michael 'Mickey' Lauer <mickey@Vanille.de>
4              (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
5 =. 4 =.
6 .=l. 5 .=l.
7           .>+-= 6           .>+-=
@@ -150,6 +149,18 @@ int stringToMode( const QString& );
150#define IW_PRIV_SIZE_FIXED 0x0800 149#define IW_PRIV_SIZE_FIXED 0x0800
151#define IW_PRIV_SIZE_MASK 0x07FF 150#define IW_PRIV_SIZE_MASK 0x07FF
152 151
152#define IW_HEADER_TYPE_NULL 0 /* Not available */
153#define IW_HEADER_TYPE_CHAR 2 /* char [IFNAMSIZ] */
154#define IW_HEADER_TYPE_UINT 4 /* __u32 */
155#define IW_HEADER_TYPE_FREQ 5 /* struct iw_freq */
156#define IW_HEADER_TYPE_ADDR 6 /* struct sockaddr */
157#define IW_HEADER_TYPE_POINT 8 /* struct iw_point */
158#define IW_HEADER_TYPE_PARAM 9 /* struct iw_param */
159#define IW_HEADER_TYPE_QUAL 10 /* struct iw_quality */
160
161#define IW_EV_POINT_OFF (((char *) &(((struct iw_point *) NULL)->length)) - \
162 (char *) NULL)
163
153#ifndef ARPHRD_IEEE80211 164#ifndef ARPHRD_IEEE80211
154#define ARPHRD_IEEE80211 801 165#define ARPHRD_IEEE80211 801
155#endif 166#endif
@@ -157,6 +168,14 @@ int stringToMode( const QString& );
157#define ARPHRD_IEEE80211_PRISM 802 168#define ARPHRD_IEEE80211_PRISM 802
158#endif 169#endif
159 170
171/* Wireless Extension Scanning Stuff */
172struct iw_stream_descr
173{
174 char * end; /* End of the stream */
175 char * current; /* Current event in stream of events */
176 char * value; /* Current value in event */
177};
178
160 179
161/* Network to host order macros */ 180/* Network to host order macros */
162 181
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp
index ae1865d..546be9e 100644
--- a/libopie2/opienet/onetwork.cpp
+++ b/libopie2/opienet/onetwork.cpp
@@ -1,7 +1,7 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003-2004 by Michael 'Mickey' Lauer 3              Copyright (C) 2003-2005 by Michael 'Mickey' Lauer <mickey@Vanille.de>
4 =. <mickey@Vanille.de> 4 =.
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can 7 _;:,     .>    :=|. This program is free software; you can
@@ -58,7 +58,6 @@
58#ifndef NODEBUG 58#ifndef NODEBUG
59#include <opie2/odebugmapper.h> 59#include <opie2/odebugmapper.h>
60 60
61
62using namespace Opie::Core; 61using namespace Opie::Core;
63using namespace Opie::Net::Internal; 62using namespace Opie::Net::Internal;
64DebugMapper* debugmapper = new DebugMapper(); 63DebugMapper* debugmapper = new DebugMapper();
@@ -865,7 +864,7 @@ QString OWirelessNetworkInterface::SSID() const
865void OWirelessNetworkInterface::setSSID( const QString& ssid ) 864void OWirelessNetworkInterface::setSSID( const QString& ssid )
866{ 865{
867 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid ); 866 _iwr.u.essid.pointer = const_cast<char*>( (const char*) ssid );
868 _iwr.u.essid.length = ssid.length(); 867 _iwr.u.essid.length = ssid.length()+1; // zero byte
869 wioctl( SIOCSIWESSID ); 868 wioctl( SIOCSIWESSID );
870} 869}
871 870
@@ -881,7 +880,7 @@ OStationList* OWirelessNetworkInterface::scanNetwork()
881 880
882 OStationList* stations = new OStationList(); 881 OStationList* stations = new OStationList();
883 882
884 int timeout = 1000000; 883 int timeout = 10000000;
885 884
886 odebug << "ONetworkInterface::scanNetwork() - scan started." << oendl; 885 odebug << "ONetworkInterface::scanNetwork() - scan started." << oendl;
887 886
@@ -935,14 +934,180 @@ OStationList* OWirelessNetworkInterface::scanNetwork()
935 dumpBytes( (const unsigned char*) &buffer[0], _iwr.u.data.length ); 934 dumpBytes( (const unsigned char*) &buffer[0], _iwr.u.data.length );
936 935
937 // parse results 936 // parse results
937 struct iw_event iwe;
938 struct iw_stream_descr stream;
939 unsigned int cmd_index, event_type, event_len;
940 char *pointer;
941
942 const char standard_ioctl_hdr[] = {
943 IW_HEADER_TYPE_NULL, /* SIOCSIWCOMMIT */
944 IW_HEADER_TYPE_CHAR, /* SIOCGIWNAME */
945 IW_HEADER_TYPE_PARAM, /* SIOCSIWNWID */
946 IW_HEADER_TYPE_PARAM, /* SIOCGIWNWID */
947 IW_HEADER_TYPE_FREQ, /* SIOCSIWFREQ */
948 IW_HEADER_TYPE_FREQ, /* SIOCGIWFREQ */
949 IW_HEADER_TYPE_UINT, /* SIOCSIWMODE */
950 IW_HEADER_TYPE_UINT, /* SIOCGIWMODE */
951 IW_HEADER_TYPE_PARAM, /* SIOCSIWSENS */
952 IW_HEADER_TYPE_PARAM, /* SIOCGIWSENS */
953 IW_HEADER_TYPE_NULL, /* SIOCSIWRANGE */
954 IW_HEADER_TYPE_POINT, /* SIOCGIWRANGE */
955 IW_HEADER_TYPE_NULL, /* SIOCSIWPRIV */
956 IW_HEADER_TYPE_POINT, /* SIOCGIWPRIV */
957 IW_HEADER_TYPE_NULL, /* SIOCSIWSTATS */
958 IW_HEADER_TYPE_POINT, /* SIOCGIWSTATS */
959 IW_HEADER_TYPE_POINT, /* SIOCSIWSPY */
960 IW_HEADER_TYPE_POINT, /* SIOCGIWSPY */
961 IW_HEADER_TYPE_POINT, /* SIOCSIWTHRSPY */
962 IW_HEADER_TYPE_POINT, /* SIOCGIWTHRSPY */
963 IW_HEADER_TYPE_ADDR, /* SIOCSIWAP */
964 IW_HEADER_TYPE_ADDR, /* SIOCGIWAP */
965 IW_HEADER_TYPE_NULL, /* -- hole -- */
966 IW_HEADER_TYPE_POINT, /* SIOCGIWAPLIST */
967 IW_HEADER_TYPE_PARAM, /* SIOCSIWSCAN */
968 IW_HEADER_TYPE_POINT, /* SIOCGIWSCAN */
969 IW_HEADER_TYPE_POINT, /* SIOCSIWESSID */
970 IW_HEADER_TYPE_POINT, /* SIOCGIWESSID */
971 IW_HEADER_TYPE_POINT, /* SIOCSIWNICKN */
972 IW_HEADER_TYPE_POINT, /* SIOCGIWNICKN */
973 IW_HEADER_TYPE_NULL, /* -- hole -- */
974 IW_HEADER_TYPE_NULL, /* -- hole -- */
975 IW_HEADER_TYPE_PARAM, /* SIOCSIWRATE */
976 IW_HEADER_TYPE_PARAM, /* SIOCGIWRATE */
977 IW_HEADER_TYPE_PARAM, /* SIOCSIWRTS */
978 IW_HEADER_TYPE_PARAM, /* SIOCGIWRTS */
979 IW_HEADER_TYPE_PARAM, /* SIOCSIWFRAG */
980 IW_HEADER_TYPE_PARAM, /* SIOCGIWFRAG */
981 IW_HEADER_TYPE_PARAM, /* SIOCSIWTXPOW */
982 IW_HEADER_TYPE_PARAM, /* SIOCGIWTXPOW */
983 IW_HEADER_TYPE_PARAM, /* SIOCSIWRETRY */
984 IW_HEADER_TYPE_PARAM, /* SIOCGIWRETRY */
985 IW_HEADER_TYPE_POINT, /* SIOCSIWENCODE */
986 IW_HEADER_TYPE_POINT, /* SIOCGIWENCODE */
987 IW_HEADER_TYPE_PARAM, /* SIOCSIWPOWER */
988 IW_HEADER_TYPE_PARAM, /* SIOCGIWPOWER */
989 };
990
991 const char standard_event_hdr[] = {
992 IW_HEADER_TYPE_ADDR, /* IWEVTXDROP */
993 IW_HEADER_TYPE_QUAL, /* IWEVQUAL */
994 IW_HEADER_TYPE_POINT, /* IWEVCUSTOM */
995 IW_HEADER_TYPE_ADDR, /* IWEVREGISTERED */
996 IW_HEADER_TYPE_ADDR, /* IWEVEXPIRED */
997 IW_HEADER_TYPE_POINT, /* IWEVGENIE */
998 IW_HEADER_TYPE_POINT, /* IWEVMICHAELMICFAILURE */
999 IW_HEADER_TYPE_POINT, /* IWEVASSOCREQIE */
1000 IW_HEADER_TYPE_POINT, /* IWEVASSOCRESPIE */
1001 IW_HEADER_TYPE_POINT, /* IWEVPMKIDCAND */
1002 };
1003
1004
1005 const int event_type_size[] = {
1006 IW_EV_LCP_LEN, /* IW_HEADER_TYPE_NULL */
1007 0,
1008 IW_EV_CHAR_LEN, /* IW_HEADER_TYPE_CHAR */
1009 0,
1010 IW_EV_UINT_LEN, /* IW_HEADER_TYPE_UINT */
1011 IW_EV_FREQ_LEN, /* IW_HEADER_TYPE_FREQ */
1012 IW_EV_ADDR_LEN, /* IW_HEADER_TYPE_ADDR */
1013 0,
1014 IW_EV_POINT_LEN, /* Without variable payload */
1015 IW_EV_PARAM_LEN, /* IW_HEADER_TYPE_PARAM */
1016 IW_EV_QUAL_LEN, /* IW_HEADER_TYPE_QUAL */
1017 };
1018
1019
1020 //Initialize the stream
1021 memset( &stream, 0, sizeof(struct iw_stream_descr) );
1022 stream.current = buffer;
1023 stream.end = buffer + _iwr.u.data.length;
1024
1025 do
1026 {
1027 if ((stream.current + IW_EV_LCP_LEN) > stream.end)
1028 break;
1029 memcpy((char *) &iwe, stream.current, IW_EV_LCP_LEN);
938 1030
939 int offset = 0; 1031 if (iwe.len <= IW_EV_LCP_LEN) //If yes, it is an invalid event
940 struct iw_event* we = (struct iw_event*) &buffer[0]; 1032 break;
1033 if (iwe.cmd <= SIOCIWLAST) {
1034 cmd_index = iwe.cmd - SIOCIWFIRST;
941 1035
942 while ( offset < _iwr.u.data.length ) 1036 if(cmd_index < sizeof(standard_ioctl_hdr))
943 { 1037 event_type = standard_ioctl_hdr[cmd_index];
944 //const char* cmd = *(*_ioctlmap)[we->cmd]; 1038 }
945 //if ( !cmd ) cmd = "<unknown>"; 1039 else {
1040 cmd_index = iwe.cmd - IWEVFIRST;
1041
1042 if(cmd_index < sizeof(standard_event_hdr))
1043 event_type = standard_event_hdr[cmd_index];
1044 }
1045
1046 /* Unknown events -> event_type=0 => IW_EV_LCP_LEN */
1047 event_len = event_type_size[event_type];
1048
1049 /* Fixup for later version of WE */
1050 if((_range.we_version_compiled > 18) && (event_type == IW_HEADER_TYPE_POINT))
1051 event_len -= IW_EV_POINT_OFF;
1052
1053 /* Check if we know about this event */
1054 if(event_len <= IW_EV_LCP_LEN) {
1055 /* Skip to next event */
1056 stream.current += iwe.len;
1057 continue;
1058 }
1059
1060 event_len -= IW_EV_LCP_LEN;
1061
1062 /* Set pointer on data */
1063 if(stream.value != NULL)
1064 pointer = stream.value; /* Next value in event */
1065 else
1066 pointer = stream.current + IW_EV_LCP_LEN; /* First value in event */
1067
1068 if((pointer + event_len) > stream.end) {
1069 /* Go to next event */
1070 stream.current += iwe.len;
1071 break;
1072 }
1073
1074 /* Fixup for later version of WE */
1075 if((_range.we_version_compiled > 18) && (event_type == IW_HEADER_TYPE_POINT))
1076 memcpy((char *) &iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF, pointer, event_len);
1077 else
1078 memcpy((char *) &iwe + IW_EV_LCP_LEN, pointer, event_len);
1079
1080 /* Skip event in the stream */
1081 pointer += event_len;
1082
1083 /* Special processing for iw_point events */
1084 if(event_type == IW_HEADER_TYPE_POINT) {
1085 /* Check the length of the payload */
1086
1087 if((iwe.len - (event_len + IW_EV_LCP_LEN)) > 0)
1088 /* Set pointer on variable part (warning : non aligned) */
1089 iwe.u.data.pointer = pointer;
1090 else
1091 /* No data */
1092 iwe.u.data.pointer = NULL;
1093 /* Go to next event */
1094 stream.current += iwe.len;
1095 }
1096
1097 else {
1098 /* Is there more value in the event ? */
1099 if((pointer + event_len) <= (stream.current + iwe.len))
1100 /* Go to next value */
1101 stream.value = pointer;
1102 else {
1103 /* Go to next event */
1104 stream.value = NULL;
1105 stream.current += iwe.len;
1106 }
1107 }
1108
1109 struct iw_event *we = &iwe;
1110 //------
946 odebug << " - reading next event... cmd=" << we->cmd << ", len=" << we->len << oendl; 1111 odebug << " - reading next event... cmd=" << we->cmd << ", len=" << we->len << oendl;
947 switch (we->cmd) 1112 switch (we->cmd)
948 { 1113 {
@@ -968,7 +1133,9 @@ OStationList* OWirelessNetworkInterface::scanNetwork()
968 case SIOCGIWESSID: 1133 case SIOCGIWESSID:
969 { 1134 {
970 odebug << "SIOCGIWESSID" << oendl; 1135 odebug << "SIOCGIWESSID" << oendl;
1136 we->u.essid.length = '\0'; // make sure it is zero terminated
971 stations->last()->ssid = static_cast<const char*>( we->u.essid.pointer ); 1137 stations->last()->ssid = static_cast<const char*>( we->u.essid.pointer );
1138 odebug << "ESSID: " << stations->last()->ssid << oendl;
972 break; 1139 break;
973 } 1140 }
974 case SIOCGIWSENS: odebug << "SIOCGIWSENS" << oendl; break; 1141 case SIOCGIWSENS: odebug << "SIOCGIWSENS" << oendl; break;
@@ -981,19 +1148,13 @@ OStationList* OWirelessNetworkInterface::scanNetwork()
981 default: odebug << "unhandled event" << oendl; 1148 default: odebug << "unhandled event" << oendl;
982 } 1149 }
983 1150
984 offset += we->len; 1151 } while (true);
985 we = (struct iw_event*) &buffer[offset];
986 }
987 return stations;
988
989 return stations;
990
991 } 1152 }
992 else 1153 else
993 { 1154 {
994 odebug << " - no results (timeout) :(" << oendl; 1155 odebug << " - no results (timeout) :(" << oendl;
995 return stations;
996 } 1156 }
1157 return stations;
997} 1158}
998 1159
999 1160
diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h
index be4bb46..4d9912d 100644
--- a/libopie2/opienet/onetwork.h
+++ b/libopie2/opienet/onetwork.h
@@ -1,7 +1,7 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003-2004 by Michael 'Mickey' Lauer 3              Copyright (C) 2003-2005 by Michael 'Mickey' Lauer <mickey@Vanille.de>
4 =. <mickey@Vanille.de> 4 =.
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can 7 _;:,     .>    :=|. This program is free software; you can
@@ -43,7 +43,7 @@
43#include <qhostaddress.h> 43#include <qhostaddress.h>
44 44
45/* STD */ 45/* STD */
46// hacky workaround until we have a user space wireless.h 46// hacky workarounds until we have a true user space wireless.h
47#include <net/if.h> 47#include <net/if.h>
48#define _LINUX_IF_H 48#define _LINUX_IF_H
49#include <linux/wireless.h> 49#include <linux/wireless.h>
diff --git a/libopie2/opienet/opienet.pro b/libopie2/opienet/opienet.pro
index 98fa175..a10a949 100644
--- a/libopie2/opienet/opienet.pro
+++ b/libopie2/opienet/opienet.pro
@@ -18,7 +18,7 @@ SOURCES = odebugmapper.cpp \
18 ostation.cpp 18 ostation.cpp
19INTERFACES = 19INTERFACES =
20TARGET = opienet2 20TARGET = opienet2
21VERSION = 1.8.4 21VERSION = 1.8.5
22INCLUDEPATH += $(OPIEDIR)/include 22INCLUDEPATH += $(OPIEDIR)/include
23DEPENDPATH += $(OPIEDIR)/include 23DEPENDPATH += $(OPIEDIR)/include
24LIBS += -lpcap 24LIBS += -lpcap
diff --git a/libopie2/opienet/ostation.h b/libopie2/opienet/ostation.h
index bdc653f..5219d92 100644
--- a/libopie2/opienet/ostation.h
+++ b/libopie2/opienet/ostation.h
@@ -1,6 +1,6 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by Michael 'Mickey' Lauer <mickey@Vanille.de> 3              Copyright (C) 2003-2005 by Michael 'Mickey' Lauer <mickey@Vanille.de>
4 =. 4 =.
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
@@ -69,6 +69,7 @@ class OStation
69 QString ssid; 69 QString ssid;
70 OMacAddress apAddress; 70 OMacAddress apAddress;
71 int channel; 71 int channel;
72 int level;
72 bool encrypted; 73 bool encrypted;
73 private: 74 private:
74 class Private; 75 class Private;