= La classe MapRoute = Rappresenta una mappa di route (vedi la [[../ClasseRouteNode|classe RouteNode]]), tutte dello stesso tipo di rem (vedi la [[../ClasseRem|classe Rem]]). <
> E' implementata come una derivata della [[../ClasseMap|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 [[../ClasseMap|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 [[../ClasseRouteNode|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 [[../ClasseKrnlRoute|classe KrnlRoute]] si incarica di utilizzare i metodi forniti dalla classe {{{Route}}} (vedi il [[../PackageNetwork|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 [[../ClasseMap|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 [[../ClasseMap|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 [[../ModuloRadar|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 [[../ModuloQSPN|modulo qspn]]) in risposta ai relativi eventi della classe Neighbour (vedi il [[../ModuloRadar|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 [[../ClasseRouteNode|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 [[../ModuloRadar|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.