La classe MapRoute
Rappresenta una mappa di route (vedi la classe RouteNode), tutte dello stesso tipo di rem (vedi la classe Rem).
E' implementata come una derivata della classe Map, il cui dataclass è RouteNode.
In pratica un nodo ha una MapRoute. Quando vuole raggiungere un certo nodo o gnodo, quindi (lvl,id), ottiene tramite la MapRoute un RouteNode. In esso trova le possibili route, al massimo una per gateway, e ha di ognuna una misurazione comparabile dell'efficienza.
In realtà il demone Netsukuku si deve occupare di tenere sincronizzata questa sua mappa con la tabella di routing del kernel. Soltanto la route più efficiente verso un dato nodo/gnodo è memorizzata in quest'ultima. La sincronizzazione è realizzata attraverso la generazione e gestione dei segnali di seguito descritti.
Essendo una Map (vedi la classe Map), la classe MapRoute emette di conseguenza i signal NODE_NEW e NODE_DELETED e ME_CHANGED.
Inoltre emette in proprio i signal ROUTE_NEW, ROUTE_DELETED, ROUTE_REM_CHGED.
Gli eventi ROUTE_XXX sono distinti dai NODE_XXX, perché ogni nodo può essere raggiungibile tramite più routes. Infatti la dataclass della mappa di route è la classe RouteNode.
Ad esempio, il metodo route_add (il suo scopo è descritto sotto) richiama il metodo node_get della classe base. Poi, solo se prima non era conosciuta nessuna route verso quel nodo, richiama il metodo node_add della classe base, generando così il segnale NODE_NEW; altrimenti non viene emesso il segnale NODE_NEW se esisteva già almeno una route. Ma in entrambi i casi di seguito emette il segnale ROUTE_NEW o ROUTE_REM_CHANGED.
Quando viene emesso il segnale ROUTE_XXX la classe KrnlRoute si incarica di utilizzare i metodi forniti dalla classe Route (vedi il package network) per modificare di conseguenza la tabelle di routing del kernel.
I dati riguardanti la dimensione della mappa (levels, gsize) e il posto occupato da me medesimo (me) che servono alla classe base (vedi la classe Map) sono passati al costruttore di MapRoute.
I metodi route_add e route_del e route_rem accettano tra i parametri lvl e dst (gli indici della mappa). Richiamando i metodi analoghi nella giusta istanza di RouteNode, aggiornano le route verso un certo g-nodo. Inoltre emettono, se non espressamente vietato, gli eventi ROUTE_NEW etc.
Vedere anche i metodi che sono ereditati dalla classe Map, in particolare free_nodes_nb e il membro node_nb[lvl].
Il metodo routeneigh_get prende un oggetto neigh, cioè la rappresentazione di un vicino di LAN (vedi il modulo radar) e recupera il relativo posto nella maproute (sotto forma di lvl, dst).
I metodi routeneigh_add, routeneigh_rem e routeneigh_del invece gestiscono le routes verso i vicini di LAN. Accettano come parametro un neigh. Usano il metodo routeneigh_get per recuperarne lvl e dst. Di seguito usano i metodi route_add e route_del e route_rem.
Questi metodi sono chiamati dalla classe Etp (vedi il modulo qspn) in risposta ai relativi eventi della classe Neighbour (vedi il modulo Radar) che segnalano la nascita, o il miglioramento, o la degradazione, o la morte di un link verso un vicino di LAN.
bestroutes_get
Il metodo bestroutes_get è un capolavoro di codice pythonesque che realizza quanto espresso in forma matematica nel documento qspn.pdf con questa formula:
r ∈ M| <=> r ∈ M, rem(r) = max{rem(s) | s ∈ M, dst(s) = dst(r)}
In altre parole M| è l'insieme di tutte le migliori routes della mappa. In particolare il metodo restituisce una lista di liste, chiamiamola L, tale che L[lvl] è la lista delle migliori routes per i gnodi di livello lvl.
E' implementato usando il metodo best_route della classe RouteNode.
Ogni route è espressa in forma di una tupla (dst, gw, rem) dove dst indica l'id della destinazione (nel livello lvl), gw indica il gateway (è l'id di un vicino di LAN come usato nella translation_table - vedi il modulo Radar) e rem la route efficiency measure usata.
Inoltre il metodo permette di passare come argomento una funzione che fa da filtro, cioè una funzione che chiamata con la tupla suddetta ritorna un booleano. Se la funzione filtro ritorna False la tupla non sarà presente nella lista.