summaryrefslogtreecommitdiff
path: root/noncore/net/wellenreiter/daemon/source/cardmode.cc
blob: ae32af442ec8aabc4a345696163a5b55eea869aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* $Id$ */

#include "cardmode.hh"

int card_into_monitormode (char *device, int cardtype)
{

	int datalink; /* used for getting the pcap datalink type */
	char CiscoRFMON[35] = "/proc/driver/aironet/";
	FILE *CISCO_CONFIG_FILE;
	char errbuf[PCAP_ERRBUF_SIZE];
	pcap_t *handle;
	
	/* Checks if we have a device to sniff on */
	if(device == NULL)
	{
		printf ("Fatal error i did not have any interfaces to sniff on\n");
		return 0;
    }

	/* Setting the prmiscous and up flag to the interface */
	if (card_set_promisc_up (device) == 0)
	{
		printf ("Interface flags correctly set using ifconfig\n");
	}

	/* Check the cardtype and executes the commands to go into monitor mode */
	if (cardtype == CARD_TYPE_CISCO) /* I got a cisco card */
	{
		/* bring the sniffer into rfmon  mode */
		snprintf(CiscoRFMON, sizeof(CiscoRFMON),DEFAULT_PATH, device);
		CISCO_CONFIG_FILE = fopen(CiscoRFMON,"w");
		fputs ("Mode: r",CISCO_CONFIG_FILE);
		fputs ("Mode: y",CISCO_CONFIG_FILE);
		fputs ("XmitPower: 1",CISCO_CONFIG_FILE);
		fclose(CISCO_CONFIG_FILE);
	}
	else if (cardtype == CARD_TYPE_NG)
	{
		char wlanngcmd[62];
		snprintf(wlanngcmd, sizeof(wlanngcmd),"%s %s lnxreq_wlansniff channel=1 enable=true",WLANCTL_PATH,device);
		if (system (wlanngcmd) != 0)
		{
			printf ("\n Fatal error could not set %s in raw mode, check cardtype\n",device);
			return 0;
	    }
	}
	else if (cardtype == CARD_TYPE_HOSTAP)
	{
		printf ("Got a host-ap card, nothing is implemented now\n");
	}

	
	/* Check the interface if it is in the correct raw mode */
    handle = pcap_open_live(device, BUFSIZ, 1, 0, errbuf);

	/* getting the datalink type */
    datalink = pcap_datalink(handle);

	if (datalink == DLT_IEEE802_11) /* Rawmode is IEEE802_11 */
	{
		printf ("Your successfully listen on %s in 802.11 raw mode\n",device);
		pcap_close(handle); 
		return 0;

	}
	else 
	{
		printf ("Fatal error, cannot continue, your interface %s does not work in the correct 802.11 raw mode, check you driver please\n",device);
		pcap_close(handle); 
		return 0;
	}
}



int card_set_promisc_up (char * device)
{
	int ret;
	char ifconfigcmd[32];
	snprintf(ifconfigcmd,sizeof(ifconfigcmd),SBIN_PATH, device);
	ret = system (ifconfigcmd);
	if (ret > 0)
	{
		printf ("\nFatal error, could not execute %s please check your card,binary location and permission\n",ifconfigcmd);
		return 0;
	}
	return 1;
}