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:
La lista di routes R.
Il suo ID e la REM del link. 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. (perché? non dovrebbe esserci, secondo il documento qspn.pdf, la nuova rem del link?)
- 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:
La lista di routes R|.
Il suo ID e la NullRem. 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.
- Un flag di interesse posto a 1.
- Invia l'ETP prodotto a tutti i suoi vicini tranne il "vicino non più rilevato".