summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/libwellenreiter/source/sniff.cc10
1 files changed, 8 insertions, 2 deletions
diff --git a/noncore/net/wellenreiter/libwellenreiter/source/sniff.cc b/noncore/net/wellenreiter/libwellenreiter/source/sniff.cc
index 66299d1..81eccab 100644
--- a/noncore/net/wellenreiter/libwellenreiter/source/sniff.cc
+++ b/noncore/net/wellenreiter/libwellenreiter/source/sniff.cc
@@ -23,197 +23,203 @@ void process_packets(const struct pcap_pkthdr *pkthdr, const unsigned char *pack
23 struct packetinfo *pinfoptr; 23 struct packetinfo *pinfoptr;
24 24
25 /* wl_network_t will finally be set and send to the ui */ 25 /* wl_network_t will finally be set and send to the ui */
26 wl_network_t wl_net; 26 wl_network_t wl_net;
27 27
28 pinfoptr=&pinfo; 28 pinfoptr=&pinfo;
29 29
30 pinfoptr->isvalid = 0; 30 pinfoptr->isvalid = 0;
31 pinfoptr->pktlen = pkthdr->len; 31 pinfoptr->pktlen = pkthdr->len;
32 32
33 if (caplen < IEEE802_11_FC_LEN) 33 if (caplen < IEEE802_11_FC_LEN)
34 { 34 {
35 /* This is a garbage packet, because is does not long enough 35 /* This is a garbage packet, because is does not long enough
36 to hold a 802.11b header */ 36 to hold a 802.11b header */
37 pinfoptr->isvalid = 0; 37 pinfoptr->isvalid = 0;
38 return; 38 return;
39 } 39 }
40 40
41 /* Gets the framecontrol bits (2bytes long) */ 41 /* Gets the framecontrol bits (2bytes long) */
42 fc = EXTRACT_LE_16BITS(packet); 42 fc = EXTRACT_LE_16BITS(packet);
43 43
44 HEADER_LENGTH = GetHeaderLength(fc); 44 HEADER_LENGTH = GetHeaderLength(fc);
45 45
46 if (caplen < HEADER_LENGTH) 46 if (caplen < HEADER_LENGTH)
47 { 47 {
48 /* This is a garbage packet, because it is not long enough 48 /* This is a garbage packet, because it is not long enough
49 to hold a correct header of its type */ 49 to hold a correct header of its type */
50 pinfoptr->isvalid = 0; 50 pinfoptr->isvalid = 0;
51 return; 51 return;
52 } 52 }
53 53
54 /* Decode 802.11b header out of the packet */ 54 /* Decode 802.11b header out of the packet */
55 if (decode_80211b_hdr(packet,pinfoptr) == 0) 55 if (decode_80211b_hdr(packet,pinfoptr) == 0)
56 { 56 {
57 /* Justification of the ofset to further process the packet */ 57 /* Justification of the ofset to further process the packet */
58 length -= HEADER_LENGTH; 58 length -= HEADER_LENGTH;
59 caplen -= HEADER_LENGTH; 59 caplen -= HEADER_LENGTH;
60 packet += HEADER_LENGTH; 60 packet += HEADER_LENGTH;
61 } 61 }
62 else /* Something is wrong,could not be a correct packet */ 62 else /* Something is wrong,could not be a correct packet */
63 return; 63 return;
64 64
65 switch (FC_TYPE(fc)) 65 switch (FC_TYPE(fc))
66 { 66 {
67 /* Is it a managemnet frame? */ 67 /* Is it a managemnet frame? */
68 case T_MGMT: 68 case T_MGMT:
69 switch (FC_SUBTYPE(fc)) 69 switch (FC_SUBTYPE(fc))
70 { 70 {
71 case ST_BEACON: 71 case ST_BEACON:
72 if (handle_beacon(fc, packet,pinfoptr) ==0) 72 if (handle_beacon(fc, packet,pinfoptr) ==0)
73 { 73 {
74 if (!strcmp(pinfoptr->desthwaddr,"ff:ff:ff:ff:ff:ff") == 0) 74 if (!strcmp(pinfoptr->desthwaddr,"ff:ff:ff:ff:ff:ff") == 0)
75 { 75 {
76 /* Every beacon must have the broadcast as destination 76 /* Every beacon must have the broadcast as destination
77 so it must be a shitti packet */ 77 so it must be a shitti packet */
78 pinfoptr->isvalid = 0; 78 pinfoptr->isvalid = 0;
79 return; 79 return;
80 } 80 }
81 81
82 if (pinfoptr->cap_ESS == pinfoptr->cap_IBSS) 82 if (pinfoptr->cap_ESS == pinfoptr->cap_IBSS)
83 { 83 {
84 /* Only one of both are possible, so must be 84 /* Only one of both are possible, so must be
85 a noise packet, if this comes up */ 85 a noise packet, if this comes up */
86 pinfoptr->isvalid = 0; 86 pinfoptr->isvalid = 0;
87 return; 87 return;
88 } 88 }
89 if (pinfoptr->channel < 1 || pinfoptr->channel > 14) 89 if (pinfoptr->channel < 1 || pinfoptr->channel > 14)
90 { 90 {
91 /* Only channels between 1 and 14 are possible 91 /* Only channels between 1 and 14 are possible
92 others must be noise packets */ 92 others must be noise packets */
93 pinfoptr->isvalid = 0; 93 pinfoptr->isvalid = 0;
94 return; 94 return;
95 } 95 }
96 96
97 97
98 /* Here should be the infos to the gui issued */ 98 /* Here should be the infos to the gui issued */
99 if (pinfoptr->cap_ESS == 1 &&pinfoptr->cap_IBSS ==0) 99 if (pinfoptr->cap_ESS == 1 &&pinfoptr->cap_IBSS ==0)
100 { 100 {
101 wl_loginfo("Found an access point"); 101 wl_loginfo("Found an access point");
102 wl_net.net_type=1; 102 wl_net.net_type=1;
103 } 103 }
104 else if(pinfoptr->cap_ESS == 0 && pinfoptr->cap_IBSS == 1) 104 else if(pinfoptr->cap_ESS == 0 && pinfoptr->cap_IBSS == 1)
105 { 105 {
106 wl_loginfo("Found an ad-hoc network"); 106 wl_loginfo("Found an ad-hoc network");
107 wl_net.net_type=2; 107 wl_net.net_type=2;
108 } 108 }
109 if (strcmp (pinfoptr->ssid,NONBROADCASTING) ==0) 109 if (strcmp (pinfoptr->ssid,NONBROADCASTING) ==0)
110 { 110 {
111 wl_loginfo("Net is a non-broadcasting network"); 111 wl_loginfo("Net is a non-broadcasting network");
112 } 112 }
113 else 113 else
114 { 114 {
115 wl_loginfo("SSID is: %s", pinfoptr->ssid); 115 wl_loginfo("SSID is: %s", pinfoptr->ssid);
116 // wl_net.bssid=pinfoptr->ssid; 116 // wl_net.bssid=pinfoptr->ssid;
117 } 117 }
118 118
119 wl_loginfo("SSID length is: %d", pinfoptr->ssid_len);
119 wl_net.ssid_len=pinfoptr->ssid_len; 120 wl_net.ssid_len=pinfoptr->ssid_len;
121
122 wl_loginfo("Channel is: %d", pinfoptr->channel);
120 wl_net.channel=pinfoptr->channel; 123 wl_net.channel=pinfoptr->channel;
121 wl_net.wep=pinfoptr->cap_WEP; 124 wl_net.wep=pinfoptr->cap_WEP;
122 memcpy(wl_net.mac, pinfoptr->sndhwaddr, sizeof(wl_net.mac));; 125
123 memcpy(wl_net.bssid, pinfoptr->ssid, sizeof(wl_net.bssid)); 126 wl_loginfo("Mac is: %s", pinfoptr->sndhwaddr);
127 memcpy(wl_net.mac, pinfoptr->sndhwaddr, sizeof(wl_net.mac)-1);;
128 wl_loginfo("SSID is: %s", pinfoptr->ssid);
129 memcpy(wl_net.bssid, pinfoptr->ssid, sizeof(wl_net.bssid)-1);
124 130
125 // printf ("\n\tDest : %s\n",pinfoptr->desthwaddr); 131 // printf ("\n\tDest : %s\n",pinfoptr->desthwaddr);
126 send_network_found((char *)guihost, guiport, &wl_net); 132 send_network_found((char *)guihost, guiport, &wl_net);
127 wl_loginfo("Sent network to GUI '%s:%d'", guihost, guiport); 133 wl_loginfo("Sent network to GUI '%s:%d'", guihost, guiport);
128 } 134 }
129 break; 135 break;
130 default: 136 default:
131 wl_logerr("Unknown IEEE802.11 frame subtype (%d)", FC_SUBTYPE(fc)); 137 wl_logerr("Unknown IEEE802.11 frame subtype (%d)", FC_SUBTYPE(fc));
132 break; 138 break;
133 } /* End of switch over different mgt frame types */ 139 } /* End of switch over different mgt frame types */
134 140
135 break; 141 break;
136 142
137 case T_CTRL: 143 case T_CTRL:
138 wl_loginfo("Received control frame, not implemented yet"); 144 wl_loginfo("Received control frame, not implemented yet");
139 break; 145 break;
140 146
141 case T_DATA: 147 case T_DATA:
142 wl_loginfo("Received date frame, not implemented yet"); 148 wl_loginfo("Received date frame, not implemented yet");
143 break; 149 break;
144 150
145 default: 151 default:
146 wl_logerr("Unknown IEEE802.11 frame type (%d)", FC_TYPE(fc)); 152 wl_logerr("Unknown IEEE802.11 frame type (%d)", FC_TYPE(fc));
147 break; 153 break;
148 } 154 }
149} 155}
150 156
151/* This decodes the 802.11b frame header out of the 802.11b packet 157/* This decodes the 802.11b frame header out of the 802.11b packet
152 all the infos is placed into the packetinfo structure */ 158 all the infos is placed into the packetinfo structure */
153int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo) 159int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo)
154{ 160{
155 const struct mgmt_header_t *mgthdr = (const struct mgmt_header_t *) p; 161 const struct mgmt_header_t *mgthdr = (const struct mgmt_header_t *) p;
156 ppinfo->fcsubtype = FC_SUBTYPE(mgthdr->fc); 162 ppinfo->fcsubtype = FC_SUBTYPE(mgthdr->fc);
157 163
158 /* Get the sender, bssid and dest mac address */ 164 /* Get the sender, bssid and dest mac address */
159 etheraddr_string(mgthdr->bssid,ppinfo->bssid); 165 etheraddr_string(mgthdr->bssid,ppinfo->bssid);
160 etheraddr_string(mgthdr->da,ppinfo->desthwaddr); 166 etheraddr_string(mgthdr->da,ppinfo->desthwaddr);
161 etheraddr_string(mgthdr->sa,ppinfo->sndhwaddr); 167 etheraddr_string(mgthdr->sa,ppinfo->sndhwaddr);
162 ppinfo->fc_wep = FC_WEP(mgthdr->fc); 168 ppinfo->fc_wep = FC_WEP(mgthdr->fc);
163 return 0; 169 return 0;
164} 170}
165 171
166 172
167void etheraddr_string(register const u_char *ep, char *text) 173void etheraddr_string(register const u_char *ep, char *text)
168{ 174{
169 static char hex[] = "0123456789abcdef"; 175 static char hex[] = "0123456789abcdef";
170 register unsigned int i, j; 176 register unsigned int i, j;
171 register char *cp; 177 register char *cp;
172 char buf[sizeof("00:00:00:00:00:00")]; 178 char buf[sizeof("00:00:00:00:00:00")];
173 cp = buf; 179 cp = buf;
174 if ((j = *ep >> 4) != 0) 180 if ((j = *ep >> 4) != 0)
175 *cp++ = hex[j]; 181 *cp++ = hex[j];
176 *cp++ = hex[*ep++ & 0xf]; 182 *cp++ = hex[*ep++ & 0xf];
177 for (i = 5; (int)--i >= 0;) { 183 for (i = 5; (int)--i >= 0;) {
178 *cp++ = ':'; 184 *cp++ = ':';
179 if ((j = *ep >> 4) != 0) 185 if ((j = *ep >> 4) != 0)
180 *cp++ = hex[j]; 186 *cp++ = hex[j];
181 *cp++ = hex[*ep++ & 0xf]; 187 *cp++ = hex[*ep++ & 0xf];
182 } 188 }
183 *cp = '\0'; 189 *cp = '\0';
184 strcpy(text,buf); 190 strcpy(text,buf);
185} 191}
186 192
187/* beacon handler */ 193/* beacon handler */
188int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo) 194int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo)
189{ 195{
190 struct mgmt_body_t pbody; 196 struct mgmt_body_t pbody;
191 int offset = 0; 197 int offset = 0;
192 198
193 /* Get the static informations out of the packet */ 199 /* Get the static informations out of the packet */
194 memset(&pbody, 0, sizeof(pbody)); 200 memset(&pbody, 0, sizeof(pbody));
195 memcpy(&pbody.timestamp, p, 8); 201 memcpy(&pbody.timestamp, p, 8);
196 offset += 8; 202 offset += 8;
197 pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); 203 pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset);
198 offset += 2; 204 offset += 2;
199 pbody.capability_info = EXTRACT_LE_16BITS(p+offset); 205 pbody.capability_info = EXTRACT_LE_16BITS(p+offset);
200 offset += 2; 206 offset += 2;
201 207
202 /* Gets the different flags out of the capabilities */ 208 /* Gets the different flags out of the capabilities */
203 ppinfo->cap_ESS = CAPABILITY_ESS(pbody.capability_info); 209 ppinfo->cap_ESS = CAPABILITY_ESS(pbody.capability_info);
204 ppinfo->cap_IBSS = CAPABILITY_IBSS(pbody.capability_info); 210 ppinfo->cap_IBSS = CAPABILITY_IBSS(pbody.capability_info);
205 ppinfo->cap_WEP = CAPABILITY_PRIVACY(pbody.capability_info); 211 ppinfo->cap_WEP = CAPABILITY_PRIVACY(pbody.capability_info);
206 212
207 /* Gets the tagged elements out of the packets */ 213 /* Gets the tagged elements out of the packets */
208 while (offset + 1 < ppinfo->pktlen) 214 while (offset + 1 < ppinfo->pktlen)
209 { 215 {
210 switch (*(p + offset)) 216 switch (*(p + offset))
211 { 217 {
212 case E_SSID: 218 case E_SSID:
213 memcpy(&(pbody.ssid),p+offset,2); offset += 2; 219 memcpy(&(pbody.ssid),p+offset,2); offset += 2;
214 if (pbody.ssid.length > 0) 220 if (pbody.ssid.length > 0)
215 { 221 {
216 memcpy(&(pbody.ssid.ssid),p+offset,pbody.ssid.length); offset += pbody.ssid.length; 222 memcpy(&(pbody.ssid.ssid),p+offset,pbody.ssid.length); offset += pbody.ssid.length;
217 pbody.ssid.ssid[pbody.ssid.length]='\0'; 223 pbody.ssid.ssid[pbody.ssid.length]='\0';
218 if (strcmp((char *)pbody.ssid.ssid,"")==0) 224 if (strcmp((char *)pbody.ssid.ssid,"")==0)
219 memcpy(ppinfo->ssid, NONBROADCASTING, sizeof(ppinfo->ssid)); 225 memcpy(ppinfo->ssid, NONBROADCASTING, sizeof(ppinfo->ssid));