00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <include.h>
00029 #include <src/analyse.h>
00030 #include <src/interface.h>
00031 #include <src/crt_io.h>
00032 #include <src/conversion.h>
00033 #include <src/manuf.h>
00034
00035
00036 void LogPutSSID_byAddMAc(UINT8 AddMac[WLAN_ADDR_LEN], char *SSID);
00037 void LogPutSSID_byBSSID(UINT8 BSSID[WLAN_ADDR_LEN], char *SSID);
00038 void CalculCoef(UINT32 X[HISTORY_SIZE],
00039 UINT32 Y[HISTORY_SIZE], float *a, float *b);
00040
00041 static UINT8 ID[] =
00042 "$Id: analyse.c,v 1.36 2005/02/23 11:36:52 poggij Exp $";
00043 static UINT16 NumberOfDetectedClient = 0;
00044 static ClientInfo_t ClientInfo[MAX_NUMBER_OF_DETECTED_CLIENT];
00045 const UINT8 BroadcastMAC[WLAN_ADDR_LEN] =
00046 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
00047
00048
00049 extern WINDOW *Panel_WND, *RealTime_WND;
00050 extern ScanResult_t Res;
00051 extern Statistics_t Stats;
00052 extern UINT8 ids_warning;
00053 extern ConfigStruct config;
00054
00055 #ifdef WITH_THREAD
00056 extern pthread_mutex_t screen_mutex;
00057 #endif
00058
00059
00060
00061
00063 UINT8
00064 CompareAddMac(UINT8 AddMac1[WLAN_ADDR_LEN], UINT8 AddMac2[WLAN_ADDR_LEN])
00065 {
00066 #ifdef WORDS_BIGENDIAN
00067
00068 return (((UINT64) AddMac1 & 0xFFFFFFFFFFFF0000ll) ==
00069 ((UINT64) AddMac2 & 0xFFFFFFFFFFFF0000ll));
00070 #else
00071
00072 return (((UINT64) AddMac1[5] & 0x0000FFFFFFFFFFFFll) ==
00073 ((UINT64) AddMac2[5] & 0x0000FFFFFFFFFFFFll));
00074 #endif
00075 }
00076
00077 void LogPutSN(UINT8 AddMac[WLAN_ADDR_LEN], UINT32 SN)
00078 {
00079 register UINT16 i, j;
00080
00081 for (i = 0; i < NumberOfDetectedClient; i++) {
00082 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00083 for (j = (HISTORY_SIZE - 1); j != 0; j--) {
00084 ClientInfo[i].SN[j] = ClientInfo[i].SN[j - 1];
00085 }
00086 ClientInfo[i].SN[0] = SN;
00087 if (ClientInfo[i].SNMax < SN)
00088 ClientInfo[i].SNMax = SN;
00089 else if ((ClientInfo[i].SNMin > SN)
00090 || (ClientInfo[i].SNMin == 0))
00091 ClientInfo[i].SNMin = SN;
00092
00093 UINT32 summe = 0;
00094
00095 for (j = 0; j < 4; j++) {
00096 summe += ClientInfo[i].SN[j];
00097 }
00098 ClientInfo[i].SNMed = (summe / HISTORY_SIZE);
00099
00100 break;
00101 }
00102 }
00103 }
00104
00105 void LogPutRate(UINT8 AddMac[WLAN_ADDR_LEN], UINT8 Rate)
00106 {
00107 register UINT16 i;
00108
00109 for (i = 0; i < NumberOfDetectedClient; i++) {
00110 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00111 if (ClientInfo[i].RateMax < Rate)
00112 ClientInfo[i].RateMax = Rate;
00113 else if ((ClientInfo[i].RateMin > Rate)
00114 || (ClientInfo[i].RateMin == 0))
00115 ClientInfo[i].RateMin = Rate;
00116 break;
00117 }
00118 }
00119 }
00120
00121 void LogPutMaxRate(UINT8 AddMac[WLAN_ADDR_LEN], UINT8 Rate)
00122 {
00123 register UINT16 i;
00124
00125 for (i = 0; i < NumberOfDetectedClient; i++) {
00126 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00127 ClientInfo[i].MaxSpeed = Rate;
00128 }
00129 }
00130 }
00131 void LogDetectedClient(UINT8 AddMac[WLAN_ADDR_LEN])
00132 {
00133 register UINT16 i;
00134 UINT8 Founded = 0;
00135
00136 if (NumberOfDetectedClient >= MAX_NUMBER_OF_DETECTED_CLIENT)
00137 return;
00138
00139 if (CompareAddMac(BroadcastMAC, AddMac))
00140 Founded = 2;
00141
00142 for (i = 0; i < NumberOfDetectedClient; i++) {
00143 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00144 Founded = 1;
00145 break;
00146 }
00147 }
00148 if (!Founded) {
00149 debug(1,
00150 "New client found (%02X:%02X:%02X:%02X:%02X:%02X)\n",
00151 AddMac[0], AddMac[1], AddMac[2], AddMac[3],
00152 AddMac[4], AddMac[5]);
00153 memset(&ClientInfo[NumberOfDetectedClient], 0, sizeof(ClientInfo_t));
00154 memcpy(&ClientInfo[NumberOfDetectedClient].AddMac, AddMac,
00155 WLAN_ADDR_LEN);
00156 memcpy(&ClientInfo[NumberOfDetectedClient].Manuf,
00157 AddMacToManufName(ClientInfo[i].AddMac), MANUF_MAXSTRINGLENGTH);
00158 memcpy(&ClientInfo[NumberOfDetectedClient].Model,
00159 AddMacToManufModel(ClientInfo[i].AddMac),
00160 MANUF_MAXSTRINGLENGTH);
00161 NumberOfDetectedClient++;
00162 }
00163 }
00164
00165 void LogPutBSSID(UINT8 AddMac[WLAN_ADDR_LEN], UINT8 BSSID[WLAN_ADDR_LEN])
00166 {
00167 register UINT16 i;
00168
00169
00170 if (CompareAddMac(BSSID, BroadcastMAC) == 0) {
00171 for (i = 0; i < NumberOfDetectedClient; i++) {
00172 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00173 memcpy(&ClientInfo[i].BSSID, BSSID, WLAN_ADDR_LEN);
00174 break;
00175 }
00176 }
00177 }
00178 }
00179
00180 void LogPutDS(UINT8 AddMac[WLAN_ADDR_LEN])
00181 {
00182 register UINT16 i;
00183
00184 for (i = 0; i < NumberOfDetectedClient; i++) {
00185 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00186 ClientInfo[i].IsDS = 1;
00187 break;
00188 }
00189 }
00190 }
00191
00192 void LogPutWep(UINT8 BSSID[WLAN_ADDR_LEN], UINT8 hasWep)
00193 {
00194 register UINT16 i;
00195
00196 for (i = 0; i < NumberOfDetectedClient; i++) {
00197 if (CompareAddMac(ClientInfo[i].BSSID, BSSID)) {
00198 ClientInfo[i].hasWep = hasWep;
00199 }
00200 }
00201 }
00202
00203 void LogPutChannel_byAddMac(UINT8 AddMac[WLAN_ADDR_LEN], UINT8 Channel)
00204 {
00205 register UINT16 i;
00206
00207 for (i = 0; i < NumberOfDetectedClient; i++) {
00208 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00209 ClientInfo[i].Channel = Channel;
00210 break;
00211 }
00212 }
00213 }
00214
00215
00216 void LogPutChannel_byBSSID(UINT8 BSSID[WLAN_ADDR_LEN], UINT8 Channel)
00217 {
00218 register UINT16 i;
00219
00220 for (i = 0; i < NumberOfDetectedClient; i++) {
00221 if (CompareAddMac(ClientInfo[i].BSSID, BSSID)) {
00222 ClientInfo[i].Channel = Channel;
00223 }
00224 }
00225 }
00226
00227 void
00228 LogPutChannel(UINT8 AddMac[WLAN_ADDR_LEN],
00229 UINT8 BSSID[WLAN_ADDR_LEN], UINT8 Channel)
00230 {
00231 if (CompareAddMac(BSSID, BroadcastMAC) == 0) {
00232 if (CompareAddMac(BSSID, BroadcastMAC))
00233 LogPutChannel_byAddMac(AddMac, Channel);
00234 else
00235 LogPutChannel_byBSSID(BSSID, Channel);
00236 }
00237 }
00238
00239
00240 void LogPutSSID_byAddMac(UINT8 AddMac[WLAN_ADDR_LEN], char *SSID)
00241 {
00242 register UINT16 i;
00243
00244
00245
00246
00247 for (i = 0; i < NumberOfDetectedClient; i++) {
00248 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00249
00250
00251 strncpy(ClientInfo[i].SSID, SSID, WLAN_SSID_MAXLEN);
00252
00253 break;
00254 }
00255 }
00256 }
00257
00258
00259 void LogPutSSID_byBSSID(UINT8 BSSID[WLAN_ADDR_LEN], char *SSID)
00260 {
00261 register UINT16 i;
00262
00263
00264
00265
00266 for (i = 0; i < NumberOfDetectedClient; i++) {
00267 if (CompareAddMac(ClientInfo[i].BSSID, BSSID)) {
00268 if ((strlen(ClientInfo[i].SSID) == 0)
00269 || ((strncmp(SSID, "<Hidden SSID>", 32))
00270 && (strncmp(SSID, "<Hidden SSID of known length>", 32)))) {
00271 strncpy(ClientInfo[i].SSID, SSID, WLAN_SSID_MAXLEN);
00272 }
00273 }
00274 }
00275 }
00276
00277 void
00278 LogPutSSID(UINT8 AddMac[WLAN_ADDR_LEN],
00279 UINT8 BSSID[WLAN_ADDR_LEN], char *SSID)
00280 {
00281
00282
00283 if ((strlen(SSID) != 0) && (strncmp(SSID, " ", 32))) {
00284 if (CompareAddMac(BSSID, BroadcastMAC))
00285 LogPutSSID_byAddMac(AddMac, SSID);
00286 else
00287 LogPutSSID_byBSSID(BSSID, SSID);
00288 }
00289 }
00290
00291 void LogPutIsAP(UINT8 AddMac[WLAN_ADDR_LEN], UINT8 hasWep, UINT16 bcn_int)
00292 {
00293 register UINT16 i, j;
00294 UINT8 BSSID[WLAN_ADDR_LEN];
00295
00296 for (i = 0; i < NumberOfDetectedClient; i++) {
00297 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00298 ClientInfo[i].hasWep = hasWep;
00299
00300 for (j = (HISTORY_SIZE - 1); j != 0; j--)
00301 ClientInfo[i].bcn_int[j] = ClientInfo[i].bcn_int[j - 1];
00302 if (bcn_int != 0)
00303 ClientInfo[i].bcn_int[0] = bcn_int;
00304 memcpy(&BSSID, ClientInfo[i].BSSID, WLAN_ADDR_LEN);
00305
00306 ClientInfo[i].IsAP = 1;
00307 break;
00308 }
00309 }
00310 LogPutWep(BSSID, hasWep);
00311 }
00312
00313 void LogPutIsP2P(UINT8 AddMac[WLAN_ADDR_LEN], UINT8 hasWep, UINT16 bcn_int)
00314 {
00315 register UINT16 i, j;
00316
00317 for (i = 0; i < NumberOfDetectedClient; i++) {
00318 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00319 ClientInfo[i].hasWep = hasWep;
00320
00321 for (j = (HISTORY_SIZE - 1); j != 0; j--)
00322 ClientInfo[i].bcn_int[j] = ClientInfo[i].bcn_int[j - 1];
00323 if (bcn_int != 0)
00324 ClientInfo[i].bcn_int[0] = bcn_int;
00325 ClientInfo[i].IsP2P = 1;
00326 ClientInfo[i].IsAP = 0;
00327 debug(1, "IsP2P > %s\n", ClientInfo[i].AddMac);
00328 break;
00329 }
00330 }
00331 }
00332
00333 void
00334 LogPutOtherInformation(UINT8 AddMac[WLAN_ADDR_LEN], char *OtherInformation)
00335 {
00336 register UINT16 i;
00337
00338 for (i = 0; i < NumberOfDetectedClient; i++) {
00339 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00340 strncpy(ClientInfo[i].OtherInformation,
00341 OtherInformation, (MAXSIZE_OTHERINFORMATION - 1));
00342 break;
00343 }
00344 }
00345 }
00346
00348 void LogPutTimestamp(UINT8 AddMac[WLAN_ADDR_LEN], UINT64 TimeStamp)
00349 {
00350 register UINT16 i;
00351 UINT8 j;
00352
00353 for (i = 0; i < NumberOfDetectedClient; i++) {
00354 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00355 for (j = (HISTORY_SIZE - 1); j != 0; j--) {
00356 ClientInfo[i].TimeStamp[j] = ClientInfo[i].TimeStamp[j - 1];
00357 }
00358 ClientInfo[i].TimeStamp[0] = TimeStamp;
00359 debug(3, "TS : %016llX %016llX %016llX %016llX\n",
00360 ClientInfo[i].TimeStamp[0],
00361 ClientInfo[i].TimeStamp[1],
00362 ClientInfo[i].TimeStamp[2], ClientInfo[i].TimeStamp[3]);
00364 break;
00365 }
00366 }
00367 }
00368
00370 void
00371 LogPutSeqNum(UINT8 AddMac[WLAN_ADDR_LEN],
00372 UINT8 AddMacDst[WLAN_ADDR_LEN], UINT16 SeqNum)
00373 {
00374 register UINT16 i, j;
00375
00378 if (CompareAddMac(AddMacDst, BroadcastMAC)) {
00379 for (i = 0; i < NumberOfDetectedClient; i++) {
00380 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00381 for (j = (HISTORY_SIZE - 1); j != 0; j--) {
00382 ClientInfo[i].SeqNum[j] = ClientInfo[i].SeqNum[j - 1];
00383 }
00384 ClientInfo[i].SeqNum[0] = WLAN_GET_SEQ_SEQNUM(SeqNum);
00385 break;
00386 }
00387 }
00388 }
00389 }
00390
00392 void LogPutLastIV(UINT8 AddMac[WLAN_ADDR_LEN], UINT8 IV[4])
00393 {
00394 register UINT16 i;
00395
00396 for (i = 0; i < NumberOfDetectedClient; i++) {
00397 if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00398 ClientInfo[i].LastIV[0] = IV[0];
00399 ClientInfo[i].LastIV[1] = IV[1];
00400 ClientInfo[i].LastIV[2] = IV[2];
00401 ClientInfo[i].LastIV[3] = IV[3];
00402 break;
00403 }
00404 }
00405 }
00406
00410 void LogWriteReport(void)
00411 {
00412 int i;
00413 UINT8 j;
00414
00415 printf("\n\n");
00416 printf("Now a summary of the detection :\n");
00417 printf("--------------------------------\n");
00418
00419 if (NumberOfDetectedClient == 0) {
00420 printf("No 802.11b information has been catched\n\n");
00421 }
00422
00423 for (i = 0; i < NumberOfDetectedClient; i++) {
00424 printf("Station (%02X:%02X:%02X:%02X:%02X:%02X) - ",
00425 ClientInfo[i].AddMac[0], ClientInfo[i].AddMac[1],
00426 ClientInfo[i].AddMac[2], ClientInfo[i].AddMac[3],
00427 ClientInfo[i].AddMac[4], ClientInfo[i].AddMac[5]);
00428 printf("BSSID=%02X:%02X:%02X:%02X:%02X:%02X - ",
00429 ClientInfo[i].BSSID[0], ClientInfo[i].BSSID[1],
00430 ClientInfo[i].BSSID[2], ClientInfo[i].BSSID[3],
00431 ClientInfo[i].BSSID[4], ClientInfo[i].BSSID[5]);
00432
00433 if ((strlen(ClientInfo[i].SSID) == 0)
00434 || ((strlen(ClientInfo[i].SSID) == 1)
00435 && (*ClientInfo[i].SSID == 0x20)))
00436 printf("SSID is not broadcasted\n");
00437 else {
00438
00439 printf("SSID='");
00440 for (j = 0; j < strlen(ClientInfo[i].SSID); j++) {
00441 if (isprint(ClientInfo[i].SSID[j]))
00442 printf("%c", ClientInfo[i].SSID[j]);
00443 else
00444 printf("/0x%02X", ClientInfo[i].SSID[j]);
00445 }
00446 printf("'\n");
00447 }
00448
00449 printf(" Manufacturer/Model : %s / %s\n",
00450 AddMacToManufName(ClientInfo[i].AddMac),
00451 AddMacToManufModel(ClientInfo[i].AddMac));
00452
00453 if (ClientInfo[i].SNMax != ClientInfo[i].SNMin)
00454 printf(" Signal is between %u and %u",
00455 ClientInfo[i].SNMin, ClientInfo[i].SNMax);
00456 else
00457 printf(" Signal is stable at %u", ClientInfo[i].SNMax);
00458
00459 if (ClientInfo[i].RateMax != ClientInfo[i].RateMin)
00460 printf(" and Data rate is between %s and %s\n",
00461 RateToString(ClientInfo[i].RateMin),
00462 RateToString(ClientInfo[i].RateMax));
00463 else
00464 printf(" and Data rate is %s\n",
00465 RateToString(ClientInfo[i].RateMax));
00466
00467 if (ClientInfo[i].MaxSpeed != 0)
00468 printf(" Max speed available is %s\n",
00469 RateToString(ClientInfo[i].MaxSpeed));
00470
00471 if (ClientInfo[i].hasWep)
00472 printf(" Channel %d with Wep\n", ClientInfo[i].Channel);
00473 else
00474 printf(" Channel %d with no Wep\n", ClientInfo[i].Channel);
00475
00476 if (ClientInfo[i].bcn_int[0] != 0)
00477 printf(" 1 beacon every %d ms is sent\n", ClientInfo[i].bcn_int[0]);
00478
00479 if (ClientInfo[i].IsDS) {
00480 if (ClientInfo[i].IsAP) {
00481 printf
00482 (" This is an AP that do some NAT or is a router (because it's also a DS)\n");
00483 } else {
00484 printf
00485 (" This stations is in the Wired network (DS) of the BSSID\n");
00486 }
00487 } else {
00488 if (ClientInfo[i].IsAP)
00489 printf(" This is an AP\n");
00490 else if (ClientInfo[i].IsP2P)
00491 printf(" This an Ad-HOC client\n");
00492 else
00493 printf(" This is a client\n");
00494 }
00495
00496 if (ClientInfo[i].OtherInformation == NULL) {
00497 printf(" Other information discovered:\n");
00498 printf(" > \"%s\"\n", ClientInfo[i].OtherInformation);
00499 }
00500
00501 printf("-------------\n");
00502 }
00503 }
00504
00508 void LogWriteDOT(FILE * filename)
00509 {
00510 int i;
00511
00512 if (NumberOfDetectedClient == 0) {
00513 printf("No 802.11b information has catched\n");
00514 printf("So no .dot file is created\n\n");
00515 } else {
00516 printf("802.11b information has catched so I make my .dot file ");
00517 }
00518
00519 fprintf(filename,
00520 "digraph xyz {\n ratio=compress;\n size=\"8,8\";\n"
00521 " rankdir=LR;\n node [shape=box,fontsize=8];\n");
00522
00523 for (i = 0; i < NumberOfDetectedClient; i++) {
00524 printf(".");
00525 fprintf(filename, "\"%02X:%02X:%02X:%02X:%02X:%02X\" -> ",
00526 ClientInfo[i].BSSID[0], ClientInfo[i].BSSID[1],
00527 ClientInfo[i].BSSID[2], ClientInfo[i].BSSID[3],
00528 ClientInfo[i].BSSID[4], ClientInfo[i].BSSID[5]);
00529 fprintf(filename, "\"%02X:%02X:%02X:%02X:%02X:%02X\";\n",
00530 ClientInfo[i].AddMac[0], ClientInfo[i].AddMac[1],
00531 ClientInfo[i].AddMac[2], ClientInfo[i].AddMac[3],
00532 ClientInfo[i].AddMac[4], ClientInfo[i].AddMac[5]);
00533 if (ClientInfo[i].IsDS)
00534 fprintf(filename,
00535 "\"%02X:%02X:%02X:%02X:%02X:%02X\" [shape=diamond];\n",
00536 ClientInfo[i].AddMac[0],
00537 ClientInfo[i].AddMac[1],
00538 ClientInfo[i].AddMac[2],
00539 ClientInfo[i].AddMac[3],
00540 ClientInfo[i].AddMac[4], ClientInfo[i].AddMac[5]);
00541 else {
00542 if (ClientInfo[i].IsAP) {
00543 fprintf(filename,
00544 "\"%02X:%02X:%02X:%02X:%02X:%02X\" [shape=circle,label=\"",
00545 ClientInfo[i].AddMac[0],
00546 ClientInfo[i].AddMac[1],
00547 ClientInfo[i].AddMac[2],
00548 ClientInfo[i].AddMac[3],
00549 ClientInfo[i].AddMac[4], ClientInfo[i].AddMac[5]);
00550 fprintf(filename,
00551 "%02X:%02X:%02X:%02X:%02X:%02X\\nSSID='%s'\"];\n",
00552 ClientInfo[i].AddMac[0],
00553 ClientInfo[i].AddMac[1],
00554 ClientInfo[i].AddMac[2],
00555 ClientInfo[i].AddMac[3],
00556 ClientInfo[i].AddMac[4],
00557 ClientInfo[i].AddMac[5], ClientInfo[i].SSID);
00558 }
00559 }
00560 }
00561 fprintf(filename, "}\n");
00562 printf("Done!\n\n");
00563 }
00564
00565 void LogWriteHisto(void)
00566 {
00567 #define HISTO_SIGNAL_SIZE 32
00568 #define HISTO_SIGNAL_CHAN 14
00569
00570 UINT8 i, Max = 0;
00571 float divid = 0;
00572 int j;
00573 char histo[HISTO_SIGNAL_SIZE][HISTO_SIGNAL_CHAN];
00574
00575 if (NumberOfDetectedClient != 0) {
00576
00577 printf("\n Spectral repartition :\n-----------------------\n\n");
00578
00579 for (i = 0; i < HISTO_SIGNAL_CHAN; i++) {
00580 debug(3, "%d,", Stats.MaxSignal[i]);
00581 if (Stats.MaxSignal[i] > Max)
00582 Max = Stats.MaxSignal[i];
00583 }
00584
00585 divid = (float) (Max + 1) / (float) HISTO_SIGNAL_SIZE;
00586 debug(3, "divid=%f\n", divid);
00587
00588 for (i = 0; i < HISTO_SIGNAL_CHAN; i++) {
00589 for (j = 0; j < HISTO_SIGNAL_SIZE; j++)
00590 histo[j][i] = '-';
00591 }
00592
00593 for (i = 0; i < HISTO_SIGNAL_CHAN; i++) {
00594 for (j = 0; j < (Stats.MaxSignal[i] / divid); j++) {
00595 histo[j][i] = '*';
00596 }
00597 }
00598
00599 printf(" 01 02 03 04 05 06 07 08 09 10 11 12 13 14\n");
00600 for (j = HISTO_SIGNAL_SIZE; j != 0; j--) {
00601 printf("%3d ", (UINT8) (j * divid));
00602 for (i = 0; i < HISTO_SIGNAL_CHAN; i++) {
00603 if (i == (HISTO_SIGNAL_CHAN - 1))
00604 printf(" ");
00605 printf("%c%c ", histo[j - 1][i], histo[j - 1][i]);
00606 }
00607 printf("\n");
00608 }
00609 printf(" 01 02 03 04 05 06 07 08 09 10 11 12 13 14\n\n");
00610 }
00611 }
00612
00613
00614
00615
00616 void WritePanel(UINT8 GoodPacket)
00617 {
00618 UINT8 i;
00619 char Line[256];
00620 char Histo[HISTOSIZE + 2];
00621 char MAC[20];
00622 char TYPE[4];
00623 UINT8 SNMax = 0;
00624 static UINT8 MaxFromAll = 1;
00625 UINT16 HistoSize = 0, HostDisplayed;
00626 UINT16 MinAff, MaxAff, Posit = 1, SizeOfWin;
00627
00628 SizeOfWin = (ROW_WND_PANEL - 2);
00629 if (config.FirstNIC == 0) {
00630 if (NumberOfDetectedClient > SizeOfWin)
00631 MinAff = NumberOfDetectedClient - SizeOfWin;
00632 else
00633 MinAff = 0;
00634 MaxAff = NumberOfDetectedClient;
00635 } else {
00636 if (config.FirstNIC < (NumberOfDetectedClient - SizeOfWin)) {
00637 MinAff = config.FirstNIC;
00638 if (config.FirstNIC + SizeOfWin < NumberOfDetectedClient)
00639 MaxAff = config.FirstNIC + SizeOfWin;
00640 else
00641 MaxAff = NumberOfDetectedClient - 1;
00642 } else {
00643 config.FirstNIC = 0;
00644 MinAff = NumberOfDetectedClient - SizeOfWin;
00645 }
00646 }
00647
00648 #ifdef WITH_THREAD
00649 pthread_mutex_lock(&screen_mutex);
00650 #endif
00651
00652 HostDisplayed = 0;
00653 i = MinAff;
00654 while ((HostDisplayed < SizeOfWin) || (i < NumberOfDetectedClient)) {
00655
00656 if (IS_BIT_SET(config.DoNotDisplay, 4)) {
00657 while ((!ClientInfo[i].IsAP)
00658 && (i < NumberOfDetectedClient)) {
00659 i++;
00660 }
00661 }
00662 if (i >= NumberOfDetectedClient)
00663 break;
00664 snprintf(MAC, 20, "%02X:%02X:%02X:%02X:%02X:%02X",
00665 ClientInfo[i].AddMac[0], ClientInfo[i].AddMac[1],
00666 ClientInfo[i].AddMac[2], ClientInfo[i].AddMac[3],
00667 ClientInfo[i].AddMac[4], ClientInfo[i].AddMac[5]);
00668 strncpy(Histo,
00669 "|____________________________________________",
00670 HISTOSIZE + 1);
00671
00672 if ((ClientInfo[i].SNMax > MaxFromAll)
00673 || (Res.Signal > MaxFromAll)) {
00674 if (Res.Signal > MaxFromAll)
00675 MaxFromAll = Res.Signal;
00676 else
00677 MaxFromAll = ClientInfo[i].SNMax;
00678 }
00679
00680 if (GoodPacket) {
00681 HistoSize =
00682 (UINT16) ((ClientInfo[i].SNMed * HISTOSIZE) / MaxFromAll);
00683 if (!strncmp(MAC, Res.SrcMac, 20)) {
00684 strncpy(Histo,
00685 "|=======================================================",
00686 HistoSize);
00687 mvwprintw(Panel_WND, Posit, 1, ">");
00688 } else {
00689 strncpy(Histo,
00690 "|.......................................................",
00691 HistoSize);
00692 mvwprintw(Panel_WND, Posit, 1, " ");
00693 }
00694 }
00695
00696
00697 SNMax = (ClientInfo[i].SNMax * HISTOSIZE) / MaxFromAll;
00698 if (SNMax <= HISTOSIZE) {
00699 Histo[SNMax - 1] = '|';
00700
00701 }
00702 Histo[HISTOSIZE + 1] = 0;
00703 snprintf(Line, COL_WND_PANEL - POS_HISTO - 1,
00704 "%s (%d,%d,%d) %s ", Histo,
00705 ((GoodPacket
00706 && !strncmp(MAC, Res.SrcMac,
00707 20)) ? Res.Signal : 0),
00708 (int) ClientInfo[i].SNMed,
00709 (int) ClientInfo[i].SNMax, ClientInfo[i].Manuf);
00710
00711 if (ClientInfo[i].IsP2P)
00712 snprintf(TYPE, 4, "ADH");
00713 else if (ClientInfo[i].IsAP)
00714 snprintf(TYPE, 4, "AP ");
00715 else
00716 snprintf(TYPE, 4, "STA");
00717
00718
00719 mvwprintw(Panel_WND, Posit, 2, "%s", TYPE);
00720 mvwprintw(Panel_WND, Posit, POS_MAC, "%s", MAC);
00721
00722 mvwprintw(Panel_WND, Posit, POS_SSID,
00723 "\"%s\" ", ClientInfo[i].SSID);
00724 mvwprintw(Panel_WND, Posit, POS_HISTO, " %s", Line);
00725 Posit++;
00726 HostDisplayed++;
00727 i++;
00728 }
00729
00730 wrefresh(Panel_WND);
00731 #ifdef WITH_THREAD
00732 pthread_mutex_unlock(&screen_mutex);
00733 #endif
00734 debug(3, "WritePanel Line #%d\n", __LINE__);
00735 }
00736
00738 void DoSummary(void)
00739 {
00740 UINT8 i;
00741 UINT8 ChanTab[14] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
00742
00743 Stats.AP = 0;
00744 Stats.STA = 0;
00745 Stats.Channel = 0;
00746
00747 for (i = 0; i < NumberOfDetectedClient; i++) {
00748 ChanTab[ClientInfo[i].Channel] = 1;
00749
00750 if (ClientInfo[i].IsAP)
00751 Stats.AP++;
00752 else
00753 Stats.STA++;
00754 }
00755
00756 for (i = 0; i < 14; i++) {
00757 if (ChanTab[i] != 0)
00758 Stats.Channel++;
00759 }
00760 }
00761
00762
00763
00764
00765
00770 void
00771 CalculCoef(UINT32 X[HISTORY_SIZE],
00772 UINT32 Y[HISTORY_SIZE], float *a, float *b)
00773 {
00774 float aa[HISTORY_SIZE], bb[HISTORY_SIZE];
00775 UINT8 NbData, i;
00776
00777
00778 #if (HISTORY_SIZE < 2)
00779 #error "STOP ?! HISTORY_SIZE MUST be greater than 1. Change it on include.h"
00780 #endif
00781
00782
00783 NbData = 0;
00784 for (i = 0; i < HISTORY_SIZE; i++) {
00785 if ((X[i] != 0) && (Y[i] != 0))
00786 NbData++;
00787 }
00788
00789
00790 for (i = 0; i < (NbData - 1); i++) {
00791 aa[i] = (Y[i] - Y[i + 1]) / (X[i] - X[i + 1]);
00792 bb[i] = Y[i] / (aa[i] * X[i]);
00793 }
00794
00795 *a = *b = 0;
00796 for (i = 0; i < NbData; i++) {
00797 *a = *a + aa[i];
00798 *b = *b + bb[i];
00799 }
00800 *a = *a / NbData;
00801 *b = *b / NbData;
00802 }
00803
00804
00806 UINT8 IDS_BcnInt(void)
00807 {
00808 register UINT16 i;
00809 UINT8 ret = 0, j;
00810 char MAC[20];
00811 char Message[1024];
00812
00813 for (i = 0; i < NumberOfDetectedClient; i++) {
00814 for (j = 0; j < (HISTORY_SIZE - 1); j++) {
00815 if (((ClientInfo[i].bcn_int[j] != 0)
00816 && (ClientInfo[i].bcn_int[j + 1] != 0))
00817 && (ClientInfo[i].bcn_int[j] != ClientInfo[i].bcn_int[j + 1])) {
00818 snprintf(MAC, 20,
00819 "%02X:%02X:%02X:%02X:%02X:%02X",
00820 ClientInfo[i].AddMac[0],
00821 ClientInfo[i].AddMac[1],
00822 ClientInfo[i].AddMac[2],
00823 ClientInfo[i].AddMac[3],
00824 ClientInfo[i].AddMac[4], ClientInfo[i].AddMac[5]);
00825 snprintf(Message, 1024,
00826 "IDS WARNING - beacon interval is changing for %s from %dms to %dms\n",
00827 MAC, ClientInfo[i].bcn_int[j + 1],
00828 ClientInfo[i].bcn_int[j]);
00829 Send_IDS_Warning(Message);
00830 ret = 0x01;
00831 break;
00832 }
00833 }
00834 }
00835 return ret;
00836 }
00837
00838 UINT8 IDS_TimeStamp(void)
00839 {
00840 register UINT16 i;
00841 UINT8 ret = 0, j;
00842 char MAC[20];
00843 char Message[1024];
00844
00845
00846 for (i = 0; i < NumberOfDetectedClient; i++) {
00847 for (j = 0; j < (HISTORY_SIZE - 1); j++) {
00848 if (((ClientInfo[i].TimeStamp[j] != 0)
00849 && (ClientInfo[i].TimeStamp[j + 1] != 0))
00850 && (ClientInfo[i].TimeStamp[j] < ClientInfo[i].TimeStamp[j + 1])) {
00851 snprintf(MAC, 20,
00852 "%02X:%02X:%02X:%02X:%02X:%02X",
00853 ClientInfo[i].AddMac[0],
00854 ClientInfo[i].AddMac[1],
00855 ClientInfo[i].AddMac[2],
00856 ClientInfo[i].AddMac[3],
00857 ClientInfo[i].AddMac[4], ClientInfo[i].AddMac[5]);
00858 snprintf(Message, 1024,
00859 "IDS WARNING - Time Stamp is not correct for %s\n", MAC);
00860 Send_IDS_Warning(Message);
00861 snprintf(Message, 1024,
00862 " Difference between two catched packets is : %lluµs %llums\n",
00863 ClientInfo[i].TimeStamp[j + 1] -
00864 ClientInfo[i].TimeStamp[j],
00865 (ClientInfo[i].TimeStamp[j + 1] -
00866 ClientInfo[i].TimeStamp[j]) * 100);
00867 Send_IDS_Warning(Message);
00868
00869
00870
00871
00872 ret = 0x02;
00873 break;
00874 }
00875 }
00876 }
00877 return ret;
00878 }
00879
00884 UINT8 IDS_Var_SeqNum(void)
00885 {
00886 register UINT16 i;
00887 UINT8 ret = 0, j;
00888 char MAC[20];
00889 char Message[1024];
00890
00891
00892 for (i = 0; i < NumberOfDetectedClient; i++) {
00893 for (j = 0; j < (HISTORY_SIZE - 1); j++) {
00894 if (((ClientInfo[i].SeqNum[j] != 0)
00895 && (ClientInfo[i].SeqNum[j + 1] != 0))
00896 && (ClientInfo[i].SeqNum[j] < ClientInfo[i].SeqNum[j + 1])) {
00897 snprintf(MAC, 20,
00898 "%02X:%02X:%02X:%02X:%02X:%02X",
00899 ClientInfo[i].AddMac[0],
00900 ClientInfo[i].AddMac[1],
00901 ClientInfo[i].AddMac[2],
00902 ClientInfo[i].AddMac[3],
00903 ClientInfo[i].AddMac[4], ClientInfo[i].AddMac[5]);
00904 snprintf(Message, 1024,
00905 "IDS WARNING - Sequence Number is not correct for %s\n",
00906 MAC);
00907 Send_IDS_Warning(Message);
00908 debug(1, "SeqNum = (0x%04X,0x%04X)\n", ClientInfo[i].SeqNum[j],
00909 ClientInfo[i].SeqNum[j + 1]);
00910 ret = 0x04;
00911 break;
00912 }
00913 }
00914 }
00915 return ret;
00916 }
00917
00918 UINT8 IDS_Detect_FakeAP(void)
00919 {
00920
00921
00922 return 0;
00923 }
00924
00929 UINT8 IDS(void)
00930 {
00935 UINT8 ret = 0;
00936
00937 ret += IDS_BcnInt();
00938 ret += IDS_TimeStamp();
00939 ret += IDS_Var_SeqNum();
00940 ret += IDS_Detect_FakeAP();
00941
00942 return (ret);
00943 }