summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc5
1 files changed, 3 insertions, 2 deletions
diff --git a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc
index 3e6c476..a512bc5 100644
--- a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc
+++ b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc
@@ -1,317 +1,318 @@
1/* 1/*
2 * Set card modes for sniffing 2 * Set card modes for sniffing
3 * 3 *
4 * $Id$ 4 * $Id$
5 */ 5 */
6 6
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, const 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
16 /* Checks if we have a device to sniff on */ 16 /* Checks if we have a device to sniff on */
17 if(device == NULL) 17 if(device == NULL)
18 { 18 {
19 wl_logerr("No device given"); 19 wl_logerr("No device given");
20 return 0; 20 return 0;
21 } 21 }
22 22
23 /* Setting the promiscous and up flag to the interface */ 23 /* Setting the promiscous and up flag to the interface */
24 if (!card_set_promisc_up(device)) 24 if (!card_set_promisc_up(device))
25 { 25 {
26 wl_logerr("Cannot set interface to promisc mode"); 26 wl_logerr("Cannot set interface to promisc mode");
27 return 0; 27 return 0;
28 } 28 }
29 wl_loginfo("Interface set to promisc mode"); 29 wl_loginfo("Interface set to promisc mode");
30 30
31 /* Check the cardtype and executes the commands to go into monitor mode */ 31 /* Check the cardtype and executes the commands to go into monitor mode */
32 if (cardtype == CARD_TYPE_CISCO) 32 if (cardtype == CARD_TYPE_CISCO)
33 { 33 {
34 /* bring the sniffer into rfmon mode */ 34 /* bring the sniffer into rfmon mode */
35 snprintf(CiscoRFMON, sizeof(CiscoRFMON) - 1, DEFAULT_PATH, device); 35 snprintf(CiscoRFMON, sizeof(CiscoRFMON) - 1, DEFAULT_PATH, device);
36 if((CISCO_CONFIG_FILE = fopen(CiscoRFMON,"w")) == NULL) 36 if((CISCO_CONFIG_FILE = fopen(CiscoRFMON,"w")) == NULL)
37 { 37 {
38 wl_logerr("Cannot open config file: %s", strerror(errno)); 38 wl_logerr("Cannot open config file: %s", strerror(errno));
39 return 0; 39 return 0;
40 } 40 }
41 fputs ("Mode: r",CISCO_CONFIG_FILE); 41 fputs ("Mode: r",CISCO_CONFIG_FILE);
42 fputs ("Mode: y",CISCO_CONFIG_FILE); 42 fputs ("Mode: y",CISCO_CONFIG_FILE);
43 fputs ("XmitPower: 1",CISCO_CONFIG_FILE); 43 fputs ("XmitPower: 1",CISCO_CONFIG_FILE);
44 fclose(CISCO_CONFIG_FILE); 44 fclose(CISCO_CONFIG_FILE);
45 } 45 }
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 if (system(wlanngcmd) != 0) 50 if (system(wlanngcmd) != 0)
51 { 51 {
52 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);
53 return 0; 53 return 0;
54 } 54 }
55 } 55 }
56 else if (cardtype == CARD_TYPE_HOSTAP) 56 else if (cardtype == CARD_TYPE_HOSTAP)
57 { 57 {
58#if WIRELESS_EXT < 15 58#if WIRELESS_EXT > 14
59 // IW_MODE_MONITOR was implemented in Wireless Extensions Version 15
59 int skfd; 60 int skfd;
60 skfd = socket(AF_INET, SOCK_STREAM, 0); 61 skfd = socket(AF_INET, SOCK_STREAM, 0);
61 struct iwreq wrq; 62 struct iwreq wrq;
62 wrq.u.mode = IW_MODE_MONITOR; 63 wrq.u.mode = IW_MODE_MONITOR;
63 64
64 if(iw_set_ext(skfd,(char *) device,SIOCSIWMODE,&wrq)<0) 65 if(iw_set_ext(skfd,(char *) device,SIOCSIWMODE,&wrq)<0)
65 { 66 {
66 wl_logerr("Could not set hostap card %s to raw mode, check cardtype", device); 67 wl_logerr("Could not set hostap card %s to raw mode, check cardtype", device);
67 return 0; 68 return 0;
68 } 69 }
69 else 70 else
70 { 71 {
71 wl_loginfo("Successfully set hostap card %s into raw mode",device); 72 wl_loginfo("Successfully set hostap card %s into raw mode",device);
72 return 1; 73 return 1;
73 } 74 }
74 return 1; 75 return 1;
75#else 76#else
76#warning Hi _MAX_, please use a system call for hostap with wireless extensions < 14 77#warning Hi _MAX_, please use a system call for hostap with wireless extensions < 15
77 // TODO: Implement switching HOSTAP into monitor mode with system call 78 // TODO: Implement switching HOSTAP into monitor mode with system call
78#endif 79#endif
79 } 80 }
80 else if (cardtype == CARD_TYPE_ORINOCCO ) 81 else if (cardtype == CARD_TYPE_ORINOCCO )
81 { 82 {
82 if (!card_set_channel (device, 1, CARD_TYPE_ORINOCCO)) 83 if (!card_set_channel (device, 1, CARD_TYPE_ORINOCCO))
83 { 84 {
84 wl_logerr("Could not set %s in raw mode, check cardtype", device); 85 wl_logerr("Could not set %s in raw mode, check cardtype", device);
85 return 0; 86 return 0;
86 } 87 }
87 else 88 else
88 { 89 {
89 wl_loginfo("Successfully set %s into raw mode",device); 90 wl_loginfo("Successfully set %s into raw mode",device);
90 } 91 }
91 } 92 }
92 93
93 /* Setting the promiscous and up flag to the interface */ 94 /* Setting the promiscous and up flag to the interface */
94 if (!card_check_rfmon_datalink(device)) 95 if (!card_check_rfmon_datalink(device))
95 { 96 {
96 wl_logerr("Cannot set interface to rfmon mode"); 97 wl_logerr("Cannot set interface to rfmon mode");
97 return 0; 98 return 0;
98 } 99 }
99 else 100 else
100 { 101 {
101 wl_loginfo("Interface set to rfmon mode"); 102 wl_loginfo("Interface set to rfmon mode");
102 } 103 }
103 return 1; 104 return 1;
104} 105}
105 106
106/* Check card is in the rfmon mode */ 107/* Check card is in the rfmon mode */
107int card_check_rfmon_datalink (const char *device) 108int card_check_rfmon_datalink (const char *device)
108{ 109{
109 int datalinktype=0; 110 int datalinktype=0;
110 pcap_t *phandle; 111 pcap_t *phandle;
111 phandle = pcap_open_live((char *)device, 65,0,0,NULL); 112 phandle = pcap_open_live((char *)device, 65,0,0,NULL);
112 datalinktype = pcap_datalink (phandle); 113 datalinktype = pcap_datalink (phandle);
113 pcap_close(phandle); 114 pcap_close(phandle);
114 115
115 if (datalinktype != DLT_IEEE802_11) /* Rawmode is IEEE802_11 */ 116 if (datalinktype != DLT_IEEE802_11) /* Rawmode is IEEE802_11 */
116 { 117 {
117 return 0; 118 return 0;
118 } 119 }
119 else 120 else
120 { 121 {
121 wl_loginfo("Your successfully listen on %s in 802.11 raw mode", device); 122 wl_loginfo("Your successfully listen on %s in 802.11 raw mode", device);
122 return 1; 123 return 1;
123 } 124 }
124} 125}
125 126
126/* Set card into promisc mode */ 127/* Set card into promisc mode */
127int card_set_promisc_up (const char *device) 128int card_set_promisc_up (const char *device)
128{ 129{
129 int err; 130 int err;
130 /* First generate a socket to use with iocalls */ 131 /* First generate a socket to use with iocalls */
131 int fd = socket(AF_INET, SOCK_DGRAM, 0); 132 int fd = socket(AF_INET, SOCK_DGRAM, 0);
132 if (fd < 0) 133 if (fd < 0)
133 { 134 {
134 /* In case of an error */ 135 /* In case of an error */
135 perror("socket"); 136 perror("socket");
136 return 0; 137 return 0;
137 } 138 }
138 139
139 /* Fill an empty an interface structure with the right flags (UP and Promsic) */ 140 /* Fill an empty an interface structure with the right flags (UP and Promsic) */
140 struct ifreq ifr; 141 struct ifreq ifr;
141 strncpy(ifr.ifr_name, device,10); 142 strncpy(ifr.ifr_name, device,10);
142 ifr.ifr_flags = IFF_UP + IFF_PROMISC; 143 ifr.ifr_flags = IFF_UP + IFF_PROMISC;
143 err = ioctl(fd, SIOCSIFFLAGS, &ifr); 144 err = ioctl(fd, SIOCSIFFLAGS, &ifr);
144 if (err < 0) 145 if (err < 0)
145 { 146 {
146 perror("Could not access the interface, "); 147 perror("Could not access the interface, ");
147 close(fd); 148 close(fd);
148 return 0; 149 return 0;
149 } 150 }
150 151
151 /* Get the informations back from the interface to check if the flags are correct */ 152 /* Get the informations back from the interface to check if the flags are correct */
152 strncpy(ifr.ifr_name, device,10); 153 strncpy(ifr.ifr_name, device,10);
153 err = ioctl(fd, SIOCGIFFLAGS, &ifr); 154 err = ioctl(fd, SIOCGIFFLAGS, &ifr);
154 if (err < 0) 155 if (err < 0)
155 { 156 {
156 perror("Could not access the interface, "); 157 perror("Could not access the interface, ");
157 close(fd); 158 close(fd);
158 return 0; 159 return 0;
159 } 160 }
160 161
161 if(ifr.ifr_flags && IFF_UP) 162 if(ifr.ifr_flags && IFF_UP)
162 { 163 {
163 close(fd); 164 close(fd);
164 return 1; 165 return 1;
165 } 166 }
166 else 167 else
167 { 168 {
168 wl_logerr("Could not set promisc flag on %d", device); 169 wl_logerr("Could not set promisc flag on %d", device);
169 close(fd); 170 close(fd);
170 return 0; 171 return 0;
171 } 172 }
172} 173}
173 174
174/* Set channel (Wireless frequency) of the device */ 175/* Set channel (Wireless frequency) of the device */
175int card_set_channel (const char *device, int channel, int cardtype) 176int card_set_channel (const char *device, int channel, int cardtype)
176{ 177{
177 if (cardtype == CARD_TYPE_CISCO || cardtype == CARD_TYPE_NG) 178 if (cardtype == CARD_TYPE_CISCO || cardtype == CARD_TYPE_NG)
178 { 179 {
179 /* Cisco and wlan-ng drivers don't need channelswitching */ 180 /* Cisco and wlan-ng drivers don't need channelswitching */
180 return 1; 181 return 1;
181 } 182 }
182 /* If it is a lucent orinocco card */ 183 /* If it is a lucent orinocco card */
183 else if (cardtype == CARD_TYPE_ORINOCCO) 184 else if (cardtype == CARD_TYPE_ORINOCCO)
184 { 185 {
185 int fd; 186 int fd;
186 //Wireless tools structure for the iocalls 187 //Wireless tools structure for the iocalls
187 struct iwreq ireq; 188 struct iwreq ireq;
188 int *ptr; 189 int *ptr;
189 /* Socket needed to use the iocall to */ 190 /* Socket needed to use the iocall to */
190 fd = socket(AF_INET, SOCK_STREAM, 0); 191 fd = socket(AF_INET, SOCK_STREAM, 0);
191 192
192 if ( fd == -1 ) { 193 if ( fd == -1 ) {
193 return -1; 194 return -1;
194 } 195 }
195 196
196 ptr = (int *) ireq.u.name; 197 ptr = (int *) ireq.u.name;
197 // This is the monitor mode for 802.11 non-prism header 198 // This is the monitor mode for 802.11 non-prism header
198 ptr[0] = 2; 199 ptr[0] = 2;
199 ptr[1] = channel; 200 ptr[1] = channel;
200 strcpy(ireq.ifr_ifrn.ifrn_name, device); 201 strcpy(ireq.ifr_ifrn.ifrn_name, device);
201 if (ioctl( fd, SIOCIWFIRSTPRIV + 0x8, &ireq)==0) 202 if (ioctl( fd, SIOCIWFIRSTPRIV + 0x8, &ireq)==0)
202 { 203 {
203 /* All was fine... */ 204 /* All was fine... */
204 close(fd); 205 close(fd);
205 wl_loginfo("Set channel %d on interface %s",channel, device); 206 wl_loginfo("Set channel %d on interface %s",channel, device);
206 return 1; 207 return 1;
207 } 208 }
208 else 209 else
209 { 210 {
210 /* iocall does not work */ 211 /* iocall does not work */
211 close(fd); 212 close(fd);
212 wl_logerr("Could not set channel %d on %s, check cardtype",channel, device); 213 wl_logerr("Could not set channel %d on %s, check cardtype",channel, device);
213 return 0; 214 return 0;
214 } 215 }
215 } 216 }
216 /* when it is an hostap card you need another iocall for channel switching */ 217 /* when it is an hostap card you need another iocall for channel switching */
217 else if (cardtype == CARD_TYPE_HOSTAP) 218 else if (cardtype == CARD_TYPE_HOSTAP)
218 { 219 {
219 int skfd; 220 int skfd;
220 skfd = socket(AF_INET, SOCK_STREAM, 0); 221 skfd = socket(AF_INET, SOCK_STREAM, 0);
221 struct iwreq wrq; 222 struct iwreq wrq;
222 iw_float2freq((double) channel, &wrq.u.freq); 223 iw_float2freq((double) channel, &wrq.u.freq);
223 224
224 if(iw_set_ext(skfd,(char *) device,SIOCSIWFREQ,&wrq)<0) 225 if(iw_set_ext(skfd,(char *) device,SIOCSIWFREQ,&wrq)<0)
225 { 226 {
226 wl_logerr("Could not set hostap card %s to channel %d", device, channel); 227 wl_logerr("Could not set hostap card %s to channel %d", device, channel);
227 return 0; 228 return 0;
228 } 229 }
229 else 230 else
230 { 231 {
231 wl_loginfo("Successfully set hostap card %s to channel %d", device, channel); 232 wl_loginfo("Successfully set hostap card %s to channel %d", device, channel);
232 return 1; 233 return 1;
233 } 234 }
234 } 235 }
235 /* For undefined situations */ 236 /* For undefined situations */
236 return 0; 237 return 0;
237} 238}
238 239
239 240
240int card_detect_channels (char * device) 241int card_detect_channels (char * device)
241{ 242{
242 int skfd; 243 int skfd;
243 skfd = socket(AF_INET, SOCK_STREAM, 0); 244 skfd = socket(AF_INET, SOCK_STREAM, 0);
244 struct iw_rangerange; 245 struct iw_rangerange;
245 /* Get list of frequencies / channels */ 246 /* Get list of frequencies / channels */
246 printf ("\n hostap card get the frequencies"); 247 printf ("\n hostap card get the frequencies");
247 /* Get list of frequencies / channels */ 248 /* Get list of frequencies / channels */
248 if(iw_get_range_info(skfd, device, &range) < 0) 249 if(iw_get_range_info(skfd, device, &range) < 0)
249 { /* We are failsave if something went wrong, asume only 11 channels */ 250 { /* We are failsave if something went wrong, asume only 11 channels */
250 return 11; 251 return 11;
251 } 252 }
252 else 253 else
253 { 254 {
254 if(range.num_frequency > 0) 255 if(range.num_frequency > 0)
255 { 256 {
256 return range.num_frequency; 257 return range.num_frequency;
257 } 258 }
258 else 259 else
259 { /* We are failsave asume only 11 channels */ 260 { /* We are failsave asume only 11 channels */
260 return 11; 261 return 11;
261 } 262 }
262 } 263 }
263 264
264} /* End of card_detect_channels */ 265} /* End of card_detect_channels */
265 266
266int iw_get_range_info(int skfd, const char * ifname, iw_range * range) 267int iw_get_range_info(int skfd, const char * ifname, iw_range * range)
267{ 268{
268 struct iwreq wrq2; 269 struct iwreq wrq2;
269 char buffer[sizeof(iw_range) * 2];/* Large enough */ 270 char buffer[sizeof(iw_range) * 2];/* Large enough */
270 271
271 /* Cleanup */ 272 /* Cleanup */
272 memset(buffer, 0, sizeof(buffer)); 273 memset(buffer, 0, sizeof(buffer));
273 wrq2.u.data.pointer = (caddr_t) buffer; 274 wrq2.u.data.pointer = (caddr_t) buffer;
274 wrq2.u.data.length = sizeof(buffer); 275 wrq2.u.data.length = sizeof(buffer);
275 wrq2.u.data.flags = 0; 276 wrq2.u.data.flags = 0;
276 277
277 if(iw_get_ext(skfd, (char *)ifname, SIOCGIWRANGE, &wrq2) < 0) 278 if(iw_get_ext(skfd, (char *)ifname, SIOCGIWRANGE, &wrq2) < 0)
278 { 279 {
279 wl_logerr("Could not get the range from the interface"); 280 wl_logerr("Could not get the range from the interface");
280 return(-1); 281 return(-1);
281 } 282 }
282 else 283 else
283 { 284 {
284 /* Copy stuff at the right place, ignore extra */ 285 /* Copy stuff at the right place, ignore extra */
285 memcpy((char *) range, buffer, sizeof(iw_range)); 286 memcpy((char *) range, buffer, sizeof(iw_range));
286 return 0; 287 return 0;
287 } 288 }
288} 289}
289 290
290/*------------------------------------------------------------------*/ 291/*------------------------------------------------------------------*/
291/* 292/*
292 * Convert our internal representation of frequencies to a floating point. 293 * Convert our internal representation of frequencies to a floating point.
293 */ 294 */
294double iw_freq2float(iw_freq * in) 295double iw_freq2float(iw_freq * in)
295{ 296{
296 int i; 297 int i;
297 double res = (double) in->m; 298 double res = (double) in->m;
298 for(i = 0; i < in->e; i++) 299 for(i = 0; i < in->e; i++)
299 res *= 10; 300 res *= 10;
300 return(res); 301 return(res);
301} 302}
302 303
303 304
304 void iw_float2freq(double in, iw_freq *out) 305 void iw_float2freq(double in, iw_freq *out)
305{ 306{
306 /* Version without libm : slower */ 307 /* Version without libm : slower */
307 out->e = 0; 308 out->e = 0;
308 while(in > 1e9) 309 while(in > 1e9)
309 { 310 {
310 in /= 10; 311 in /= 10;
311 out->e++; 312 out->e++;
312 } 313 }
313 out->m = (long) in; 314 out->m = (long) in;
314} 315}
315 316
316 317
317 318