Differences between revisions 12 and 13
Revision 12 as of 2009-04-16 21:24:23
Size: 6518
Editor: anonymous
Comment:
Revision 13 as of 2009-04-17 22:32:17
Size: 6597
Editor: anonymous
Comment:
Deletions are marked like this. Additions are marked like this.
Line 54: Line 54:
 . Verifica quale livello comune di appartenenza ha il nodo corrente con il nodo mittente. Chiamiamolo {{{comm_lvl}}}. Appartengo allo stesso gnodo? Livello 0. Allo stesso ggnodo? Livello 1. ...  . Verifica quale livello comune di appartenenza ha il nodo corrente con il nodo mittente. Cioè si memorizza il primo livello (il più alto) in cui gli ID differiscono. Chiamiamolo {{{comm_lvl}}}. Appartengo allo stesso gnodo? Livello 0. Allo stesso ggnodo? Livello 1. ...

Il modulo qspn

Nel modulo qspn.py viene definita la classe Etp.
Questa viene istanziata nel costruttore della classe NtkNode. Si mette in ascolto degli eventi prodotti dalla classe Neighbour (vedi il modulo Radar). In particolare è interessata agli eventi NEIGH_NEW, NEIGH_REM_CHGED e NEIGH_DELETED, che sono emessi quando viene rilevato un nuovo vicino, oppure cambia l'efficienza del link ad un vicino, oppure un vicino abbandona la rete.
In risposta a questi eventi:

  • Aggiorna la mappa delle routes note chiamando i metodi routeneigh_xxx della classe MapRoute;

  • Genera gli ETP;

  • Tramite i TCPClient li invia ai vicini interessati.

Inoltre fornisce il remotable method etp_exec, nel quale processa gli ETP ricevuti dai suoi vicini.

Infine emette i segnali ETP_EXECUTED e NET_COLLISION. Entrambi sono gestiti dalla classe Hook, entrambi con funzioni microfunc di tipo "con dispatcher".

Caso "vicino con REM modificata"

In questo evento la classe intraprende le seguenti azioni:

  • Aggiorna la mappa con la nuova REM del vicino.
  • Avvalendosi del metodo bestroutes_get della classe MapRoute, crea la lista M|; è una lista di 4 liste, una per ogni livello; ogni lista contiene le migliori routes per ogni destinazione, tra tutte quelle conosciute.

  • Filtra questa lista M| eliminando quelle che hanno come gateway il vicino stesso; ottiene così la lista R.

  • Se la lista R risulta vuota l'algoritmo si ferma.

  • La lista R è composta da routes espresse come tupla (dst, rem)

  • Crea un ETP composto da:
    1. La lista di routes R.

    2. Il suo ID. Inizia una lista di blocchi con un primo blocco di livello 0. In esso inizia una lista di nodi (di livello 0) con un primo nodo che rappresenta se stesso. Per questo mette il suo ID di livello 0 e una NullRem.
      Quando un nodo crea inizialmente un ETP, mette sempre insieme al suo ID una NullRem perché non deve indicare l'efficienza di nessun link. Spetta al nodo che riceve l'ETP indicare, in base ai dati della sua mappa, la Rem del link tra lui e il nodo che glielo ha inviato.
      Nota: secondo il documento qspn.pdf il rem è impostato dal nodo che invia l'ETP, non andrebbe corretto il documento?

    3. Un flag di interesse posto a 1.
  • Invia l'ETP prodotto al "vicino con REM modificata".

Caso "vicino nuovo"

In questo caso la classe si comporta allo stesso modo del caso "vicino con REM modificata".

Caso "vicino non più rilevato"

In questo evento la classe intraprende le seguenti azioni:

  • Avvalendosi del metodo bestroutes_get della classe MapRoute, crea la lista M| (vedi sopra).

  • Filtra questa lista M| trattenendo solo quelle che hanno come gateway il vicino stesso; ottiene così la lista R.

  • Se la lista R risulta vuota l'algoritmo si ferma. (questo passo non dovrebbe avvenire dopo aver aggiornato la mappa?)

  • Aggiorna la mappa eliminando le routes che passano per il vicino.
  • Avvalendosi del metodo bestroutes_get della classe MapRoute, crea la lista M|, aggiornata.

  • Filtra questa lista M| trattenendo solo quelle che hanno come destinazione le destinazioni delle routes appena eliminate; ottiene così la lista R|.

  • Calcola la lista R| con le nuove migliori routes (ottenute con il metodo best_route delle istanze di RouteNode contenute nella classe MapRoute) verso le stesse destinazioni presenti nella precedente lista R.

  • Crea un ETP composto da:
    1. La lista di routes R|.

    2. Il suo ID. Inizia una lista di blocchi con un primo blocco di livello 0. In esso inizia una lista di nodi (di livello 0) con un primo nodo che rappresenta se stesso. Per questo mette il suo ID di livello 0 e una NullRem.
      Vedi commento sopra.

    3. Un flag di interesse posto a 1.
  • Invia l'ETP prodotto a tutti i suoi vicini tranne il "vicino non più rilevato".

Processazione degli ETP ricevuti dai vicini (metodo etp_exec)

Alla ricezione di un ETP la classe intraprende le seguenti azioni:

  • Prima c'è un controllo sulla collisione di 2 reti nate separatamente, dal quale potrebbe risultare l'abbandono di tutta questa procedura.
  • Verifica quale livello comune di appartenenza ha il nodo corrente con il nodo mittente. Cioè si memorizza il primo livello (il più alto) in cui gli ID differiscono. Chiamiamolo comm_lvl. Appartengo allo stesso gnodo? Livello 0. Allo stesso ggnodo? Livello 1. ...

  • Si scorre i blocchi del TPL ricevuto (vedi la struttura dell'ETP). Di ogni blocco con un livello più basso di comm_lvl, i vari pairs vengono "accorpati" in un unico pair all'interno del blocco. Questo unico pair ha come livello comm_lvl e come ID l'ID di livello comm_lvl del nodo mittente.

  • Si scorre di nuovo i blocchi del TPL e accorpa i blocchi contigui di paro livello.
  • Si scorre di nuovo i blocchi del TPL e per ogni blocco si scorre i pairs ivi contenuti e accorpa i pairs contigui di uguale ID.

  • Questi passi fanno si che un TPL ricevuto:
    • non ha mai più di 4 (settings.LEVELS) blocchi;
    • ogni blocco è preceduto da blocchi di livello più alto e seguito da blocchi di livello più basso;
  • Poi inizia la procedura come delineata nel documento qspn.pdf.
  • Verifica che il proprio ID non sia già presente nella lista percorsa dall'ETP (Acyclic rule). Se è presente ignora il pacchetto e termina la processazione.
  • Aggiorna la propria mappa in base alle info ottenute dalla TPL. (Nota: mi pare che la somma delle rem avvenga erroneamente in senso contrario)

  • Si calcola un flag TPL_is_interesting dal quale dipende la propagazione o meno del ETP. (Nota: mi pare che la flag_of_interest non viene controllata, né valorizzata, e ha poco senso nella struttura del ETP)

  • Aggiorna la propria mappa in base alle info contenute nella porzione di mappa in R.
  • bla
  • Nota: sul events.send('net_collision') manca la virgola che serve per le sequence con un solo elemento!

Netsukuku/ita/ModuloQSPN (last edited 2009-05-29 21:37:26 by lukisi)