summaryrefslogtreecommitdiff
path: root/libopie2/opienet
Unidiff
Diffstat (limited to 'libopie2/opienet') (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,216 +1,217 @@
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
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
@@ -33,385 +33,443 @@
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
@@ -605,257 +663,258 @@ OWaveLanManagementCF::OWaveLanManagementCF( const unsigned char* end, const stru
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
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
@@ -313,254 +313,278 @@ class OWaveLanManagementDS : public QObject
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