Differences between revisions 6 and 7
Revision 6 as of 2009-04-10 07:17:54
Size: 2896
Editor: anonymous
Comment:
Revision 7 as of 2009-05-07 11:03:03
Size: 3565
Editor: lukisi
Comment:
Deletions are marked like this. Additions are marked like this.
Line 8: Line 8:
La ''dataclass'' deve avere il metodo is_free per dire se lo spazio in questione è usato o no.<<BR>> La ''dataclass'' deve avere il metodo {{{is_free}}} per dire se lo spazio in questione è usato o no.<<BR>>
Line 13: Line 13:

Inoltre la classe Map tiene traccia del numero di nodi presenti di ogni livello, cioè il numero di spazi per cui {{{is_free() = False}}}. Lo memorizza nel membro {{{node_nb[lvl]}}}.
<<BR>>
Oltre ad avere questo numero immediatamente pronto nel membro {{{node_nb[lvl]}}}, e come controparte il numero di nodi liberi calcolati come differenza nel metodo {{{free_nodes_nb(lvl)}}}, la classe fornisce anche il metodo {{{free_nodes_list(lvl)}}} che restituisce l'elenco degli {{{id}}} dei nodi liberi di livello {{{lvl}}}.
<<BR>>
'''''TODO''': Questi dati non tengono conto degli indirizzi non validi, tipo 192.168.* o 224.* etc. Vanno corretti?''
Line 30: Line 36:
Il metodo is_in_level ci dice se un certo nodo o gnodo appartiene allo stesso nostro gnodo di livello x. Il metodo {{{is_in_level}}} ci dice se un certo nodo o gnodo appartiene allo stesso nostro gnodo di livello x.
Line 34: Line 40:
Il metodo nip_cmp dice di 2 Netsukuku-IP quale sia il primo livello differente. La ricerca parte dall'ultimo elemento delle sequenze (levels -1). Tra i 2 nip citati prima Il metodo {{{nip_cmp}}} dice di 2 Netsukuku-IP quale sia il primo livello differente. La ricerca parte dall'ultimo elemento delle sequenze (levels -1). Tra i 2 nip citati prima

La classe Map

Rappresenta una mappa di oggetti generici (dataclass) con uno spazio di levels x gsize. Cioè 4 x 256.

Ricorda che il livello 0 contiene l'id dei singoli nodi, mentre il livello 3 contiene l'id dei gnodi più vasti. Il livello 4 non si specifica, consisterebbe in un unico gnodo che contiene l'intero dominio di IPv4.

Ogni spazio è creato solo quando viene esplicitamente usato per la prima volta. Ogni spazio viene creato usando il costruttore dataclass con i parametri lvl e id, così che l'informazione di dove si trova nella mappa ce l'ha lo stesso nodo (al momento la classe RouteNode non ne fa uso).
La dataclass deve avere il metodo is_free per dire se lo spazio in questione è usato o no.
E' possibile segnalare la presenza di un nuovo nodo nella mappa. Si fa con il metodo node_add. In questo momento viene emesso il signal NODE_NEW.
E' possibile anche rimuovere un elemento dalla mappa. Si fa con il metodo node_del. In questo caso viene anche emesso il signal NODE_DELETED.

E' possibile anche resettare un intero livello o l'intera mappa senza far emettere alcun segnale (map_reset, level_reset). Questa tecnica è usata dopo aver fatto un re-hook in un diverso gnodo e aver reimpostato il nuovo IP su tutti i Nic attivi (vedi la classe Hook).

Inoltre la classe Map tiene traccia del numero di nodi presenti di ogni livello, cioè il numero di spazi per cui is_free() = False. Lo memorizza nel membro node_nb[lvl].
Oltre ad avere questo numero immediatamente pronto nel membro node_nb[lvl], e come controparte il numero di nodi liberi calcolati come differenza nel metodo free_nodes_nb(lvl), la classe fornisce anche il metodo free_nodes_list(lvl) che restituisce l'elenco degli id dei nodi liberi di livello lvl.
TODO: Questi dati non tengono conto degli indirizzi non validi, tipo 192.168.* o 224.* etc. Vanno corretti?

Nella classe Map l'attributo me memorizza il proprio spazio, cioè il proprio Netsukuku-IP (abbreviato nip).
Un nip è indicato nella forma di una sequenza di ID per i vari livelli dallo 0 al più alto.
   self.me = [1,1,168,192]
Notare che il primo elemento della sequenza è il livello 0 (l'id del singolo nodo)
Un altro modo di rappresentare uno spazio nella mappa è un intero, detto semplicemente ip, dato dal calcolo 192*2563+168*2562+1*2561+1*2560.
Per convertire tra le 2 notazioni si possono usare i metodi ip_to_nip e nip_to_ip.

Per descrivere le altre funzionalità, supponiamo di avere a disposizione un altro indirizzo nella variabile nip.
   nip = [2,2,168,192]

Il metodo is_in_level ci dice se un certo nodo o gnodo appartiene allo stesso nostro gnodo di livello x. In questo caso self.is_in_level(nip,0) darebbe False;
invece self.is_in_level(nip,1) darebbe True.

Il metodo nip_cmp dice di 2 Netsukuku-IP quale sia il primo livello differente. La ricerca parte dall'ultimo elemento delle sequenze (levels -1). Tra i 2 nip citati prima
   nip_cmp(self.me, nip)
dovrebbe restituire 1.

Il metodo lvlid_to_nip(lvl, id) partendo da lvl e id guarda nella mappa e restituisce il nip equivalente. Lo fa partendo dal proprio nip (self.me) sostituendo il livello lvl con id e azzerando i livelli sotto lvl.

Netsukuku/ita/ClasseMap (last edited 2009-05-26 18:53:31 by lukisi)