home *** CD-ROM | disk | FTP | other *** search
/ Current Shareware 1994 January / SHAR194.ISO / hamradio / netspy.zip / RETI.DOC < prev    next >
Text File  |  1989-07-25  |  37KB  |  730 lines

  1.  
  2.  
  3.  
  4.                          I N D I C E                         
  5.  
  6. 1. INTRODUZIONE...........................................2
  7.  
  8. 2. IL PROTOCOLLO AX25.....................................2
  9.  
  10. 3. L'INTERFACCIA RADIO - TNC - COMPUTER...................9
  11.  
  12. 4. LE ROUTINE DI GESTIONE DELLA PORTA SERIALE............11
  13.  
  14. 5. IL PROGRAMMA NETSPY.C.................................12
  15.   5.1 La Strategia del programma.........................12
  16.   5.2 Come usare il programma............................16
  17.   5.3 Le principali strutture dati del programma.........20
  18.   5.4 Le   principali   costanti    "      "    .........23
  19.   5.5 Le   principali   routines    "      "    .........24
  20.  
  21. 8. LISTATI...............................................29
  22.  
  23. 1. INTRODUZIONE.
  24. Con questa  relazione  si  vuole  descrivere  come  e'  stato 
  25. progettato e implementato il programma NETSPY .C. Esso e'  in 
  26. grado, tramite un ricevitore radio e un TNC, di  intercettare 
  27. le comunicazioni in "packet" su un dato canale  radio,  e  di 
  28. analizzare i relativi pacchetti.
  29. Inizieremo con una breve  descrizione  del  protocollo  AX25, 
  30. usato  per  le  comunicazioni  in  packet  radio,   per   poi 
  31. descrivere come  le  conoscenze  acquisite  nello  studio  di 
  32. questo protocollo ci hanno permesso di affrontare il problema 
  33. propostoci.
  34.  
  35. 2. IL PROTOCOLLO AX25.
  36. La comunicazione in packet radio  fra  due  stazioni  avviene 
  37. attraverso lo scambio di piccoli  blocchi,  o  pacchetti,  di 
  38. dati. Ogni pacchetto (frame) e'  costituito  dall'insieme  di 
  39. altre piccole sequenze,  dette  campi.  La  prima  grossolana 
  40. classificazione possibile e' dividere i frames in tre  gruppi 
  41. principali: frame  U,  S,  I,  rispettivamente  pacchetti  di 
  42. informazione non  numerati,  pacchetti  di  supervisione  del 
  43. protocollo, pacchetti di informazione numerati. I  campi  che 
  44. formano questi tipi di pacchetti sono i seguenti:
  45.  
  46. Pacchetto I (o UI)
  47.  
  48.            FLAG   ADDRESS   CONTROL   PID   INFO   FCS   FLAG
  49. (n.bytes)   1      14/70      1        1     n      2     1
  50.  
  51. Pacchetto S (o U)
  52.  
  53.            FLAG    ADDRESS    CONTROL    FCS    FLAG
  54. (n.bytes)   1       14/70        1        2       1
  55.  
  56. Prendiamo ora in esame il contenuto dei vari campi. 
  57. FLAG. Il campo flag (7E Hex, 01111110) delimita l'inizio e la 
  58. fine  di  un  pacchetto.  Se  questo  byte   deve   comparire 
  59. all'interno di altri campi, vi e' inserito con la tecnica del 
  60. "byte stuffing".
  61. ADDRESS. Il campo address  serve  per  conoscere  mittente  e 
  62. destinatario di ogni frame. I primi 7 byte sono  relativi  al 
  63. mittente, i bytes 8-14 al destinatario, gli altri (eventuali) 
  64. alla  catena  dei  digipeater  che   rendono   possibile   il 
  65. collegamento. Per individuare il termine del  campo  address, 
  66. tutte i byte relativi alle  lettere  dei  nominativi  vengono 
  67. shiftati di una posizione a sinistra, lasciando al  bit  meno 
  68. significativo il compito di indicare se il campo indirizzo e' 
  69. terminato oppure no. Un bit a 1 in questa posizione dara'  il 
  70. termine del campo. Per ogni nominativo sono presenti 7  byte: 
  71. 6 di  nominativo  vero  e  proprio,  1  per  l'identificativo 
  72. secondario  di  stazione  (localmente  verra'   aggiunto   il 
  73. carattere "-").
  74. CONTROL.  Il  campo  control  serve  per   identificare   che 
  75. tipo di frame (I, U, S) e' stato inviato.  I  due  bits  meno 
  76. significativi del campo controllo specificano la  natura  del 
  77. pacchetto:
  78. x 0 : Pacchetto di tipo I (x indica indifferenza)
  79. 0 1 : Pacchetto di tipo S
  80. 1 1 : Pacchetto di tipo U.
  81. Tutte le decodifiche successive (compresa quella relativa  ai 
  82. bits rimanenti del campo control) hanno modalita'  diverse  a 
  83. seconda di questa prima distinzione.
  84.  
  85. FRAME I.
  86. Cominciamo dalla decodifica  dei  bits  rimanenti  del  campo 
  87. control (bit 1-7, intendendo 0 bit meno significativo e primo 
  88. ad essere trasmesso).
  89. I bits 1, 2 e 3 identificano il numero progressivo (modulo 8) 
  90. della sequenza di pacchetti I  trasmessi.  Il  bit  4  e'  il 
  91. sottocampo di poll/final: quando questo campo e' a 1 si vuole 
  92. una risposta immediata dalla stazione  dall'altra  parte  del 
  93. link, che rispondera' anch'essa con un sottocampo di P/F a 0. 
  94. Questo serve per accertarsi, qualora  ve  ne  fosse  bisogno, 
  95. della 'presenza' dell' altra stazione.
  96. I bit 5, 6 e 7 identificano il numero progressivo (modulo  8) 
  97. della sequenza di pacchetti I ricevuti.
  98.  
  99. FRAME I.- Campo PID -
  100. Il  Byte  successivo  al  campo  controllo  e'  il   Protocol 
  101. Identifier Field, che dice se esiste un protocollo a  livello 
  102. 3 e quale esso sia. Il valore  240d  codifica  il  fatto  che 
  103. nessun protocollo a livello 3 e' implementato; il valore 207d 
  104. codifica il protocollo  NETROM;  il  valore  204d codifica il 
  105. protocollo IP.
  106.  
  107. FRAME I.- Campo Info e successivi -
  108. Dopo il Byte di PID, inizia la serie  di  bytes  di contenuto 
  109. informativo veri e propri, cioe' la sequenza  di  byte  ASCII 
  110. che  costituiscono il messaggio. Essi sono  terminati  da  un 
  111. byte di FCS (Frame Check Sequence), su cui il TNC dovra' fare 
  112. il test di correttezza del pacchetto, e da un  byte  di  flag 
  113. (01111110) che termina il pacchetto stesso.
  114.  
  115. FRAME S
  116. Con questo nome si identificano i pacchetti  di  supervisione 
  117. del protocollo, quelli cioe' a cui e' assegnato il compito di 
  118. controllare l'esatto flusso dei dati sul link. I bytes 2 e  3 
  119. del campo control descrivono la natura del  pacchetto  S:  in 
  120. particolare:
  121. bit   3  2       tipo
  122.       0  0       RR  (Receive Ready)
  123.       0  1       RNR (Receive Not Ready)
  124.       1  0       REJ (Frame Reject)
  125. Il bit 4 e' il gia' spiegato sottocampo di poll/final, mentre 
  126. i bits   5, 6, 7 danno il numero progressivo,  sempre  modulo 
  127. 8, della sequenza di pacchetti ricevuti.
  128.  
  129. FRAME S.- Tipo RR -
  130. Il tipo RR serve principalmente per tre scopi:
  131. -) Per indicare che chi trasmette RR  e'  pronto  a  ricevere 
  132. pacchetti di tipo I;
  133. -) Per indicare  che  sono  stati  ricevuti  correttamente  i 
  134. pacchetti I inviati;
  135. -)  Per  ridare  il  via  a  una  condizione  precedentemente 
  136. bloccata.
  137.  
  138. FRAME S.- Tipo RNR -
  139. Questo tipo di pacchetti  viene  usato  per  indicare  a  chi 
  140. trasmette  pacchetti  di  tipo  I  che   il   ricevitore   e' 
  141. temporaneamente occupato e non puo' ricevere altri pacchetti.
  142.  
  143. FRAME S.- Tipo REJ -
  144. Questo pacchetto viene usato per richiedere la ritrasmissione 
  145. della sequenza di pacchetti I che non  e'  stata  esattamente 
  146. ricevuta ( per esempio per cattive condizioni di ricezione).
  147.  
  148. FRAME U.
  149. Questo tipo di pacchetto  (Unnumbered,  non  numerato),  puo' 
  150. essere sia di comando che di risposta. I  bits 2, 3, 5, 6,  7 
  151. del campo control danno informazione sul tipo di pacchetto in 
  152. questo modo:
  153. bits     7  6  5    3  2        tipo
  154.          0  0  1    1  1        SABM
  155.          0  1  0    0  0        DISC
  156.          0  0  0    1  1         DM
  157.          0  1  1    0  0         UA
  158.          1  0  0    0  1        FRMR
  159.          0  0  0    0  0         UI
  160. Il bit 4 e' il solito sottocampo di poll/final.
  161.  
  162. FRAME U - tipo SABM -
  163. Il tipo SABM (Set Asynchronous Balance Mode) serve per  porre 
  164. due stazioni in collegamento. Il link viene  attivato  quando 
  165. una stazione che riceve SABM risponde con un UA.
  166.  
  167. FRAME U - tipo DISC -
  168. Il  Tipo   DISC   (Disconnect)   serve   per   terminare   un 
  169. collegamento. IL link si disattiva immediatamente.
  170.  
  171. FRAME U - tipo DM -
  172. Il tipo DM (Disconnect Mode) viene inviato da  ogni  stazione 
  173. che, essendo disconnessa,  riceve  un  messaggio  diverso  da 
  174. SABM,  oppure  per  indicare  che   al   momento   non   c'e' 
  175. possibilita' di connessione (BUSY).
  176.  
  177. FRAME U - tipo UA -
  178. Il tipo UA  (Unnumbered  Acknowledgment)  viene  inviato  per 
  179. confermare la ricezione di un pacchetto U.
  180.  
  181. FRAME U - tipo FRMR -
  182. Il tipo FRMR (Frame Reject) viene inviato per indicare che in 
  183. un pacchetto ricevuto e'  stato  evidenziato  un  errore  non 
  184. recuperabile con la ritrasmissione del pacchetto stesso  (per 
  185. esempio, un pacchetto con numero progressivo fuori sequenza o 
  186. con campi invalidi). Un pacchetto FRMR contiene, in un  campo 
  187. aggiuntivo, la descrizione codificata dell'errore rilevato.
  188.  
  189. FRAME U - tipo UI -
  190. Il pacchetto UI (Unnumbered Information) e' un  pacchetto  di 
  191. informazione e come tale  contiene  successivamente  tutti  i 
  192. campi  gia'  visti  per  il  pacchetto  I.  Questo  tipo   di 
  193. pacchetto, pero', non riceve conferma di ricezione e  percio' 
  194. puo' essere perduto.
  195.  
  196. Tutti i pacchetti di qualunque tipo sono  poi  terminati  dai 
  197. gia' descritti campi FCS e FLAG.
  198.  
  199. 3. L'INTERFACCIA RADIO - TNC - COMPUTER.
  200. Per ricevere i pacchetti  che  viaggiano  su  un  determinato 
  201. canale si e' fatto uso di un  ricevitore  FM  sulle  bande  2 
  202. metri e 70 cm (144 e 433 Mhz), di un  TNC  PK  87  e  di  un 
  203. personal AT su cui e' stato sviluppato il software.
  204. Il primo problema e' stato come configurare il TNC in modo da 
  205. rendere l'algoritmo il piu'  generale  possibile.  Lo  si  e' 
  206. configurato in KISS mode  (per  il  PK  87  la  sequenza  che 
  207. setta il TNC in KISS e' contenuta nello script file  KISS.XTK 
  208. eseguibile da CROSSTALK).
  209. Tale modo, operando a basso livello, fa soltanto un controllo 
  210. di correttezza del pacchetto e poi lo invia byte per byte  al 
  211. computer ospite, dopo averlo filtrato dei byte di FLAG e  FCS 
  212. e corredato di un byte di inizio e fine pacchetto (192d).  In 
  213. realta' si e' notato  che  all'inizio  del  pacchetto  vi  e' 
  214. sempre la sequenza 192d 000d, e non soltanto 192d. Questo  in 
  215. contraddizione con le istruzioni,  riportate sul manuale, del 
  216. modo KISS, che prevedevano il solo 192d. I byte cosi'  giunti 
  217. saranno poi decodificati dal programma secondo la descrizione 
  218. del protocollo che e' stata data.
  219. Il secondo  problema  e'  stato  come  gestire  da  programma 
  220. l'arrivo dei dati  alla  porta  seriale  su  cui  il  TNC  e' 
  221. collegato.  In sostanza, da programma vengono per prima  cosa 
  222. configurati i registri che gestiscono l'informazione relativa 
  223. alla porta seriale (velocita'in Baud,  lunghezza  di  parola, 
  224. byte  di  parita',  byte  di  stop);  inoltre,  il  programma 
  225. provvede a sostituire la normale routine  di  gestione  della 
  226. RS232 del BIOS (interrupt 0Ch) con un nuovo interrupt handler 
  227. che consente di lavorare con i byte che arrivano  alla  porta 
  228. seriale in modo asincrono rispetto al flusso del programma. 
  229. Di  queste  routine  daremo  una  spiegazione  nel   prossimo 
  230. paragrafo.
  231.  
  232. 4. LE ROUTINE DI GESTIONE DELLA PORTA SERIALE.
  233. Queste routine si trovano nel file GestSer.C. Di esse  daremo 
  234. una sommaria spiegazione.
  235.  
  236. Con la InitSer1(speed) si accede  direttamente  nei  registri 
  237. del WD8250, chip programmabile che gestisce la porta seriale, 
  238. e lo si inizializza coni parametri di  ricezione:  velocita', 
  239. che puo' venire cambiata da programma con il passaggio  della 
  240. variabile speed (default =  1200  Baud),  bit  di  dati  (8), 
  241. parita' (nessuna), bit di stop (1).
  242. Tramite la Com1_Handler() si riscrive il vettore di interrupt 
  243. 0Ch che si attiva quando e' pronto  un  dato  dalla  seriale: 
  244. tale dato viene scritto in un buffer  circolare  Com1buf  che 
  245. viene gestito con due puntatori: uno  all'ultimo  dato  letto 
  246. dal nostro programma, uno all'ultimo  dato  arrivato  tramite 
  247. seriale. Per evitare ragionevolmente il  rischio  di  overrun 
  248. dei dati, la dimensione del buffer e' stata fissata in  10000 
  249. caratteri. 
  250. La GetSer1() permette  di  leggere  questo  buffer  rimanendo 
  251. fuori del vettore di interrupt; cioe', in pratica, il  buffer 
  252. Com1buf si riempe asincronicamente rispetto  al  programma  e 
  253. viene letto invece tramite la GetSer1() quando  il  programma 
  254. stesso lo richiede. Quest'ultima funzione riceve un puntatore 
  255. a carattere e basa il  suo  funzionamento  sui  due  suddetti 
  256. puntatori che si chiamano Last_Read1 e Last_Char1; se essa li 
  257. ritrova uguali, ritorna -1 a significare che non c'e'  nessun 
  258. dato nuovo; altrimenti ritorna 0 e il carattere nuovo.
  259. Come ultima routine utilizzata c'e' la PutSer1() che permette 
  260. di mandare dati in uscita  sulla  seriale  (per  esempio  per 
  261. forzare il TNC ad uscire da Kiss mode).
  262.  
  263. 5. IL PROGRAMMA NETSPY.C .
  264. Con  le  premesse  fatte,  si  possono  ora   descrivere   le 
  265. caratteristiche e il funzionamento  del  programma.  Esso  si 
  266. propone di:
  267. -) Intercettare i pacchetti che viaggiano su un canale radio;
  268. -) Costruire una tabella dei link attivi segnalando il numero 
  269.    di  pacchetti  informativi   scambiati,   il   numero   di 
  270.    collisioni rilevate, il tipo di  protocollo  a  livello  3 
  271.    eventualmente presente, l'ora di  inizio  e  di  fine  del 
  272.    colloquio. Tale tabella si aggiorna in tempo reale;  tutto 
  273.    cio' che esce dalla tabella viene salvato su  file;  tutta 
  274.    la tabella viene poi  salvata,  a  richiesta,  al  termine 
  275.    dell'elaborazione.
  276. -) Dare,  a  richiesta,  ulteriori  informazioni   sui   link 
  277.    costituiti, come, ad  esempio,  gli  eventuali  digipeater 
  278.    tramite i quali avviene la connessione.
  279. -) Permettere di "catturare" a livello di  byte  i  pacchetti 
  280.    passanti   sui   vari   link,   permettendone   poi    una 
  281.    consultazione in un ambiente dove  essi  sono  gia'  stati 
  282.    divisi nei campi che li costituiscono.
  283.  
  284.    5.1 LA STRATEGIA DEL PROGRAMMA.
  285. In  questo  paragrafo  verra'  spiegato  come  il   programma 
  286. raggiunge gli scopi prefissati. All'inizio viene visualizzata 
  287. una pagina di spiegazione d'uso che serve all'utente  che  si 
  288. accosti al programma  per  la  prima  volta.  Poi  inizia  il 
  289. programma  vero  e  proprio,  con  la  visualizzazione  dello 
  290. schermo  principale  che  consta  di  tre   finestre:   nella 
  291. principale,  la  piu'  grande,  troveranno   posto   i   link 
  292. (collegamenti  tra  due  stazioni)  con  i   loro   parametri 
  293. significativi; in una seconda, in basso a  sinistra,  saranno 
  294. visualizzati,  in  forma  breve,  gli  ultimi   5   pacchetti 
  295. transitati sul canale; in una terza, in basso a destra, sara' 
  296. visualizzato un menu di opzioni tra le quali la  possibilita' 
  297. di effettuare la cattura e poi la visualizzazione byte a byte 
  298. dei pacchetti transitati sui vari link. Inoltre vengono anche 
  299. visualizzate l'ora e la data attuali.
  300. Normalmente  il  programma  attende  i  dati  dalla  seriale. 
  301. Durante questa attesa vengono  chiamate  alcune  routine  che 
  302. svolgono compiti di contorno. Una di  esse  analizza  i  link 
  303. presenti in tabella: se qualcuno  di  essi  non  ha  traffico 
  304. (scambio di pacchett)  da piu' di TIME_OUT  minuti,  il  link 
  305. viene considerato disconnesso e  si aggiorna  l'ora  di  fine 
  306. collegamento.
  307. TIME_OUT e' una costante del programma, posta uguale a 15: e' 
  308. consigliabile che tale valore non sia  troppo  elevato,   per 
  309. evitare di lasciare in  tabella  troppi  link  apparentemente 
  310. 'attivi';  in  ogni  caso  TIME_OUT  non  potra'  mai  essere 
  311. maggiore di 59.
  312. Altre routine si occupano di scrivere l'ora, di  visualizzare 
  313. i vari menu, di interpretare i comandi dell'utente.
  314. E' in seguito presente una descrizione dettagliata di  queste 
  315. routine. All' arrivo del primo dato il  programma  inizia  ad 
  316. elaborare il pacchetto. Una cosa da tenere  presente,  e'  la 
  317. seguente: all'arrivo del primo dato si potrebbe supporre  che 
  318. il secondo dato sia subito dopo immediatamente disponibile, e 
  319. tralasciare un test sull'effettivo arrivo di un  dato  nuovo. 
  320. In realta', essendo il codice  compilato  generalmente  molto 
  321. piu' veloce dell'arrivo, sebbene continuativo, dei dati dalla 
  322. seriale, tale test va fatto PRIMA di  leggerne  qualunque  di 
  323. essi, non solo il primo.
  324. Avendo quindi rilevato l'arrivo di un pacchetto nuovo, lo  si 
  325. mette in una variabile e,  quando  lo  si  ha  completo,   si 
  326. procede   all'estrazione   di   tutti   i   suoi    parametri 
  327. fondamentali; inoltre, se l'utente ha  selezionato  l'opzione 
  328. relativa, lo si inserisce nell'apposito  buffer.
  329. A questo punto si fa una distinzione: si considerano  solo  i 
  330. pacchetti   di   tipo   I,   U(UI,DISC,DM),    S(RR,RNR,REJ). 
  331. Considerare questo sottoinsieme e' sufficiente per gli  scopi 
  332. seguenti e semplifica l'algoritmo. Se viene  intercettato  un 
  333. pacchetto I o pacchetti RR, RNR, REJ con bit di poll = 0 (che 
  334. sono relativi a un precedente invio di pacchetti I), si ha la 
  335. presenza di a un link attivo. Se questo link e'  presente  in 
  336. tabella, si aggiornano semplicemente tutti i  dati  relativi: 
  337. si  controllano  ripetizioni  di   pacchetti   per   rilevare 
  338. collisioni, si aggiorna l'ora dell'ultimo pacchetto  ricevuto 
  339. e cosi' via. Se il link non e' in tabella, lo si aggiunge; se 
  340. la tabella  e'  piena  si  elimina  il  link  'piu'  vecchio' 
  341. salvandolo su file. Inoltre si aggiornano  le  scritte  sullo 
  342. schermo  e  si  scrive  in  basso  a  sinistra  il  pacchetto 
  343. intercettato.
  344. Se si e' ricevuto un pacchetto  DISC  o  DM  il  link  si  e' 
  345. disconnesso, e percio' si aggiorna l'ora di fine collegamento
  346. che viene scritta sullo schermo.
  347. Se si riceve un pacchetto UI si controlla  tramite  il  campo 
  348. PID se e' implementato un protocollo a livello 3: se si',  si 
  349. aggiunge  anche  questo  link  in   tabella,   considerandolo 
  350. significativo. Gli altri pacchetti UI non IP o NETROM vengono 
  351. ignorati a questo livello  perche'  di  scarso  interesse  (a 
  352. quest'ultima categoria appartengono, per esempio, i pacchetti 
  353. di identificazione che i vari nodi trasmettono ogni tanto sul 
  354. canale).
  355. Questo e' cio' che il programma fa per 'default', cioe' senza 
  356. interventi  dell'utente.  Quest'ultimo  ha  pero'  sempre   a 
  357. disposizione un menu che gli permette di fare  altre  analisi
  358. contemporaneamente   all'arrivo   e   all'elaborazione    dei 
  359. pacchetti. L'utente puo' chiedere notizie  aggiuntive  su  un 
  360. link, puo' decidere se e come abbandonare il programma,  puo' 
  361. svolgere attivita' in una shell del sistema  operativo,  puo' 
  362. decidere di  iniziare  o  terminare  di  catturare,  per  poi 
  363. vederli byte a byte, tutti i  pacchetti  che  transitano  sul 
  364. canale.
  365. Questa  opzione  funziona  nel  seguente  modo:  esiste   una 
  366. variabile 'capture' che puo' essere posta ON oppure OFF.  Nel 
  367. primo caso tutti i pacchetti intercettati, anche  quelli  che 
  368. non influenzano la tabella principale, sono catturati in  una 
  369. struttura dati. Questa cattura termina o quando l'utente pone 
  370. a OFF la variabile, oppure quando  sono  stati  catturati  un 
  371. numero max  di  pacchetti   (numero  che  e'fissato  con  una 
  372. costante del programma, NUMPAK_MAX   uguale  a  250),  oppure 
  373. ancora  se  non   esiste   piu'   memoria   disponibile   per 
  374. l'allocazione dei nuovi pacchetti.
  375. A questo punto l'utente puo' entrare  in  un  nuovo  ambiente 
  376. dove puo' vedere con semplici comandi tutti i pacchetti  byte 
  377. per byte, gia' divisi nei  loro  campi.  Intanto,  il  buffer 
  378. della seriale continuera' a riempirsi di dati in arrivo,  che 
  379. pero' non saranno elaborati istantaneamente, ma solo ogni  un 
  380. certo  numero  di  secondi  (nel  programma  tale  numero  e' 
  381. definito dalla costante TEMPO_AGGIORNAMENTO, uguale a 30)  in 
  382. modo da non perdere continuita' nell'elaborazione dei dati in 
  383. arrivo senza pero' rallentare in  modo  vistoso  la  sessione 
  384. corrente.
  385. Vengono ora descritte le operazioni che svolge  il  programma 
  386. nel caso che l'utente  desideri  avere  una  rappresentazione 
  387. grafica dell'attivita' del canale. Una volta inizializzato il 
  388. sistema   con    la    funzione    StartPlacet()    descritta 
  389. dettagliatamente in seguito, il programma legge la tabella in 
  390. cui sono memorizzati i pacchetti  che  sono  arrivati  e  con 
  391. queste   informazioni   costruisce   la   schermata   grafica 
  392. corrispondente. A questo punto, il programma prosegue come al 
  393. solito continuando ad aggiornare la tabella dei link man mano 
  394. che arrivano i nuovi pacchetti;  questa  tabella  costituisce 
  395. sempre il riferimento per  l'aggiornamento  della  situazione 
  396. grafica e viene quindi riletta ad ogni nuovo ciclo.
  397.  
  398.    5.2 COME USARE IL PROGRAMMA.
  399. Il programma viene lanciato da DOS con il comando 'netspy' al 
  400. quale possono essere aggiunte, sulla stessa riga, le seguenti 
  401. opzioni:
  402. -h :     evita la visualizzazione, all' inizio del programma, 
  403.          delle due pagine di istruzioni. 
  404. -p xx:   permette di specificare  il  path  xx  per  il  file 
  405.          LOG.PKT che altrimenti viene scritto nella directory 
  406.          corrente.
  407. -s yyyy: pone a yyyy   la  velocita'  di  trasferimento  TNC-
  408.          Computer che per default e' 1200 Baud.
  409. Da prove effettuate si e' visto che, specialmente con PC  XT, 
  410. e' consigliabile non salire oltre 4800 baud per non rischiare 
  411. di perdere qualche dato e far abortire il programma che tenta 
  412. di decodificare pacchetti con campi invalidi o mancanti.
  413. Lanciato  senza  l'opzione  -h,  il  programma  presenta  due 
  414. schermate di informazione:  la  prima  schermata  attende  la 
  415. pressione del tasto 'PgDn' prima di presentare la seconda. Al 
  416. termina di quest'ultima premendo F1 si  inizia  il  programma 
  417. vero e proprio, premendo F10 si ritorna al sistema operativo. 
  418. A programma iniziato, ogni volta che  un  pacchetto  transita 
  419. sul canale, lo si vedra' apparire sullo  schermo,  e,  se  il 
  420. pacchetto indica la presenza di un  link  attivo  secondo  le 
  421. modalita' previste e prima spiegate, il link stesso apparira' 
  422. nella finestra principale.
  423. Se  i  pacchetti  sono  rilevati  correttamente  dal  TNC  il
  424. programma seguira'  l'evolversi  dei  vari  link  sul  canale 
  425. aggiornando le informazioni sullo  schermo.  In  questa  fase 
  426. l'utente ha a disposizione i seguenti comandi:
  427. n - Battendo n dove n e' il numero di  un  link  presente  in 
  428. tabella, l'utente avra' a disposizione per il link scelto  le 
  429. seguenti informazioni:
  430.       -) Numero di pacchetti I inviati da un  lato  all'altro 
  431.          del  link e viceversa (in tabella  principale  viene 
  432.          riportato il  numero complessivo);
  433.       -) Digipeater  eventualmente  presenti  sul  link   (in 
  434.          questo    caso   viene   visualizzata    la    frase 
  435.          'connessione  via:   <digipeaters>   ',   altrimenti 
  436.          'connessione diretta'.
  437.  
  438. C (Capture ON - OFF) - Battendo 'c' l'utente puo' attivare  o 
  439. disattivare la cattura byte per byte di tutti i pacchetti che 
  440. transitano. La condizione di default e' OFF, lo  stato  della 
  441. variabile viene comunque sempre visualizzato. Tale variabile. 
  442. se posta ON, puo' tornare in  modo  OFF  manualmente,  quando 
  443. l'utente lo decide, oppure automaticamente nei  seguenti  due 
  444. casi: quando si e' superato il numero  di  pacchetti  massimi 
  445. catturabili NUMPAKMAX (per ora posta a 250 ),  o  ancora,  in 
  446. sistemi  con  basse  disponibilita'  di  memoria,  quando  la 
  447. memoria disponibile per la  cattura  di  altri  pacchetti  e' 
  448. insufficiente.
  449.  
  450. A (Analisi pacchetti) - Battendo 'a'  l'utente  entra  in  un 
  451. ambiente dove e' possibile visualizzare i pacchetti catturati 
  452. precedentemente.
  453. A  questo  livello,  sullo  schermo  viene  visualizzato   un 
  454. pacchetto per volta secondo queste modalita': in alto vi sono 
  455. il numero d'ordine del  pacchetto  catturato,  il  numero  di 
  456. pacchetti che sono nel buffer e  una  minima  decodifica  del 
  457. pacchetto stesso i cui bytes vengono rappresentati in  codice 
  458. esadecimale.
  459. Sono  poi  rappresentati  divisi  nei  campi  descritti   nel 
  460. paragrafo relativo al protocollo ax25, tutti i byte contenuti 
  461. nel pacchetto. Se esiste un campo informativo, e' data  anche 
  462. una conversione dei bytes in codice ASCII; se in  tale  campo 
  463. sono  presenti  caratteri   non   stampabili   essi   vengono 
  464. sostituiti dal carattere di codice ASCII 2d  (una  'faccetta' 
  465. in reverse video) se si tratta di un carattere il cui  codice 
  466. e' < 26d, da quello  di  codice  ASCII  254d  (un  quadratino 
  467. bianco) se si tratta di uno di codice > 127d. L'  utente  ora 
  468. potra' spostarsi nel buffer di cattura tramite i comandi:
  469. Up    per vedere il dato precedente;
  470. Dn    per vedere il dato seguente;
  471. Home  per andare all'inizio del buffer;
  472. End   per andare in fondo al buffer;
  473. F3    per abbandonare la sessione pulendo il buffer
  474. F5    per abbandonare  la  sessione  mantenendo  i  dati  nel 
  475.       buffer.
  476. Come gia' detto in  precedenza,  i  dati  in  arrivo  vengono 
  477. elaborati ogni TEMPO_AGGIORNAMENTO secondi: poiche' il numero 
  478. di secondi e' piuttosto basso, e quindi solo pochi  pacchetti 
  479. possono essere in attesa  di  elaborazione,  quest'ultima  e' 
  480. praticamente  istantanea,  tanto   che   l'utente   che   sta 
  481. effettuando l'analisi pacchetti quasi non  viene  disturbato, 
  482. se non rilevando che, in caso di 'capture' posta   a  ON,  il 
  483. numero di pacchetti nel buffer di cattura  e'  aumentato.  La 
  484. sessione puo' essere abbandonata  o  mantenendo  i  dati  nel 
  485. buffer di cattura, oppure svuotandolo lasciando  piu'  spazio 
  486. per una successiva cattura.
  487.  
  488. D (DOS Shell) - Premendo 'd' l'utente ha a  disposizione  una 
  489. shell del sistema operativo. In essa e' possibile  effettuare 
  490. in generale tutto cio' che normalmente si fa da DOS, a  patto 
  491. di tenere presente queste  due  avvertenze:  non  trattenersi 
  492. molto in tale sessione specie se vi  e'  molto  traffico  sul 
  493. canale radio (i pacchetti in arrivo si accumulano nel  buffer 
  494. di seriale e possono andare in overrun) ed evitare  nel  modo 
  495. piu' assoluto di eseguire programmi che agiscano sulla stessa 
  496. porta  seriale   (COM1:).   In   questo   caso   NETSPY   non 
  497. funzionerebbe piu' e sarebbe necessario un reset di tutto  il 
  498. sistema.
  499.  
  500. V (Vista Grafica) -  Questa  e'  l'opzione  che  consente  di 
  501. passare dal formato tabellare al formato grafico.
  502. Quest'ultimo riespecchia  fedelmente  il  formato  tabellare; 
  503. l'angolo superiore sinistro e' assegnato in  permanenza  alla 
  504. visualizzazione  del  nominativo  di  tutti  i  pacchetti  in 
  505. transito,  costituendo  cosi'  l'equivalente  grafico   della 
  506. 'scroll window' del modo 'testo' in cui sono visualizzati gli 
  507. ultimi 5 pacchetti ricevuti.
  508. E' opportuno far notare che cio' che si  vede  sullo  schermo 
  509. sono i collegamenti che hanno  mittente  e  destinatario  nel 
  510. pacchetto e cioe' quelli  a  LIVELLO  FISICO  AX25,  compresi 
  511. NETROM e IP.
  512. Nel  formato  grafico  sono  disponibili  due   comandi   per 
  513. l'utente:
  514.      (R)idisegna    le   stazioni   sullo   schermo   vengono 
  515.      riposizionate;  questo  per  permettere  all'utente   di 
  516.      cambiare una  configurazione  poco  apprezzabile  da  un 
  517.      punto di vista estetico.
  518.      ESC   torna al menu precedente, dopo  aver  'chiuso'  il 
  519.      sistema grafico.
  520.  
  521. E (Esce senza salvare)- Con questo comando l'utente ritorna a 
  522. DOS senza salvare sul file LOG.PKT il contenuto della tabella 
  523. principale. In detto file rimarranno solo gli eventuali  link 
  524. 'vecchi' eliminati dalla tabella  per  dare  posto  ai  nuovi 
  525. arrivati. All'uscita del programma e' possibile  togliere  il 
  526. TNC da KISS mode per farlo tornare in modo normale,  mediante 
  527. la PutSer1(), con la sequenza 0Ch, FFh, 0Ch valida per il  PK 
  528. 87 della AEA.
  529.  
  530. S (Esce Salvando  su  file)  -  Battendo  's'  l'utente  esce 
  531. (previa conferma) dal programma salvando su file il contenuto 
  532. della tabella principale.
  533.  
  534.    5.3 LE PRINCIPALI STRUTTURE DATI.
  535. In questa sezione vengono descritte le  principali  strutture 
  536. dati usate per implementare il programma.
  537. Avendo gia' parlato del buffer di seriale Com1buf vediamo ora 
  538. le rimanenti strutture significative.
  539. La piu' importante e' sicuramente Info[]: essa contiene tutte 
  540. le informazioni relative  ad  un  link:  i  nominativi  degli 
  541. operatori (.link[]), il tipo di protocollo presente a livello 
  542. piu' alto (.protocollo[]), il numero di pacchetti I scambiati 
  543. (.num_p), il numero di collisioni  rilevate  (.num_coll),  il 
  544. numero di pacchetti inviati da una parte all'altra del link e 
  545. viceversa (.a_to_btot,  .b_to_atot),  il  numero  progressivo 
  546. dell'ultimo   pacchetto    I    intercettato    (.a_to_bprog, 
  547. .b_to_aprog),  la  data  e  l'ora  del  primo  e  dell'ultimo 
  548. pacchetto    intercettato     (.data_primo,     .data_ultimo, 
  549. .ora_primo, .ora_ultimo) lo stato del link, cioe'  se  esiste 
  550. ancora la connessione o se e' gia' cessata  (.stato),  e  una 
  551. struttura a lista del tipo elemento - puntatore  all'elemento 
  552. successivo dove vengono salvati i nominativi degli  eventuali 
  553. digipeaters (.digi_struct).
  554. Un'altra importante struttura dati e' quella nella quale sono 
  555. memorizzati byte per  byte  i  pacchetti  che  devono  essere 
  556. intercettati. Essa e' costituita  da  un  array  buffer[]  di 
  557. strutture  composte  dai  seguenti  campi:  .*pacchetto,  che 
  558. contiene i byte relativi al pacchetto catturato,  e  .pac_len 
  559. che indica la sua lunghezza.
  560. Per quanto riguarda  la  parte  grafica,  le  strutture  dati 
  561. significative  sono  l'array  punto[]  di   strutture   cosi' 
  562. composte: (.stato) in cui e' memorizzato lo stato  del  punto 
  563. sullo schermo, (.nome) che contiene  il  nome  dell'eventuale 
  564. stazione presente in quel punto e (.link[]) che e'  un  array 
  565. di nomi delle eventuali stazioni collegate.
  566. Questo array e' usato dalle varie funzioni per sapere  se  un 
  567. punto sullo schermo e' libero,  se  e'  una  stazione  o  una 
  568. linea. Inoltre, nel caso il punto sia una stazione  si  tiene 
  569. traccia dei suoi eventuali collegamenti con altre stazioni.
  570. L'altra struttura dati di rilievo e' la strittura chiave  che 
  571. consente di  creare  una  lista  di  corrispondenze  nomi  di 
  572. stazione  - posizione da esse occupata sullo schermo.
  573. In questa lista si inseriscono le nuove stazioni, si  trovano 
  574. quelle gia'  inserite,  e  vengono  rimosse  quelle  che  non 
  575. servono  piu';  in  sostanza,  questa  struttura  svolge   le 
  576. funzioni di un piccolo data-base.
  577.  
  578.    5.4 LE PRINCIPALI COSTANTI DEL PROGRAMMA.
  579. Si riporta un elenco delle  costanti  significative  presenti 
  580. nel  programma,  dove  sono  implementate  tramite   #define. 
  581. Volutamente vengono tralasciate  le  costanti  relative  alle 
  582. routine di  inizializzazione  ed  uso  della  porta  seriale. 
  583. BUFSIZE: 10000 - Dimensione in byte del buffer di seriale.
  584. FEND: 192 - Byte del kiss mode che da' l'inizio e la fine  di 
  585. un pacchetto.
  586. FESC, TFEND, TFESC - Parametri che permettono di eseguire  il 
  587. byte stuffing di un pacchetto.
  588. NET_ROM: 207, IP: 204  -  Valori   del    Byte    PID     che 
  589. identificano i rispettiviprotocolli a  livello 3.
  590. MAX_LINK:  10  -  Numero  massimo  di  link   nella   tabella 
  591. principale.
  592. TIME_OUT: 15  -  Numero  di  minuti  dopo  i  quali  un  link 
  593. 'silenzioso' viene  considerato  disconnesso.  TIME_OUT  deve 
  594. essere compresa nell'intervallo (0, 59).
  595. NUMPAKMAX: 250  - Numero  massimo  di  pacchetti  catturabili 
  596. byte per byte.
  597. TEMPO_AGGIORNAMENTO: 30 - Numero  di  secondi  dopo  i  quali 
  598. viene svuotato il  buffer  di  seriale  durante  l'uso  della 
  599. sessione di Analisi dei pacchetti.
  600.  
  601.    5.5 LE PRINCIPALI ROUTINE DEL PROGRAMMA.
  602.  
  603. void   Introduzione   (void) -   All'inizio   del   programma 
  604. visualizza le due pagine di informazioni.
  605.  
  606. void Lista_Digipeater() - Questa routine crea  la  lista  dei 
  607. digipeater  eventualmente  presenti  nel   campo   indirizzo, 
  608. salvandoli nella struttura Digi_struct.
  609.  
  610. void Byte_Stuffing(), Decodifica_Ind(),
  611. Decodifica_Controllo(), Decodifica_Tipo() -  Queste  routines 
  612. decodificano i  parametri  significativi  di  ogni  pacchetto 
  613. intercettato.
  614.  
  615. void  Gestisci_File  (void)  -   All'inizio   del   programma 
  616. controlla se esiste gia' un file "log.pkt" - Se si'  lo  apre 
  617. per  l'eventuale  aggiunta  dei  dati,  altrimenti  lo   crea 
  618. scrivendo per prima cosa delle  informazioni  su  come  detto 
  619. file e' strutturato.
  620.  
  621. void Aggiorna_Connessioni (void) - Questa  routine  considera 
  622. disconnesso un link che  non  dialoga  da  piu'  di  TIME_OUT 
  623. minuti, ponendo cosi' lo stato a 0 (disconnesso).  Utile  per 
  624. quei link di cui non si riceve il pacchetto DISC o per quegli 
  625. altri in cui il dialogo avviene al di fuori del normale  AX25 
  626. (per esempio link in NETROM o IP).
  627.  
  628. void Scrivi_Orologio (byte x,y) - Questa routine aggiorna data 
  629. e ora  correnti  che  vengono  visualizzate  nella  schermata 
  630. principale alle posizioni indicate da x e y.
  631.  
  632. void  Visualizza_Menu  (void),    void  Mostra_Info   (void),    
  633. void Host_Off (void), void Esci() - Visualizzano il menu  dei 
  634. comandi disponibili nella finestra video in basso  a  destra, 
  635. e/o gestiscono le eventuali scelte dell'utente.
  636.  
  637. void Usa_FullScreen (void) - void Usa_Window1 (void)  -  void 
  638. (Usa_Window2) - Gestiscono il sistema di riferimento  attuale 
  639. per il cursore.
  640.  
  641. Int Esiste_Link (unsigned char *i, crea_posto_vuoto) - Questa 
  642. routine analizza il link  presente  nella  variabile  globale 
  643. LINK_1 e stabilisce se in tabella esiste gia' oppure  no.  In 
  644. caso  positivo  ritorna   1,   altrimenti   ritorna   0.   In 
  645. quest'ultimo caso,  inoltre, se  crea_posto_vuoto e' a 1, la 
  646. routine restituisce tramite *i l'indice di  tabella  dove  e' 
  647. possibile   memorizzare   il   nuovo   link    (eventualmente 
  648. eliminando, salvandolo su file tramite apposita  routine,  il 
  649. link  disconnesso piu' vecchio; se nessun link in tabella  e' 
  650. in stato di disconnessione, la ricerca del piu' vecchio viene 
  651. fatta su tutti i link) .
  652. void Salva_Info(unsigned char nr) - Salva su file il link  di 
  653. indice nr della tabella.
  654.  
  655. void Crea_Nuovo_Link (unsigned char in, fr) - Crea  il  nuovo 
  656. link LINK1 alla posizione in, ponendo i parametri del link in 
  657. accordo con il frame ricevuto fr.
  658.  
  659. void Cattura_Pacchetto(), Resetta_Capture() -  Gestiscono  la 
  660. cattura byte a byte dei pacchetti riferendosi alla  variabile 
  661. capture  che  viene   eventualmente   resettata   quando   si 
  662. verificano certe condizioni.
  663.  
  664. void Analisi_Pacchetti() - Permette l'analisi  dei  pacchetti 
  665. catturati, secondo le modalita' di cui sopra.
  666.  
  667. void Salva_Tabella (void)  -  All'uscita  del  programma,  se 
  668. richiesto, salva su file la tabella corrente.
  669.  
  670. Dos_Shell (void)  - Apre  una  shell  del  DOS  gestendo   il 
  671. salvataggio della situazione video e tutti gli imprevisti che 
  672. possono capitare a tale livello.
  673.  
  674. Controlla_Tbaud (int*speed) -  Controlla  che  il  valore  di 
  675. velocita' inserito sulla linea di  comando  sia  ragionevole, 
  676. (300, 600, 1200, 2400, 4800  ,  9600)  altrimenti  lo  assume 
  677. 1200.
  678. void StartPlacet(void) - Predispone la partenza  del  sistema 
  679. grafico e la  creazione  dinamica  delle  strutture  dati  in 
  680. funzione del tipo di scheda video disponibile.
  681.  
  682. void EndPlacet(void) - Rilascia  la  memoria  allocata  dalla 
  683. funzione precedente e predispone il ritorno  del  sistema  al 
  684. modo 'testo'.
  685.  
  686. word PiazzaStazione(char *nome) - Disegna una stazione  sullo 
  687. schermo in modo casuale e ritorna un  numero  associato  alla 
  688. sua posizione.
  689.  
  690. void PiazzaStazioni(char *nome1, char *nome2, byte pr
  691.                     word *s1,     word  *s2)  -  Disegna  due 
  692. stazioni sullo schermo in modo casuale, ritorna in s1 e s2 le 
  693. posizioni delle medesime e  provvede  a  collegarle  con  una 
  694. linea di diverso tipo a seconda del  valore  del  protocolllo 
  695. contenuto in pr.
  696.  
  697. boolean LinkaStazioni(word s1, char *nome, byte pr, word *s2)
  698. Collega la stazione associata a nome alla stazione  s1,  gia' 
  699. presente sullo schermo  con  una  linea  di  diverso  tipo  a 
  700. sseconda del valore del protocollo contenuto in pr.
  701. Ritorna in s2 la posizione della stazione  collegata;  se  la 
  702. funzione non riesce a collegare la nuova  stazione  e  quella 
  703. vecchia, la funzione ritorna FALSE.
  704. boolean LinkAttivi(word s) - Questa funzione ritorna  TRUE  o 
  705. FALSE a seconda che la stazione s sia o  meno  collegata  con 
  706. altre stazioni.
  707.  
  708. boolean StazioniCollegate(word s1, word s2) - Questa funzione 
  709. ritorna TRUE se la  stazione  s1  e  la  s2  sono  collegate, 
  710. FALSE altrimenti.
  711.  
  712. void RimuoviStazione(word s) - Cancella la stazione  s  dallo 
  713. schermo a aggiorna l'array punto[].
  714.  
  715. void RimuoviLInk(word s1, word s2) - Cancella il collegamento 
  716. fra la stazione s1 e la s2 e aggiorna l'array punto[].
  717.  
  718. void BlinkStazione(word s) - Fa lampeggiare la stazione s.
  719.  
  720. void AddStazione(char *nome, word s) - Aggiunge nel data-base 
  721. la nuova relazione nome_stazione - posizione, aggiornando  la 
  722. lista chiave.
  723.  
  724. void DelDtazione(char  *nome)  -  Rimuove  dal  data-base  la 
  725. posizione della stazione associata a nome: se la stazione non 
  726. e' presente nel data-base, la funzione ritorna NOT_FOUND.
  727.  
  728. void ClearKeyt(void) - Reinizializza il data-base rilasciando 
  729. tutta la memoria di cui era costituita la lista chiave.
  730.