Main Page | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

analyse.c

Go to the documentation of this file.
00001 /* Linux Prism II Stumbler - Utility Scan for 802_11 networks under Linux
00002  * 
00003  * File : analyse.c
00004  * Project : WifiScanner (c) 2002 Hervé Schauer Consultants
00005  * Usage : This utility is written for use with IEEE 802.11 adapters based
00006  * on Intersil's PRISM II chipset (PCMCIA).
00007  * 
00008  * Base code was from prismstumbler Jan Fernquist <Jan.B.Fernquist@telia.com>
00009  * and wlanctl from www.linux-wlan.com
00010  *
00011  * This program is free software; you can redistribute it and/or
00012  * modify it under the terms of the GNU General Public License
00013  * as published by the Free Software Foundation; either version 2
00014  * of the License, or (at your option) any later version.
00015  * 
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  * 
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software
00023  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00024  *
00025  * $Id: analyse.c,v 1.36 2005/02/23 11:36:52 poggij Exp $
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 // Private declaration
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 // External references
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 // Big Endian = Not Intel
00068   return (((UINT64) AddMac1 & 0xFFFFFFFFFFFF0000ll) ==
00069           ((UINT64) AddMac2 & 0xFFFFFFFFFFFF0000ll));
00070 #else
00071 // Littel Endian = Intel
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   // ignore broadcast BUG #557306
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 /*  warning (">>1 SSID '%s' (%02X:%02X:%02X:%02X:%02X:%02X)\n",
00245            SSID, AddMac[0], AddMac[1], AddMac[2], AddMac[3], AddMac[4], AddMac[5]); /// XXX
00246 */
00247   for (i = 0; i < NumberOfDetectedClient; i++) {
00248     if (CompareAddMac(ClientInfo[i].AddMac, AddMac)) {
00249       //    ClientInfo[i].SSID ""           and SSID not " "
00250       //if ((strlen (ClientInfo[i].SSID) == 0) && (strncmp (SSID, " ", 32))) {  // BUG #557123
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 /*  warning (">>2 SSID '%s' (%02X:%02X:%02X:%02X:%02X:%02X)\n",
00264            SSID, BSSID[0], BSSID[1], BSSID[2], BSSID[3], BSSID[4], BSSID[5]); /// XXX
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   // We don't initialyse SSID if it's blank, BUG #557123
00282   //   SSID not ""         and  SSID not " "
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       // A little rotation of Beacon Interval
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       //if (!ClientInfo[i].IsP2P)
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       // A little rotation of Beacon Interval
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       //printf ("SSID='%s'\n", ClientInfo[i].SSID);
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) { // #568053
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] = '-';      // Clear histo
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] = '*';      // Fill histo
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("    ");       // separation between channel 13 and 14
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 Function that display the Upper Panel
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   //for (i = MinAff; i < MaxAff; i++) {
00652   HostDisplayed = 0;
00653   i = MinAff;
00654   while ((HostDisplayed < SizeOfWin) || (i < NumberOfDetectedClient)) {
00655     // If we don't need to display this AP/STA, we skip it
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     /* if SN/2 > 64 then SNMax = 64 else SNMax = SN/2 */
00697     SNMax = (ClientInfo[i].SNMax * HISTOSIZE) / MaxFromAll;
00698     if (SNMax <= HISTOSIZE) {
00699       Histo[SNMax - 1] = '|';
00700       //Histo[HISTOSIZE] = ' ';
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     // We Write now
00719     mvwprintw(Panel_WND, Posit, 2, "%s", TYPE);
00720     mvwprintw(Panel_WND, Posit, POS_MAC, "%s", MAC);
00721     //mvwprintw (Panel_WND, Posit, POS_MAC, "%d,%d", ClientInfo[i].IsP2P, ClientInfo[i].IsAP);
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 /* IDS ZONE */
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   // in case of ...
00778 #if (HISTORY_SIZE < 2)
00779 #error "STOP ?! HISTORY_SIZE MUST be greater than 1. Change it on include.h"
00780 #endif
00781 
00782   // Find number of data to analyse
00783   NbData = 0;
00784   for (i = 0; i < HISTORY_SIZE; i++) {
00785     if ((X[i] != 0) && (Y[i] != 0))
00786       NbData++;
00787   }
00788 
00789   // Calculate all aa and all bb
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   // Analysis of Time Stamps
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 /*        snprintf(Message, 1024, "Timestamps = (0x%016llX,0x%016llX)\n",
00869                  ClientInfo[i].TimeStamp[j],
00870                  ClientInfo[i].TimeStamp[j + 1]);
00871         Send_IDS_Warning(Message); */
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   // Analysis of variation of Seqnum
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   // TODO
00921   //  must use CalcCoef ...
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 }

Generated on Fri Feb 25 12:02:37 2005 for WifiScanner by  doxygen 1.4.1