summaryrefslogtreecommitdiff
authormjm <mjm>2002-11-12 22:12:33 (UTC)
committer mjm <mjm>2002-11-12 22:12:33 (UTC)
commiteaecbed44924ece119c5b41db2828b4554f263d2 (patch) (unidiff)
treeb87dd3d049ea1768b20192f6c674f8684a41282c
parent15bc80dffd7a4c52985a742cb3a439da42692478 (diff)
downloadopie-eaecbed44924ece119c5b41db2828b4554f263d2.zip
opie-eaecbed44924ece119c5b41db2828b4554f263d2.tar.gz
opie-eaecbed44924ece119c5b41db2828b4554f263d2.tar.bz2
pre-alpha version, most things does not work yet.
todo: communication protocol with GUI and implementation of sniffer
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/daemon/source/Makefile31
-rw-r--r--noncore/net/wellenreiter/daemon/source/README5
-rw-r--r--noncore/net/wellenreiter/daemon/source/TODO5
-rw-r--r--noncore/net/wellenreiter/daemon/source/config.hh22
-rw-r--r--noncore/net/wellenreiter/daemon/source/daemon.cc82
-rw-r--r--noncore/net/wellenreiter/daemon/source/daemon.hh16
-rw-r--r--noncore/net/wellenreiter/daemon/source/extract.hh (renamed from noncore/net/wellenreiter/daemon/source/extract.h)9
-rw-r--r--noncore/net/wellenreiter/daemon/source/getgui.cc43
-rw-r--r--noncore/net/wellenreiter/daemon/source/getgui.hh16
-rw-r--r--noncore/net/wellenreiter/daemon/source/ieee802_11.hh (renamed from noncore/net/wellenreiter/daemon/source/ieee802_11.h)7
-rw-r--r--noncore/net/wellenreiter/daemon/source/log.cc52
-rw-r--r--noncore/net/wellenreiter/daemon/source/log.hh14
-rw-r--r--noncore/net/wellenreiter/daemon/source/sendgui.cc75
-rw-r--r--noncore/net/wellenreiter/daemon/source/sendgui.hh20
-rw-r--r--noncore/net/wellenreiter/daemon/source/sniffer.cc (renamed from noncore/net/wellenreiter/daemon/source/sniffer.c)98
-rw-r--r--noncore/net/wellenreiter/daemon/source/sniffer.hh (renamed from noncore/net/wellenreiter/daemon/source/sniffer.h)35
16 files changed, 437 insertions, 93 deletions
diff --git a/noncore/net/wellenreiter/daemon/source/Makefile b/noncore/net/wellenreiter/daemon/source/Makefile
new file mode 100644
index 0000000..dc459af
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/Makefile
@@ -0,0 +1,31 @@
1# $Id$
2
3 CPP = g++
4
5 CFLAGS=
6 OPTIMFLAGS= -g
7 WARNFLAGS= -Wall -pedantic -DDEBUG
8 LDFLAGS =
9 LIBS = -lpcap
10 OBJ = daemon.o log.o sendgui.o getgui.o sniffer.o
11
12.SUFFIXES:
13 .PHONY: all wellenreiterd clean distclean realclean
14
15%.o : %.cc
16 $(CPP) $(CFLAGS) $(WARNFLAGS) $(OPTIMFLAGS) -c $< -o $@
17
18 all:wellenreiterd
19
20 wellenreiterd:$(OBJ)
21 $(CPP) $(OPTIMFLAGS) $(WARNFLAGS) $(CFLAGS) $(OBJ) $(LDFLAGS) $(LIBS) -o $@
22 @echo Build wellenreiterd
23
24clean distclean realclean:
25 @rm -rf wellenreiterd *~ *.o
26 @echo All dependent files have been removed.
27
28 wellenreiterd.o:config.hh
29 serve.o: config.hh
30 log.o: config.hh
31 sendgui.o: config.hh
diff --git a/noncore/net/wellenreiter/daemon/source/README b/noncore/net/wellenreiter/daemon/source/README
deleted file mode 100644
index 249d950..0000000
--- a/noncore/net/wellenreiter/daemon/source/README
+++ b/dev/null
@@ -1,5 +0,0 @@
1compile it using:
2
3gcc -o sniffer ./sniffer.c -lpcap
4
5
diff --git a/noncore/net/wellenreiter/daemon/source/TODO b/noncore/net/wellenreiter/daemon/source/TODO
new file mode 100644
index 0000000..39b1a05
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/TODO
@@ -0,0 +1,5 @@
1implement communication protocol
2security analysis
3implement sniffer (last step)
4security analysis
5code cleanup \ No newline at end of file
diff --git a/noncore/net/wellenreiter/daemon/source/config.hh b/noncore/net/wellenreiter/daemon/source/config.hh
new file mode 100644
index 0000000..b124f41
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/config.hh
@@ -0,0 +1,22 @@
1/*
2 *
3 * Global configuration for wellenreiter
4 *
5 * $Id$
6 *
7 * Written by Martin J. Muench <mjm@codito.de>
8 *
9 */
10
11#ifndef CONFIG_HH
12#define CONFIG_HH
13
14#define PROGNAME "wellenreiter" /* Name of program (for syslog et.al.) */
15#define VERSION "0.2" /* Version of wellenreiter */
16
17#define DAEMONPORT 37772 /* Port of Daemon */
18
19#define GUIADDR "127.0.0.1" /* Adress of GUI, later specified in configfile */
20#define GUIPORT 37773 /* Port of GUI, " " */
21
22#endif /* CONFIG_HH */
diff --git a/noncore/net/wellenreiter/daemon/source/daemon.cc b/noncore/net/wellenreiter/daemon/source/daemon.cc
new file mode 100644
index 0000000..7972c0f
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/daemon.cc
@@ -0,0 +1,82 @@
1/*
2 * Startup functions of wellenreiter
3 *
4 * $Id$
5 */
6
7#include "config.hh"
8#include "daemon.hh"
9#include "log.hh"
10#include "sendgui.hh"
11#include "getgui.hh"
12
13/* Main function of wellenreiterd */
14int main(int argc, char **argv)
15{
16 int sock, maxfd;
17 struct sockaddr_in *cliaddr;
18 socklen_t len=sizeof(struct sockaddr);
19 char buffer[128];
20 FILE *fp=stdin; /* Will be replaced with sniffer */
21 fd_set rset;
22
23 fprintf(stderr, "wellenreiterd %s\n\n", VERSION);
24
25 /* Setup socket for incoming commands */
26 if(!commsock(&sock))
27 return 0;
28
29 log_info("Set up socket '%d' for GUI communication", sock);
30
31 FD_ZERO(&rset);
32
33 /* Start main loop */
34 log_info("Starting main loop");
35 while(1)
36 {
37
38 FD_SET(sock, &rset);
39 FD_SET(fileno(fp), &rset);
40 maxfd=sock+fileno(fp)+1;
41 if(select(maxfd, &rset, NULL, NULL, NULL) < 0)
42 {
43 log_err("Error calling select: %s", strerror(errno));
44 break;
45 }
46
47 /* Got data on local socket from GUI */
48 if(FD_ISSET(sock, &rset))
49 {
50 memset(buffer, 0, sizeof(buffer));
51 if(recvfrom(sock, buffer, sizeof(buffer)-1, 0, (struct sockaddr *)cliaddr, &len) < 0)
52 {
53 log_err("Cannot read from socket: %s", strerror(errno));
54 break;
55 }
56 log_info("Received command from '%s': %s", inet_ntoa(cliaddr->sin_addr), buffer);
57
58 /* Pass string to analyze function */
59 commstring(buffer);
60
61 }
62
63 /* Will be replaced with sniffer ... later */
64 if(FD_ISSET(fileno(fp), &rset))
65 {
66 memset(buffer, 0, sizeof(buffer));
67 if(fgets(buffer, sizeof(buffer) - 1, fp) == NULL)
68 {
69 log_err("Cannot read from stdin: %s", strerror(errno));
70 break;
71 }
72
73 /* Send string to GUI */
74 sendgui("%d: %s", 1234, buffer);
75
76 }
77
78 }
79
80 close(sock);
81 return 0;
82}
diff --git a/noncore/net/wellenreiter/daemon/source/daemon.hh b/noncore/net/wellenreiter/daemon/source/daemon.hh
new file mode 100644
index 0000000..6776d37
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/daemon.hh
@@ -0,0 +1,16 @@
1/* $Id$ */
2
3#ifndef DAEMON_HH
4#define DAEMON_HH
5
6#include <stdio.h>
7#include <string.h>
8#include <sys/types.h>
9#include <sys/time.h>
10#include <sys/socket.h>
11#include <netinet/in.h>
12#include <arpa/inet.h>
13#include <unistd.h>
14#include <errno.h>
15
16#endif /* DAEMON_HH */
diff --git a/noncore/net/wellenreiter/daemon/source/extract.h b/noncore/net/wellenreiter/daemon/source/extract.hh
index c1bcdcd..21dcffa 100644
--- a/noncore/net/wellenreiter/daemon/source/extract.h
+++ b/noncore/net/wellenreiter/daemon/source/extract.hh
@@ -1,57 +1,60 @@
1/* $Id */
1/* 2/*
2 * Copyright (c) 1992, 1993, 1994, 1995, 1996 3 * Copyright (c) 1992, 1993, 1994, 1995, 1996
3 *The Regents of the University of California. All rights reserved. 4 *The Regents of the University of California. All rights reserved.
4 * 5 *
5 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that: (1) source code distributions 7 * modification, are permitted provided that: (1) source code distributions
7 * retain the above copyright notice and this paragraph in its entirety, (2) 8 * retain the above copyright notice and this paragraph in its entirety, (2)
8 * distributions including binary code include the above copyright notice and 9 * distributions including binary code include the above copyright notice and
9 * this paragraph in its entirety in the documentation or other materials 10 * this paragraph in its entirety in the documentation or other materials
10 * provided with the distribution, and (3) all advertising materials mentioning 11 * provided with the distribution, and (3) all advertising materials mentioning
11 * features or use of this software display the following acknowledgement: 12 * features or use of this software display the following acknowledgement:
12 * ``This product includes software developed by the University of California, 13 * ``This product includes software developed by the University of California,
13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14 * the University nor the names of its contributors may be used to endorse 15 * the University nor the names of its contributors may be used to endorse
15 * or promote products derived from this software without specific prior 16 * or promote products derived from this software without specific prior
16 * written permission. 17 * written permission.
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 * @(#) $Header$ (LBL)
22 */ 21 */
23
24/* Network to host order macros */ 22/* Network to host order macros */
25 23
24#ifndef EXTRACT_HH
25#define EXTRACT_HH
26
26#ifdef LBL_ALIGN 27#ifdef LBL_ALIGN
27#define EXTRACT_16BITS(p) \ 28#define EXTRACT_16BITS(p) \
28 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 0) << 8 | \ 29 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 0) << 8 | \
29 (u_int16_t)*((const u_int8_t *)(p) + 1))) 30 (u_int16_t)*((const u_int8_t *)(p) + 1)))
30#define EXTRACT_32BITS(p) \ 31#define EXTRACT_32BITS(p) \
31 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 24 | \ 32 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 24 | \
32 (u_int32_t)*((const u_int8_t *)(p) + 1) << 16 | \ 33 (u_int32_t)*((const u_int8_t *)(p) + 1) << 16 | \
33 (u_int32_t)*((const u_int8_t *)(p) + 2) << 8 | \ 34 (u_int32_t)*((const u_int8_t *)(p) + 2) << 8 | \
34 (u_int32_t)*((const u_int8_t *)(p) + 3))) 35 (u_int32_t)*((const u_int8_t *)(p) + 3)))
35#else 36#else
36#define EXTRACT_16BITS(p) \ 37#define EXTRACT_16BITS(p) \
37 ((u_int16_t)ntohs(*(const u_int16_t *)(p))) 38 ((u_int16_t)ntohs(*(const u_int16_t *)(p)))
38#define EXTRACT_32BITS(p) \ 39#define EXTRACT_32BITS(p) \
39 ((u_int32_t)ntohl(*(const u_int32_t *)(p))) 40 ((u_int32_t)ntohl(*(const u_int32_t *)(p)))
40#endif 41#endif
41 42
42#define EXTRACT_24BITS(p) \ 43#define EXTRACT_24BITS(p) \
43 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 16 | \ 44 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 0) << 16 | \
44 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \ 45 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
45 (u_int32_t)*((const u_int8_t *)(p) + 2))) 46 (u_int32_t)*((const u_int8_t *)(p) + 2)))
46 47
47/* Little endian protocol host order macros */ 48/* Little endian protocol host order macros */
48 49
49#define EXTRACT_LE_8BITS(p) (*(p)) 50#define EXTRACT_LE_8BITS(p) (*(p))
50#define EXTRACT_LE_16BITS(p) \ 51#define EXTRACT_LE_16BITS(p) \
51 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 1) << 8 | \ 52 ((u_int16_t)((u_int16_t)*((const u_int8_t *)(p) + 1) << 8 | \
52 (u_int16_t)*((const u_int8_t *)(p) + 0))) 53 (u_int16_t)*((const u_int8_t *)(p) + 0)))
53#define EXTRACT_LE_32BITS(p) \ 54#define EXTRACT_LE_32BITS(p) \
54 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 3) << 24 | \ 55 ((u_int32_t)((u_int32_t)*((const u_int8_t *)(p) + 3) << 24 | \
55 (u_int32_t)*((const u_int8_t *)(p) + 2) << 16 | \ 56 (u_int32_t)*((const u_int8_t *)(p) + 2) << 16 | \
56 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \ 57 (u_int32_t)*((const u_int8_t *)(p) + 1) << 8 | \
57 (u_int32_t)*((const u_int8_t *)(p) + 0))) 58 (u_int32_t)*((const u_int8_t *)(p) + 0)))
59
60#endif /* EXTRACT_HH */
diff --git a/noncore/net/wellenreiter/daemon/source/getgui.cc b/noncore/net/wellenreiter/daemon/source/getgui.cc
new file mode 100644
index 0000000..f56f40b
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/getgui.cc
@@ -0,0 +1,43 @@
1/*
2 * Setup UDP socket for commands
3 * Misc wrapper functions for incoming commands
4 *
5 * $Id$
6 */
7
8#include "config.hh"
9#include "getgui.hh"
10#include "log.hh"
11
12struct sockaddr_in saddr;
13
14/* Setup UDP Socket for incoming commands */
15int commsock(int *sock)
16{
17
18 if((*sock=socket(AF_INET, SOCK_DGRAM, 0)) < 0)
19 {
20 log_err("Cannot set up socket: %s", strerror(errno));
21 return 0;
22 }
23
24 memset(&saddr, 0, sizeof(saddr));
25 saddr.sin_family = PF_INET;
26 saddr.sin_port = htons(DAEMONPORT);
27 saddr.sin_addr.s_addr = htonl(INADDR_ANY);
28
29 if(bind(*sock,(struct sockaddr *)&saddr, sizeof(saddr)) < 0)
30 {
31 log_err("Cannot bind socket: %s", strerror(errno));
32 close(*sock);
33 return 0;
34 }
35
36 return 1;
37}
38
39int commstring(const char *input)
40{
41
42 return 1;
43}
diff --git a/noncore/net/wellenreiter/daemon/source/getgui.hh b/noncore/net/wellenreiter/daemon/source/getgui.hh
new file mode 100644
index 0000000..f5a37f9
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/getgui.hh
@@ -0,0 +1,16 @@
1/* $id */
2
3#ifndef GETGUI_HH
4#define GETGUI_HH
5
6#include <sys/types.h>
7#include <sys/socket.h>
8#include <netinet/in.h>
9#include <string.h>
10#include <unistd.h>
11#include <errno.h>
12
13int commsock(int *);
14int commstring(const char *);
15
16#endif /* GETGUI_HH */
diff --git a/noncore/net/wellenreiter/daemon/source/ieee802_11.h b/noncore/net/wellenreiter/daemon/source/ieee802_11.hh
index 497e6ed..3cc5343 100644
--- a/noncore/net/wellenreiter/daemon/source/ieee802_11.h
+++ b/noncore/net/wellenreiter/daemon/source/ieee802_11.hh
@@ -1,245 +1,250 @@
1/* @(#) $Header$ (LBL) */ 1/* $Id$ */
2/* 2/*
3 * Copyright (c) 2001 3 * Copyright (c) 2001
4 *Fortress Technologies 4 *Fortress Technologies
5 * Charlie Lenahan ( clenahan@fortresstech.com ) 5 * Charlie Lenahan ( clenahan@fortresstech.com )
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that: (1) source code distributions 8 * modification, are permitted provided that: (1) source code distributions
9 * retain the above copyright notice and this paragraph in its entirety, (2) 9 * retain the above copyright notice and this paragraph in its entirety, (2)
10 * distributions including binary code include the above copyright notice and 10 * distributions including binary code include the above copyright notice and
11 * this paragraph in its entirety in the documentation or other materials 11 * this paragraph in its entirety in the documentation or other materials
12 * provided with the distribution, and (3) all advertising materials mentioning 12 * provided with the distribution, and (3) all advertising materials mentioning
13 * features or use of this software display the following acknowledgement: 13 * features or use of this software display the following acknowledgement:
14 * ``This product includes software developed by the University of California, 14 * ``This product includes software developed by the University of California,
15 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 15 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16 * the University nor the names of its contributors may be used to endorse 16 * the University nor the names of its contributors may be used to endorse
17 * or promote products derived from this software without specific prior 17 * or promote products derived from this software without specific prior
18 * written permission. 18 * written permission.
19 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 19 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 20 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22 */ 22 */
23 23
24#ifndef IEEE802_11_HH
25#define IEEE802_11_HH
26
24 #define IEEE802_11_FC_LEN2 27 #define IEEE802_11_FC_LEN2
25 28
26#define T_MGMT 0x0 /* management */ 29#define T_MGMT 0x0 /* management */
27#define T_CTRL 0x1 /* control */ 30#define T_CTRL 0x1 /* control */
28#define T_DATA 0x2 /* data */ 31#define T_DATA 0x2 /* data */
29#define T_RESV 0x3 /* reserved */ 32#define T_RESV 0x3 /* reserved */
30 33
31 #define ST_ASSOC_REQUEST 0x0 34 #define ST_ASSOC_REQUEST 0x0
32 #define ST_ASSOC_RESPONSE 0x1 35 #define ST_ASSOC_RESPONSE 0x1
33 #define ST_REASSOC_REQUEST 0x2 36 #define ST_REASSOC_REQUEST 0x2
34 #define ST_REASSOC_RESPONSE 0x3 37 #define ST_REASSOC_RESPONSE 0x3
35 #define ST_PROBE_REQUEST 0x4 38 #define ST_PROBE_REQUEST 0x4
36 #define ST_PROBE_RESPONSE 0x5 39 #define ST_PROBE_RESPONSE 0x5
37 /* RESERVED 0x6 */ 40 /* RESERVED 0x6 */
38 /* RESERVED 0x7 */ 41 /* RESERVED 0x7 */
39 #define ST_BEACON 0x8 42 #define ST_BEACON 0x8
40 #define ST_ATIM 0x9 43 #define ST_ATIM 0x9
41 #define ST_DISASSOC 0xA 44 #define ST_DISASSOC 0xA
42 #define ST_AUTH 0xB 45 #define ST_AUTH 0xB
43 #define ST_DEAUTH 0xC 46 #define ST_DEAUTH 0xC
44 /* RESERVED 0xD */ 47 /* RESERVED 0xD */
45 /* RESERVED 0xE */ 48 /* RESERVED 0xE */
46 /* RESERVED 0xF */ 49 /* RESERVED 0xF */
47 50
48 51
49 #define CTRL_PS_POLL0xA 52 #define CTRL_PS_POLL0xA
50 #define CTRL_RTS0xB 53 #define CTRL_RTS0xB
51 #define CTRL_CTS0xC 54 #define CTRL_CTS0xC
52 #define CTRL_ACK0xD 55 #define CTRL_ACK0xD
53 #define CTRL_CF_END0xE 56 #define CTRL_CF_END0xE
54 #define CTRL_END_ACK0xF 57 #define CTRL_END_ACK0xF
55 58
56/* 59/*
57 * Bits in the frame control field. 60 * Bits in the frame control field.
58 */ 61 */
59 #define FC_VERSION(fc) ((fc) & 0x3) 62 #define FC_VERSION(fc) ((fc) & 0x3)
60 #define FC_TYPE(fc) (((fc) >> 2) & 0x3) 63 #define FC_TYPE(fc) (((fc) >> 2) & 0x3)
61 #define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF) 64 #define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF)
62 #define FC_TO_DS(fc) ((fc) & 0x0100) 65 #define FC_TO_DS(fc) ((fc) & 0x0100)
63 #define FC_FROM_DS(fc) ((fc) & 0x0200) 66 #define FC_FROM_DS(fc) ((fc) & 0x0200)
64 #define FC_MORE_FLAG(fc)((fc) & 0x0400) 67 #define FC_MORE_FLAG(fc)((fc) & 0x0400)
65 #define FC_RETRY(fc) ((fc) & 0x0800) 68 #define FC_RETRY(fc) ((fc) & 0x0800)
66 #define FC_POWER_MGMT(fc)((fc) & 0x1000) 69 #define FC_POWER_MGMT(fc)((fc) & 0x1000)
67 #define FC_MORE_DATA(fc)((fc) & 0x2000) 70 #define FC_MORE_DATA(fc)((fc) & 0x2000)
68 #define FC_WEP(fc) ((fc) & 0x4000) 71 #define FC_WEP(fc) ((fc) & 0x4000)
69 #define FC_ORDER(fc) ((fc) & 0x8000) 72 #define FC_ORDER(fc) ((fc) & 0x8000)
70 73
71struct mgmt_header_t { 74struct mgmt_header_t {
72 u_int16_tfc; 75 u_int16_tfc;
73 u_int16_t duration; 76 u_int16_t duration;
74 u_int8_tda[6]; 77 u_int8_tda[6];
75 u_int8_tsa[6]; 78 u_int8_tsa[6];
76 u_int8_tbssid[6]; 79 u_int8_tbssid[6];
77 u_int16_tseq_ctrl; 80 u_int16_tseq_ctrl;
78}; 81};
79 82
80 #define MGMT_HEADER_LEN(2+2+6+6+6+2) 83 #define MGMT_HEADER_LEN(2+2+6+6+6+2)
81 84
82 #define CAPABILITY_ESS(cap)((cap) & 0x0001) 85 #define CAPABILITY_ESS(cap)((cap) & 0x0001)
83 #define CAPABILITY_IBSS(cap)((cap) & 0x0002) 86 #define CAPABILITY_IBSS(cap)((cap) & 0x0002)
84 #define CAPABILITY_CFP(cap)((cap) & 0x0004) 87 #define CAPABILITY_CFP(cap)((cap) & 0x0004)
85 #define CAPABILITY_CFP_REQ(cap)((cap) & 0x0008) 88 #define CAPABILITY_CFP_REQ(cap)((cap) & 0x0008)
86 #define CAPABILITY_PRIVACY(cap)((cap) & 0x0010) 89 #define CAPABILITY_PRIVACY(cap)((cap) & 0x0010)
87 90
88struct ssid_t { 91struct ssid_t {
89 u_int8_telement_id; 92 u_int8_telement_id;
90 u_int8_tlength; 93 u_int8_tlength;
91 u_char ssid[33]; /* 32 + 1 for null */ 94 u_char ssid[33]; /* 32 + 1 for null */
92} ; 95} ;
93 96
94struct rates_t { 97struct rates_t {
95 u_int8_telement_id; 98 u_int8_telement_id;
96 u_int8_tlength; 99 u_int8_tlength;
97 u_int8_trate[8]; 100 u_int8_trate[8];
98}; 101};
99 102
100struct challenge_t { 103struct challenge_t {
101 u_int8_telement_id; 104 u_int8_telement_id;
102 u_int8_tlength; 105 u_int8_tlength;
103 u_int8_ttext[254]; /* 1-253 + 1 for null */ 106 u_int8_ttext[254]; /* 1-253 + 1 for null */
104}; 107};
105struct fh_t { 108struct fh_t {
106 u_int8_telement_id; 109 u_int8_telement_id;
107 u_int8_tlength; 110 u_int8_tlength;
108 u_int16_tdwell_time; 111 u_int16_tdwell_time;
109 u_int8_thop_set; 112 u_int8_thop_set;
110 u_int8_t hop_pattern; 113 u_int8_t hop_pattern;
111 u_int8_thop_index; 114 u_int8_thop_index;
112}; 115};
113 116
114struct ds_t { 117struct ds_t {
115 u_int8_telement_id; 118 u_int8_telement_id;
116 u_int8_tlength; 119 u_int8_tlength;
117 u_int8_tchannel; 120 u_int8_tchannel;
118}; 121};
119 122
120struct cf_t { 123struct cf_t {
121 u_int8_telement_id; 124 u_int8_telement_id;
122 u_int8_tlength; 125 u_int8_tlength;
123 u_int8_tcount; 126 u_int8_tcount;
124 u_int8_tperiod; 127 u_int8_tperiod;
125 u_int16_tmax_duration; 128 u_int16_tmax_duration;
126 u_int16_tdur_remaing; 129 u_int16_tdur_remaing;
127}; 130};
128 131
129struct tim_t { 132struct tim_t {
130 u_int8_telement_id; 133 u_int8_telement_id;
131 u_int8_tlength; 134 u_int8_tlength;
132 u_int8_tcount; 135 u_int8_tcount;
133 u_int8_tperiod; 136 u_int8_tperiod;
134 u_int8_tbitmap_control; 137 u_int8_tbitmap_control;
135 u_int8_tbitmap[251]; 138 u_int8_tbitmap[251];
136}; 139};
137 140
138 #define E_SSID 0 141 #define E_SSID 0
139 #define E_RATES 1 142 #define E_RATES 1
140 #define E_FH 2 143 #define E_FH 2
141 #define E_DS 3 144 #define E_DS 3
142 #define E_CF 4 145 #define E_CF 4
143 #define E_TIM 5 146 #define E_TIM 5
144 #define E_IBSS 6 147 #define E_IBSS 6
145 #define E_CISCO 133 148 #define E_CISCO 133
146 /* reserved 7 */ 149 /* reserved 7 */
147 /* reserved 8 */ 150 /* reserved 8 */
148 /* reserved 9 */ 151 /* reserved 9 */
149 /* reserved 10 */ 152 /* reserved 10 */
150 /* reserved 11 */ 153 /* reserved 11 */
151 /* reserved 12 */ 154 /* reserved 12 */
152 /* reserved 13 */ 155 /* reserved 13 */
153 /* reserved 14 */ 156 /* reserved 14 */
154 /* reserved 15 */ 157 /* reserved 15 */
155 /* reserved 16 */ 158 /* reserved 16 */
156 159
157 #define E_CHALLENGE 16 160 #define E_CHALLENGE 16
158 /* reserved 17 */ 161 /* reserved 17 */
159 /* reserved 18 */ 162 /* reserved 18 */
160 /* reserved 19 */ 163 /* reserved 19 */
161 /* reserved 16 */ 164 /* reserved 16 */
162 /* reserved 16 */ 165 /* reserved 16 */
163 166
164 167
165struct mgmt_body_t { 168struct mgmt_body_t {
166 u_int8_t timestamp[8]; 169 u_int8_t timestamp[8];
167 u_int16_t beacon_interval; 170 u_int16_t beacon_interval;
168 u_int16_t listen_interval; 171 u_int16_t listen_interval;
169 u_int16_t status_code; 172 u_int16_t status_code;
170 u_int16_t aid; 173 u_int16_t aid;
171 u_char ap[6]; 174 u_char ap[6];
172 u_int16_treason_code; 175 u_int16_treason_code;
173 u_int16_tauth_alg; 176 u_int16_tauth_alg;
174 u_int16_tauth_trans_seq_num; 177 u_int16_tauth_trans_seq_num;
175 struct challenge_t challenge; 178 struct challenge_t challenge;
176 u_int16_tcapability_info; 179 u_int16_tcapability_info;
177 struct ssid_tssid; 180 struct ssid_tssid;
178 struct rates_t rates; 181 struct rates_t rates;
179 struct ds_tds; 182 struct ds_tds;
180 struct cf_tcf; 183 struct cf_tcf;
181 struct fh_tfh; 184 struct fh_tfh;
182 struct tim_ttim; 185 struct tim_ttim;
183}; 186};
184 187
185struct ctrl_rts_t { 188struct ctrl_rts_t {
186 u_int16_tfc; 189 u_int16_tfc;
187 u_int16_tduration; 190 u_int16_tduration;
188 u_int8_tra[6]; 191 u_int8_tra[6];
189 u_int8_tta[6]; 192 u_int8_tta[6];
190 u_int8_tfcs[4]; 193 u_int8_tfcs[4];
191}; 194};
192 195
193 #define CTRL_RTS_LEN(2+2+6+6+4) 196 #define CTRL_RTS_LEN(2+2+6+6+4)
194 197
195struct ctrl_cts_t { 198struct ctrl_cts_t {
196 u_int16_tfc; 199 u_int16_tfc;
197 u_int16_tduration; 200 u_int16_tduration;
198 u_int8_tra[6]; 201 u_int8_tra[6];
199 u_int8_tfcs[4]; 202 u_int8_tfcs[4];
200}; 203};
201 204
202 #define CTRL_CTS_LEN(2+2+6+4) 205 #define CTRL_CTS_LEN(2+2+6+4)
203 206
204struct ctrl_ack_t { 207struct ctrl_ack_t {
205 u_int16_tfc; 208 u_int16_tfc;
206 u_int16_tduration; 209 u_int16_tduration;
207 u_int8_tra[6]; 210 u_int8_tra[6];
208 u_int8_tfcs[4]; 211 u_int8_tfcs[4];
209}; 212};
210 213
211 #define CTRL_ACK_LEN(2+2+6+4) 214 #define CTRL_ACK_LEN(2+2+6+4)
212 215
213struct ctrl_ps_poll_t { 216struct ctrl_ps_poll_t {
214 u_int16_tfc; 217 u_int16_tfc;
215 u_int16_taid; 218 u_int16_taid;
216 u_int8_tbssid[6]; 219 u_int8_tbssid[6];
217 u_int8_tta[6]; 220 u_int8_tta[6];
218 u_int8_tfcs[4]; 221 u_int8_tfcs[4];
219}; 222};
220 223
221 #define CTRL_PS_POLL_LEN(2+2+6+6+4) 224 #define CTRL_PS_POLL_LEN(2+2+6+6+4)
222 225
223struct ctrl_end_t { 226struct ctrl_end_t {
224 u_int16_tfc; 227 u_int16_tfc;
225 u_int16_tduration; 228 u_int16_tduration;
226 u_int8_tra[6]; 229 u_int8_tra[6];
227 u_int8_tbssid[6]; 230 u_int8_tbssid[6];
228 u_int8_tfcs[4]; 231 u_int8_tfcs[4];
229}; 232};
230 233
231 #define CTRL_END_LEN(2+2+6+6+4) 234 #define CTRL_END_LEN(2+2+6+6+4)
232 235
233struct ctrl_end_ack_t { 236struct ctrl_end_ack_t {
234 u_int16_tfc; 237 u_int16_tfc;
235 u_int16_tduration; 238 u_int16_tduration;
236 u_int8_tra[6]; 239 u_int8_tra[6];
237 u_int8_tbssid[6]; 240 u_int8_tbssid[6];
238 u_int8_tfcs[4]; 241 u_int8_tfcs[4];
239}; 242};
240 243
241 #define CTRL_END_ACK_LEN(2+2+6+6+4) 244 #define CTRL_END_ACK_LEN(2+2+6+6+4)
242 245
243 #define IV_IV(iv)((iv) & 0xFFFFFF) 246 #define IV_IV(iv)((iv) & 0xFFFFFF)
244 #define IV_PAD(iv)(((iv) >> 24) & 0x3F) 247 #define IV_PAD(iv)(((iv) >> 24) & 0x3F)
245 #define IV_KEYID(iv)(((iv) >> 30) & 0x03) 248 #define IV_KEYID(iv)(((iv) >> 30) & 0x03)
249
250#endif /* IEEE802_11_HH */
diff --git a/noncore/net/wellenreiter/daemon/source/log.cc b/noncore/net/wellenreiter/daemon/source/log.cc
new file mode 100644
index 0000000..47589d2
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/log.cc
@@ -0,0 +1,52 @@
1/*
2 * Small functions to log to syslog
3 *
4 * $Id$
5 */
6
7#include "config.hh"
8#include "log.hh"
9
10/* Log to syslog INFO */
11void log_info(const char *fmt,...)
12{
13
14 char buffer[4096];
15 va_list ap;
16
17 memset(buffer, 0, sizeof(buffer)),
18 va_start(ap, fmt);
19 vsnprintf(buffer, sizeof(buffer)-1, fmt, ap);
20 va_end(ap);
21
22 openlog(PROGNAME, LOG_PID, LOG_SYSLOG);
23 syslog(LOG_INFO, "(info) %s", buffer);
24 closelog();
25
26#ifdef DEBUG
27 fprintf(stderr, "(info) %s\n", buffer);
28#endif
29
30}
31
32/* Log to syslog ERR */
33void log_err(const char *fmt,...)
34{
35
36 char buffer[4096];
37 va_list ap;
38
39 memset(buffer, 0, sizeof(buffer));
40 va_start(ap, fmt);
41 vsnprintf(buffer, sizeof(buffer)-1, fmt, ap);
42 va_end(ap);
43
44 openlog(PROGNAME, LOG_PID, LOG_SYSLOG);
45 syslog(LOG_INFO, "(err) %s", buffer);
46 closelog();
47
48#ifdef DEBUG
49 fprintf(stderr, "(err) %s\n", buffer);
50#endif
51
52}
diff --git a/noncore/net/wellenreiter/daemon/source/log.hh b/noncore/net/wellenreiter/daemon/source/log.hh
new file mode 100644
index 0000000..bdea7e4
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/log.hh
@@ -0,0 +1,14 @@
1/* $Id$ */
2
3#ifndef LOG_HH
4#define LOG_HH
5
6#include <stdio.h>
7#include <syslog.h>
8#include <stdarg.h>
9#include <string.h>
10
11void log_info(const char *, ...);
12void log_err(const char *, ...);
13
14#endif /* LOG_HH */
diff --git a/noncore/net/wellenreiter/daemon/source/sendgui.cc b/noncore/net/wellenreiter/daemon/source/sendgui.cc
new file mode 100644
index 0000000..48ad5b8
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/sendgui.cc
@@ -0,0 +1,75 @@
1/*
2 * Send string to GUI
3 *
4 * $Id$
5 */
6
7#include "config.hh"
8#include "sendgui.hh"
9#include "log.hh"
10
11/* Simple dummy for alarm timer */
12static void alarmdummy(int signo)
13{
14 alarm (0);
15}
16
17/* Connect to given IP on given port */
18int connect_server(int *sock, unsigned int ipaddr, int port)
19{
20 struct sockaddr_in saddr;
21 int retval=0;
22
23 *sock = socket (PF_INET, SOCK_STREAM, 0);
24 saddr.sin_family = PF_INET;
25 saddr.sin_port = htons (port);
26 saddr.sin_addr.s_addr = ipaddr;
27
28 signal (SIGALRM, alarmdummy);
29 siginterrupt (SIGALRM, 1);
30
31 alarm(5);
32 retval=connect (*sock, (struct sockaddr *) &saddr, sizeof (saddr));
33 alarm(0);
34
35 if(retval < 0)
36 {
37 close (*sock);
38 return 0;
39 }
40
41 return 1;
42}
43
44/* Send a string to the GUI */
45int sendgui(const char *string, ...)
46{
47 int sock=0;
48 char buffer[4096];
49 va_list ap;
50
51 /* Generate string */
52 memset(buffer, 0, sizeof(buffer));
53 va_start(ap, string);
54 vsnprintf(buffer, sizeof(buffer)-1, string, ap);
55 va_end(ap);
56
57 if(!connect_server(&sock, inet_addr(GUIADDR), GUIPORT))
58 {
59 log_err("Connect to GUI at '%s' failed: %s", GUIADDR, strerror(errno));
60 return 0;
61 }
62
63 if(write(sock, buffer, sizeof(buffer)) < 0)
64 {
65 log_err("Cannot write to socket: %s", strerror(errno));
66 close(sock);
67 return 0;
68 }
69
70 if(close(sock) < 0)
71 log_err("Cannot close socket: %s", strerror(errno));
72
73 return 1;
74}
75
diff --git a/noncore/net/wellenreiter/daemon/source/sendgui.hh b/noncore/net/wellenreiter/daemon/source/sendgui.hh
new file mode 100644
index 0000000..e083704
--- a/dev/null
+++ b/noncore/net/wellenreiter/daemon/source/sendgui.hh
@@ -0,0 +1,20 @@
1/* $Id$ */
2
3#ifndef SENDGUI_HH
4#define SENDGUI_HH
5
6#include <sys/types.h>
7#include <sys/socket.h>
8#include <netinet/in.h>
9#include <arpa/inet.h>
10#include <signal.h>
11#include <errno.h>
12#include <string.h>
13#include <stdio.h>
14#include <unistd.h>
15#include <stdlib.h>
16
17int connect_server(int *, unsigned int, int);
18int sendgui(const char *string, ...);
19
20#endif /* SENDGUI_HH */
diff --git a/noncore/net/wellenreiter/daemon/source/sniffer.c b/noncore/net/wellenreiter/daemon/source/sniffer.cc
index 31a5d13..c837505 100644
--- a/noncore/net/wellenreiter/daemon/source/sniffer.c
+++ b/noncore/net/wellenreiter/daemon/source/sniffer.cc
@@ -1,434 +1,418 @@
1/* Its just a simple rfmon mode sniffer 1/*
2 i hope my C is at last a bit better then in my 2 * rfmon mode sniffer
3 early days :-). 3 * This works only with cisco wireless cards with an rfmon
4 This works only with cisco wireless cards with an rfmon 4 * able driver and not with wifi stuff.
5 able driver and not with wifi stuff. 5 *
6 Btw. did i mention that i hate C? 6 * $Id$
7 7 */
8 To compile use: 8
9 gcc sniffer.c -o wlan-sniffer -lpcap 9#include "config.hh"
10 10#include "sniffer.hh"
11*/ 11#include "ieee802_11.hh"
12#include "sniffer.h" 12#include "extract.hh"
13 13
14int main(int argc, char **argv) 14int sniffer(void)
15{ 15 {
16 int ret; /* return code */ 16 if(card_into_monitormode (SNIFFER_DEVICE, CARD_TYPE_NG) < 0)
17 ret = card_into_monitormode (SNIFFER_DEVICE, CARD_TYPE_NG); 17 return 0;
18 if (ret == -1)
19 {
20 exit(-1);
21 }
22 start_sniffing (SNIFFER_DEVICE); 18 start_sniffing (SNIFFER_DEVICE);
23 19
24 return 0; 20 return 1;
25} 21}
26 22
27int card_into_monitormode (char * device, int cardtype) 23int card_into_monitormode (char *device, int cardtype)
28{ 24{
29 int ret = -1; 25
30 int datalink; /* used for getting the pcap datalink type */ 26 int datalink; /* used for getting the pcap datalink type */
31 char CiscoRFMON[35] = "/proc/driver/aironet/"; 27 char CiscoRFMON[35] = "/proc/driver/aironet/";
32 FILE *CISCO_CONFIG_FILE; 28 FILE *CISCO_CONFIG_FILE;
33 char errbuf[PCAP_ERRBUF_SIZE]; 29 char errbuf[PCAP_ERRBUF_SIZE];
34 pcap_t *handle; 30 pcap_t *handle;
35 31
36 /* Checks if we have a device to sniff on */ 32 /* Checks if we have a device to sniff on */
37 if(device == NULL) 33 if(device == NULL)
38 { 34 {
39 printf ("Fatal error i did not have any interfaces to sniff on\n"); 35 printf ("Fatal error i did not have any interfaces to sniff on\n");
40 exit(1); 36 return 0;
41 } 37 }
42 38
43 /* Setting the prmiscous and up flag to the interface */ 39 /* Setting the prmiscous and up flag to the interface */
44 if (card_set_promisc_up (device) == 0) 40 if (card_set_promisc_up (device) == 0)
45 { 41 {
46 printf ("Interface flags correctly set using ifconfig\n"); 42 printf ("Interface flags correctly set using ifconfig\n");
47 } 43 }
48 44
49 /* Check the cardtype and executes the commands to go into monitor mode */ 45 /* Check the cardtype and executes the commands to go into monitor mode */
50 if (cardtype == CARD_TYPE_CISCO) /* I got a cisco card */ 46 if (cardtype == CARD_TYPE_CISCO) /* I got a cisco card */
51 { 47 {
52 /* bring the sniffer into rfmon mode */ 48 /* bring the sniffer into rfmon mode */
53 snprintf(CiscoRFMON, sizeof(CiscoRFMON),DEFAULT_PATH, device); 49 snprintf(CiscoRFMON, sizeof(CiscoRFMON),DEFAULT_PATH, device);
54 CISCO_CONFIG_FILE = fopen(CiscoRFMON,"w"); 50 CISCO_CONFIG_FILE = fopen(CiscoRFMON,"w");
55 fputs ("Mode: r",CISCO_CONFIG_FILE); 51 fputs ("Mode: r",CISCO_CONFIG_FILE);
56 fputs ("Mode: y",CISCO_CONFIG_FILE); 52 fputs ("Mode: y",CISCO_CONFIG_FILE);
57 fputs ("XmitPower: 1",CISCO_CONFIG_FILE); 53 fputs ("XmitPower: 1",CISCO_CONFIG_FILE);
58 fclose(CISCO_CONFIG_FILE); 54 fclose(CISCO_CONFIG_FILE);
59 } 55 }
60 else if (cardtype == CARD_TYPE_NG) 56 else if (cardtype == CARD_TYPE_NG)
61 { 57 {
62 char wlanngcmd[62]; 58 char wlanngcmd[62];
63 snprintf(wlanngcmd, sizeof(wlanngcmd),"%s %s lnxreq_wlansniff channel=1 enable=true",WLANCTL_PATH,device); 59 snprintf(wlanngcmd, sizeof(wlanngcmd),"%s %s lnxreq_wlansniff channel=1 enable=true",WLANCTL_PATH,device);
64 if (ret = (system (wlanngcmd)) != 0) 60 if (system (wlanngcmd) != 0)
65 { 61 {
66 printf ("\n Fatal error could not set %s in raw mode, check cardtype\n",device); 62 printf ("\n Fatal error could not set %s in raw mode, check cardtype\n",device);
67 exit(1); 63 return 0;
68 } 64 }
69 } 65 }
70 else if (cardtype == CARD_TYPE_HOSTAP) 66 else if (cardtype == CARD_TYPE_HOSTAP)
71 { 67 {
72 printf ("Got a host-ap card, nothing is implemented now\n"); 68 printf ("Got a host-ap card, nothing is implemented now\n");
73 } 69 }
74 70
75 71
76 /* Check the interface if it is in the correct raw mode */ 72 /* Check the interface if it is in the correct raw mode */
77 handle = pcap_open_live(device, BUFSIZ, 1, 0, errbuf); 73 handle = pcap_open_live(device, BUFSIZ, 1, 0, errbuf);
78 74
79 /* getting the datalink type */ 75 /* getting the datalink type */
80 datalink = pcap_datalink(handle); 76 datalink = pcap_datalink(handle);
81 77
82 if (datalink == DLT_IEEE802_11) /* Rawmode is IEEE802_11 */ 78 if (datalink == DLT_IEEE802_11) /* Rawmode is IEEE802_11 */
83 { 79 {
84 printf ("Your successfully listen on %s in 802.11 raw mode\n",device); 80 printf ("Your successfully listen on %s in 802.11 raw mode\n",device);
85 pcap_close(handle); 81 pcap_close(handle);
86 return (0); 82 return 0;
87 83
88 } 84 }
89 else 85 else
90 { 86 {
91 printf ("Fatal error, cannot continue, your interface %s does not work in the correct 802.11 raw mode, check you driver please\n",device); 87 printf ("Fatal error, cannot continue, your interface %s does not work in the correct 802.11 raw mode, check you driver please\n",device);
92 pcap_close(handle); 88 pcap_close(handle);
93 exit(1); 89 return 0;
94 } 90 }
95} 91}
96 92
97int card_set_promisc_up (char * device) 93int card_set_promisc_up (char * device)
98{ 94{
99 int ret; 95 int ret;
100 char ifconfigcmd[32]; 96 char ifconfigcmd[32];
101 snprintf(ifconfigcmd,sizeof(ifconfigcmd),SBIN_PATH, device); 97 snprintf(ifconfigcmd,sizeof(ifconfigcmd),SBIN_PATH, device);
102 ret = system (ifconfigcmd); 98 ret = system (ifconfigcmd);
103 if (ret > 0) 99 if (ret > 0)
104 { 100 {
105 printf ("\nFatal error, could not execute %s please check your card,binary location and permission\n",ifconfigcmd); 101 printf ("\nFatal error, could not execute %s please check your card,binary location and permission\n",ifconfigcmd);
106 exit(1); 102 return 0;
107 } 103 }
108 return(0); 104 return 1;
109} 105}
110 106
111int start_sniffing (char * device) 107int start_sniffing (char * device)
112{ 108{
113 int ret; /* return code */ 109
114 pcap_t *handletopcap; 110 pcap_t *handletopcap;
115 char errbuf[PCAP_ERRBUF_SIZE]; 111 char errbuf[PCAP_ERRBUF_SIZE];
116 struct pcap_pkthdr header; /* The header that pcap gives us */
117 const u_char *packet; /* The actual packet */
118 112
119 /* opening the pcap for sniffing */ 113 /* opening the pcap for sniffing */
120 handletopcap = pcap_open_live(device, BUFSIZ, 1, 1000, errbuf); 114 handletopcap = pcap_open_live(device, BUFSIZ, 1, 1000, errbuf);
121 115
122 /* Next few lines a taken out of kismet */ 116 /* Next few lines a taken out of kismet */
123 #ifdef HAVE_PCAP_NONBLOCK 117 #ifdef HAVE_PCAP_NONBLOCK
124 pcap_setnonblock(handletopcap, 1, errstr); 118 pcap_setnonblock(handletopcap, 1, errstr);
125 #endif 119 #endif
126 120
127 /*start scanning */ 121 /*start scanning */
128 pcap_loop(handletopcap,-1,process_packets,NULL); 122 pcap_loop(handletopcap,-1,process_packets,NULL);
129 123
130 printf("\nDone processing packets... wheew!\n"); 124 printf("\nDone processing packets... wheew!\n");
131 return 0; 125 return 1;
132} 126}
133 127
134void process_packets(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet) 128void process_packets(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet)
135{ 129{
136 u_int caplen = pkthdr->caplen; 130 u_int caplen = pkthdr->caplen;
137 u_int length = pkthdr->len; 131 u_int length = pkthdr->len;
138 u_int16_t fc; 132 u_int16_t fc;
139 u_int HEADER_LENGTH; 133 u_int HEADER_LENGTH;
140 u_short extracted_ethertype; 134
141 int snapend;
142 int ret;
143 /* pinfo holds all interresting information for us */ 135 /* pinfo holds all interresting information for us */
144 struct packetinfo pinfo; 136 struct packetinfo pinfo;
145 struct packetinfo *pinfoptr; 137 struct packetinfo *pinfoptr;
146 pinfoptr=&pinfo; 138 pinfoptr=&pinfo;
147 139
148 pinfoptr->isvalid = 0; 140 pinfoptr->isvalid = 0;
149 pinfoptr->pktlen = pkthdr->len; 141 pinfoptr->pktlen = pkthdr->len;
150 if (caplen < IEEE802_11_FC_LEN) 142 if (caplen < IEEE802_11_FC_LEN)
151 { 143 {
152 /* This is a garbage packet, because is does not long enough 144 /* This is a garbage packet, because is does not long enough
153 to hold a 802.11b header */ 145 to hold a 802.11b header */
154 pinfoptr->isvalid = 0; 146 pinfoptr->isvalid = 0;
155 return; 147 return;
156 } 148 }
157 149
158 /* Gets the framecontrol bits (2bytes long) */ 150 /* Gets the framecontrol bits (2bytes long) */
159 fc = EXTRACT_LE_16BITS(packet); 151 fc = EXTRACT_LE_16BITS(packet);
160 152
161 HEADER_LENGTH = GetHeaderLength(fc); 153 HEADER_LENGTH = GetHeaderLength(fc);
162 154
163 if (caplen < HEADER_LENGTH) 155 if (caplen < HEADER_LENGTH)
164 { 156 {
165 /* This is a garbage packet, because it is not long enough 157 /* This is a garbage packet, because it is not long enough
166 to hold a correct header of its type */ 158 to hold a correct header of its type */
167 pinfoptr->isvalid = 0; 159 pinfoptr->isvalid = 0;
168 return; 160 return;
169 } 161 }
170 162
171 /* Decode 802.11b header out of the packet */ 163 /* Decode 802.11b header out of the packet */
172 if (decode_80211b_hdr(packet,pinfoptr) == 0) 164 if (decode_80211b_hdr(packet,pinfoptr) == 0)
173 { 165 {
174 /* Justification of the ofset to further process the packet */ 166 /* Justification of the ofset to further process the packet */
175 length -= HEADER_LENGTH; 167 length -= HEADER_LENGTH;
176 caplen -= HEADER_LENGTH; 168 caplen -= HEADER_LENGTH;
177 packet += HEADER_LENGTH; 169 packet += HEADER_LENGTH;
178 } 170 }
179 else 171 else
180 { /* Something is wrong,could not be a correct packet */ 172 { /* Something is wrong,could not be a correct packet */
181 return; 173 return;
182 } 174 }
183 175
184 switch (FC_TYPE(fc)) 176 switch (FC_TYPE(fc))
185 { 177 {
186 /* Is it a managemnet frame? */ 178 /* Is it a managemnet frame? */
187 case T_MGMT: 179 case T_MGMT:
188 switch (FC_SUBTYPE(fc)) 180 switch (FC_SUBTYPE(fc))
189 { /* Is it a beacon frame? */ 181 { /* Is it a beacon frame? */
190 case ST_BEACON: 182 case ST_BEACON:
191 if (handle_beacon(fc, packet,pinfoptr) ==0) 183 if (handle_beacon(fc, packet,pinfoptr) ==0)
192 { 184 {
193 if (!strcmp(pinfoptr->desthwaddr,"ff:ff:ff:ff:ff:ff") == 0) 185 if (!strcmp(pinfoptr->desthwaddr,"ff:ff:ff:ff:ff:ff") == 0)
194 { 186 {
195 /* Every beacon must have the broadcast as destination 187 /* Every beacon must have the broadcast as destination
196 so it must be a shitti packet */ 188 so it must be a shitti packet */
197 pinfoptr->isvalid = 0; 189 pinfoptr->isvalid = 0;
198 return; 190 return;
199 } 191 }
200 if (pinfoptr->cap_ESS == pinfoptr->cap_IBSS) 192 if (pinfoptr->cap_ESS == pinfoptr->cap_IBSS)
201 { 193 {
202 /* Only one of both are possible, so must be 194 /* Only one of both are possible, so must be
203 a noise packet, if this comes up */ 195 a noise packet, if this comes up */
204 pinfoptr->isvalid = 0; 196 pinfoptr->isvalid = 0;
205 return; 197 return;
206 } 198 }
207 if (pinfoptr->channel < 1 || pinfoptr->channel > 14) 199 if (pinfoptr->channel < 1 || pinfoptr->channel > 14)
208 { 200 {
209 /* Only channels between 1 and 14 are possible 201 /* Only channels between 1 and 14 are possible
210 others must be noise packets */ 202 others must be noise packets */
211 pinfoptr->isvalid = 0; 203 pinfoptr->isvalid = 0;
212 return; 204 return;
213 } 205 }
214 206
215 /* Here should be the infos to the gui issued */ 207 /* Here should be the infos to the gui issued */
216 if (pinfoptr->cap_ESS == 1 &&pinfoptr->cap_IBSS ==0) 208 if (pinfoptr->cap_ESS == 1 &&pinfoptr->cap_IBSS ==0)
217 { 209 {
218 printf ("\nHave found an accesspoint:"); 210 printf ("\nHave found an accesspoint:");
219 } 211 }
220 else if(pinfoptr->cap_ESS == 0 && pinfoptr->cap_IBSS == 1) 212 else if(pinfoptr->cap_ESS == 0 && pinfoptr->cap_IBSS == 1)
221 { 213 {
222 printf ("\nHave found an AD-HOC station:"); 214 printf ("\nHave found an AD-HOC station:");
223 215
224 } 216 }
225 if (strcmp (pinfoptr->ssid,NONBROADCASTING) ==0) 217 if (strcmp (pinfoptr->ssid,NONBROADCASTING) ==0)
226 { 218 {
227 printf ("\n\tOn a non-broadcasting network"); 219 printf ("\n\tOn a non-broadcasting network");
228 } 220 }
229 else 221 else
230 { 222 {
231 printf ("\n\tOn network : %s",pinfoptr->ssid); 223 printf ("\n\tOn network : %s",pinfoptr->ssid);
232 } 224 }
233 printf ("\n\tLen SSID : %d",pinfoptr->ssid_len); 225 printf ("\n\tLen SSID : %d",pinfoptr->ssid_len);
234 printf ("\n\tOn Channel : %d",pinfoptr->channel); 226 printf ("\n\tOn Channel : %d",pinfoptr->channel);
235 printf ("\n\tEncryption : %s", pinfoptr->cap_WEP ? "ON" : "OFF"); 227 printf ("\n\tEncryption : %s", pinfoptr->cap_WEP ? "ON" : "OFF");
236 printf ("\n\tMacaddress : %s",pinfoptr->sndhwaddr); 228 printf ("\n\tMacaddress : %s",pinfoptr->sndhwaddr);
237 printf ("\n\tBssid : %s",pinfoptr->bssid); 229 printf ("\n\tBssid : %s",pinfoptr->bssid);
238 printf ("\n\tDest : %s\n",pinfoptr->desthwaddr); 230 printf ("\n\tDest : %s\n",pinfoptr->desthwaddr);
239 } 231 }
240 break; 232 break;
241 default: 233 default:
242 printf("Unknown IEEE802.11 frame subtype (%d)",FC_SUBTYPE(fc)); 234 printf("Unknown IEEE802.11 frame subtype (%d)",FC_SUBTYPE(fc));
243 break; 235 break;
244 } /* End of switch over different mgt frame types */ 236 } /* End of switch over different mgt frame types */
245 237
246 break; 238 break;
247 case T_CTRL: 239 case T_CTRL:
248 //decode_control_frames(fc, packet); 240 //decode_control_frames(fc, packet);
249 printf ("Its a control frame"); 241 printf ("Its a control frame");
250 break; 242 break;
251 case T_DATA: 243 case T_DATA:
252 //decode_data_frames(fc, packet); 244 //decode_data_frames(fc, packet);
253 printf ("Its a date frame"); 245 printf ("Its a date frame");
254 break; 246 break;
255 default: 247 default:
256 printf("Unknown IEEE802.11 frame type (%d)",FC_TYPE(fc)); 248 printf("Unknown IEEE802.11 frame type (%d)",FC_TYPE(fc));
257 break; 249 break;
258 } 250 }
259} 251}
260 252
261 253
262/* This decodes the 802.11b frame header out of the 802.11b packet 254/* This decodes the 802.11b frame header out of the 802.11b packet
263 all the infos is placed into the packetinfo structure */ 255 all the infos is placed into the packetinfo structure */
264int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo) 256int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo)
265{ 257{
266 char * ret;
267 char testme[16];
268 const struct mgmt_header_t *mgthdr = (const struct mgmt_header_t *) p; 258 const struct mgmt_header_t *mgthdr = (const struct mgmt_header_t *) p;
269 ppinfo->fcsubtype = FC_SUBTYPE(mgthdr->fc); 259 ppinfo->fcsubtype = FC_SUBTYPE(mgthdr->fc);
270 260
271 /* Get the sender, bssid and dest mac address */ 261 /* Get the sender, bssid and dest mac address */
272 etheraddr_string(mgthdr->bssid,ppinfo->bssid); 262 etheraddr_string(mgthdr->bssid,ppinfo->bssid);
273 etheraddr_string(mgthdr->da,ppinfo->desthwaddr); 263 etheraddr_string(mgthdr->da,ppinfo->desthwaddr);
274 etheraddr_string(mgthdr->sa,ppinfo->sndhwaddr); 264 etheraddr_string(mgthdr->sa,ppinfo->sndhwaddr);
275 ppinfo->fc_wep = FC_WEP(mgthdr->fc); 265 ppinfo->fc_wep = FC_WEP(mgthdr->fc);
276 return(0); 266 return 0;
277} 267}
278 268
279 269
280void etheraddr_string(register const u_char *ep,char * text) 270void etheraddr_string(register const u_char *ep,char * text)
281{ 271{
282 static char hex[] = "0123456789abcdef"; 272 static char hex[] = "0123456789abcdef";
283 register u_int i, j; 273 register u_int i, j;
284 register char *cp; 274 register char *cp;
285 char buf[sizeof("00:00:00:00:00:00")]; 275 char buf[sizeof("00:00:00:00:00:00")];
286 cp = buf; 276 cp = buf;
287 if ((j = *ep >> 4) != 0) 277 if ((j = *ep >> 4) != 0)
288 *cp++ = hex[j]; 278 *cp++ = hex[j];
289 *cp++ = hex[*ep++ & 0xf]; 279 *cp++ = hex[*ep++ & 0xf];
290 for (i = 5; (int)--i >= 0;) { 280 for (i = 5; (int)--i >= 0;) {
291 *cp++ = ':'; 281 *cp++ = ':';
292 if ((j = *ep >> 4) != 0) 282 if ((j = *ep >> 4) != 0)
293 *cp++ = hex[j]; 283 *cp++ = hex[j];
294 *cp++ = hex[*ep++ & 0xf]; 284 *cp++ = hex[*ep++ & 0xf];
295 } 285 }
296 *cp = '\0'; 286 *cp = '\0';
297 strcpy(text,buf); 287 strcpy(text,buf);
298 return;
299} 288}
300 289
301int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo) 290int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo)
302{ 291{
303 struct mgmt_body_t pbody; 292 struct mgmt_body_t pbody;
304 int offset = 0; 293 int offset = 0;
305 294
306 /* Get the static informations out of the packet */ 295 /* Get the static informations out of the packet */
307 memset(&pbody, 0, sizeof(pbody)); 296 memset(&pbody, 0, sizeof(pbody));
308 memcpy(&pbody.timestamp, p, 8); 297 memcpy(&pbody.timestamp, p, 8);
309 offset += 8; 298 offset += 8;
310 pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); 299 pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset);
311 offset += 2; 300 offset += 2;
312 pbody.capability_info = EXTRACT_LE_16BITS(p+offset); 301 pbody.capability_info = EXTRACT_LE_16BITS(p+offset);
313 offset += 2; 302 offset += 2;
314 303
315 /* Gets the different flags out of the capabilities */ 304 /* Gets the different flags out of the capabilities */
316 ppinfo->cap_ESS = CAPABILITY_ESS(pbody.capability_info); 305 ppinfo->cap_ESS = CAPABILITY_ESS(pbody.capability_info);
317 ppinfo->cap_IBSS = CAPABILITY_IBSS(pbody.capability_info); 306 ppinfo->cap_IBSS = CAPABILITY_IBSS(pbody.capability_info);
318 ppinfo->cap_WEP = CAPABILITY_PRIVACY(pbody.capability_info); 307 ppinfo->cap_WEP = CAPABILITY_PRIVACY(pbody.capability_info);
319 308
320 /* Gets the tagged elements out of the packets */ 309 /* Gets the tagged elements out of the packets */
321 while (offset + 1 < ppinfo->pktlen) 310 while (offset + 1 < ppinfo->pktlen)
322 { 311 {
323 switch (*(p + offset)) 312 switch (*(p + offset))
324 { 313 {
325 case E_SSID: 314 case E_SSID:
326 memcpy(&(pbody.ssid),p+offset,2); offset += 2; 315 memcpy(&(pbody.ssid),p+offset,2); offset += 2;
327 if (pbody.ssid.length > 0) 316 if (pbody.ssid.length > 0)
328 { 317 {
329 memcpy(&(pbody.ssid.ssid),p+offset,pbody.ssid.length); offset += pbody.ssid.length; 318 memcpy(&(pbody.ssid.ssid),p+offset,pbody.ssid.length); offset += pbody.ssid.length;
330 pbody.ssid.ssid[pbody.ssid.length]='\0'; 319 pbody.ssid.ssid[pbody.ssid.length]='\0';
331 if (strcmp(pbody.ssid.ssid,"")==0) 320 if (strcmp((char *)pbody.ssid.ssid,"")==0)
332 { 321 {
333 ppinfo->ssid = NONBROADCASTING; 322 ppinfo->ssid = NONBROADCASTING;
334 } 323 }
335 else 324 else
336 { 325 {
337 ppinfo->ssid = pbody.ssid.ssid; 326 ppinfo->ssid = (char *)pbody.ssid.ssid;
338 } 327 }
339 ppinfo->ssid_len = pbody.ssid.length; 328 ppinfo->ssid_len = pbody.ssid.length;
340 } 329 }
341 break; 330 break;
342 case E_CHALLENGE: 331 case E_CHALLENGE:
343 memcpy(&(pbody.challenge),p+offset,2); offset += 2; 332 memcpy(&(pbody.challenge),p+offset,2); offset += 2;
344 if (pbody.challenge.length > 0) 333 if (pbody.challenge.length > 0)
345 { 334 {
346 memcpy(&(pbody.challenge.text),p+offset,pbody.challenge.length); offset += pbody.challenge.length; 335 memcpy(&(pbody.challenge.text),p+offset,pbody.challenge.length); offset += pbody.challenge.length;
347 pbody.challenge.text[pbody.challenge.length]='\0'; 336 pbody.challenge.text[pbody.challenge.length]='\0';
348 } 337 }
349 break; 338 break;
350 case E_RATES: 339 case E_RATES:
351 memcpy(&(pbody.rates),p+offset,2); offset += 2; 340 memcpy(&(pbody.rates),p+offset,2); offset += 2;
352 if (pbody.rates.length > 0) { 341 if (pbody.rates.length > 0) {
353 memcpy(&(pbody.rates.rate),p+offset,pbody.rates.length); offset += pbody.rates.length; 342 memcpy(&(pbody.rates.rate),p+offset,pbody.rates.length); offset += pbody.rates.length;
354 } 343 }
355 break; 344 break;
356 case E_DS: 345 case E_DS:
357 memcpy(&(pbody.ds),p+offset,3); offset +=3; 346 memcpy(&(pbody.ds),p+offset,3); offset +=3;
358 ppinfo->channel = pbody.ds.channel; 347 ppinfo->channel = pbody.ds.channel;
359 break; 348 break;
360 case E_CF: 349 case E_CF:
361 memcpy(&(pbody.cf),p+offset,8); offset +=8; 350 memcpy(&(pbody.cf),p+offset,8); offset +=8;
362 break; 351 break;
363 case E_TIM: 352 case E_TIM:
364 memcpy(&(pbody.tim),p+offset,2); offset +=2; 353 memcpy(&(pbody.tim),p+offset,2); offset +=2;
365 memcpy(&(pbody.tim.count),p+offset,3); offset +=3; 354 memcpy(&(pbody.tim.count),p+offset,3); offset +=3;
366 if ((pbody.tim.length -3) > 0) 355 if ((pbody.tim.length -3) > 0)
367 { 356 {
368 memcpy((pbody.tim.bitmap),p+(pbody.tim.length -3),(pbody.tim.length -3)); 357 memcpy((pbody.tim.bitmap),p+(pbody.tim.length -3),(pbody.tim.length -3));
369 offset += pbody.tim.length -3; 358 offset += pbody.tim.length -3;
370 } 359 }
371 break; 360 break;
372 default: 361 default:
373#if 0 362
374 printf("(1) unhandled element_id (%d) ", *(p+offset) );
375#endif
376 offset+= *(p+offset+1) + 2; 363 offset+= *(p+offset+1) + 2;
377 break; 364 break;
378 } /* end of switch*/ 365 } /* end of switch*/
379 } /* end of for loop */ 366 } /* end of for loop */
380 return(0); 367 return 1;
381
382
383
384 368
385} /* End of handle_beacon */ 369} /* End of handle_beacon */
386 370
387 371
388static int GetHeaderLength(u_int16_t fc) 372static int GetHeaderLength(u_int16_t fc)
389{ 373{
390 int iLength=0; 374 int iLength=0;
391 375
392 switch (FC_TYPE(fc)) { 376 switch (FC_TYPE(fc)) {
393 case T_MGMT: 377 case T_MGMT:
394 iLength = MGMT_HEADER_LEN; 378 iLength = MGMT_HEADER_LEN;
395 break; 379 break;
396 case T_CTRL: 380 case T_CTRL:
397 switch (FC_SUBTYPE(fc)) { 381 switch (FC_SUBTYPE(fc)) {
398 case CTRL_PS_POLL: 382 case CTRL_PS_POLL:
399 iLength = CTRL_PS_POLL_LEN; 383 iLength = CTRL_PS_POLL_LEN;
400 break; 384 break;
401 case CTRL_RTS: 385 case CTRL_RTS:
402 iLength = CTRL_RTS_LEN; 386 iLength = CTRL_RTS_LEN;
403 break; 387 break;
404 case CTRL_CTS: 388 case CTRL_CTS:
405 iLength = CTRL_CTS_LEN; 389 iLength = CTRL_CTS_LEN;
406 break; 390 break;
407 case CTRL_ACK: 391 case CTRL_ACK:
408 iLength = CTRL_ACK_LEN; 392 iLength = CTRL_ACK_LEN;
409 break; 393 break;
410 case CTRL_CF_END: 394 case CTRL_CF_END:
411 iLength = CTRL_END_LEN; 395 iLength = CTRL_END_LEN;
412 break; 396 break;
413 case CTRL_END_ACK: 397 case CTRL_END_ACK:
414 iLength = CTRL_END_ACK_LEN; 398 iLength = CTRL_END_ACK_LEN;
415 break; 399 break;
416 default: 400 default:
417 iLength = 0; 401 iLength = 0;
418 break; 402 break;
419 } 403 }
420 break; 404 break;
421 case T_DATA: 405 case T_DATA:
422 if (FC_TO_DS(fc) && FC_FROM_DS(fc)) 406 if (FC_TO_DS(fc) && FC_FROM_DS(fc))
423 iLength = 30; 407 iLength = 30;
424 else 408 else
425 iLength = 24; 409 iLength = 24;
426 break; 410 break;
427 default: 411 default:
428 printf("unknown IEEE802.11 frame type (%d)", 412 printf("unknown IEEE802.11 frame type (%d)",
429 FC_TYPE(fc)); 413 FC_TYPE(fc));
430 break; 414 break;
431 } 415 }
432 416
433 return iLength; 417 return iLength;
434} 418}
diff --git a/noncore/net/wellenreiter/daemon/source/sniffer.h b/noncore/net/wellenreiter/daemon/source/sniffer.hh
index b880b68..7f45be6 100644
--- a/noncore/net/wellenreiter/daemon/source/sniffer.h
+++ b/noncore/net/wellenreiter/daemon/source/sniffer.hh
@@ -1,102 +1,83 @@
1// Wellenreiter-sniffer-code header file 1/* $Id$ */
2
3#ifndef SNIFFER_HH
4#define SNIFFER_HH
2 5
3#include <string.h> 6#include <string.h>
4#include <stdio.h> 7#include <stdio.h>
5#include <stdlib.h> 8#include <stdlib.h>
6#include <pcap.h> 9#include <pcap.h>
7#include <errno.h> 10#include <errno.h>
8#include <sys/socket.h> 11#include <sys/socket.h>
9#include <netinet/in.h> 12#include <netinet/in.h>
10#include <arpa/inet.h> 13#include <arpa/inet.h>
11#include <net/bpf.h> 14#include <net/bpf.h>
12#include "ieee802_11.h"
13#include "extract.h"
14 15
15#define DEFAULT_PATH "/proc/driver/aironet/%s/Config" 16#define DEFAULT_PATH "/proc/driver/aironet/%s/Config"
16 #define CARD_TYPE_CISCO1 17 #define CARD_TYPE_CISCO1
17 #define CARD_TYPE_NG2 18 #define CARD_TYPE_NG2
18 #define CARD_TYPE_HOSTAP3 19 #define CARD_TYPE_HOSTAP3
19 20
20#define NONBROADCASTING "non-broadcasting" 21#define NONBROADCASTING "non-broadcasting"
21 22
22/* only for now, until we have the daemon running */ 23/* only for now, until we have the daemon running */
23/*the config file should provide these information */ 24/*the config file should provide these information */
24 #define SNIFFER_DEVICE "wlan0" 25 #define SNIFFER_DEVICE "wlan0"
25#define CARD_TYPE CARD_TYPE_CISCO 26#define CARD_TYPE CARD_TYPE_CISCO
26 #define SBIN_PATH"/sbin/ifconfig %s promisc up" 27 #define SBIN_PATH"/sbin/ifconfig %s promisc up"
27#define WLANCTL_PATH "/sbin/wlanctl-ng" 28#define WLANCTL_PATH "/sbin/wlanctl-ng"
28 29
29/* holds all the interresting data */ 30/* holds all the interresting data */
30struct packetinfo 31struct packetinfo
31{ 32{
32 int isvalid; 33 int isvalid;
33 int pktlen; 34 int pktlen;
34 int fctype; 35 int fctype;
35 int fcsubtype; 36 int fcsubtype;
36 int fc_wep; 37 int fc_wep;
37 int cap_WEP; 38 int cap_WEP;
38 int cap_IBSS; 39 int cap_IBSS;
39 int cap_ESS; 40 int cap_ESS;
40 int channel; 41 int channel;
41 char bssid[sizeof("00:00:00:00:00:00")]; 42 char bssid[sizeof("00:00:00:00:00:00")];
42 char desthwaddr[sizeof("00:00:00:00:00:00")]; 43 char desthwaddr[sizeof("00:00:00:00:00:00")];
43 char sndhwaddr[sizeof("00:00:00:00:00:00")]; 44 char sndhwaddr[sizeof("00:00:00:00:00:00")];
44 char *ssid; 45 char *ssid;
45 int ssid_len; 46 int ssid_len;
46}; 47};
47 48
48 49
49/* Prototypes */ 50/* Prototypes */
50int card_into_monitormode (char * device, int cardtype);
51 51
52int sniffer(void);
53int card_into_monitormode (char * device, int cardtype);
52int card_set_promisc_up (char * device); 54int card_set_promisc_up (char * device);
53
54int start_sniffing (char * device); 55int start_sniffing (char * device);
55
56void process_packets(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet); 56void process_packets(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet);
57
58int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo); 57int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo);
59
60void etheraddr_string(register const u_char *ep,char * text); 58void etheraddr_string(register const u_char *ep,char * text);
61
62int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo); 59int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo);
63 60
64static int GetHeaderLength(u_int16_t fc); 61static int GetHeaderLength(u_int16_t fc);
65 62
66static const char *subtype_text[]={
67 "Assoc Request",
68 "Assoc Response",
69 "ReAssoc Request",
70 "ReAssoc Response",
71 "Probe Request",
72 "Probe Response",
73 "RESERVED",
74 "RESERVED",
75 "Beacon",
76 "ATIM",
77 "Disassociation",
78 "Authentication",
79 "DeAuthentication",
80 "RESERVED",
81 "RESERVED"
82};
83
84/* 63/*
85 * True if "l" bytes of "var" were captured. 64 * True if "l" bytes of "var" were captured.
86 * 65 *
87 * The "snapend - (l) <= snapend" checks to make sure "l" isn't so large 66 * The "snapend - (l) <= snapend" checks to make sure "l" isn't so large
88 * that "snapend - (l)" underflows. 67 * that "snapend - (l)" underflows.
89 * 68 *
90 * The check is for <= rather than < because "l" might be 0. 69 * The check is for <= rather than < because "l" might be 0.
91 */ 70 */
92#define TTEST2(var, l) (snapend - (l) <= snapend && \ 71#define TTEST2(var, l) (snapend - (l) <= snapend && \
93 (const u_char *)&(var) <= snapend - (l)) 72 (const u_char *)&(var) <= snapend - (l))
94 73
95/* True if "var" was captured */ 74/* True if "var" was captured */
96#define TTEST(var) TTEST2(var, sizeof(var)) 75#define TTEST(var) TTEST2(var, sizeof(var))
97 76
98/* Bail if "l" bytes of "var" were not captured */ 77/* Bail if "l" bytes of "var" were not captured */
99#define TCHECK2(var, l) if (!TTEST2(var, l)) goto trunc 78#define TCHECK2(var, l) if (!TTEST2(var, l)) goto trunc
100 79
101/* Bail if "var" was not captured */ 80/* Bail if "var" was not captured */
102#define TCHECK(var) TCHECK2(var, sizeof(var)) 81#define TCHECK(var) TCHECK2(var, sizeof(var))
82
83#endif /* SNIFFER_HH */