summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/802_11_user.h47
-rw-r--r--libopie2/opienet/opcap.cpp65
-rw-r--r--libopie2/opienet/opcap.h24
3 files changed, 110 insertions, 26 deletions
diff --git a/libopie2/opienet/802_11_user.h b/libopie2/opienet/802_11_user.h
index cd98503..ad84514 100644
--- a/libopie2/opienet/802_11_user.h
+++ b/libopie2/opienet/802_11_user.h
@@ -1,457 +1,458 @@
1#ifndef IEEE_802_11 1#ifndef IEEE_802_11
2#define IEEE_802_11 2#define IEEE_802_11
3 3
4enum ieee_802_11_link_status_failure_reason { 4enum ieee_802_11_link_status_failure_reason {
5 reserved0, Unspecified=1, Previous_not_valid, 5 reserved0, Unspecified=1, Previous_not_valid,
6 Sender_Quits_ESS_or_IBSS, 6 Sender_Quits_ESS_or_IBSS,
7 Due_Inactivity, AP_Overload, 7 Due_Inactivity, AP_Overload,
8 Class_2_from_NonAuth, 8 Class_2_from_NonAuth,
9 Class_3_from_NonAuth, 9 Class_3_from_NonAuth,
10 Sender_Quits_BSS, 10 Sender_Quits_BSS,
11 Association_requester_not_authenticated, 11 Association_requester_not_authenticated,
12 Reserved10 12 Reserved10
13}; 13};
14 14
15 15
16#define IEEE_802_11_LINK_STATUS_FAILURE_REASON_STRINGS \ 16#define IEEE_802_11_LINK_STATUS_FAILURE_REASON_STRINGS \
17 {\ 17 {\
18 {reserved0, 0xff," Reserved reason "},\ 18 {reserved0, 0xff," Reserved reason "},\
19 {Unspecified, 0xff," Unspecified Reason "},\ 19 {Unspecified, 0xff," Unspecified Reason "},\
20 {Previous_not_valid,0xff," Previous Authentication no longer valid "},\ 20 {Previous_not_valid,0xff," Previous Authentication no longer valid "},\
21 {Sender_Quits_ESS_or_IBSS,0xff," Deauthenticated because sending station is leaving (has left) IBSS or ESS "},\ 21 {Sender_Quits_ESS_or_IBSS,0xff," Deauthenticated because sending station is leaving (has left) IBSS or ESS "},\
22 {Due_Inactivity,0xff," Disassociated due to inactivity "},\ 22 {Due_Inactivity,0xff," Disassociated due to inactivity "},\
23 {AP_Overload, 0xff," Disassociated because AP is unable to handle all currently associated stations "},\ 23 {AP_Overload, 0xff," Disassociated because AP is unable to handle all currently associated stations "},\
24 {Class_2_from_NonAuth,0xff," Class 2 frame received from non-Authenticated station"},\ 24 {Class_2_from_NonAuth,0xff," Class 2 frame received from non-Authenticated station"},\
25 {Class_3_from_NonAuth,0xff," Class 3 frame received from non­Associated station"},\ 25 {Class_3_from_NonAuth,0xff," Class 3 frame received from non­Associated station"},\
26 {Sender_Quits_BSS,0xff," Disassociated because sending station is leaving (has left) BSS"},\ 26 {Sender_Quits_BSS,0xff," Disassociated because sending station is leaving (has left) BSS"},\
27 {Association_requester_not_authenticated,0xff," Station requesting (Re)Association is not Authenticated with responding station"},\ 27 {Association_requester_not_authenticated,0xff," Station requesting (Re)Association is not Authenticated with responding station"},\
28 {Reserved10, 0xff," Reserved"},\ 28 {Reserved10, 0xff," Reserved"},\
29 {0,0,NULL}\ 29 {0,0,NULL}\
30}; 30};
31 31
32 32
33 33
34struct ieee_802_11_header { 34struct ieee_802_11_header {
35 u_int16_tframe_control;// needs to be subtyped 35 u_int16_tframe_control;// needs to be subtyped
36 u_int16_tduration; 36 u_int16_tduration;
37 u_int8_tmac1[6]; 37 u_int8_tmac1[6];
38 u_int8_tmac2[6]; 38 u_int8_tmac2[6];
39 u_int8_tmac3[6]; 39 u_int8_tmac3[6];
40 u_int16_tSeqCtl; 40 u_int16_tSeqCtl;
41 u_int8_tmac4[6]; 41 u_int8_tmac4[6];
42 // u_int16_tgapLen; 42 // u_int16_tgapLen;
43 // u_int8_tgap[8]; 43 // u_int8_tgap[8];
44}; 44};
45 45
46 46
47struct ieee_802_3_header { 47struct ieee_802_3_header {
48 48
49 u_int16_tstatus; 49 u_int16_tstatus;
50 u_int16_tpayload_length; 50 u_int16_tpayload_length;
51 u_int8_tdst_mac[6]; 51 u_int8_tdst_mac[6];
52 u_int8_tsrc_mac[6]; 52 u_int8_tsrc_mac[6];
53 53
54}; 54};
55 55
56#define P80211_OUI_LEN 3 56#define P80211_OUI_LEN 3
57 57
58struct ieee_802_11_snap_header {
59
60 u_int8_t dsap; /* always 0xAA */
61 u_int8_t ssap; /* always 0xAA */
62 u_int8_t ctrl; /* always 0x03 */
63 u_int8_t oui[P80211_OUI_LEN]; /* organizational universal id */
64
65} __attribute__ ((packed));
66
67#define P80211_LLC_OUI_LEN 3
68
69struct ieee_802_11_802_1H_header {
70
71 u_int8_t dsap;
72 u_int8_t ssap; /* always 0xAA */
73 u_int8_t ctrl; /* always 0x03 */
74 u_int8_t oui[P80211_OUI_LEN]; /* organizational universal id */
75 u_int16_t unknown1; /* packet type ID fields */
76 u_int16_t unknown2; /* here is something like length in some cases */
77} __attribute__ ((packed));
78
79struct ieee_802_11_802_2_header { 58struct ieee_802_11_802_2_header {
80 59
81 u_int8_t dsap; 60 u_int8_t dsap;
82 u_int8_t ssap; /* always 0xAA */ 61 u_int8_t ssap; /* always 0xAA */
83 u_int8_t ctrl; /* always 0x03 */ 62 u_int8_t ctrl; /* always 0x03 */
84 u_int8_t oui[P80211_OUI_LEN]; /* organizational universal id */ 63 u_int8_t oui[P80211_OUI_LEN]; /* organizational universal id */
85 u_int16_t type; /* packet type ID field */ 64 u_int16_t type; /* packet type ID field */
65};
86 66
87} __attribute__ ((packed)); 67/* See RFC 826 for protocol description. ARP packets are variable
88 68 in size; the arphdr structure defines the fixed-length portion.
69 Protocol type values are the same as those for 10 Mb/s Ethernet.
70 It is followed by the variable-sized fields ar_sha, arp_spa,
71 arp_tha and arp_tpa in that order, according to the lengths
72 specified. Field names used correspond to RFC 826. */
73
74#define ETH_ALEN 6
75
76struct myarphdr
77{
78 unsigned short int ar_hrd; /* Format of hardware address. */
79 unsigned short int ar_pro; /* Format of protocol address. */
80 unsigned char ar_hln; /* Length of hardware address. */
81 unsigned char ar_pln; /* Length of protocol address. */
82 unsigned short int ar_op; /* ARP opcode (command). */
83 /* Ethernet looks like this : This bit is variable sized
84 however... */
85 unsigned char ar_sha[ETH_ALEN]; /* Sender hardware address. */
86 unsigned char ar_sip[4]; /* Sender IP address. */
87 unsigned char ar_tha[ETH_ALEN]; /* Target hardware address. */
88 unsigned char ar_tip[4]; /* Target IP address. */
89};
89 90
90 91
91// following is incoplete and may be incorrect and need reorganization 92// following is incoplete and may be incorrect and need reorganization
92 93
93 #define ieee_802_11_frame_type_Management0x00 94 #define ieee_802_11_frame_type_Management0x00
94 #define ieee_802_11_frame_type_Control 0x01 95 #define ieee_802_11_frame_type_Control 0x01
95 #define ieee_802_11_frame_type_Data 0x10 96 #define ieee_802_11_frame_type_Data 0x10
96 #define ieee_802_11_frame_type_Reserved 0x11 97 #define ieee_802_11_frame_type_Reserved 0x11
97 98
98 #define ieee_802_11_frame_subtype_Association_Req0x0 // Association Request 99 #define ieee_802_11_frame_subtype_Association_Req0x0 // Association Request
99 #define ieee_802_11_frame_subtype_Association_Resp0x1 // Association Response 100 #define ieee_802_11_frame_subtype_Association_Resp0x1 // Association Response
100 #define ieee_802_11_frame_subtype_Reassociation_Req0x2 // Reassociation Request 101 #define ieee_802_11_frame_subtype_Reassociation_Req0x2 // Reassociation Request
101 #define ieee_802_11_frame_subtype_Reassociation_Resp0x3 // Reassociation Response 102 #define ieee_802_11_frame_subtype_Reassociation_Resp0x3 // Reassociation Response
102 #define ieee_802_11_frame_subtype_Probe_Req 0x4 // Probe Request 103 #define ieee_802_11_frame_subtype_Probe_Req 0x4 // Probe Request
103 #define ieee_802_11_frame_subtype_Probe_Resp 0x5 // Probe Response 104 #define ieee_802_11_frame_subtype_Probe_Resp 0x5 // Probe Response
104 #define ieee_802_11_frame_subtype_Beacon 0x8 // Beacon 105 #define ieee_802_11_frame_subtype_Beacon 0x8 // Beacon
105 #define ieee_802_11_frame_subtype_ATIM 0x9 // ATIM 106 #define ieee_802_11_frame_subtype_ATIM 0x9 // ATIM
106 #define ieee_802_11_frame_subtype_Disassociation 0xA // Disassociation 107 #define ieee_802_11_frame_subtype_Disassociation 0xA // Disassociation
107 #define ieee_802_11_frame_subtype_Authentication 0xB // Authentication 108 #define ieee_802_11_frame_subtype_Authentication 0xB // Authentication
108 #define ieee_802_11_frame_subtype_Deauthentication 0xC // Deauthentication 109 #define ieee_802_11_frame_subtype_Deauthentication 0xC // Deauthentication
109 #define ieee_802_11_frame_subtype_PS_Poll 0xA // PS-Poll 110 #define ieee_802_11_frame_subtype_PS_Poll 0xA // PS-Poll
110 #define ieee_802_11_frame_subtype_RTS 0xB // RTS 111 #define ieee_802_11_frame_subtype_RTS 0xB // RTS
111 #define ieee_802_11_frame_subtype_CTS 0xC // CTS 112 #define ieee_802_11_frame_subtype_CTS 0xC // CTS
112 #define ieee_802_11_frame_subtype_ACK 0xD // ACK 113 #define ieee_802_11_frame_subtype_ACK 0xD // ACK
113 #define ieee_802_11_frame_subtype_CFEnd 0xE // CF-End 114 #define ieee_802_11_frame_subtype_CFEnd 0xE // CF-End
114 #define ieee_802_11_frame_subtype_CFEnd_CFAck 0xF // CF-End + CF-Ack 115 #define ieee_802_11_frame_subtype_CFEnd_CFAck 0xF // CF-End + CF-Ack
115 #define ieee_802_11_frame_subtype_Data 0x0 // Data 116 #define ieee_802_11_frame_subtype_Data 0x0 // Data
116 #define ieee_802_11_frame_subtype_Data_CFAck 0x1 // Data + CF-Ack 117 #define ieee_802_11_frame_subtype_Data_CFAck 0x1 // Data + CF-Ack
117 #define ieee_802_11_frame_subtype_Data_CF_Poll 0x2 // Data + CF-Poll 118 #define ieee_802_11_frame_subtype_Data_CF_Poll 0x2 // Data + CF-Poll
118 #define ieee_802_11_frame_subtype_Data_CF_AckCF_Poll 0x3 // Data + CF-Ack + CF-Poll 119 #define ieee_802_11_frame_subtype_Data_CF_AckCF_Poll 0x3 // Data + CF-Ack + CF-Poll
119 #define ieee_802_11_frame_subtype_NullFunction 0x4 // Null Function (no data) 120 #define ieee_802_11_frame_subtype_NullFunction 0x4 // Null Function (no data)
120 #define ieee_802_11_frame_subtype_CF_Ack 0x5 // CF-Ack (no data) 121 #define ieee_802_11_frame_subtype_CF_Ack 0x5 // CF-Ack (no data)
121 #define ieee_802_11_frame_subtype_CF_Poll 0x6 // CF-Poll (no data) 122 #define ieee_802_11_frame_subtype_CF_Poll 0x6 // CF-Poll (no data)
122 #define ieee_802_11_frame_subtype_CF_AckCF_Poll 0x7 // CF-Ack + CF-Poll (no data) 123 #define ieee_802_11_frame_subtype_CF_AckCF_Poll 0x7 // CF-Ack + CF-Poll (no data)
123 124
124 125
125#define ieee_802_11_frame_subtype_strings {\ 126#define ieee_802_11_frame_subtype_strings {\
126 { ieee_802_11_frame_subtype_Association_Req,0xF,"f Association Request"},\ 127 { ieee_802_11_frame_subtype_Association_Req,0xF,"f Association Request"},\
127 { ieee_802_11_frame_subtype_Association_Resp,0xF,"1 Association Response"},\ 128 { ieee_802_11_frame_subtype_Association_Resp,0xF,"1 Association Response"},\
128 { ieee_802_11_frame_subtype_Reassociation_Req,0xF,"2 Reassociation Request"},\ 129 { ieee_802_11_frame_subtype_Reassociation_Req,0xF,"2 Reassociation Request"},\
129 { ieee_802_11_frame_subtype_Reassociation_Resp,0xF,"3 Reassociation Response"},\ 130 { ieee_802_11_frame_subtype_Reassociation_Resp,0xF,"3 Reassociation Response"},\
130 { ieee_802_11_frame_subtype_Probe_Req ,0xF,"4 Probe Request"},\ 131 { ieee_802_11_frame_subtype_Probe_Req ,0xF,"4 Probe Request"},\
131 { ieee_802_11_frame_subtype_Probe_Resp ,0xF,"5 Probe Response"},\ 132 { ieee_802_11_frame_subtype_Probe_Resp ,0xF,"5 Probe Response"},\
132 { ieee_802_11_frame_subtype_Beacon ,0xF,"8 Beacon"},\ 133 { ieee_802_11_frame_subtype_Beacon ,0xF,"8 Beacon"},\
133 { ieee_802_11_frame_subtype_ATIM ,0xF,"9 ATIM"},\ 134 { ieee_802_11_frame_subtype_ATIM ,0xF,"9 ATIM"},\
134 { ieee_802_11_frame_subtype_Disassociation,0xF,"A Disassociation"},\ 135 { ieee_802_11_frame_subtype_Disassociation,0xF,"A Disassociation"},\
135 { ieee_802_11_frame_subtype_Authentication,0xF,"B Authentication"},\ 136 { ieee_802_11_frame_subtype_Authentication,0xF,"B Authentication"},\
136 { ieee_802_11_frame_subtype_Deauthentication,0xF,"C Deauthentication"},\ 137 { ieee_802_11_frame_subtype_Deauthentication,0xF,"C Deauthentication"},\
137 { ieee_802_11_frame_subtype_PS_Poll ,0xF,"A PS-Poll"},\ 138 { ieee_802_11_frame_subtype_PS_Poll ,0xF,"A PS-Poll"},\
138 { ieee_802_11_frame_subtype_RTS ,0xF,"B RTS"},\ 139 { ieee_802_11_frame_subtype_RTS ,0xF,"B RTS"},\
139 { ieee_802_11_frame_subtype_CTS ,0xF,"C CTS"},\ 140 { ieee_802_11_frame_subtype_CTS ,0xF,"C CTS"},\
140 { ieee_802_11_frame_subtype_ACK ,0xF,"D ACK"},\ 141 { ieee_802_11_frame_subtype_ACK ,0xF,"D ACK"},\
141 { ieee_802_11_frame_subtype_CFEnd ,0xF,"E CF-End"},\ 142 { ieee_802_11_frame_subtype_CFEnd ,0xF,"E CF-End"},\
142 { ieee_802_11_frame_subtype_CFEnd_CFAck ,0xF,"F CF-End + CF-Ack"},\ 143 { ieee_802_11_frame_subtype_CFEnd_CFAck ,0xF,"F CF-End + CF-Ack"},\
143 { ieee_802_11_frame_subtype_Data ,0xF,"0 Data"},\ 144 { ieee_802_11_frame_subtype_Data ,0xF,"0 Data"},\
144 { ieee_802_11_frame_subtype_Data_CFAck ,0xF,"1 Data + CF-Ack"},\ 145 { ieee_802_11_frame_subtype_Data_CFAck ,0xF,"1 Data + CF-Ack"},\
145 { ieee_802_11_frame_subtype_Data_CFPoll ,0xF,"2 Data + CF-Poll"},\ 146 { ieee_802_11_frame_subtype_Data_CFPoll ,0xF,"2 Data + CF-Poll"},\
146 { ieee_802_11_frame_subtype_Data_CFAck_CFPoll,0xF,"3 Data + CF-Ack + CF-Poll"},\ 147 { ieee_802_11_frame_subtype_Data_CFAck_CFPoll,0xF,"3 Data + CF-Ack + CF-Poll"},\
147 { ieee_802_11_frame_subtype_Null_Function ,0xF,"4 Null Function (no data)"},\ 148 { ieee_802_11_frame_subtype_Null_Function ,0xF,"4 Null Function (no data)"},\
148 { ieee_802_11_frame_subtype_CFAck , 0xF,"5 CF-Ack (no data)"},\ 149 { ieee_802_11_frame_subtype_CFAck , 0xF,"5 CF-Ack (no data)"},\
149 { ieee_802_11_frame_subtype_CFPoll , 0xF,"6 CF-Poll (no data)"},\ 150 { ieee_802_11_frame_subtype_CFPoll , 0xF,"6 CF-Poll (no data)"},\
150 { ieee_802_11_frame_subtype_CFAck_CFPoll,0xF,"y7 CF-Ack + CF-Poll (no data)"},\ 151 { ieee_802_11_frame_subtype_CFAck_CFPoll,0xF,"y7 CF-Ack + CF-Poll (no data)"},\
151 { 0,0,NULL}\ 152 { 0,0,NULL}\
152} 153}
153struct ieee_802_11_frame_subtype_class { 154struct ieee_802_11_frame_subtype_class {
154 u_int8_tsubtype; 155 u_int8_tsubtype;
155 u_int8_tmask; 156 u_int8_tmask;
156 u_int8_tklass; 157 u_int8_tklass;
157 u_int8_ttype; 158 u_int8_ttype;
158}; 159};
159#define ieee_802_11_frame_subtype_classes {\ 160#define ieee_802_11_frame_subtype_classes {\
160 { ieee_802_11_frame_subtype_Association_Req,0xF,2,ieee_802_11_frame_type_Management},\ 161 { ieee_802_11_frame_subtype_Association_Req,0xF,2,ieee_802_11_frame_type_Management},\
161 { ieee_802_11_frame_subtype_Association_Resp,0xF,2,ieee_802_11_frame_type_Management},\ 162 { ieee_802_11_frame_subtype_Association_Resp,0xF,2,ieee_802_11_frame_type_Management},\
162 { ieee_802_11_frame_subtype_Reassociation_Req,0xF,2,ieee_802_11_frame_type_Management},\ 163 { ieee_802_11_frame_subtype_Reassociation_Req,0xF,2,ieee_802_11_frame_type_Management},\
163 { ieee_802_11_frame_subtype_Reassociation_Resp,0xF,2,ieee_802_11_frame_type_Management},\ 164 { ieee_802_11_frame_subtype_Reassociation_Resp,0xF,2,ieee_802_11_frame_type_Management},\
164 { ieee_802_11_frame_subtype_Probe_Req ,0xF,1,ieee_802_11_frame_type_Management},\ 165 { ieee_802_11_frame_subtype_Probe_Req ,0xF,1,ieee_802_11_frame_type_Management},\
165 { ieee_802_11_frame_subtype_Probe_Resp ,0xF,1,ieee_802_11_frame_type_Management},\ 166 { ieee_802_11_frame_subtype_Probe_Resp ,0xF,1,ieee_802_11_frame_type_Management},\
166 { ieee_802_11_frame_subtype_Beacon ,0xF,1,ieee_802_11_frame_type_Management},\ 167 { ieee_802_11_frame_subtype_Beacon ,0xF,1,ieee_802_11_frame_type_Management},\
167 { ieee_802_11_frame_subtype_ATIM ,0xF,1,ieee_802_11_frame_type_Management},\ 168 { ieee_802_11_frame_subtype_ATIM ,0xF,1,ieee_802_11_frame_type_Management},\
168 { ieee_802_11_frame_subtype_Disassociation,0xF,2,ieee_802_11_frame_type_Management},\ 169 { ieee_802_11_frame_subtype_Disassociation,0xF,2,ieee_802_11_frame_type_Management},\
169 { ieee_802_11_frame_subtype_Authentication,0xF,1,ieee_802_11_frame_type_Management},\ 170 { ieee_802_11_frame_subtype_Authentication,0xF,1,ieee_802_11_frame_type_Management},\
170 { ieee_802_11_frame_subtype_Deauthentication,0xF,3,ieee_802_11_frame_type_Management},\ 171 { ieee_802_11_frame_subtype_Deauthentication,0xF,3,ieee_802_11_frame_type_Management},\
171 { ieee_802_11_frame_subtype_PS-Poll ,0xF,3,ieee_802_11_frame_type_Control},\ 172 { ieee_802_11_frame_subtype_PS-Poll ,0xF,3,ieee_802_11_frame_type_Control},\
172 { ieee_802_11_frame_subtype_RTS ,0xF,1,ieee_802_11_frame_type_Control},\ 173 { ieee_802_11_frame_subtype_RTS ,0xF,1,ieee_802_11_frame_type_Control},\
173 { ieee_802_11_frame_subtype_CTS ,0xF,1,ieee_802_11_frame_type_Control},\ 174 { ieee_802_11_frame_subtype_CTS ,0xF,1,ieee_802_11_frame_type_Control},\
174 { ieee_802_11_frame_subtype_ACK ,0xF,1,ieee_802_11_frame_type_Control},\ 175 { ieee_802_11_frame_subtype_ACK ,0xF,1,ieee_802_11_frame_type_Control},\
175 { ieee_802_11_frame_subtype_CFEnd ,0xF,1,ieee_802_11_frame_type_Control},\ 176 { ieee_802_11_frame_subtype_CFEnd ,0xF,1,ieee_802_11_frame_type_Control},\
176 { ieee_802_11_frame_subtype_CFEnd_CFAck ,0xF,1,ieee_802_11_frame_type_Control},\ 177 { ieee_802_11_frame_subtype_CFEnd_CFAck ,0xF,1,ieee_802_11_frame_type_Control},\
177 { ieee_802_11_frame_subtype_Data ,0xF,3,ieee_802_11_frame_type_Data},\ 178 { ieee_802_11_frame_subtype_Data ,0xF,3,ieee_802_11_frame_type_Data},\
178 { ieee_802_11_frame_subtype_Data_CFAck ,0xF,3,ieee_802_11_frame_type_Data},\ 179 { ieee_802_11_frame_subtype_Data_CFAck ,0xF,3,ieee_802_11_frame_type_Data},\
179 { ieee_802_11_frame_subtype_Data_CF_Poll 0xF,3,ieee_802_11_frame_type_Data},\ 180 { ieee_802_11_frame_subtype_Data_CF_Poll 0xF,3,ieee_802_11_frame_type_Data},\
180 { ieee_802_11_frame_subtype_Data_CF_AckCF_Poll,0xF,3,ieee_802_11_frame_type_Data},\ 181 { ieee_802_11_frame_subtype_Data_CF_AckCF_Poll,0xF,3,ieee_802_11_frame_type_Data},\
181 { ieee_802_11_frame_subtype_NullFunction 0xF,1,ieee_802_11_frame_type_Data},\ 182 { ieee_802_11_frame_subtype_NullFunction 0xF,1,ieee_802_11_frame_type_Data},\
182 { ieee_802_11_frame_subtype_CF_Ack , 0xF,1,ieee_802_11_frame_type_Data},\ 183 { ieee_802_11_frame_subtype_CF_Ack , 0xF,1,ieee_802_11_frame_type_Data},\
183 { ieee_802_11_frame_subtype_CF_Poll , 0xF,1,ieee_802_11_frame_type_Data},\ 184 { ieee_802_11_frame_subtype_CF_Poll , 0xF,1,ieee_802_11_frame_type_Data},\
184 { ieee_802_11_frame_subtype_CF_AckCF_Poll,0xF,1,ieee_802_11_frame_type_Data},\ 185 { ieee_802_11_frame_subtype_CF_AckCF_Poll,0xF,1,ieee_802_11_frame_type_Data},\
185 { 0,0,NULL}\ 186 { 0,0,NULL}\
186} 187}
187 188
188 #define IEEE802_11_FC_LEN2 189 #define IEEE802_11_FC_LEN2
189 190
190#define T_MGMT 0x0 /* management */ 191#define T_MGMT 0x0 /* management */
191#define T_CTRL 0x1 /* control */ 192#define T_CTRL 0x1 /* control */
192#define T_DATA 0x2 /* data */ 193#define T_DATA 0x2 /* data */
193#define T_RESV 0x3 /* reserved */ 194#define T_RESV 0x3 /* reserved */
194 195
195 #define ST_ASSOC_REQUEST 0x0 196 #define ST_ASSOC_REQUEST 0x0
196 #define ST_ASSOC_RESPONSE 0x1 197 #define ST_ASSOC_RESPONSE 0x1
197 #define ST_REASSOC_REQUEST 0x2 198 #define ST_REASSOC_REQUEST 0x2
198 #define ST_REASSOC_RESPONSE 0x3 199 #define ST_REASSOC_RESPONSE 0x3
199 #define ST_PROBE_REQUEST 0x4 200 #define ST_PROBE_REQUEST 0x4
200 #define ST_PROBE_RESPONSE 0x5 201 #define ST_PROBE_RESPONSE 0x5
201 /* RESERVED 0x6 */ 202 /* RESERVED 0x6 */
202 /* RESERVED 0x7 */ 203 /* RESERVED 0x7 */
203 #define ST_BEACON 0x8 204 #define ST_BEACON 0x8
204 #define ST_ATIM 0x9 205 #define ST_ATIM 0x9
205 #define ST_DISASSOC 0xA 206 #define ST_DISASSOC 0xA
206 #define ST_AUTH 0xB 207 #define ST_AUTH 0xB
207 #define ST_DEAUTH 0xC 208 #define ST_DEAUTH 0xC
208 /* RESERVED 0xD */ 209 /* RESERVED 0xD */
209 /* RESERVED 0xE */ 210 /* RESERVED 0xE */
210 /* RESERVED 0xF */ 211 /* RESERVED 0xF */
211 212
212 213
213 #define CTRL_PS_POLL0xA 214 #define CTRL_PS_POLL0xA
214 #define CTRL_RTS0xB 215 #define CTRL_RTS0xB
215 #define CTRL_CTS0xC 216 #define CTRL_CTS0xC
216 #define CTRL_ACK0xD 217 #define CTRL_ACK0xD
217 #define CTRL_CF_END0xE 218 #define CTRL_CF_END0xE
218 #define CTRL_END_ACK0xF 219 #define CTRL_END_ACK0xF
219 220
220/* 221/*
221 * Bits in the frame control field. 222 * Bits in the frame control field.
222 */ 223 */
223 #define FC_VERSION(fc) ((fc) & 0x3) 224 #define FC_VERSION(fc) ((fc) & 0x3)
224 #define FC_TYPE(fc) (((fc) >> 2) & 0x3) 225 #define FC_TYPE(fc) (((fc) >> 2) & 0x3)
225 #define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF) 226 #define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF)
226 #define FC_TO_DS(fc) ((fc) & 0x0100) 227 #define FC_TO_DS(fc) ((fc) & 0x0100)
227 #define FC_FROM_DS(fc) ((fc) & 0x0200) 228 #define FC_FROM_DS(fc) ((fc) & 0x0200)
228 #define FC_MORE_FLAG(fc)((fc) & 0x0400) 229 #define FC_MORE_FLAG(fc)((fc) & 0x0400)
229 #define FC_RETRY(fc) ((fc) & 0x0800) 230 #define FC_RETRY(fc) ((fc) & 0x0800)
230 #define FC_POWER_MGMT(fc)((fc) & 0x1000) 231 #define FC_POWER_MGMT(fc)((fc) & 0x1000)
231 #define FC_MORE_DATA(fc)((fc) & 0x2000) 232 #define FC_MORE_DATA(fc)((fc) & 0x2000)
232 #define FC_WEP(fc) ((fc) & 0x4000) 233 #define FC_WEP(fc) ((fc) & 0x4000)
233 #define FC_ORDER(fc) ((fc) & 0x8000) 234 #define FC_ORDER(fc) ((fc) & 0x8000)
234 235
235 236
236struct ieee_802_11_mgmt_header { 237struct ieee_802_11_mgmt_header {
237 u_int16_t fc; 238 u_int16_t fc;
238 u_int16_t duration; 239 u_int16_t duration;
239 u_int8_t da[6]; 240 u_int8_t da[6];
240 u_int8_t sa[6]; 241 u_int8_t sa[6];
241 u_int8_t bssid[6]; 242 u_int8_t bssid[6];
242 u_int16_t seq_ctrl; 243 u_int16_t seq_ctrl;
243}; 244};
244 245
245 246
246struct ieee_802_11_data_header { 247struct ieee_802_11_data_header {
247 u_int16_tframe_control; 248 u_int16_tframe_control;
248 u_int16_tduration; 249 u_int16_tduration;
249 u_int8_tmac1[6]; 250 u_int8_tmac1[6];
250 u_int8_tmac2[6]; 251 u_int8_tmac2[6];
251 u_int8_tmac3[6]; 252 u_int8_tmac3[6];
252 u_int16_tSeqCtl; 253 u_int16_tSeqCtl;
253 u_int8_tmac4[6]; 254 u_int8_tmac4[6];
254 // u_int16_tgapLen; 255 // u_int16_tgapLen;
255 // u_int8_tgap[8]; 256 // u_int8_tgap[8];
256}; 257};
257 258
258struct ieee_802_11_control_header { 259struct ieee_802_11_control_header {
259 u_int16_tframe_control; 260 u_int16_tframe_control;
260 u_int16_tduration; 261 u_int16_tduration;
261 u_int8_tmac1[6]; 262 u_int8_tmac1[6];
262 u_int8_tmac2[6]; 263 u_int8_tmac2[6];
263 u_int8_tmac3[6]; 264 u_int8_tmac3[6];
264 u_int16_tSeqCtl; 265 u_int16_tSeqCtl;
265 u_int8_tmac4[6]; 266 u_int8_tmac4[6];
266 // u_int16_tgapLen; 267 // u_int16_tgapLen;
267 // u_int8_tgap[8]; 268 // u_int8_tgap[8];
268}; 269};
269 270
270#define CAPABILITY_ESS(cap) ((cap) & 0x0001) 271#define CAPABILITY_ESS(cap) ((cap) & 0x0001)
271#define CAPABILITY_IBSS(cap) ((cap) & 0x0002) 272#define CAPABILITY_IBSS(cap) ((cap) & 0x0002)
272#define CAPABILITY_CFP(cap) ((cap) & 0x0004) 273#define CAPABILITY_CFP(cap) ((cap) & 0x0004)
273#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008) 274#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008)
274#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010) 275#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010)
275 276
276struct ssid_t { 277struct ssid_t {
277 u_int8_telement_id; 278 u_int8_telement_id;
278 u_int8_tlength; 279 u_int8_tlength;
279 u_char ssid[33]; /* 32 + 1 for null */ 280 u_char ssid[33]; /* 32 + 1 for null */
280}; 281};
281 282
282 283
283struct rates_t { 284struct rates_t {
284 u_int8_telement_id; 285 u_int8_telement_id;
285 u_int8_tlength; 286 u_int8_tlength;
286 u_int8_trate[8]; 287 u_int8_trate[8];
287}; 288};
288 289
289 290
290struct challenge_t { 291struct challenge_t {
291 u_int8_telement_id; 292 u_int8_telement_id;
292 u_int8_tlength; 293 u_int8_tlength;
293 u_int8_ttext[254]; /* 1-253 + 1 for null */ 294 u_int8_ttext[254]; /* 1-253 + 1 for null */
294}; 295};
295 296
296 297
297struct fh_t { 298struct fh_t {
298 u_int8_telement_id; 299 u_int8_telement_id;
299 u_int8_tlength; 300 u_int8_tlength;
300 u_int16_tdwell_time; 301 u_int16_tdwell_time;
301 u_int8_thop_set; 302 u_int8_thop_set;
302 u_int8_t hop_pattern; 303 u_int8_t hop_pattern;
303 u_int8_thop_index; 304 u_int8_thop_index;
304}; 305};
305 306
306 307
307struct ds_t { 308struct ds_t {
308 u_int8_telement_id; 309 u_int8_telement_id;
309 u_int8_tlength; 310 u_int8_tlength;
310 u_int8_tchannel; 311 u_int8_tchannel;
311}; 312};
312 313
313 314
314struct cf_t { 315struct cf_t {
315 u_int8_telement_id; 316 u_int8_telement_id;
316 u_int8_tlength; 317 u_int8_tlength;
317 u_int8_tcount; 318 u_int8_tcount;
318 u_int8_tperiod; 319 u_int8_tperiod;
319 u_int16_tmax_duration; 320 u_int16_tmax_duration;
320 u_int16_tdur_remaing; 321 u_int16_tdur_remaing;
321}; 322};
322 323
323 324
324struct tim_t { 325struct tim_t {
325 u_int8_telement_id; 326 u_int8_telement_id;
326 u_int8_tlength; 327 u_int8_tlength;
327 u_int8_tcount; 328 u_int8_tcount;
328 u_int8_tperiod; 329 u_int8_tperiod;
329 u_int8_tbitmap_control; 330 u_int8_tbitmap_control;
330 u_int8_tbitmap[251]; 331 u_int8_tbitmap[251];
331}; 332};
332 333
333 334
334struct ibss_t { 335struct ibss_t {
335 u_int8_telement_id; 336 u_int8_telement_id;
336 u_int8_tlength; 337 u_int8_tlength;
337 u_int16_tatim_window; 338 u_int16_tatim_window;
338}; 339};
339 340
340 341
341#define E_SSID 0 342#define E_SSID 0
342#define E_RATES 1 343#define E_RATES 1
343#define E_FH 2 344#define E_FH 2
344#define E_DS 3 345#define E_DS 3
345#define E_CF 4 346#define E_CF 4
346#define E_TIM 5 347#define E_TIM 5
347#define E_IBSS 6 348#define E_IBSS 6
348#define E_CHALLENGE 16 349#define E_CHALLENGE 16
349#define E_CISCO 133 350#define E_CISCO 133
350 351
351 352
352struct ieee_802_11_mgmt_body { 353struct ieee_802_11_mgmt_body {
353 u_int8_t timestamp[8]; 354 u_int8_t timestamp[8];
354 u_int16_t beacon_interval; 355 u_int16_t beacon_interval;
355 // u_int16_t listen_interval; 356 // u_int16_t listen_interval;
356 // u_int16_t status_code; 357 // u_int16_t status_code;
357 // u_int16_t aid; 358 // u_int16_t aid;
358 // u_char ap[6]; 359 // u_char ap[6];
359 // u_int16_treason_code; 360 // u_int16_treason_code;
360 // u_int16_tauth_alg; 361 // u_int16_tauth_alg;
361 // u_int16_tauth_trans_seq_num; 362 // u_int16_tauth_trans_seq_num;
362// struct challenge_t challenge; 363// struct challenge_t challenge;
363 u_int16_t capability_info; 364 u_int16_t capability_info;
364 // struct ssid_tssid; 365 // struct ssid_tssid;
365 // struct rates_t rates; 366 // struct rates_t rates;
366 // struct ds_tds; 367 // struct ds_tds;
367 // struct cf_tcf; 368 // struct cf_tcf;
368 // struct fh_tfh; 369 // struct fh_tfh;
369 // struct tim_ttim; 370 // struct tim_ttim;
370}; 371};
371 372
372/* a 802.11 value */ 373/* a 802.11 value */
373struct val_80211 { 374struct val_80211 {
374 unsigned int did; 375 unsigned int did;
375 unsigned short status, len; 376 unsigned short status, len;
376 unsigned int data; 377 unsigned int data;
377}; 378};
378 379
379/* header attached during prism monitor mode */ 380/* header attached during prism monitor mode */
380struct prism_hdr { 381struct prism_hdr {
381 unsigned int msgcode, msglen; 382 unsigned int msgcode, msglen;
382 char devname[16]; 383 char devname[16];
383 struct val_80211 hosttime, mactime, channel, rssi, sq, signal, 384 struct val_80211 hosttime, mactime, channel, rssi, sq, signal,
384 noise, rate, istx, frmlen; 385 noise, rate, istx, frmlen;
385}; 386};
386 387
387struct ieee_802_11_data_body { 388struct ieee_802_11_data_body {
388//FIXME 389//FIXME
389}; 390};
390 391
391struct ieee_802_11_control_body { 392struct ieee_802_11_control_body {
392//FIXME 393//FIXME
393}; 394};
394 395
395struct ctrl_rts_t { 396struct ctrl_rts_t {
396 u_int16_tfc; 397 u_int16_tfc;
397 u_int16_tduration; 398 u_int16_tduration;
398 u_int8_tra[6]; 399 u_int8_tra[6];
399 u_int8_tta[6]; 400 u_int8_tta[6];
400 u_int8_tfcs[4]; 401 u_int8_tfcs[4];
401}; 402};
402 403
403 #define CTRL_RTS_LEN(2+2+6+6+4) 404 #define CTRL_RTS_LEN(2+2+6+6+4)
404 405
405struct ctrl_cts_t { 406struct ctrl_cts_t {
406 u_int16_tfc; 407 u_int16_tfc;
407 u_int16_tduration; 408 u_int16_tduration;
408 u_int8_tra[6]; 409 u_int8_tra[6];
409 u_int8_tfcs[4]; 410 u_int8_tfcs[4];
410}; 411};
411 412
412 #define CTRL_CTS_LEN(2+2+6+4) 413 #define CTRL_CTS_LEN(2+2+6+4)
413 414
414struct ctrl_ack_t { 415struct ctrl_ack_t {
415 u_int16_tfc; 416 u_int16_tfc;
416 u_int16_tduration; 417 u_int16_tduration;
417 u_int8_tra[6]; 418 u_int8_tra[6];
418 u_int8_tfcs[4]; 419 u_int8_tfcs[4];
419}; 420};
420 421
421 #define CTRL_ACK_LEN(2+2+6+4) 422 #define CTRL_ACK_LEN(2+2+6+4)
422 423
423struct ctrl_ps_poll_t { 424struct ctrl_ps_poll_t {
424 u_int16_tfc; 425 u_int16_tfc;
425 u_int16_taid; 426 u_int16_taid;
426 u_int8_tbssid[6]; 427 u_int8_tbssid[6];
427 u_int8_tta[6]; 428 u_int8_tta[6];
428 u_int8_tfcs[4]; 429 u_int8_tfcs[4];
429}; 430};
430 431
431 #define CTRL_PS_POLL_LEN(2+2+6+6+4) 432 #define CTRL_PS_POLL_LEN(2+2+6+6+4)
432 433
433struct ctrl_end_t { 434struct ctrl_end_t {
434 u_int16_tfc; 435 u_int16_tfc;
435 u_int16_tduration; 436 u_int16_tduration;
436 u_int8_tra[6]; 437 u_int8_tra[6];
437 u_int8_tbssid[6]; 438 u_int8_tbssid[6];
438 u_int8_tfcs[4]; 439 u_int8_tfcs[4];
439}; 440};
440 441
441 #define CTRL_END_LEN(2+2+6+6+4) 442 #define CTRL_END_LEN(2+2+6+6+4)
442 443
443struct ctrl_end_ack_t { 444struct ctrl_end_ack_t {
444 u_int16_tfc; 445 u_int16_tfc;
445 u_int16_tduration; 446 u_int16_tduration;
446 u_int8_tra[6]; 447 u_int8_tra[6];
447 u_int8_tbssid[6]; 448 u_int8_tbssid[6];
448 u_int8_tfcs[4]; 449 u_int8_tfcs[4];
449}; 450};
450 451
451 #define CTRL_END_ACK_LEN(2+2+6+6+4) 452 #define CTRL_END_ACK_LEN(2+2+6+6+4)
452 453
453 #define IV_IV(iv)((iv) & 0xFFFFFF) 454 #define IV_IV(iv)((iv) & 0xFFFFFF)
454 #define IV_PAD(iv)(((iv) >> 24) & 0x3F) 455 #define IV_PAD(iv)(((iv) >> 24) & 0x3F)
455 #define IV_KEYID(iv)(((iv) >> 30) & 0x03) 456 #define IV_KEYID(iv)(((iv) >> 30) & 0x03)
456 457
457#endif 458#endif
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp
index 675818e..e2ab6d7 100644
--- a/libopie2/opienet/opcap.cpp
+++ b/libopie2/opienet/opcap.cpp
@@ -1,998 +1,1057 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team: 3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org> 4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org 5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more 22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 23++=   -.     .`     .: details.
24 :     =  ...= . :.=- 24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 30 Boston, MA 02111-1307, USA.
31 31
32*/ 32*/
33 33
34/* OPIE */ 34/* OPIE */
35 35
36#include <opie2/opcap.h> 36#include <opie2/opcap.h>
37 37
38/* QT */ 38/* QT */
39 39
40#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects) 40#include <qapplication.h> // don't use oapplication here (will decrease reusability in other projects)
41#include <qsocketnotifier.h> 41#include <qsocketnotifier.h>
42#include <qobjectlist.h> 42#include <qobjectlist.h>
43 43
44/*====================================================================================== 44/*======================================================================================
45 * OPacket 45 * OPacket
46 *======================================================================================*/ 46 *======================================================================================*/
47 47
48OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent ) 48OPacket::OPacket( int datalink, packetheaderstruct header, const unsigned char* data, QObject* parent )
49 :QObject( parent, "Generic" ), _hdr( header ), _data( data ) 49 :QObject( parent, "Generic" ), _hdr( header ), _data( data )
50{ 50{
51 //qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen ); 51 //qDebug( "OPacket::OPacket(): (Len %d, CapLen %d)" /*, ctime((const time_t*) header.ts.tv_sec)*/, header.len, header.caplen );
52 52
53 _end = (unsigned char*) data + header.len; 53 _end = (unsigned char*) data + header.len;
54 //qDebug( "OPacket::data @ %0x, end @ %0x", data, _end ); 54 //qDebug( "OPacket::data @ %0x, end @ %0x", data, _end );
55 55
56 switch ( datalink ) 56 switch ( datalink )
57 { 57 {
58 case DLT_EN10MB: 58 case DLT_EN10MB:
59 qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" ); 59 qDebug( "OPacket::OPacket(): Received Packet. Datalink = ETHERNET" );
60 new OEthernetPacket( _end, (const struct ether_header*) data, this ); 60 new OEthernetPacket( _end, (const struct ether_header*) data, this );
61 break; 61 break;
62 62
63 case DLT_IEEE802_11: 63 case DLT_IEEE802_11:
64 qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" ); 64 qDebug( "OPacket::OPacket(): Received Packet. Datalink = IEEE802.11" );
65 new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this ); 65 new OWaveLanPacket( _end, (const struct ieee_802_11_header*) data, this );
66 break; 66 break;
67 67
68 case DLT_PRISM_HEADER: 68 case DLT_PRISM_HEADER:
69 qDebug( "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" ); 69 qDebug( "OPacket::OPacket(): Received Packet. Datalink = PRISM_HEADER" );
70 new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) data, this ); 70 new OPrismHeaderPacket( _end, (const struct prism_hdr*) (unsigned char*) data, this );
71 break; 71 break;
72 72
73 default: 73 default:
74 qWarning( "OPacket::OPacket(): Received Packet over unsupported datalink '%s'!", datalink ); 74 qWarning( "OPacket::OPacket(): Received Packet over unsupported datalink '%s'!", datalink );
75 } 75 }
76} 76}
77 77
78 78
79OPacket::~OPacket() 79OPacket::~OPacket()
80{ 80{
81} 81}
82 82
83 83
84timevalstruct OPacket::timeval() const 84timevalstruct OPacket::timeval() const
85{ 85{
86 return _hdr.ts; 86 return _hdr.ts;
87} 87}
88 88
89 89
90int OPacket::caplen() const 90int OPacket::caplen() const
91{ 91{
92 return _hdr.caplen; 92 return _hdr.caplen;
93} 93}
94 94
95 95
96void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l ) 96void OPacket::updateStats( QMap<QString,int>& stats, QObjectList* l )
97{ 97{
98 if (!l) return; 98 if (!l) return;
99 QObject* o = l->first(); 99 QObject* o = l->first();
100 while ( o ) 100 while ( o )
101 { 101 {
102 stats[o->name()]++; 102 stats[o->name()]++;
103 updateStats( stats, const_cast<QObjectList*>( o->children() ) ); 103 updateStats( stats, const_cast<QObjectList*>( o->children() ) );
104 o = l->next(); 104 o = l->next();
105 } 105 }
106} 106}
107 107
108 108
109QString OPacket::dump( int bpl ) const 109QString OPacket::dump( int bpl ) const
110{ 110{
111 static int index = 0; 111 static int index = 0;
112 index++; 112 index++;
113 int len = _hdr.caplen; 113 int len = _hdr.caplen;
114 QString str; 114 QString str;
115 str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len ); 115 str.sprintf( "\n<----- Packet #%04d Len = 0x%X (%d) ----->\n\n", index, len, len );
116 str.append( "0000: " ); 116 str.append( "0000: " );
117 QString tmp; 117 QString tmp;
118 QString bytes; 118 QString bytes;
119 QString chars; 119 QString chars;
120 120
121 for ( int i = 0; i < len; ++i ) 121 for ( int i = 0; i < len; ++i )
122 { 122 {
123 tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp ); 123 tmp.sprintf( "%02X ", _data[i] ); bytes.append( tmp );
124 if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] ); 124 if ( (_data[i] > 31) && (_data[i]<128) ) chars.append( _data[i] );
125 else chars.append( '.' ); 125 else chars.append( '.' );
126 126
127 if ( !((i+1) % bpl) ) 127 if ( !((i+1) % bpl) )
128 { 128 {
129 str.append( bytes ); 129 str.append( bytes );
130 str.append( ' ' ); 130 str.append( ' ' );
131 str.append( chars ); 131 str.append( chars );
132 str.append( '\n' ); 132 str.append( '\n' );
133 tmp.sprintf( "%04X: ", i+1 ); str.append( tmp ); 133 tmp.sprintf( "%04X: ", i+1 ); str.append( tmp );
134 bytes = ""; 134 bytes = "";
135 chars = ""; 135 chars = "";
136 } 136 }
137 137
138 } 138 }
139 if ( (len % bpl) ) 139 if ( (len % bpl) )
140 { 140 {
141 str.append( bytes.leftJustify( 1 + 3*bpl ) ); 141 str.append( bytes.leftJustify( 1 + 3*bpl ) );
142 str.append( chars ); 142 str.append( chars );
143 } 143 }
144 str.append( '\n' ); 144 str.append( '\n' );
145 return str; 145 return str;
146} 146}
147 147
148 148
149int OPacket::len() const 149int OPacket::len() const
150{ 150{
151 return _hdr.len; 151 return _hdr.len;
152} 152}
153 153
154 154
155/*====================================================================================== 155/*======================================================================================
156 * OEthernetPacket 156 * OEthernetPacket
157 *======================================================================================*/ 157 *======================================================================================*/
158 158
159OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent ) 159OEthernetPacket::OEthernetPacket( const unsigned char* end, const struct ether_header* data, QObject* parent )
160 :QObject( parent, "Ethernet" ), _ether( data ) 160 :QObject( parent, "Ethernet" ), _ether( data )
161
162{ 161{
163 162
164 qDebug( "Source = %s", (const char*) sourceAddress().toString() ); 163 qDebug( "Source = %s", (const char*) sourceAddress().toString() );
165 qDebug( "Destination = %s", (const char*) destinationAddress().toString() ); 164 qDebug( "Destination = %s", (const char*) destinationAddress().toString() );
166 165
167 if ( sourceAddress() == OMacAddress::broadcast ) 166 if ( sourceAddress() == OMacAddress::broadcast )
168 qDebug( "Source is broadcast address" ); 167 qDebug( "Source is broadcast address" );
169 if ( destinationAddress() == OMacAddress::broadcast ) 168 if ( destinationAddress() == OMacAddress::broadcast )
170 qDebug( "Destination is broadcast address" ); 169 qDebug( "Destination is broadcast address" );
171 170
172 switch ( type() ) 171 switch ( type() )
173 { 172 {
174 case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; 173 case ETHERTYPE_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break;
175 case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; } 174 case ETHERTYPE_ARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = ARP" ); break; }
176 case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; } 175 case ETHERTYPE_REVARP: { qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = RARP" ); break; }
177 default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" ); 176 default: qDebug( "OPacket::OPacket(): Received Ethernet Packet : Type = UNKNOWN" );
178 } 177 }
179 178
180} 179}
181 180
182 181
183OEthernetPacket::~OEthernetPacket() 182OEthernetPacket::~OEthernetPacket()
184{ 183{
185} 184}
186 185
187 186
188OMacAddress OEthernetPacket::sourceAddress() const 187OMacAddress OEthernetPacket::sourceAddress() const
189{ 188{
190 return OMacAddress( _ether->ether_shost ); 189 return OMacAddress( _ether->ether_shost );
191} 190}
192 191
193 192
194OMacAddress OEthernetPacket::destinationAddress() const 193OMacAddress OEthernetPacket::destinationAddress() const
195{ 194{
196 return OMacAddress( _ether->ether_dhost ); 195 return OMacAddress( _ether->ether_dhost );
197} 196}
198 197
199int OEthernetPacket::type() const 198int OEthernetPacket::type() const
200{ 199{
201 return ntohs( _ether->ether_type ); 200 return ntohs( _ether->ether_type );
202} 201}
203 202
204 203
205/*====================================================================================== 204/*======================================================================================
206 * OIPPacket 205 * OIPPacket
207 *======================================================================================*/ 206 *======================================================================================*/
208 207
209 208
210OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent ) 209OIPPacket::OIPPacket( const unsigned char* end, const struct iphdr* data, QObject* parent )
211 :QObject( parent, "IP" ), _iphdr( data ) 210 :QObject( parent, "IP" ), _iphdr( data )
212
213{ 211{
214 qDebug( "OIPPacket::OIPPacket(): decoding IP header..." ); 212 qDebug( "OIPPacket::OIPPacket(): decoding IP header..." );
215 213
216 //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) ); 214 //qDebug( "FromAddress: %s", (const char*) inet_ntoa( *src ) );
217 //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) ); 215 //qDebug( " ToAddress: %s", (const char*) inet_ntoa( *dst ) );
218 216
219 qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() ); 217 qDebug( "FromAddress: %s", (const char*) fromIPAddress().toString() );
220 qDebug( " toAddress: %s", (const char*) toIPAddress().toString() ); 218 qDebug( " toAddress: %s", (const char*) toIPAddress().toString() );
221 219
222 switch ( protocol() ) 220 switch ( protocol() )
223 { 221 {
224 case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break; 222 case IPPROTO_UDP: new OUDPPacket( end, (const struct udphdr*) (data+1), this ); break;
225 case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break; 223 case IPPROTO_TCP: new OTCPPacket( end, (const struct tcphdr*) (data+1), this ); break;
226 default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() ); 224 default: qDebug( "OIPPacket::OIPPacket(): unknown IP protocol type = %d", protocol() );
227 } 225 }
228 226
229} 227}
230 228
231OIPPacket::~OIPPacket() 229OIPPacket::~OIPPacket()
232{ 230{
233} 231}
234 232
235 233
236QHostAddress OIPPacket::fromIPAddress() const 234QHostAddress OIPPacket::fromIPAddress() const
237{ 235{
238 return EXTRACT_32BITS( &_iphdr->saddr ); 236 return EXTRACT_32BITS( &_iphdr->saddr );
239} 237}
240 238
241 239
242QHostAddress OIPPacket::toIPAddress() const 240QHostAddress OIPPacket::toIPAddress() const
243{ 241{
244 return EXTRACT_32BITS( &_iphdr->saddr ); 242 return EXTRACT_32BITS( &_iphdr->saddr );
245} 243}
246 244
247 245
248int OIPPacket::tos() const 246int OIPPacket::tos() const
249{ 247{
250 return _iphdr->tos; 248 return _iphdr->tos;
251} 249}
252 250
253 251
254int OIPPacket::len() const 252int OIPPacket::len() const
255{ 253{
256 return EXTRACT_16BITS( &_iphdr->tot_len ); 254 return EXTRACT_16BITS( &_iphdr->tot_len );
257} 255}
258 256
259 257
260int OIPPacket::id() const 258int OIPPacket::id() const
261{ 259{
262 return EXTRACT_16BITS( &_iphdr->id ); 260 return EXTRACT_16BITS( &_iphdr->id );
263} 261}
264 262
265 263
266int OIPPacket::offset() const 264int OIPPacket::offset() const
267{ 265{
268 return EXTRACT_16BITS( &_iphdr->frag_off ); 266 return EXTRACT_16BITS( &_iphdr->frag_off );
269} 267}
270 268
271 269
272int OIPPacket::ttl() const 270int OIPPacket::ttl() const
273{ 271{
274 return _iphdr->ttl; 272 return _iphdr->ttl;
275} 273}
276 274
277 275
278int OIPPacket::protocol() const 276int OIPPacket::protocol() const
279{ 277{
280 return _iphdr->protocol; 278 return _iphdr->protocol;
281} 279}
282 280
283 281
284int OIPPacket::checksum() const 282int OIPPacket::checksum() const
285{ 283{
286 return EXTRACT_16BITS( &_iphdr->check ); 284 return EXTRACT_16BITS( &_iphdr->check );
287} 285}
288 286
289/*====================================================================================== 287/*======================================================================================
288 * OARPPacket
289 *======================================================================================*/
290
291
292OARPPacket::OARPPacket( const unsigned char* end, const struct myarphdr* data, QObject* parent )
293 :QObject( parent, "ARP" ), _arphdr( data )
294{
295 qDebug( "OARPPacket::OARPPacket(): decoding ARP header..." );
296 qDebug( "ARP type seems to be %02d - '%s'", EXTRACT_16BITS( &_arphdr->ar_op ), (const char*) type() );
297 qDebug( "Sender: MAC %s = IP %s", (const char*) senderMacAddress().toString(), (const char*) senderIPV4Address().toString() );
298 qDebug( "Target: MAC %s = IP %s", (const char*) targetMacAddress().toString(), (const char*) targetIPV4Address().toString() );
299}
300
301
302OARPPacket::~OARPPacket()
303{
304}
305
306
307QString OARPPacket::type() const
308{
309 switch ( EXTRACT_16BITS( &_arphdr->ar_op ) )
310 {
311 case 1: return "REQUEST";
312 case 2: return "REPLY";
313 case 3: return "RREQUEST";
314 case 4: return "RREPLY";
315 case 8: return "InREQUEST";
316 case 9: return "InREPLY";
317 case 10: return "NAK";
318 default: qWarning( "OARPPacket::type(): invalid ARP type!" ); return "<unknown>";
319 }
320}
321
322
323QHostAddress OARPPacket::senderIPV4Address() const
324{
325 return EXTRACT_32BITS( &_arphdr->ar_sip );
326}
327
328
329QHostAddress OARPPacket::targetIPV4Address() const
330{
331 return EXTRACT_32BITS( &_arphdr->ar_tip );
332}
333
334
335OMacAddress OARPPacket::senderMacAddress() const
336{
337 return OMacAddress( _arphdr->ar_sha );
338}
339
340
341OMacAddress OARPPacket::targetMacAddress() const
342{
343 return OMacAddress( _arphdr->ar_tha );
344}
345
346
347/*======================================================================================
290 * OUDPPacket 348 * OUDPPacket
291 *======================================================================================*/ 349 *======================================================================================*/
292 350
293 351
294OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent ) 352OUDPPacket::OUDPPacket( const unsigned char* end, const struct udphdr* data, QObject* parent )
295 :QObject( parent, "UDP" ), _udphdr( data ) 353 :QObject( parent, "UDP" ), _udphdr( data )
296 354
297{ 355{
298 qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." ); 356 qDebug( "OUDPPacket::OUDPPacket(): decoding UDP header..." );
299} 357}
300 358
301OUDPPacket::~OUDPPacket() 359OUDPPacket::~OUDPPacket()
302{ 360{
303} 361}
304 362
305 363
306/*====================================================================================== 364/*======================================================================================
307 * OTCPPacket 365 * OTCPPacket
308 *======================================================================================*/ 366 *======================================================================================*/
309 367
310 368
311OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent ) 369OTCPPacket::OTCPPacket( const unsigned char* end, const struct tcphdr* data, QObject* parent )
312 :QObject( parent, "TCP" ), _tcphdr( data ) 370 :QObject( parent, "TCP" ), _tcphdr( data )
313 371
314{ 372{
315 qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." ); 373 qDebug( "OTCPPacket::OTCPPacket(): decoding TCP header..." );
316} 374}
317 375
318OTCPPacket::~OTCPPacket() 376OTCPPacket::~OTCPPacket()
319{ 377{
320} 378}
321 379
322 380
323/*====================================================================================== 381/*======================================================================================
324 * OPrismHeaderPacket 382 * OPrismHeaderPacket
325 *======================================================================================*/ 383 *======================================================================================*/
326 384
327 385
328OPrismHeaderPacket::OPrismHeaderPacket( const unsigned char* end, const struct prism_hdr* data, QObject* parent ) 386OPrismHeaderPacket::OPrismHeaderPacket( const unsigned char* end, const struct prism_hdr* data, QObject* parent )
329 :QObject( parent, "Prism" ), _header( data ) 387 :QObject( parent, "Prism" ), _header( data )
330 388
331{ 389{
332 qDebug( "OPrismHeaderPacket::OPrismHeaderPacket(): decoding PRISM header..." ); 390 qDebug( "OPrismHeaderPacket::OPrismHeaderPacket(): decoding PRISM header..." );
333 391
334 qDebug( "Signal Strength = %d", data->signal.data ); 392 qDebug( "Signal Strength = %d", data->signal.data );
335 393
336 new OWaveLanPacket( end, (const struct ieee_802_11_header*) (data+1), this ); 394 new OWaveLanPacket( end, (const struct ieee_802_11_header*) (data+1), this );
337} 395}
338 396
339OPrismHeaderPacket::~OPrismHeaderPacket() 397OPrismHeaderPacket::~OPrismHeaderPacket()
340{ 398{
341} 399}
342 400
343 401
344unsigned int OPrismHeaderPacket::signalStrength() const 402unsigned int OPrismHeaderPacket::signalStrength() const
345{ 403{
346 return _header->signal.data; 404 return _header->signal.data;
347} 405}
348 406
349/*====================================================================================== 407/*======================================================================================
350 * OWaveLanPacket 408 * OWaveLanPacket
351 *======================================================================================*/ 409 *======================================================================================*/
352 410
353 411
354OWaveLanPacket::OWaveLanPacket( const unsigned char* end, const struct ieee_802_11_header* data, QObject* parent ) 412OWaveLanPacket::OWaveLanPacket( const unsigned char* end, const struct ieee_802_11_header* data, QObject* parent )
355 :QObject( parent, "802.11" ), _wlanhdr( data ) 413 :QObject( parent, "802.11" ), _wlanhdr( data )
356 414
357{ 415{
358 qDebug( "OWaveLanPacket::OWaveLanPacket(): decoding IEEE 802.11 header..." ); 416 qDebug( "OWaveLanPacket::OWaveLanPacket(): decoding IEEE 802.11 header..." );
359 qDebug( "type: %0X", type() ); 417 qDebug( "type: %0X", type() );
360 qDebug( "subType: %0X", subType() ); 418 qDebug( "subType: %0X", subType() );
361 qDebug( "duration: %d", duration() ); 419 qDebug( "duration: %d", duration() );
362 qDebug( "powermanagement: %d", usesPowerManagement() ); 420 qDebug( "powermanagement: %d", usesPowerManagement() );
363 qDebug( "payload is encrypted: %s", usesWep() ? "yes" : "no" ); 421 qDebug( "payload is encrypted: %s", usesWep() ? "yes" : "no" );
364 qDebug( "MAC1: %s", (const char*) macAddress1().toString() ); 422 qDebug( "MAC1: %s", (const char*) macAddress1().toString() );
365 qDebug( "MAC2: %s", (const char*) macAddress2().toString() ); 423 qDebug( "MAC2: %s", (const char*) macAddress2().toString() );
366 qDebug( "MAC3: %s", (const char*) macAddress3().toString() ); 424 qDebug( "MAC3: %s", (const char*) macAddress3().toString() );
367 qDebug( "MAC4: %s", (const char*) macAddress4().toString() ); 425 qDebug( "MAC4: %s", (const char*) macAddress4().toString() );
368 426
369 switch ( type() ) 427 switch ( type() )
370 { 428 {
371 case T_MGMT: new OWaveLanManagementPacket( end, (const struct ieee_802_11_mgmt_header*) data, this ); break; 429 case T_MGMT: new OWaveLanManagementPacket( end, (const struct ieee_802_11_mgmt_header*) data, this ); break;
372 case T_DATA: new OWaveLanDataPacket( end, (const struct ieee_802_11_data_header*) data, this ); break; 430 case T_DATA: new OWaveLanDataPacket( end, (const struct ieee_802_11_data_header*) data, this ); break;
373 case T_CTRL: new OWaveLanControlPacket( end, (const struct ieee_802_11_control_header*) data, this ); break; 431 case T_CTRL: new OWaveLanControlPacket( end, (const struct ieee_802_11_control_header*) data, this ); break;
374 default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown major type '%d'!", type() ); 432 default: qDebug( "OWaveLanPacket::OWaveLanPacket(): Warning: Unknown major type '%d'!", type() );
375 } 433 }
376} 434}
377 435
378OWaveLanPacket::~OWaveLanPacket() 436OWaveLanPacket::~OWaveLanPacket()
379{ 437{
380} 438}
381 439
382 440
383int OWaveLanPacket::duration() const 441int OWaveLanPacket::duration() const
384{ 442{
385 return _wlanhdr->duration; 443 return _wlanhdr->duration;
386} 444}
387 445
388 446
389OMacAddress OWaveLanPacket::macAddress1() const 447OMacAddress OWaveLanPacket::macAddress1() const
390{ 448{
391 return OMacAddress( _wlanhdr->mac1 ); 449 return OMacAddress( _wlanhdr->mac1 );
392} 450}
393 451
394 452
395OMacAddress OWaveLanPacket::macAddress2() const 453OMacAddress OWaveLanPacket::macAddress2() const
396{ 454{
397 return OMacAddress( _wlanhdr->mac2 ); 455 return OMacAddress( _wlanhdr->mac2 );
398} 456}
399 457
400 458
401OMacAddress OWaveLanPacket::macAddress3() const 459OMacAddress OWaveLanPacket::macAddress3() const
402{ 460{
403 return OMacAddress( _wlanhdr->mac3 ); 461 return OMacAddress( _wlanhdr->mac3 );
404} 462}
405 463
406 464
407OMacAddress OWaveLanPacket::macAddress4() const 465OMacAddress OWaveLanPacket::macAddress4() const
408{ 466{
409 return OMacAddress( _wlanhdr->mac4 ); 467 return OMacAddress( _wlanhdr->mac4 );
410} 468}
411 469
412 470
413int OWaveLanPacket::subType() const 471int OWaveLanPacket::subType() const
414{ 472{
415 return FC_SUBTYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 473 return FC_SUBTYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
416} 474}
417 475
418 476
419int OWaveLanPacket::type() const 477int OWaveLanPacket::type() const
420{ 478{
421 return FC_TYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 479 return FC_TYPE( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
422} 480}
423 481
424 482
425int OWaveLanPacket::version() const 483int OWaveLanPacket::version() const
426{ 484{
427 return FC_VERSION( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 485 return FC_VERSION( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
428} 486}
429 487
430 488
431bool OWaveLanPacket::fromDS() const 489bool OWaveLanPacket::fromDS() const
432{ 490{
433 return FC_FROM_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 491 return FC_FROM_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
434} 492}
435 493
436 494
437bool OWaveLanPacket::toDS() const 495bool OWaveLanPacket::toDS() const
438{ 496{
439 return FC_TO_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 497 return FC_TO_DS( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
440} 498}
441 499
442 500
443bool OWaveLanPacket::usesPowerManagement() const 501bool OWaveLanPacket::usesPowerManagement() const
444{ 502{
445 return FC_POWER_MGMT( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 503 return FC_POWER_MGMT( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
446} 504}
447 505
448 506
449bool OWaveLanPacket::usesWep() const 507bool OWaveLanPacket::usesWep() const
450{ 508{
451 return FC_WEP( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) ); 509 return FC_WEP( EXTRACT_LE_16BITS( &_wlanhdr->frame_control ) );
452} 510}
453 511
454 512
455/*====================================================================================== 513/*======================================================================================
456 * OWaveLanManagementPacket 514 * OWaveLanManagementPacket
457 *======================================================================================*/ 515 *======================================================================================*/
458 516
459OWaveLanManagementPacket::OWaveLanManagementPacket( const unsigned char* end, const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent ) 517OWaveLanManagementPacket::OWaveLanManagementPacket( const unsigned char* end, const struct ieee_802_11_mgmt_header* data, OWaveLanPacket* parent )
460 :QObject( parent, "802.11 Management" ), _header( data ), 518 :QObject( parent, "802.11 Management" ), _header( data ),
461 _body( (const struct ieee_802_11_mgmt_body*) (data+1) ) 519 _body( (const struct ieee_802_11_mgmt_body*) (data+1) )
462{ 520{
463 qDebug( "OWaveLanManagementPacket::OWaveLanManagementPacket(): decoding frame..." ); 521 qDebug( "OWaveLanManagementPacket::OWaveLanManagementPacket(): decoding frame..." );
464 qDebug( "Detected subtype is '%s'", (const char*) managementType() ); 522 qDebug( "Detected subtype is '%s'", (const char*) managementType() );
465 523
466 // grab tagged values 524 // grab tagged values
467 const unsigned char* ptr = (const unsigned char*) (_body+1); 525 const unsigned char* ptr = (const unsigned char*) (_body+1);
468 while (ptr < end) 526 while (ptr < end)
469 { 527 {
470 switch ( *ptr ) 528 switch ( *ptr )
471 { 529 {
472 case E_SSID: new OWaveLanManagementSSID( end, (struct ssid_t*) ptr, this ); break; 530 case E_SSID: new OWaveLanManagementSSID( end, (struct ssid_t*) ptr, this ); break;
473 case E_FH: new OWaveLanManagementFH( end, (struct fh_t*) ptr, this ); break; 531 case E_FH: new OWaveLanManagementFH( end, (struct fh_t*) ptr, this ); break;
474 case E_DS: new OWaveLanManagementDS( end, (struct ds_t*) ptr, this ); break; 532 case E_DS: new OWaveLanManagementDS( end, (struct ds_t*) ptr, this ); break;
475 case E_RATES: new OWaveLanManagementRates( end, (struct rates_t*) ptr, this ); break; 533 case E_RATES: new OWaveLanManagementRates( end, (struct rates_t*) ptr, this ); break;
476 case E_CF: new OWaveLanManagementCF( end, (struct cf_t*) ptr, this ); break; 534 case E_CF: new OWaveLanManagementCF( end, (struct cf_t*) ptr, this ); break;
477 case E_TIM: new OWaveLanManagementTim( end, (struct tim_t*) ptr, this ); break; 535 case E_TIM: new OWaveLanManagementTim( end, (struct tim_t*) ptr, this ); break;
478 case E_IBSS: new OWaveLanManagementIBSS( end, (struct ibss_t*) ptr, this ); break; 536 case E_IBSS: new OWaveLanManagementIBSS( end, (struct ibss_t*) ptr, this ); break;
479 case E_CHALLENGE: new OWaveLanManagementChallenge( end, (struct challenge_t*) ptr, this ); break; 537 case E_CHALLENGE: new OWaveLanManagementChallenge( end, (struct challenge_t*) ptr, this ); break;
480 } 538 }
481 ptr+= ( ( struct ssid_t* ) ptr )->length; // skip length of tagged value 539 ptr+= ( ( struct ssid_t* ) ptr )->length; // skip length of tagged value
482 ptr+= 2; // skip tag ID and length 540 ptr+= 2; // skip tag ID and length
483 } 541 }
484} 542}
485 543
486 544
487OWaveLanManagementPacket::~OWaveLanManagementPacket() 545OWaveLanManagementPacket::~OWaveLanManagementPacket()
488{ 546{
489} 547}
490 548
491 549
492QString OWaveLanManagementPacket::managementType() const 550QString OWaveLanManagementPacket::managementType() const
493{ 551{
494 switch ( FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) ) 552 switch ( FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) )
495 { 553 {
496 case ST_ASSOC_REQUEST: return "AssociationRequest"; break; 554 case ST_ASSOC_REQUEST: return "AssociationRequest"; break;
497 case ST_ASSOC_RESPONSE: return "AssociationResponse"; break; 555 case ST_ASSOC_RESPONSE: return "AssociationResponse"; break;
498 case ST_REASSOC_REQUEST: return "ReassociationRequest"; break; 556 case ST_REASSOC_REQUEST: return "ReassociationRequest"; break;
499 case ST_REASSOC_RESPONSE: return "ReassociationResponse"; break; 557 case ST_REASSOC_RESPONSE: return "ReassociationResponse"; break;
500 case ST_PROBE_REQUEST: return "ProbeRequest"; break; 558 case ST_PROBE_REQUEST: return "ProbeRequest"; break;
501 case ST_PROBE_RESPONSE: return "ProbeResponse"; break; 559 case ST_PROBE_RESPONSE: return "ProbeResponse"; break;
502 case ST_BEACON: return "Beacon"; break; 560 case ST_BEACON: return "Beacon"; break;
503 case ST_ATIM: return "Atim"; break; 561 case ST_ATIM: return "Atim"; break;
504 case ST_DISASSOC: return "Disassociation"; break; 562 case ST_DISASSOC: return "Disassociation"; break;
505 case ST_AUTH: return "Authentication"; break; 563 case ST_AUTH: return "Authentication"; break;
506 case ST_DEAUTH: return "Deathentication"; break; 564 case ST_DEAUTH: return "Deathentication"; break;
507 default: 565 default:
508 qWarning( "OWaveLanManagementPacket::managementType(): unhandled subtype %d", FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) ); 566 qWarning( "OWaveLanManagementPacket::managementType(): unhandled subtype %d", FC_SUBTYPE( EXTRACT_LE_16BITS( &_header->fc ) ) );
509 return "Unknown"; 567 return "Unknown";
510 } 568 }
511} 569}
512 570
513 571
514int OWaveLanManagementPacket::beaconInterval() const 572int OWaveLanManagementPacket::beaconInterval() const
515{ 573{
516 return EXTRACT_LE_16BITS( &_body->beacon_interval ); 574 return EXTRACT_LE_16BITS( &_body->beacon_interval );
517} 575}
518 576
519 577
520int OWaveLanManagementPacket::capabilities() const 578int OWaveLanManagementPacket::capabilities() const
521{ 579{
522 return EXTRACT_LE_16BITS( &_body->capability_info ); 580 return EXTRACT_LE_16BITS( &_body->capability_info );
523} 581}
524 582
525 583
526bool OWaveLanManagementPacket::canESS() const 584bool OWaveLanManagementPacket::canESS() const
527{ 585{
528 return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) ); 586 return CAPABILITY_ESS( EXTRACT_LE_16BITS( &_body->capability_info ) );
529} 587}
530 588
531 589
532bool OWaveLanManagementPacket::canIBSS() const 590bool OWaveLanManagementPacket::canIBSS() const
533{ 591{
534 return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) ); 592 return CAPABILITY_IBSS( EXTRACT_LE_16BITS( &_body->capability_info ) );
535} 593}
536 594
537 595
538bool OWaveLanManagementPacket::canCFP() const 596bool OWaveLanManagementPacket::canCFP() const
539{ 597{
540 return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) ); 598 return CAPABILITY_CFP( EXTRACT_LE_16BITS( &_body->capability_info ) );
541} 599}
542 600
543 601
544bool OWaveLanManagementPacket::canCFP_REQ() const 602bool OWaveLanManagementPacket::canCFP_REQ() const
545{ 603{
546 return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) ); 604 return CAPABILITY_CFP_REQ( EXTRACT_LE_16BITS( &_body->capability_info ) );
547} 605}
548 606
549 607
550bool OWaveLanManagementPacket::canPrivacy() const 608bool OWaveLanManagementPacket::canPrivacy() const
551{ 609{
552 return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) ); 610 return CAPABILITY_PRIVACY( EXTRACT_LE_16BITS( &_body->capability_info ) );
553} 611}
554 612
555 613
556/*====================================================================================== 614/*======================================================================================
557 * OWaveLanManagementSSID 615 * OWaveLanManagementSSID
558 *======================================================================================*/ 616 *======================================================================================*/
559 617
560OWaveLanManagementSSID::OWaveLanManagementSSID( const unsigned char* end, const struct ssid_t* data, QObject* parent ) 618OWaveLanManagementSSID::OWaveLanManagementSSID( const unsigned char* end, const struct ssid_t* data, QObject* parent )
561 :QObject( parent, "802.11 SSID" ), _data( data ) 619 :QObject( parent, "802.11 SSID" ), _data( data )
562{ 620{
563 qDebug( "OWaveLanManagementSSID()" ); 621 qDebug( "OWaveLanManagementSSID()" );
564} 622}
565 623
566 624
567OWaveLanManagementSSID::~OWaveLanManagementSSID() 625OWaveLanManagementSSID::~OWaveLanManagementSSID()
568{ 626{
569} 627}
570 628
571 629
572QString OWaveLanManagementSSID::ID() const 630QString OWaveLanManagementSSID::ID() const
573{ 631{
574 int length = _data->length; 632 int length = _data->length;
575 if ( length > 32 ) length = 32; 633 if ( length > 32 ) length = 32;
576 char essid[length+1]; 634 char essid[length+1];
577 memcpy( &essid, &_data->ssid, length ); 635 memcpy( &essid, &_data->ssid, length );
578 essid[length] = 0x0; 636 essid[length] = 0x0;
579 return essid; 637 return essid;
580} 638}
581 639
582 640
583/*====================================================================================== 641/*======================================================================================
584 * OWaveLanManagementRates 642 * OWaveLanManagementRates
585 *======================================================================================*/ 643 *======================================================================================*/
586 644
587OWaveLanManagementRates::OWaveLanManagementRates( const unsigned char* end, const struct rates_t* data, QObject* parent ) 645OWaveLanManagementRates::OWaveLanManagementRates( const unsigned char* end, const struct rates_t* data, QObject* parent )
588 :QObject( parent, "802.11 Rates" ), _data( data ) 646 :QObject( parent, "802.11 Rates" ), _data( data )
589{ 647{
590 qDebug( "OWaveLanManagementRates()" ); 648 qDebug( "OWaveLanManagementRates()" );
591} 649}
592 650
593 651
594OWaveLanManagementRates::~OWaveLanManagementRates() 652OWaveLanManagementRates::~OWaveLanManagementRates()
595{ 653{
596} 654}
597 655
598/*====================================================================================== 656/*======================================================================================
599 * OWaveLanManagementCF 657 * OWaveLanManagementCF
600 *======================================================================================*/ 658 *======================================================================================*/
601 659
602OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const struct cf_t* data, QObject* parent ) 660OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const struct cf_t* data, QObject* parent )
603 :QObject( parent, "802.11 CF" ), _data( data ) 661 :QObject( parent, "802.11 CF" ), _data( data )
604{ 662{
605 qDebug( "OWaveLanManagementCF()" ); 663 qDebug( "OWaveLanManagementCF()" );
606} 664}
607 665
608 666
609OWaveLanManagementCF::~OWaveLanManagementCF() 667OWaveLanManagementCF::~OWaveLanManagementCF()
610{ 668{
611} 669}
612 670
613/*====================================================================================== 671/*======================================================================================
614 * OWaveLanManagementFH 672 * OWaveLanManagementFH
615 *======================================================================================*/ 673 *======================================================================================*/
616 674
617OWaveLanManagementFH::OWaveLanManagementFH( const unsigned char* end, const struct fh_t* data, QObject* parent ) 675OWaveLanManagementFH::OWaveLanManagementFH( const unsigned char* end, const struct fh_t* data, QObject* parent )
618 :QObject( parent, "802.11 FH" ), _data( data ) 676 :QObject( parent, "802.11 FH" ), _data( data )
619{ 677{
620 qDebug( "OWaveLanManagementFH()" ); 678 qDebug( "OWaveLanManagementFH()" );
621} 679}
622 680
623 681
624OWaveLanManagementFH::~OWaveLanManagementFH() 682OWaveLanManagementFH::~OWaveLanManagementFH()
625{ 683{
626} 684}
627 685
628/*====================================================================================== 686/*======================================================================================
629 * OWaveLanManagementDS 687 * OWaveLanManagementDS
630 *======================================================================================*/ 688 *======================================================================================*/
631 689
632OWaveLanManagementDS::OWaveLanManagementDS( const unsigned char* end, const struct ds_t* data, QObject* parent ) 690OWaveLanManagementDS::OWaveLanManagementDS( const unsigned char* end, const struct ds_t* data, QObject* parent )
633 :QObject( parent, "802.11 DS" ), _data( data ) 691 :QObject( parent, "802.11 DS" ), _data( data )
634{ 692{
635 qDebug( "OWaveLanManagementDS()" ); 693 qDebug( "OWaveLanManagementDS()" );
636} 694}
637 695
638 696
639OWaveLanManagementDS::~OWaveLanManagementDS() 697OWaveLanManagementDS::~OWaveLanManagementDS()
640{ 698{
641} 699}
642 700
643 701
644int OWaveLanManagementDS::channel() const 702int OWaveLanManagementDS::channel() const
645{ 703{
646 return _data->channel; 704 return _data->channel;
647} 705}
648 706
649/*====================================================================================== 707/*======================================================================================
650 * OWaveLanManagementTim 708 * OWaveLanManagementTim
651 *======================================================================================*/ 709 *======================================================================================*/
652 710
653OWaveLanManagementTim::OWaveLanManagementTim( const unsigned char* end, const struct tim_t* data, QObject* parent ) 711OWaveLanManagementTim::OWaveLanManagementTim( const unsigned char* end, const struct tim_t* data, QObject* parent )
654 :QObject( parent, "802.11 Tim" ), _data( data ) 712 :QObject( parent, "802.11 Tim" ), _data( data )
655{ 713{
656 qDebug( "OWaveLanManagementTim()" ); 714 qDebug( "OWaveLanManagementTim()" );
657} 715}
658 716
659 717
660OWaveLanManagementTim::~OWaveLanManagementTim() 718OWaveLanManagementTim::~OWaveLanManagementTim()
661{ 719{
662} 720}
663 721
664/*====================================================================================== 722/*======================================================================================
665 * OWaveLanManagementIBSS 723 * OWaveLanManagementIBSS
666 *======================================================================================*/ 724 *======================================================================================*/
667 725
668OWaveLanManagementIBSS::OWaveLanManagementIBSS( const unsigned char* end, const struct ibss_t* data, QObject* parent ) 726OWaveLanManagementIBSS::OWaveLanManagementIBSS( const unsigned char* end, const struct ibss_t* data, QObject* parent )
669 :QObject( parent, "802.11 IBSS" ), _data( data ) 727 :QObject( parent, "802.11 IBSS" ), _data( data )
670{ 728{
671 qDebug( "OWaveLanManagementIBSS()" ); 729 qDebug( "OWaveLanManagementIBSS()" );
672} 730}
673 731
674 732
675OWaveLanManagementIBSS::~OWaveLanManagementIBSS() 733OWaveLanManagementIBSS::~OWaveLanManagementIBSS()
676{ 734{
677} 735}
678 736
679/*====================================================================================== 737/*======================================================================================
680 * OWaveLanManagementChallenge 738 * OWaveLanManagementChallenge
681 *======================================================================================*/ 739 *======================================================================================*/
682 740
683OWaveLanManagementChallenge::OWaveLanManagementChallenge( const unsigned char* end, const struct challenge_t* data, QObject* parent ) 741OWaveLanManagementChallenge::OWaveLanManagementChallenge( const unsigned char* end, const struct challenge_t* data, QObject* parent )
684 :QObject( parent, "802.11 Challenge" ), _data( data ) 742 :QObject( parent, "802.11 Challenge" ), _data( data )
685{ 743{
686 qDebug( "OWaveLanManagementChallenge()" ); 744 qDebug( "OWaveLanManagementChallenge()" );
687} 745}
688 746
689 747
690OWaveLanManagementChallenge::~OWaveLanManagementChallenge() 748OWaveLanManagementChallenge::~OWaveLanManagementChallenge()
691{ 749{
692} 750}
693 751
694/*====================================================================================== 752/*======================================================================================
695 * OWaveLanDataPacket 753 * OWaveLanDataPacket
696 *======================================================================================*/ 754 *======================================================================================*/
697 755
698OWaveLanDataPacket::OWaveLanDataPacket( const unsigned char* end, const struct ieee_802_11_data_header* data, OWaveLanPacket* parent ) 756OWaveLanDataPacket::OWaveLanDataPacket( const unsigned char* end, const struct ieee_802_11_data_header* data, OWaveLanPacket* parent )
699 :QObject( parent, "802.11 Data" ), _header( data ) 757 :QObject( parent, "802.11 Data" ), _header( data )
700{ 758{
701 qDebug( "OWaveLanDataPacket::OWaveLanDataPacket(): decoding frame..." ); 759 qDebug( "OWaveLanDataPacket::OWaveLanDataPacket(): decoding frame..." );
702 760
703 const unsigned char* payload = (const unsigned char*) data + sizeof( struct ieee_802_11_data_header ); 761 const unsigned char* payload = (const unsigned char*) data + sizeof( struct ieee_802_11_data_header );
704 762
705 #warning The next line works for most cases, but can not be correct generally! 763 #warning The next line works for most cases, but can not be correct generally!
706 if (!( ( (OWaveLanPacket*) this->parent())->duration() )) payload -= 6; // compensation for missing last address 764 if (!( ( (OWaveLanPacket*) this->parent())->duration() )) payload -= 6; // compensation for missing last address
707 765
708 new OLLCPacket( end, (const struct ieee_802_11_802_2_header*) payload, this ); 766 new OLLCPacket( end, (const struct ieee_802_11_802_2_header*) payload, this );
709} 767}
710 768
711 769
712OWaveLanDataPacket::~OWaveLanDataPacket() 770OWaveLanDataPacket::~OWaveLanDataPacket()
713{ 771{
714} 772}
715 773
716 774
717/*====================================================================================== 775/*======================================================================================
718 * OLLCPacket 776 * OLLCPacket
719 *======================================================================================*/ 777 *======================================================================================*/
720 778
721OLLCPacket::OLLCPacket( const unsigned char* end, const struct ieee_802_11_802_2_header* data, QObject* parent ) 779OLLCPacket::OLLCPacket( const unsigned char* end, const struct ieee_802_11_802_2_header* data, QObject* parent )
722 :QObject( parent, "802.11 LLC" ), _header( data ) 780 :QObject( parent, "802.11 LLC" ), _header( data )
723{ 781{
724 qDebug( "OLLCPacket::OLLCPacket(): decoding frame..." ); 782 qDebug( "OLLCPacket::OLLCPacket(): decoding frame..." );
725 783
726 if ( !(_header->oui[0] || _header->oui[1] || _header->oui[2]) ) 784 if ( !(_header->oui[0] || _header->oui[1] || _header->oui[2]) )
727 { 785 {
728 qDebug( "OLLCPacket::OLLCPacket(): contains an encapsulated Ethernet frame (type=%04X)", EXTRACT_16BITS( &_header->type ) ); 786 qDebug( "OLLCPacket::OLLCPacket(): contains an encapsulated Ethernet frame (type=%04X)", EXTRACT_16BITS( &_header->type ) );
729 787
730 switch ( EXTRACT_16BITS( &_header->type ) ) // defined in linux/if_ether.h 788 switch ( EXTRACT_16BITS( &_header->type ) ) // defined in linux/if_ether.h
731 { 789 {
732 case ETH_P_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break; 790 case ETH_P_IP: new OIPPacket( end, (const struct iphdr*) (data+1), this ); break;
733 default: qDebug( "OLLCPacket::OLLCPacket(): Unknown Encapsulation Type" ); 791 case ETH_P_ARP: new OARPPacket( end, (const struct myarphdr*) (data+1), this ); break;
792 default: qWarning( "OLLCPacket::OLLCPacket(): Unknown Encapsulation (type=%04X)", EXTRACT_16BITS( &_header->type ) );
734 } 793 }
735 794
736 } 795 }
737} 796}
738 797
739 798
740OLLCPacket::~OLLCPacket() 799OLLCPacket::~OLLCPacket()
741{ 800{
742} 801}
743 802
744 803
745/*====================================================================================== 804/*======================================================================================
746 * OWaveLanControlPacket 805 * OWaveLanControlPacket
747 *======================================================================================*/ 806 *======================================================================================*/
748 807
749OWaveLanControlPacket::OWaveLanControlPacket( const unsigned char* end, const struct ieee_802_11_control_header* data, OWaveLanPacket* parent ) 808OWaveLanControlPacket::OWaveLanControlPacket( const unsigned char* end, const struct ieee_802_11_control_header* data, OWaveLanPacket* parent )
750 :QObject( parent, "802.11 Data" ), _header( data ) 809 :QObject( parent, "802.11 Data" ), _header( data )
751{ 810{
752 qDebug( "OWaveLanControlPacket::OWaveLanDataControl(): decoding frame..." ); 811 qDebug( "OWaveLanControlPacket::OWaveLanDataControl(): decoding frame..." );
753 //TODO: Implement this 812 //TODO: Implement this
754} 813}
755 814
756 815
757OWaveLanControlPacket::~OWaveLanControlPacket() 816OWaveLanControlPacket::~OWaveLanControlPacket()
758{ 817{
759} 818}
760 819
761 820
762/*====================================================================================== 821/*======================================================================================
763 * OPacketCapturer 822 * OPacketCapturer
764 *======================================================================================*/ 823 *======================================================================================*/
765 824
766OPacketCapturer::OPacketCapturer( QObject* parent, const char* name ) 825OPacketCapturer::OPacketCapturer( QObject* parent, const char* name )
767 :QObject( parent, name ), _name( QString::null ), _open( false ), 826 :QObject( parent, name ), _name( QString::null ), _open( false ),
768 _pch( 0 ), _pcd( 0 ), _sn( 0 ) 827 _pch( 0 ), _pcd( 0 ), _sn( 0 )
769{ 828{
770} 829}
771 830
772 831
773OPacketCapturer::~OPacketCapturer() 832OPacketCapturer::~OPacketCapturer()
774{ 833{
775 if ( _open ) 834 if ( _open )
776 { 835 {
777 qDebug( "OPacketCapturer::~OPacketCapturer(): pcap still open, autoclosing." ); 836 qDebug( "OPacketCapturer::~OPacketCapturer(): pcap still open, autoclosing." );
778 close(); 837 close();
779 } 838 }
780} 839}
781 840
782 841
783void OPacketCapturer::setBlocking( bool b ) 842void OPacketCapturer::setBlocking( bool b )
784{ 843{
785 if ( pcap_setnonblock( _pch, 1-b, _errbuf ) != -1 ) 844 if ( pcap_setnonblock( _pch, 1-b, _errbuf ) != -1 )
786 { 845 {
787 qDebug( "OPacketCapturer::setBlocking(): blocking mode changed successfully." ); 846 qDebug( "OPacketCapturer::setBlocking(): blocking mode changed successfully." );
788 } 847 }
789 else 848 else
790 { 849 {
791 qDebug( "OPacketCapturer::setBlocking(): can't change blocking mode: %s", _errbuf ); 850 qDebug( "OPacketCapturer::setBlocking(): can't change blocking mode: %s", _errbuf );
792 } 851 }
793} 852}
794 853
795 854
796bool OPacketCapturer::blocking() const 855bool OPacketCapturer::blocking() const
797{ 856{
798 int b = pcap_getnonblock( _pch, _errbuf ); 857 int b = pcap_getnonblock( _pch, _errbuf );
799 if ( b == -1 ) 858 if ( b == -1 )
800 { 859 {
801 qDebug( "OPacketCapturer::blocking(): can't get blocking mode: %s", _errbuf ); 860 qDebug( "OPacketCapturer::blocking(): can't get blocking mode: %s", _errbuf );
802 return -1; 861 return -1;
803 } 862 }
804 return !b; 863 return !b;
805} 864}
806 865
807 866
808void OPacketCapturer::close() 867void OPacketCapturer::close()
809{ 868{
810 if ( _open ) 869 if ( _open )
811 { 870 {
812 if ( _sn ) 871 if ( _sn )
813 { 872 {
814 _sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); 873 _sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
815 delete _sn; 874 delete _sn;
816 } 875 }
817 if ( _pcd ) 876 if ( _pcd )
818 { 877 {
819 pcap_dump_close( _pcd ); 878 pcap_dump_close( _pcd );
820 _pcd = 0; 879 _pcd = 0;
821 } 880 }
822 pcap_close( _pch ); 881 pcap_close( _pch );
823 _open = false; 882 _open = false;
824 } 883 }
825 884
826 qDebug( "OPacketCapturer::close() --- dumping capturing statistics..." ); 885 qDebug( "OPacketCapturer::close() --- dumping capturing statistics..." );
827 qDebug( "--------------------------------------------------" ); 886 qDebug( "--------------------------------------------------" );
828 for( QMap<QString,int>::Iterator it = _stats.begin(); it != _stats.end(); ++it ) 887 for( QMap<QString,int>::Iterator it = _stats.begin(); it != _stats.end(); ++it )
829 qDebug( "%s : %d", (const char*) it.key(), it.data() ); 888 qDebug( "%s : %d", (const char*) it.key(), it.data() );
830 qDebug( "--------------------------------------------------" ); 889 qDebug( "--------------------------------------------------" );
831 890
832} 891}
833 892
834 893
835int OPacketCapturer::dataLink() const 894int OPacketCapturer::dataLink() const
836{ 895{
837 return pcap_datalink( _pch ); 896 return pcap_datalink( _pch );
838} 897}
839 898
840 899
841int OPacketCapturer::fileno() const 900int OPacketCapturer::fileno() const
842{ 901{
843 if ( _open ) 902 if ( _open )
844 { 903 {
845 return pcap_fileno( _pch ); 904 return pcap_fileno( _pch );
846 } 905 }
847 else 906 else
848 { 907 {
849 return -1; 908 return -1;
850 } 909 }
851} 910}
852 911
853OPacket* OPacketCapturer::next() 912OPacket* OPacketCapturer::next()
854{ 913{
855 packetheaderstruct header; 914 packetheaderstruct header;
856 qDebug( "==> OPacketCapturer::next()" ); 915 qDebug( "==> OPacketCapturer::next()" );
857 const unsigned char* pdata = pcap_next( _pch, &header ); 916 const unsigned char* pdata = pcap_next( _pch, &header );
858 qDebug( "<== OPacketCapturer::next()" ); 917 qDebug( "<== OPacketCapturer::next()" );
859 if ( _pcd ) 918 if ( _pcd )
860 pcap_dump( (u_char*) _pcd, &header, pdata ); 919 pcap_dump( (u_char*) _pcd, &header, pdata );
861 920
862 if ( pdata && header.len ) 921 if ( pdata && header.len )
863 { 922 {
864 OPacket* p = new OPacket( dataLink(), header, pdata, 0 ); 923 OPacket* p = new OPacket( dataLink(), header, pdata, 0 );
865 // packets shouldn't be inserted in the QObject child-parent hierarchy, 924 // packets shouldn't be inserted in the QObject child-parent hierarchy,
866 // because due to memory constraints they will be deleted as soon 925 // because due to memory constraints they will be deleted as soon
867 // as possible - that is right after they have been processed 926 // as possible - that is right after they have been processed
868 // by emit() [ see below ] 927 // by emit() [ see below ]
869 //TODO: make gathering statistics optional, because it takes time 928 //TODO: make gathering statistics optional, because it takes time
870 p->updateStats( _stats, const_cast<QObjectList*>( p->children() ) ); 929 p->updateStats( _stats, const_cast<QObjectList*>( p->children() ) );
871 930
872 return p; 931 return p;
873 } 932 }
874 else 933 else
875 { 934 {
876 qWarning( "OPacketCapturer::next() - no packet received!" ); 935 qWarning( "OPacketCapturer::next() - no packet received!" );
877 return 0; 936 return 0;
878 } 937 }
879} 938}
880 939
881 940
882bool OPacketCapturer::open( const QString& name, const QString& filename ) 941bool OPacketCapturer::open( const QString& name, const QString& filename )
883{ 942{
884 if ( _open ) 943 if ( _open )
885 { 944 {
886 if ( name == _name ) // ignore opening an already openend device 945 if ( name == _name ) // ignore opening an already openend device
887 { 946 {
888 return true; 947 return true;
889 } 948 }
890 else // close the last opened device 949 else // close the last opened device
891 { 950 {
892 close(); 951 close();
893 } 952 }
894 } 953 }
895 954
896 _name = name; 955 _name = name;
897 956
898 // open libpcap 957 // open libpcap
899 pcap_t* handle = pcap_open_live( const_cast<char*>( (const char*) name ), 1024, 0, 0, &_errbuf[0] ); 958 pcap_t* handle = pcap_open_live( const_cast<char*>( (const char*) name ), 1024, 0, 0, &_errbuf[0] );
900 959
901 if ( !handle ) 960 if ( !handle )
902 { 961 {
903 qWarning( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf ); 962 qWarning( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf );
904 return false; 963 return false;
905 } 964 }
906 965
907 qDebug( "OPacketCapturer::open(): libpcap [%s] opened successfully.", (const char*) name ); 966 qDebug( "OPacketCapturer::open(): libpcap [%s] opened successfully.", (const char*) name );
908 _pch = handle; 967 _pch = handle;
909 _open = true; 968 _open = true;
910 _stats.clear(); 969 _stats.clear();
911 970
912 // in case we have an application object, create a socket notifier 971 // in case we have an application object, create a socket notifier
913 if ( qApp ) //TODO: I don't like this here... 972 if ( qApp ) //TODO: I don't like this here...
914 { 973 {
915 _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); 974 _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read );
916 connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); 975 connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
917 } 976 }
918 977
919 // if requested, open a dump 978 // if requested, open a dump
920 pcap_dumper_t* dump = pcap_dump_open( _pch, const_cast<char*>( (const char*) filename ) ); 979 pcap_dumper_t* dump = pcap_dump_open( _pch, const_cast<char*>( (const char*) filename ) );
921 if ( !dump ) 980 if ( !dump )
922 { 981 {
923 qWarning( "OPacketCapturer::open(): can't open dump with '%s': %s", (const char*) filename, _errbuf ); 982 qWarning( "OPacketCapturer::open(): can't open dump with '%s': %s", (const char*) filename, _errbuf );
924 return false; 983 return false;
925 } 984 }
926 qDebug( "OPacketCapturer::open(): dump [%s] opened successfully.", (const char*) filename ); 985 qDebug( "OPacketCapturer::open(): dump [%s] opened successfully.", (const char*) filename );
927 _pcd = dump; 986 _pcd = dump;
928 987
929 return true; 988 return true;
930} 989}
931 990
932 991
933bool OPacketCapturer::open( const QFile& file ) 992bool OPacketCapturer::open( const QFile& file )
934{ 993{
935 QString name = file.name(); 994 QString name = file.name();
936 995
937 if ( _open ) 996 if ( _open )
938 { 997 {
939 close(); 998 close();
940 if ( name == _name ) // ignore opening an already openend device 999 if ( name == _name ) // ignore opening an already openend device
941 { 1000 {
942 return true; 1001 return true;
943 } 1002 }
944 else // close the last opened device 1003 else // close the last opened device
945 { 1004 {
946 close(); 1005 close();
947 } 1006 }
948 } 1007 }
949 1008
950 _name = name; 1009 _name = name;
951 1010
952 pcap_t* handle = pcap_open_offline( const_cast<char*>( (const char*) name ), &_errbuf[0] ); 1011 pcap_t* handle = pcap_open_offline( const_cast<char*>( (const char*) name ), &_errbuf[0] );
953 1012
954 if ( handle ) 1013 if ( handle )
955 { 1014 {
956 qDebug( "OPacketCapturer::open(): libpcap opened successfully." ); 1015 qDebug( "OPacketCapturer::open(): libpcap opened successfully." );
957 _pch = handle; 1016 _pch = handle;
958 _open = true; 1017 _open = true;
959 1018
960 // in case we have an application object, create a socket notifier 1019 // in case we have an application object, create a socket notifier
961 if ( qApp ) 1020 if ( qApp )
962 { 1021 {
963 _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read ); 1022 _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read );
964 connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) ); 1023 connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
965 } 1024 }
966 1025
967 return true; 1026 return true;
968 } 1027 }
969 else 1028 else
970 { 1029 {
971 qDebug( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf ); 1030 qDebug( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf );
972 return false; 1031 return false;
973 } 1032 }
974 1033
975} 1034}
976 1035
977 1036
978bool OPacketCapturer::isOpen() const 1037bool OPacketCapturer::isOpen() const
979{ 1038{
980 return _open; 1039 return _open;
981} 1040}
982 1041
983 1042
984void OPacketCapturer::readyToReceive() 1043void OPacketCapturer::readyToReceive()
985{ 1044{
986 qDebug( "OPacketCapturer::readyToReceive(): about to emit 'receivePacket(p)'" ); 1045 qDebug( "OPacketCapturer::readyToReceive(): about to emit 'receivePacket(p)'" );
987 OPacket* p = next(); 1046 OPacket* p = next();
988 emit receivedPacket( p ); 1047 emit receivedPacket( p );
989 // emit is synchronous - packet has been dealt with, now it's safe to delete 1048 // emit is synchronous - packet has been dealt with, now it's safe to delete
990 delete p; 1049 delete p;
991} 1050}
992 1051
993 1052
994const QMap<QString,int>& OPacketCapturer::statistics() const 1053const QMap<QString,int>& OPacketCapturer::statistics() const
995{ 1054{
996 return _stats; 1055 return _stats;
997} 1056}
998 1057
diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h
index bee0ca0..5a50d9b 100644
--- a/libopie2/opienet/opcap.h
+++ b/libopie2/opienet/opcap.h
@@ -1,566 +1,590 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3              Copyright (C) 2003 by the Wellenreiter team: 3              Copyright (C) 2003 by the Wellenreiter team:
4 Martin J. Muench <mjm@remote-exploit.org> 4 Martin J. Muench <mjm@remote-exploit.org>
5 Max Moser <mmo@remote-exploit.org 5 Max Moser <mmo@remote-exploit.org
6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> 6 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more 22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 23++=   -.     .`     .: details.
24 :     =  ...= . :.=- 24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 30 Boston, MA 02111-1307, USA.
31 31
32*/ 32*/
33 33
34#ifndef OPCAP_H 34#ifndef OPCAP_H
35#define OPCAP_H 35#define OPCAP_H
36 36
37/* LINUX */ 37/* LINUX */
38extern "C" // work around a bpf/pcap conflict in recent headers 38extern "C" // work around a bpf/pcap conflict in recent headers
39{ 39{
40 #include <pcap.h> 40 #include <pcap.h>
41} 41}
42#include <netinet/ether.h> 42#include <netinet/ether.h>
43#include <netinet/ip.h> 43#include <netinet/ip.h>
44#include <netinet/udp.h> 44#include <netinet/udp.h>
45#include <netinet/tcp.h> 45#include <netinet/tcp.h>
46#include <time.h> 46#include <time.h>
47 47
48/* QT */ 48/* QT */
49#include <qevent.h> 49#include <qevent.h>
50#include <qfile.h> 50#include <qfile.h>
51#include <qhostaddress.h> 51#include <qhostaddress.h>
52#include <qobject.h> 52#include <qobject.h>
53#include <qstring.h> 53#include <qstring.h>
54#include <qmap.h> 54#include <qmap.h>
55 55
56/* OPIE */ 56/* OPIE */
57#include <opie2/onetutils.h> 57#include <opie2/onetutils.h>
58#include "802_11_user.h" 58#include "802_11_user.h"
59 59
60/* TYPEDEFS */ 60/* TYPEDEFS */
61typedef struct timeval timevalstruct; 61typedef struct timeval timevalstruct;
62typedef struct pcap_pkthdr packetheaderstruct; 62typedef struct pcap_pkthdr packetheaderstruct;
63 63
64/* FORWARDS */ 64/* FORWARDS */
65class OPacketCapturer; 65class OPacketCapturer;
66class QSocketNotifier; 66class QSocketNotifier;
67 67
68/*====================================================================================== 68/*======================================================================================
69 * OPacket - A frame on the wire 69 * OPacket - A frame on the wire
70 *======================================================================================*/ 70 *======================================================================================*/
71 71
72/** @brief A class representing a data frame on the wire. 72/** @brief A class representing a data frame on the wire.
73 * 73 *
74 * The whole family of the packet classes are used when capturing frames from a network. 74 * The whole family of the packet classes are used when capturing frames from a network.
75 * Most standard network protocols in use share a common architecture, which mostly is 75 * Most standard network protocols in use share a common architecture, which mostly is
76 * a packet header and then the packet payload. In layered architectures, each lower layer 76 * a packet header and then the packet payload. In layered architectures, each lower layer
77 * encapsulates data from its upper layer - that is it 77 * encapsulates data from its upper layer - that is it
78 * treats the data from its upper layer as payload and prepends an own header to the packet, 78 * treats the data from its upper layer as payload and prepends an own header to the packet,
79 * which - again - is treated as the payload for the layer below. The figure below is an 79 * which - again - is treated as the payload for the layer below. The figure below is an
80 * example for how such a data frame is composed out of packets, e.g. when sending a mail. 80 * example for how such a data frame is composed out of packets, e.g. when sending a mail.
81 * 81 *
82 * <pre> 82 * <pre>
83 * | User Data | == Mail Data 83 * | User Data | == Mail Data
84 * | SMTP Header | User Data | == SMTP 84 * | SMTP Header | User Data | == SMTP
85 * | TCP Header | SMTP Header | User Data | == TCP 85 * | TCP Header | SMTP Header | User Data | == TCP
86 * | IP Header | TCP Header | SMTP Header | User Data | == IP 86 * | IP Header | TCP Header | SMTP Header | User Data | == IP
87 * | MAC Header | IP Header | TCP Header | SMTP Header | User Data | == MAC 87 * | MAC Header | IP Header | TCP Header | SMTP Header | User Data | == MAC
88 * 88 *
89 * </pre> 89 * </pre>
90 * 90 *
91 * The example is trimmed for simplicity, because the MAC (Medium Access Control) layer 91 * The example is trimmed for simplicity, because the MAC (Medium Access Control) layer
92 * also contains a few more levels of encapsulation. 92 * also contains a few more levels of encapsulation.
93 * Since the type of the payload is more or less independent from the encapsulating protocol, 93 * Since the type of the payload is more or less independent from the encapsulating protocol,
94 * the header must be inspected before attempting to decode the payload. Hence, the 94 * the header must be inspected before attempting to decode the payload. Hence, the
95 * encapsulation level varies and can't be deduced without actually looking into the packets. 95 * encapsulation level varies and can't be deduced without actually looking into the packets.
96 * 96 *
97 * For actually working with captured frames, it's useful to identify the packets via names and 97 * For actually working with captured frames, it's useful to identify the packets via names and
98 * insert them into a parent/child - relationship based on the encapsulation. This is why 98 * insert them into a parent/child - relationship based on the encapsulation. This is why
99 * all packet classes derive from QObject. The amount of overhead caused by the QObject is 99 * all packet classes derive from QObject. The amount of overhead caused by the QObject is
100 * not a problem in this case, because we're talking about a theoratical maximum of about 100 * not a problem in this case, because we're talking about a theoratical maximum of about
101 * 10 packets per captured frame. We need to stuff them into a searchable list anyway and the 101 * 10 packets per captured frame. We need to stuff them into a searchable list anyway and the
102 * QObject also cares about destroying the sub-, (child-) packets. 102 * QObject also cares about destroying the sub-, (child-) packets.
103 * 103 *
104 * This enables us to perform a simple look for packets of a certain type: 104 * This enables us to perform a simple look for packets of a certain type:
105 * @code 105 * @code
106 * OPacketCapturer* pcap = new OPacketCapturer(); 106 * OPacketCapturer* pcap = new OPacketCapturer();
107 * pcap->open( "eth0" ); 107 * pcap->open( "eth0" );
108 * OPacket* p = pcap->next(); 108 * OPacket* p = pcap->next();
109 * OIPPacket* ip = (OIPPacket*) p->child( "IP" ); // returns 0, if no such child exists 109 * OIPPacket* ip = (OIPPacket*) p->child( "IP" ); // returns 0, if no such child exists
110 * odebug << "got ip packet from " << ip->fromIPAddress().toString() << " to " << ip->toIPAddress().toString() << oendl; 110 * odebug << "got ip packet from " << ip->fromIPAddress().toString() << " to " << ip->toIPAddress().toString() << oendl;
111 * 111 *
112 */ 112 */
113 113
114class OPacket : public QObject 114class OPacket : public QObject
115{ 115{
116 Q_OBJECT 116 Q_OBJECT
117 117
118 public: 118 public:
119 OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent ); 119 OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent );
120 virtual ~OPacket(); 120 virtual ~OPacket();
121 121
122 timevalstruct timeval() const; 122 timevalstruct timeval() const;
123 123
124 int caplen() const; 124 int caplen() const;
125 int len() const; 125 int len() const;
126 QString dump( int = 32 ) const; 126 QString dump( int = 32 ) const;
127 127
128 void updateStats( QMap<QString,int>&, QObjectList* ); 128 void updateStats( QMap<QString,int>&, QObjectList* );
129 129
130 private: 130 private:
131 const packetheaderstruct _hdr; // pcap packet header 131 const packetheaderstruct _hdr; // pcap packet header
132 const unsigned char* _data; // pcap packet data 132 const unsigned char* _data; // pcap packet data
133 const unsigned char* _end; // end of pcap packet data 133 const unsigned char* _end; // end of pcap packet data
134}; 134};
135 135
136/*====================================================================================== 136/*======================================================================================
137 * OEthernetPacket - DLT_EN10MB frame 137 * OEthernetPacket - DLT_EN10MB frame
138 *======================================================================================*/ 138 *======================================================================================*/
139 139
140class OEthernetPacket : public QObject 140class OEthernetPacket : public QObject
141{ 141{
142 Q_OBJECT 142 Q_OBJECT
143 143
144 public: 144 public:
145 OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 ); 145 OEthernetPacket( const unsigned char*, const struct ether_header*, QObject* parent = 0 );
146 virtual ~OEthernetPacket(); 146 virtual ~OEthernetPacket();
147 147
148 OMacAddress sourceAddress() const; 148 OMacAddress sourceAddress() const;
149 OMacAddress destinationAddress() const; 149 OMacAddress destinationAddress() const;
150 int type() const; 150 int type() const;
151 151
152 private: 152 private:
153 const struct ether_header* _ether; 153 const struct ether_header* _ether;
154}; 154};
155 155
156/*====================================================================================== 156/*======================================================================================
157 * OPrismHeaderPacket - DLT_PRISM_HEADER frame 157 * OPrismHeaderPacket - DLT_PRISM_HEADER frame
158 *======================================================================================*/ 158 *======================================================================================*/
159 159
160class OPrismHeaderPacket : public QObject 160class OPrismHeaderPacket : public QObject
161{ 161{
162 Q_OBJECT 162 Q_OBJECT
163 163
164 public: 164 public:
165 OPrismHeaderPacket( const unsigned char*, const struct prism_hdr*, QObject* parent = 0 ); 165 OPrismHeaderPacket( const unsigned char*, const struct prism_hdr*, QObject* parent = 0 );
166 virtual ~OPrismHeaderPacket(); 166 virtual ~OPrismHeaderPacket();
167 167
168 unsigned int signalStrength() const; 168 unsigned int signalStrength() const;
169 169
170 private: 170 private:
171 const struct prism_hdr* _header; 171 const struct prism_hdr* _header;
172}; 172};
173 173
174/*====================================================================================== 174/*======================================================================================
175 * OWaveLanPacket - DLT_IEEE802_11 frame 175 * OWaveLanPacket - DLT_IEEE802_11 frame
176 *======================================================================================*/ 176 *======================================================================================*/
177 177
178class OWaveLanPacket : public QObject 178class OWaveLanPacket : public QObject
179{ 179{
180 Q_OBJECT 180 Q_OBJECT
181 181
182 public: 182 public:
183 OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 ); 183 OWaveLanPacket( const unsigned char*, const struct ieee_802_11_header*, QObject* parent = 0 );
184 virtual ~OWaveLanPacket(); 184 virtual ~OWaveLanPacket();
185 185
186 int duration() const; 186 int duration() const;
187 bool fromDS() const; 187 bool fromDS() const;
188 bool toDS() const; 188 bool toDS() const;
189 virtual OMacAddress macAddress1() const; 189 virtual OMacAddress macAddress1() const;
190 virtual OMacAddress macAddress2() const; 190 virtual OMacAddress macAddress2() const;
191 virtual OMacAddress macAddress3() const; 191 virtual OMacAddress macAddress3() const;
192 virtual OMacAddress macAddress4() const; 192 virtual OMacAddress macAddress4() const;
193 bool usesPowerManagement() const; 193 bool usesPowerManagement() const;
194 int type() const; 194 int type() const;
195 int subType() const; 195 int subType() const;
196 int version() const; 196 int version() const;
197 bool usesWep() const; 197 bool usesWep() const;
198 198
199 private: 199 private:
200 const struct ieee_802_11_header* _wlanhdr; 200 const struct ieee_802_11_header* _wlanhdr;
201}; 201};
202 202
203 203
204/*====================================================================================== 204/*======================================================================================
205 * OWaveLanManagementPacket - type: management (T_MGMT) 205 * OWaveLanManagementPacket - type: management (T_MGMT)
206 *======================================================================================*/ 206 *======================================================================================*/
207 207
208class OWaveLanManagementPacket : public QObject 208class OWaveLanManagementPacket : public QObject
209{ 209{
210 Q_OBJECT 210 Q_OBJECT
211 211
212 public: 212 public:
213 OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 ); 213 OWaveLanManagementPacket( const unsigned char*, const struct ieee_802_11_mgmt_header*, OWaveLanPacket* parent = 0 );
214 virtual ~OWaveLanManagementPacket(); 214 virtual ~OWaveLanManagementPacket();
215 215
216 QString managementType() const; 216 QString managementType() const;
217 217
218 int beaconInterval() const; 218 int beaconInterval() const;
219 int capabilities() const; // generic 219 int capabilities() const; // generic
220 220
221 bool canESS() const; 221 bool canESS() const;
222 bool canIBSS() const; 222 bool canIBSS() const;
223 bool canCFP() const; 223 bool canCFP() const;
224 bool canCFP_REQ() const; 224 bool canCFP_REQ() const;
225 bool canPrivacy() const; 225 bool canPrivacy() const;
226 226
227 private: 227 private:
228 const struct ieee_802_11_mgmt_header* _header; 228 const struct ieee_802_11_mgmt_header* _header;
229 const struct ieee_802_11_mgmt_body* _body; 229 const struct ieee_802_11_mgmt_body* _body;
230}; 230};
231 231
232 232
233/*====================================================================================== 233/*======================================================================================
234 * OWaveLanManagementSSID 234 * OWaveLanManagementSSID
235 *======================================================================================*/ 235 *======================================================================================*/
236 236
237class OWaveLanManagementSSID : public QObject 237class OWaveLanManagementSSID : public QObject
238{ 238{
239 Q_OBJECT 239 Q_OBJECT
240 240
241 public: 241 public:
242 OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 ); 242 OWaveLanManagementSSID( const unsigned char*, const struct ssid_t*, QObject* parent = 0 );
243 virtual ~OWaveLanManagementSSID(); 243 virtual ~OWaveLanManagementSSID();
244 244
245 QString ID() const; 245 QString ID() const;
246 246
247 private: 247 private:
248 const struct ssid_t* _data; 248 const struct ssid_t* _data;
249}; 249};
250 250
251/*====================================================================================== 251/*======================================================================================
252 * OWaveLanManagementRates 252 * OWaveLanManagementRates
253 *======================================================================================*/ 253 *======================================================================================*/
254 254
255class OWaveLanManagementRates : public QObject 255class OWaveLanManagementRates : public QObject
256{ 256{
257 Q_OBJECT 257 Q_OBJECT
258 258
259 public: 259 public:
260 OWaveLanManagementRates( const unsigned char*, const struct rates_t*, QObject* parent = 0 ); 260 OWaveLanManagementRates( const unsigned char*, const struct rates_t*, QObject* parent = 0 );
261 virtual ~OWaveLanManagementRates(); 261 virtual ~OWaveLanManagementRates();
262 262
263 private: 263 private:
264 const struct rates_t* _data; 264 const struct rates_t* _data;
265}; 265};
266 266
267/*====================================================================================== 267/*======================================================================================
268 * OWaveLanManagementCF 268 * OWaveLanManagementCF
269 *======================================================================================*/ 269 *======================================================================================*/
270 270
271class OWaveLanManagementCF : public QObject 271class OWaveLanManagementCF : public QObject
272{ 272{
273 Q_OBJECT 273 Q_OBJECT
274 274
275 public: 275 public:
276 OWaveLanManagementCF( const unsigned char*, const struct cf_t*, QObject* parent = 0 ); 276 OWaveLanManagementCF( const unsigned char*, const struct cf_t*, QObject* parent = 0 );
277 virtual ~OWaveLanManagementCF(); 277 virtual ~OWaveLanManagementCF();
278 278
279 private: 279 private:
280 const struct cf_t* _data; 280 const struct cf_t* _data;
281}; 281};
282 282
283/*====================================================================================== 283/*======================================================================================
284 * OWaveLanManagementFH 284 * OWaveLanManagementFH
285 *======================================================================================*/ 285 *======================================================================================*/
286 286
287class OWaveLanManagementFH : public QObject 287class OWaveLanManagementFH : public QObject
288{ 288{
289 Q_OBJECT 289 Q_OBJECT
290 290
291 public: 291 public:
292 OWaveLanManagementFH( const unsigned char*, const struct fh_t*, QObject* parent = 0 ); 292 OWaveLanManagementFH( const unsigned char*, const struct fh_t*, QObject* parent = 0 );
293 virtual ~OWaveLanManagementFH(); 293 virtual ~OWaveLanManagementFH();
294 294
295 private: 295 private:
296 const struct fh_t* _data; 296 const struct fh_t* _data;
297}; 297};
298 298
299/*====================================================================================== 299/*======================================================================================
300 * OWaveLanManagementDS 300 * OWaveLanManagementDS
301 *======================================================================================*/ 301 *======================================================================================*/
302 302
303class OWaveLanManagementDS : public QObject 303class OWaveLanManagementDS : public QObject
304{ 304{
305 Q_OBJECT 305 Q_OBJECT
306 306
307 public: 307 public:
308 OWaveLanManagementDS( const unsigned char*, const struct ds_t*, QObject* parent = 0 ); 308 OWaveLanManagementDS( const unsigned char*, const struct ds_t*, QObject* parent = 0 );
309 virtual ~OWaveLanManagementDS(); 309 virtual ~OWaveLanManagementDS();
310 310
311 int channel() const; 311 int channel() const;
312 312
313 private: 313 private:
314 const struct ds_t* _data; 314 const struct ds_t* _data;
315}; 315};
316 316
317/*====================================================================================== 317/*======================================================================================
318 * OWaveLanManagementTim 318 * OWaveLanManagementTim
319 *======================================================================================*/ 319 *======================================================================================*/
320 320
321class OWaveLanManagementTim : public QObject 321class OWaveLanManagementTim : public QObject
322{ 322{
323 Q_OBJECT 323 Q_OBJECT
324 324
325 public: 325 public:
326 OWaveLanManagementTim( const unsigned char*, const struct tim_t*, QObject* parent = 0 ); 326 OWaveLanManagementTim( const unsigned char*, const struct tim_t*, QObject* parent = 0 );
327 virtual ~OWaveLanManagementTim(); 327 virtual ~OWaveLanManagementTim();
328 328
329 private: 329 private:
330 const struct tim_t* _data; 330 const struct tim_t* _data;
331}; 331};
332 332
333/*====================================================================================== 333/*======================================================================================
334 * OWaveLanManagementIBSS 334 * OWaveLanManagementIBSS
335 *======================================================================================*/ 335 *======================================================================================*/
336 336
337class OWaveLanManagementIBSS : public QObject 337class OWaveLanManagementIBSS : public QObject
338{ 338{
339 Q_OBJECT 339 Q_OBJECT
340 340
341 public: 341 public:
342 OWaveLanManagementIBSS( const unsigned char*, const struct ibss_t*, QObject* parent = 0 ); 342 OWaveLanManagementIBSS( const unsigned char*, const struct ibss_t*, QObject* parent = 0 );
343 virtual ~OWaveLanManagementIBSS(); 343 virtual ~OWaveLanManagementIBSS();
344 344
345 private: 345 private:
346 const struct ibss_t* _data; 346 const struct ibss_t* _data;
347}; 347};
348 348
349/*====================================================================================== 349/*======================================================================================
350 * OWaveLanManagementChallenge 350 * OWaveLanManagementChallenge
351 *======================================================================================*/ 351 *======================================================================================*/
352 352
353class OWaveLanManagementChallenge : public QObject 353class OWaveLanManagementChallenge : public QObject
354{ 354{
355 Q_OBJECT 355 Q_OBJECT
356 356
357 public: 357 public:
358 OWaveLanManagementChallenge( const unsigned char*, const struct challenge_t*, QObject* parent = 0 ); 358 OWaveLanManagementChallenge( const unsigned char*, const struct challenge_t*, QObject* parent = 0 );
359 virtual ~OWaveLanManagementChallenge(); 359 virtual ~OWaveLanManagementChallenge();
360 360
361 private: 361 private:
362 const struct challenge_t* _data; 362 const struct challenge_t* _data;
363}; 363};
364 364
365/*====================================================================================== 365/*======================================================================================
366 * OWaveLanDataPacket - type: data (T_DATA) 366 * OWaveLanDataPacket - type: data (T_DATA)
367 *======================================================================================*/ 367 *======================================================================================*/
368 368
369class OWaveLanDataPacket : public QObject 369class OWaveLanDataPacket : public QObject
370{ 370{
371 Q_OBJECT 371 Q_OBJECT
372 372
373 public: 373 public:
374 OWaveLanDataPacket( const unsigned char*, const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 ); 374 OWaveLanDataPacket( const unsigned char*, const struct ieee_802_11_data_header*, OWaveLanPacket* parent = 0 );
375 virtual ~OWaveLanDataPacket(); 375 virtual ~OWaveLanDataPacket();
376 376
377 private: 377 private:
378 const struct ieee_802_11_data_header* _header; 378 const struct ieee_802_11_data_header* _header;
379}; 379};
380 380
381/*====================================================================================== 381/*======================================================================================
382 * OWaveLanControlPacket - type: control (T_CTRL) 382 * OWaveLanControlPacket - type: control (T_CTRL)
383 *======================================================================================*/ 383 *======================================================================================*/
384 384
385class OWaveLanControlPacket : public QObject 385class OWaveLanControlPacket : public QObject
386{ 386{
387 Q_OBJECT 387 Q_OBJECT
388 388
389 public: 389 public:
390 OWaveLanControlPacket( const unsigned char*, const struct ieee_802_11_control_header*, OWaveLanPacket* parent = 0 ); 390 OWaveLanControlPacket( const unsigned char*, const struct ieee_802_11_control_header*, OWaveLanPacket* parent = 0 );
391 virtual ~OWaveLanControlPacket(); 391 virtual ~OWaveLanControlPacket();
392 392
393 private: 393 private:
394 const struct ieee_802_11_control_header* _header; 394 const struct ieee_802_11_control_header* _header;
395}; 395};
396 396
397/*====================================================================================== 397/*======================================================================================
398 * OLLCPacket - IEEE 802.2 Link Level Control 398 * OLLCPacket - IEEE 802.2 Link Level Control
399 *======================================================================================*/ 399 *======================================================================================*/
400 400
401class OLLCPacket : public QObject 401class OLLCPacket : public QObject
402{ 402{
403 Q_OBJECT 403 Q_OBJECT
404 404
405 public: 405 public:
406 OLLCPacket( const unsigned char*, const struct ieee_802_11_802_2_header* data, QObject* parent = 0 ); 406 OLLCPacket( const unsigned char*, const struct ieee_802_11_802_2_header* data, QObject* parent = 0 );
407 virtual ~OLLCPacket(); 407 virtual ~OLLCPacket();
408 408
409 private: 409 private:
410 const struct ieee_802_11_802_2_header* _header; 410 const struct ieee_802_11_802_2_header* _header;
411}; 411};
412 412
413/*====================================================================================== 413/*======================================================================================
414 * OIPPacket 414 * OIPPacket
415 *======================================================================================*/ 415 *======================================================================================*/
416 416
417class OIPPacket : public QObject 417class OIPPacket : public QObject
418{ 418{
419 Q_OBJECT 419 Q_OBJECT
420 420
421 public: 421 public:
422 OIPPacket( const unsigned char*, const struct iphdr*, QObject* parent = 0 ); 422 OIPPacket( const unsigned char*, const struct iphdr*, QObject* parent = 0 );
423 virtual ~OIPPacket(); 423 virtual ~OIPPacket();
424 424
425 QHostAddress fromIPAddress() const; 425 QHostAddress fromIPAddress() const;
426 QHostAddress toIPAddress() const; 426 QHostAddress toIPAddress() const;
427 427
428 int tos() const; 428 int tos() const;
429 int len() const; 429 int len() const;
430 int id() const; 430 int id() const;
431 int offset() const; 431 int offset() const;
432 int ttl() const; 432 int ttl() const;
433 int protocol() const; 433 int protocol() const;
434 int checksum() const; 434 int checksum() const;
435 435
436 private: 436 private:
437 const struct iphdr* _iphdr; 437 const struct iphdr* _iphdr;
438}; 438};
439 439
440/*====================================================================================== 440/*======================================================================================
441 * OARPPacket
442 *======================================================================================*/
443
444class OARPPacket : public QObject
445{
446 Q_OBJECT
447
448 public:
449 OARPPacket( const unsigned char*, const struct myarphdr*, QObject* parent = 0 );
450 virtual ~OARPPacket();
451
452 QHostAddress senderIPV4Address() const;
453 OMacAddress senderMacAddress() const;
454 QHostAddress targetIPV4Address() const;
455 OMacAddress targetMacAddress() const;
456
457 //int type() const;
458 QString type() const;
459
460 private:
461 const struct myarphdr* _arphdr;
462};
463
464/*======================================================================================
441 * OUDPPacket 465 * OUDPPacket
442 *======================================================================================*/ 466 *======================================================================================*/
443 467
444class OUDPPacket : public QObject 468class OUDPPacket : public QObject
445{ 469{
446 Q_OBJECT 470 Q_OBJECT
447 471
448 public: 472 public:
449 OUDPPacket( const unsigned char*, const struct udphdr*, QObject* parent = 0 ); 473 OUDPPacket( const unsigned char*, const struct udphdr*, QObject* parent = 0 );
450 virtual ~OUDPPacket(); 474 virtual ~OUDPPacket();
451 475
452 int fromPort() const; 476 int fromPort() const;
453 int toPort() const; 477 int toPort() const;
454 478
455 private: 479 private:
456 const struct udphdr* _udphdr; 480 const struct udphdr* _udphdr;
457}; 481};
458 482
459/*====================================================================================== 483/*======================================================================================
460 * OTCPPacket 484 * OTCPPacket
461 *======================================================================================*/ 485 *======================================================================================*/
462 486
463class OTCPPacket : public QObject 487class OTCPPacket : public QObject
464{ 488{
465 Q_OBJECT 489 Q_OBJECT
466 490
467 public: 491 public:
468 OTCPPacket( const unsigned char*, const struct tcphdr*, QObject* parent = 0 ); 492 OTCPPacket( const unsigned char*, const struct tcphdr*, QObject* parent = 0 );
469 virtual ~OTCPPacket(); 493 virtual ~OTCPPacket();
470 494
471 int fromPort() const; 495 int fromPort() const;
472 int toPort() const; 496 int toPort() const;
473 497
474 private: 498 private:
475 const struct tcphdr* _tcphdr; 499 const struct tcphdr* _tcphdr;
476}; 500};
477 501
478 502
479/*====================================================================================== 503/*======================================================================================
480 * OPacketCapturer 504 * OPacketCapturer
481 *======================================================================================*/ 505 *======================================================================================*/
482 506
483/** 507/**
484 * @brief A class based wrapper for network packet capturing. 508 * @brief A class based wrapper for network packet capturing.
485 * 509 *
486 * This class is the base of a high-level interface to the well known packet capturing 510 * This class is the base of a high-level interface to the well known packet capturing
487 * library libpcap. ... 511 * library libpcap. ...
488 */ 512 */
489class OPacketCapturer : public QObject 513class OPacketCapturer : public QObject
490{ 514{
491 Q_OBJECT 515 Q_OBJECT
492 516
493 public: 517 public:
494 /** 518 /**
495 * Constructor. 519 * Constructor.
496 */ 520 */
497 OPacketCapturer( QObject* parent = 0, const char* name = 0 ); 521 OPacketCapturer( QObject* parent = 0, const char* name = 0 );
498 /** 522 /**
499 * Destructor. 523 * Destructor.
500 */ 524 */
501 ~OPacketCapturer(); 525 ~OPacketCapturer();
502 /** 526 /**
503 * Setting the packet capturer to use blocking IO calls can be useful when 527 * Setting the packet capturer to use blocking IO calls can be useful when
504 * not using the socket notifier, e.g. without an application object. 528 * not using the socket notifier, e.g. without an application object.
505 */ 529 */
506 void setBlocking( bool ); 530 void setBlocking( bool );
507 /** 531 /**
508 * @returns true if the packet capturer uses blocking IO calls. 532 * @returns true if the packet capturer uses blocking IO calls.
509 */ 533 */
510 bool blocking() const; 534 bool blocking() const;
511 /** 535 /**
512 * Closes the packet capturer. This is automatically done in the destructor. 536 * Closes the packet capturer. This is automatically done in the destructor.
513 */ 537 */
514 void close(); 538 void close();
515 /** 539 /**
516 * @returns the data link type. 540 * @returns the data link type.
517 * @see <pcap.h> for possible values. 541 * @see <pcap.h> for possible values.
518 */ 542 */
519 int dataLink() const; 543 int dataLink() const;
520 /** 544 /**
521 * @returns the filedescriptor of the packet capturer. This is only useful, if 545 * @returns the filedescriptor of the packet capturer. This is only useful, if
522 * not using the socket notifier, e.g. without an application object. 546 * not using the socket notifier, e.g. without an application object.
523 */ 547 */
524 int fileno() const; 548 int fileno() const;
525 /** 549 /**
526 * @returns the next @ref OPacket from the packet capturer. 550 * @returns the next @ref OPacket from the packet capturer.
527 * @note If blocking mode is true then this call might block. 551 * @note If blocking mode is true then this call might block.
528 */ 552 */
529 OPacket* next(); 553 OPacket* next();
530 /** 554 /**
531 * Open the packet capturer to capture packets in live-mode from @a interface. 555 * Open the packet capturer to capture packets in live-mode from @a interface.
532 * If a @a filename is given, all captured packets are output to a tcpdump-compatible capture file. 556 * If a @a filename is given, all captured packets are output to a tcpdump-compatible capture file.
533 */ 557 */
534 bool open( const QString& interface, const QString& filename = QString::null ); 558 bool open( const QString& interface, const QString& filename = QString::null );
535 /** 559 /**
536 * Open the packet capturer to capture packets in offline-mode from @a file. 560 * Open the packet capturer to capture packets in offline-mode from @a file.
537 */ 561 */
538 bool open( const QFile& file ); 562 bool open( const QFile& file );
539 /** 563 /**
540 * @returns true if the packet capturer is open 564 * @returns true if the packet capturer is open
541 */ 565 */
542 bool isOpen() const; 566 bool isOpen() const;
543 567
544 const QMap<QString,int>& statistics() const; 568 const QMap<QString,int>& statistics() const;
545 569
546 signals: 570 signals:
547 /** 571 /**
548 * This signal is emitted, when a packet has been received. 572 * This signal is emitted, when a packet has been received.
549 */ 573 */
550 void receivedPacket( OPacket* ); 574 void receivedPacket( OPacket* );
551 575
552 protected slots: 576 protected slots:
553 void readyToReceive(); 577 void readyToReceive();
554 578
555 protected: 579 protected:
556 QString _name; // devicename 580 QString _name; // devicename
557 bool _open; // check this before doing pcap calls 581 bool _open; // check this before doing pcap calls
558 pcap_t* _pch; // pcap library handle 582 pcap_t* _pch; // pcap library handle
559 pcap_dumper_t* _pcd; // pcap dumper handle 583 pcap_dumper_t* _pcd; // pcap dumper handle
560 QSocketNotifier* _sn; // socket notifier for main loop 584 QSocketNotifier* _sn; // socket notifier for main loop
561 mutable char _errbuf[PCAP_ERRBUF_SIZE]; // holds error strings from libpcap 585 mutable char _errbuf[PCAP_ERRBUF_SIZE]; // holds error strings from libpcap
562 QMap<QString, int> _stats; // statistics; 586 QMap<QString, int> _stats; // statistics;
563}; 587};
564 588
565#endif // OPCAP_H 589#endif // OPCAP_H
566 590