summaryrefslogtreecommitdiff
Unidiff
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
@@ -1,206 +1,312 @@
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, 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 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);
73 return 0; 80 return 0;
74 } 81 }
75 else 82 else
76 { 83 {
77 wl_loginfo("Successfully set %s into raw mode",device); 84 wl_loginfo("Successfully set %s into raw mode",device);
78 } 85 }
79 } 86 }
80 87
81 /* Setting the promiscous and up flag to the interface */ 88 /* Setting the promiscous and up flag to the interface */
82 if (!card_check_rfmon_datalink(device)) 89 if (!card_check_rfmon_datalink(device))
83 { 90 {
84 wl_logerr("Cannot set interface to rfmon mode"); 91 wl_logerr("Cannot set interface to rfmon mode");
85 return 0; 92 return 0;
86 } 93 }
87 else 94 else
88 { 95 {
89 wl_loginfo("Interface set to rfmon mode"); 96 wl_loginfo("Interface set to rfmon mode");
90 } 97 }
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);
100 datalinktype = pcap_datalink (phandle); 107 datalinktype = pcap_datalink (phandle);
101 pcap_close(phandle); 108 pcap_close(phandle);
102 109
103 if (datalinktype != DLT_IEEE802_11) /* Rawmode is IEEE802_11 */ 110 if (datalinktype != DLT_IEEE802_11) /* Rawmode is IEEE802_11 */
104 { 111 {
105 return 0; 112 return 0;
106 } 113 }
107 else 114 else
108 { 115 {
109 wl_loginfo("Your successfully listen on %s in 802.11 raw mode", device); 116 wl_loginfo("Your successfully listen on %s in 802.11 raw mode", device);
110 return 1; 117 return 1;
111 } 118 }
112} 119}
113 120
114/* Set card into promisc mode */ 121/* Set card into promisc mode */
115int card_set_promisc_up (const char *device) 122int card_set_promisc_up (const char *device)
116{ 123{
117 int err; 124 int err;
118 /* First generate a socket to use with iocalls */ 125 /* First generate a socket to use with iocalls */
119 int fd = socket(AF_INET, SOCK_DGRAM, 0); 126 int fd = socket(AF_INET, SOCK_DGRAM, 0);
120 if (fd < 0) 127 if (fd < 0)
121 { 128 {
122 /* In case of an error */ 129 /* In case of an error */
123 perror("socket"); 130 perror("socket");
124 return 0; 131 return 0;
125 } 132 }
126 133
127 /* Fill an empty an interface structure with the right flags (UP and Promsic) */ 134 /* Fill an empty an interface structure with the right flags (UP and Promsic) */
128 struct ifreq ifr; 135 struct ifreq ifr;
129 strncpy(ifr.ifr_name, device,10); 136 strncpy(ifr.ifr_name, device,10);
130 ifr.ifr_flags = IFF_UP + IFF_PROMISC; 137 ifr.ifr_flags = IFF_UP + IFF_PROMISC;
131 err = ioctl(fd, SIOCSIFFLAGS, &ifr); 138 err = ioctl(fd, SIOCSIFFLAGS, &ifr);
132 if (err < 0) 139 if (err < 0)
133 { 140 {
134 perror("Could not access the interface, "); 141 perror("Could not access the interface, ");
135 close(fd); 142 close(fd);
136 return 0; 143 return 0;
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);
146 return 0; 153 return 0;
147 } 154 }
148 155
149 if(ifr.ifr_flags && IFF_UP) 156 if(ifr.ifr_flags && IFF_UP)
150 { 157 {
151 close(fd); 158 close(fd);
152 return 1; 159 return 1;
153 } 160 }
154 else 161 else
155 { 162 {
156 wl_logerr("Could not set promisc flag on %d", device); 163 wl_logerr("Could not set promisc flag on %d", device);
157 close(fd); 164 close(fd);
158 return 0; 165 return 0;
159 } 166 }
160} 167}
161 168
162/* Set channel (Wireless frequency) of the device */ 169/* Set channel (Wireless frequency) of the device */
163int card_set_channel (const char *device, int channel, int cardtype) 170int card_set_channel (const char *device, int channel, int cardtype)
164{ 171{
165 if (cardtype == CARD_TYPE_CISCO || cardtype == CARD_TYPE_NG) 172 if (cardtype == CARD_TYPE_CISCO || cardtype == CARD_TYPE_NG)
166 { 173 {
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;
176 int *ptr; 183 int *ptr;
177 /* Socket needed to use the iocall to */ 184 /* Socket needed to use the iocall to */
178 fd = socket(AF_INET, SOCK_STREAM, 0); 185 fd = socket(AF_INET, SOCK_STREAM, 0);
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;
187 strcpy(ireq.ifr_ifrn.ifrn_name, device); 195 strcpy(ireq.ifr_ifrn.ifrn_name, device);
188 if (ioctl( fd, SIOCIWFIRSTPRIV + 0x8, &ireq)==0) 196 if (ioctl( fd, SIOCIWFIRSTPRIV + 0x8, &ireq)==0)
189 { 197 {
190 /* All was fine... */ 198 /* All was fine... */
191 close(fd); 199 close(fd);
192 wl_loginfo("Set channel %d on interface %s",channel, device); 200 wl_loginfo("Set channel %d on interface %s",channel, device);
193 return 1; 201 return 1;
194 } 202 }
195 else 203 else
196 { 204 {
197 /* iocall does not work */ 205 /* iocall does not work */
198 close(fd); 206 close(fd);
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
@@ -14,35 +14,80 @@
14#include <sys/ioctl.h> 14#include <sys/ioctl.h>
15#include <unistd.h> 15#include <unistd.h>
16#include <linux/if.h> 16#include <linux/if.h>
17#include <linux/wireless.h> 17#include <linux/wireless.h>
18 18
19#ifndef SIOCIWFIRSTPRIV 19#ifndef SIOCIWFIRSTPRIV
20#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE 20#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE
21#endif 21#endif
22 22
23 23
24extern "C" 24extern "C"
25{ 25{
26#include <net/bpf.h> 26#include <net/bpf.h>
27#include <pcap.h> 27#include <pcap.h>
28} 28}
29 29
30/* Defines, used for the card setup */ 30/* Defines, used for the card setup */
31#define DEFAULT_PATH "/proc/driver/aironet/%s/Config" 31#define DEFAULT_PATH "/proc/driver/aironet/%s/Config"
32#define CISCO_STATUS "/proc/driver/aironet/%s/Status" 32#define CISCO_STATUS "/proc/driver/aironet/%s/Status"
33 #define CARD_TYPE_CISCO 1 33 #define CARD_TYPE_CISCO 1
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 */