summaryrefslogtreecommitdiff
authormax <max>2003-02-12 01:03:29 (UTC)
committer max <max>2003-02-12 01:03:29 (UTC)
commitc7fe028f53eb676c9ce619840c0d0a4603a9301f (patch) (unidiff)
tree81c32bfe1445092f52ae8097418dbb2375a7342b
parentee67394120b5436d955d64a21b8ea707b57ac0c0 (diff)
downloadopie-c7fe028f53eb676c9ce619840c0d0a4603a9301f.zip
opie-c7fe028f53eb676c9ce619840c0d0a4603a9301f.tar.gz
opie-c7fe028f53eb676c9ce619840c0d0a4603a9301f.tar.bz2
All card monitor and switching
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc134
-rw-r--r--noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh49
2 files changed, 167 insertions, 16 deletions
diff --git a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc
index 8c94cb1..cf50d8c 100644
--- a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc
+++ b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc
@@ -7,9 +7,9 @@
7#include "cardmode.hh" 7#include "cardmode.hh"
8#include "wl_log.hh" 8#include "wl_log.hh"
9 9
10/* main card into monitor function */ 10/* main card into monitor function */
11int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype) 11int card_into_monitormode (pcap_t **orighandle, const char *device, int cardtype)
12{ 12{
13 char CiscoRFMON[35] = "/proc/driver/aironet/"; 13 char CiscoRFMON[35] = "/proc/driver/aironet/";
14 FILE *CISCO_CONFIG_FILE; 14 FILE *CISCO_CONFIG_FILE;
15 15
@@ -46,27 +46,34 @@ int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype)
46 else if (cardtype == CARD_TYPE_NG) 46 else if (cardtype == CARD_TYPE_NG)
47 { 47 {
48 char wlanngcmd[80]; 48 char wlanngcmd[80];
49 snprintf(wlanngcmd, sizeof(wlanngcmd) - 1, "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=true", device, 1); 49 snprintf(wlanngcmd, sizeof(wlanngcmd) - 1, "$(which wlanctl-ng) %s lnxreq_wlansniff channel=%d enable=true", device, 1);
50 printf ("\n %s",wlanngcmd);
51 if (system(wlanngcmd) != 0) 50 if (system(wlanngcmd) != 0)
52 { 51 {
53 wl_logerr("Could not set %s in raw mode, check cardtype", device); 52 wl_logerr("Could not set %s in raw mode, check cardtype", device);
54 return 0; 53 return 0;
55 } 54 }
56 } 55 }
57 else if (cardtype == CARD_TYPE_HOSTAP) 56 else if (cardtype == CARD_TYPE_HOSTAP)
58 { 57 {
59 wl_logerr("Got a host-ap card, nothing is implemented now"); 58 int skfd;
60 char hostapcmd[250]; 59 skfd = socket(AF_INET, SOCK_STREAM, 0);
61 snprintf(hostapcmd, sizeof(hostapcmd) -1, "$(which iwpriv) %s monitor 2 %d", device,1); 60 struct iwreq wrq;
62 if (system(hostapcmd) !=0) 61 wrq.u.mode = IW_MODE_MONITOR;
63 { 62
64 wl_logerr("Could not set %s in raw mode, check cardtype", device); 63 if(iw_set_ext(skfd,device,SIOCSIWMODE,&wrq)<0)
65 return 0; 64 {
66 } 65 wl_logerr("Could not set hostap card %s to raw mode, check cardtype", device);
66 return 0;
67 }
68 else
69 {
70 wl_loginfo("Successfully set hostap card %s into raw mode",device);
71 return 1;
72 }
73 return 1;
67 } 74 }
68 else if (cardtype == CARD_TYPE_ORINOCCO || cardtype == CARD_TYPE_HOSTAP) 75 else if (cardtype == CARD_TYPE_ORINOCCO )
69 { 76 {
70 if (!card_set_channel (device, 1, CARD_TYPE_ORINOCCO)) 77 if (!card_set_channel (device, 1, CARD_TYPE_ORINOCCO))
71 { 78 {
72 wl_logerr("Could not set %s in raw mode, check cardtype", device); 79 wl_logerr("Could not set %s in raw mode, check cardtype", device);
@@ -91,9 +98,9 @@ int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype)
91 return 1; 98 return 1;
92} 99}
93 100
94/* Check card is in the rfmon mode */ 101/* Check card is in the rfmon mode */
95int card_check_rfmon_datalink (char *device) 102int card_check_rfmon_datalink (const char *device)
96{ 103{
97 int datalinktype=0; 104 int datalinktype=0;
98 pcap_t *phandle; 105 pcap_t *phandle;
99 phandle = pcap_open_live(device, 65,0,0,NULL); 106 phandle = pcap_open_live(device, 65,0,0,NULL);
@@ -137,9 +144,9 @@ int card_set_promisc_up (const char *device)
137 } 144 }
138 145
139 /* Get the informations back from the interface to check if the flags are correct */ 146 /* Get the informations back from the interface to check if the flags are correct */
140 strncpy(ifr.ifr_name, device,10); 147 strncpy(ifr.ifr_name, device,10);
141 ioctl(fd, SIOCGIFFLAGS, &ifr); 148 err = ioctl(fd, SIOCGIFFLAGS, &ifr);
142 if (err < 0) 149 if (err < 0)
143 { 150 {
144 perror("Could not access the interface, "); 151 perror("Could not access the interface, ");
145 close(fd); 152 close(fd);
@@ -167,9 +174,9 @@ int card_set_channel (const char *device, int channel, int cardtype)
167 /* Cisco and wlan-ng drivers don't need channelswitching */ 174 /* Cisco and wlan-ng drivers don't need channelswitching */
168 return 1; 175 return 1;
169 } 176 }
170 /* If it is a lucent orinocco card */ 177 /* If it is a lucent orinocco card */
171 else if (cardtype == CARD_TYPE_ORINOCCO || cardtype == CARD_TYPE_HOSTAP) 178 else if (cardtype == CARD_TYPE_ORINOCCO)
172 { 179 {
173 int fd; 180 int fd;
174 //Wireless tools structure for the iocalls 181 //Wireless tools structure for the iocalls
175 struct iwreq ireq; 182 struct iwreq ireq;
@@ -179,8 +186,9 @@ int card_set_channel (const char *device, int channel, int cardtype)
179 186
180 if ( fd == -1 ) { 187 if ( fd == -1 ) {
181 return -1; 188 return -1;
182 } 189 }
190
183 ptr = (int *) ireq.u.name; 191 ptr = (int *) ireq.u.name;
184 // This is the monitor mode for 802.11 non-prism header 192 // This is the monitor mode for 802.11 non-prism header
185 ptr[0] = 2; 193 ptr[0] = 2;
186 ptr[1] = channel; 194 ptr[1] = channel;
@@ -199,8 +207,106 @@ int card_set_channel (const char *device, int channel, int cardtype)
199 wl_logerr("Could not set channel %d on %s, check cardtype",channel, device); 207 wl_logerr("Could not set channel %d on %s, check cardtype",channel, device);
200 return 0; 208 return 0;
201 } 209 }
202 } 210 }
211 /* when it is an hostap card you need another iocall for channel switching */
212 else if (cardtype == CARD_TYPE_HOSTAP)
213 {
214 int skfd;
215 skfd = socket(AF_INET, SOCK_STREAM, 0);
216 struct iwreq wrq;
217 iw_float2freq((double) channel, &wrq.u.freq);
218
219 if(iw_set_ext(skfd,device,SIOCSIWFREQ,&wrq)<0)
220 {
221 wl_logerr("Could not set hostap card %s to channel %d", device, channel);
222 return 0;
223 }
224 else
225 {
226 wl_loginfo("Successfully set hostap card %s to channel %d", device, channel);
227 return 1;
228 }
229 }
203 /* For undefined situations */ 230 /* For undefined situations */
204 return 0; 231 return 0;
205} 232}
206 233
234
235int card_detect_channels (char * device)
236{
237 int skfd;
238 skfd = socket(AF_INET, SOCK_STREAM, 0);
239 struct iw_rangerange;
240 /* Get list of frequencies / channels */
241 printf ("\n hostap card get the frequencies");
242 /* Get list of frequencies / channels */
243 if(iw_get_range_info(skfd, device, &range) < 0)
244 { /* We are failsave if something went wrong, asume only 11 channels */
245 return 11;
246 }
247 else
248 {
249 if(range.num_frequency > 0)
250 {
251 return range.num_frequency;
252 }
253 else
254 { /* We are failsave asume only 11 channels */
255 return 11;
256 }
257 }
258
259} /* End of card_detect_channels */
260
261int iw_get_range_info(int skfd, const char * ifname, iw_range * range)
262{
263 struct iwreq wrq2;
264 char buffer[sizeof(iw_range) * 2];/* Large enough */
265
266 /* Cleanup */
267 memset(buffer, 0, sizeof(buffer));
268 wrq2.u.data.pointer = (caddr_t) buffer;
269 wrq2.u.data.length = sizeof(buffer);
270 wrq2.u.data.flags = 0;
271
272 if(iw_get_ext(skfd, ifname, SIOCGIWRANGE, &wrq2) < 0)
273 {
274 wl_logerr("Could not get the range from the interface");
275 return(-1);
276 }
277 else
278 {
279 /* Copy stuff at the right place, ignore extra */
280 memcpy((char *) range, buffer, sizeof(iw_range));
281 return 0;
282 }
283}
284
285/*------------------------------------------------------------------*/
286/*
287 * Convert our internal representation of frequencies to a floating point.
288 */
289double iw_freq2float(iw_freq * in)
290{
291 int i;
292 double res = (double) in->m;
293 for(i = 0; i < in->e; i++)
294 res *= 10;
295 return(res);
296}
297
298
299 void iw_float2freq(double in, iw_freq *out)
300{
301 /* Version without libm : slower */
302 out->e = 0;
303 while(in > 1e9)
304 {
305 in /= 10;
306 out->e++;
307 }
308 out->m = (long) in;
309}
310
311
312
diff --git a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh
index 4a95956..b35dddd 100644
--- a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh
+++ b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.hh
@@ -34,15 +34,60 @@ extern "C"
34 #define CARD_TYPE_NG 2 34 #define CARD_TYPE_NG 2
35 #define CARD_TYPE_HOSTAP3 35 #define CARD_TYPE_HOSTAP3
36#define CARD_TYPE_ORINOCCO 4 36#define CARD_TYPE_ORINOCCO 4
37 37
38/* Some usefull constants for frequencies */
39#define KILO 1e3
40#define MEGA 1e6
41#define GIGA 1e9
42
43
38/* only for now, until we have the daemon running */ 44/* only for now, until we have the daemon running */
39/*the config file should provide these information */ 45/*the config file should provide these information */
40#define CARD_TYPE CARD_TYPE_HOSTAP 46#define CARD_TYPE CARD_TYPE_HOSTAP
41 47
42/* Prototypes */ 48/* Prototypes */
43int card_check_rfmon_datalink (char *device); 49int card_check_rfmon_datalink (const char *device);
44int card_into_monitormode (pcap_t **, char *, int); 50int card_into_monitormode (pcap_t **, const char *, int);
45int card_set_promisc_up (const char *); 51int card_set_promisc_up (const char *);
46int card_set_channel (const char *device, int channel,int cardtype); 52int card_set_channel (const char *device, int channel,int cardtype);
53int iw_get_range_info(int skfd, const char * ifname, struct iw_range * range);
54double iw_freq2float(iw_freq * in);
55 void iw_float2freq(double in, iw_freq *out);
56int card_detect_channels (char * device);
57
58
59/*------------------------------------------------------------------*/
60/*
61 * Wrapper to push some Wireless Parameter in the driver
62 */
63static inline int
64 iw_set_ext(int skfd, /* Socket to the kernel */
65 char * ifname, /* Device name */
66 int request,/* WE ID */
67 struct iwreq * pwrq) /* Fixed part of the request */
68{
69 /* Set device name */
70 strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
71 /* Do the request */
72 return(ioctl(skfd, request, pwrq));
73}
74
75/*------------------------------------------------------------------*/
76/*
77 * Wrapper to extract some Wireless Parameter out of the driver
78 */
79static inline int
80 iw_get_ext(int skfd, /* Socket to the kernel */
81 char * ifname, /* Device name */
82 int request,/* WE ID */
83 struct iwreq * pwrq) /* Fixed part of the request */
84{
85 /* Set device name */
86 strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
87 /* Do the request */
88 return(ioctl(skfd, request, pwrq));
89}
90
91
47 92
48#endif /* CARDMODE_HH */ 93#endif /* CARDMODE_HH */