Differences between revisions 2 and 3
Revision 2 as of 2009-04-18 16:08:51
Size: 931
Editor: anonymous
Comment:
Revision 3 as of 2009-05-08 14:56:50
Size: 4146
Editor: lukisi
Comment:
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
'''TODO''' Rivisitare la funzione e dettagliare Parametri che riceve, sono:
<<BR>>
(neigh_list=[], forbidden_neighs=[], condition=False, gnumb=0)
Line 5: Line 7:
Procedura mediante la quale il nodo cerca di entrare in un gnodo di cui fanno parte alcuni suoi vicini di LAN (che diventano i suoi "vicini interni"). Questo può comportare l'abbandonare un altro gnodo. Quando viene richiamata?
Line 7: Line 9:
Allo stesso tempo si cambia il proprio IP (richiesto al coordinator node) a tutte le interfaccie attive ({{{NicAll}}}) Viene richiamata una prima volta all'avvio del demone (vedi metodo run della classe {{{NtkNode}}}) subito dopo aver avviato i server RPC e il radar. ('''''TODO''': forse bisognerebbe aspettare che il radar faccia il primo giro per poi giudicare correttamente se siamo soli o con qualche vicino?''). In questo frangente non viene passato nessun argomento.
Line 9: Line 11:
--(Infine i precedenti nodi interni vengono avvisati richiamando in essi (vedi il [[../ModuloRPC|modulo RPC]]) il metodo {{{Neighbour.delete}}} (vedi il [[../ModuloRadar|modulo Radar]]).)-- Viene richiamata come gestore dell'evento {{{NET_COLLISION}}}. Questo evento viene generato dalla classe {{{Etp}}} quando, durante l'esecuzione di un ETP ricevuto, si rileva una collisione di 2 reti disgiunte. In questo caso l'elenco neigh_list di vicini da esaminare è passato nell'evento ed è l'elenco dei nodi appartenenti all'altra rete. Infatti siamo nella rete più piccola e dobbiamo fare noi ''hook'' nella altra rete.
Line 11: Line 13:
Inoltre i nodi vicini vengono avvisati richiamando in essi (vedi il [[../ModuloRPC|modulo RPC]]) il metodo {{{Neighbour.ip_change}}} (vedi il [[../ModuloRadar|modulo Radar]] e le [[../ElencoRemotableFunctions|funzioni remotable]]). Viene richiamata nel [[../ElencoRemotableFunctions|metodo remotable]] [[../CommunicatingVessels|communicating_vessels]]. Il metodo {{{communicating_vessels}}} può essere stato richiamato da remoto o da un evento {{{ETP_EXECUTED}}} locale. In ogni caso questo metodo eseguito localmente fa i suoi calcoli e poi richiama eventualmente hook, indicando i nodi con più spazi liberi del nostro e con gnumb=il numero di nodi liberi nel miglior candidato.

Cosa fa?

Si memorizza il proprio nip attuale in oldnip.
Line 13: Line 19:
Infine, la [[../ClasseHook|classe Hook]] emette il segnale {{{HOOKED}}}. Deve scoprire se è solo. Per ora we_are_alone = False.

Ricorda che la maproute.free_nodes_list(lvl) restituisce una lista dei posti liberi di livello lvl, tipo ad esempio [1, 2, 56, 57, 123, 124, 125, 200]
<<BR>>
La funzione highest_free_nodes() restituisce (lvl, free_nodes_list) per il primo livello in cui self.maproute.free_nodes_list(lvl) non è vuoto.
<<BR>>
Quindi una cosa tipo (3, [1, 2, 56, 57, 123, 124, 125, 200])

Si inizia a preparare hfn che conterrà una lista di coppie (nip, highestfreenodes) partendo dal proprio attuale nip.
<<BR>>
Quindi tipo [([44,33,22,11], (3, [1, 2, 56, 57, 123, 124, 125, 200])), ...]
<<BR>>
Cioè
<<BR>>
hfn = [ ( nip, ( lvl, [ id, id, id, ...] ) ), ( nip2, ( lvl2, [ id2, id2, id2, ...] ) ), ... ]
<<BR>>
Per ora contiene il proprio nip e il livello più alto in cui la propria mappa ha qualche free_node

Se è stato specificato quali neighbour prendere in esame (caso collisione di 2 reti disgiunte) guarda solo quelli, sennò recupera tutti i neighbour conosciuti col metodo neigh_list della classe Neighbour.
<<BR>>
Qui vediamo se siamo soli e valoriziamo we_are_alone.

Viene definita una funzione is_neigh_forbidden, per vedere se un neigh è incluso nell'elenco vietato forbidden_neighs.

Ogni neighbour passa al vaglio di is_neigh_forbidden. Inoltre ci si assicura di esaminare solo neighbour esterni. Per vedere se è del nostro stesso gnodo di livello 1 usiamo il metodo nip_cmp della classe Map, che restituirebbe 0.
<<BR>>
Se passa queste verifiche si richiama su questo neighbour il [[metodo remotable]] highest_free_nodes e si aggiunge nip e lista nella hfn.

Dalla hfn cosi ottenuta si tolgono i livelli più bassi. Dall'elenco rimasto si prende la prima tupla con più nodi liberi, di questa il primo id di nodo libero.
<<BR>>
Il caso estremo di Netsukuku is full viene rilevato qui.
<<BR>>
Si genera il nuovo nip newnip, appartenente al (g)nodo libero trovato.
<<BR>>
Se we_are_alone si genera anche un nuovo netid.

Se è stata richiesta la verifica della condizione (tipo |G'| < |G| and gnumb < |G| ) questa viene eseguita con l'uso del coordinator node e i metodi going_in, going_out, going_out_ok.

Per completare la fase di hook, si smette di rispondere ai radar.reply.
<<BR>>
Si attiva il newnip nelle proprie interfacce di rete.
<<BR>>
Si cambia il nip in me della mappa e si resettano i vari livelli della mappa.
<<BR>>
Si esegue il metodo di Neighbour readvertise().
<<BR>>
Si avvertono i nostri vicini chiamando il loro [[metodo remotable]] ip_change(oldip, newip)
<<BR>>
Si riprende a rispondere al radar e si genera l'evento HOOKED.

La microfunc hook

Parametri che riceve, sono:
(neigh_list=[], forbidden_neighs=[], condition=False, gnumb=0)

Quando viene richiamata?
Viene richiamata una prima volta all'avvio del demone (vedi metodo run della classe NtkNode) subito dopo aver avviato i server RPC e il radar. (TODO: forse bisognerebbe aspettare che il radar faccia il primo giro per poi giudicare correttamente se siamo soli o con qualche vicino?). In questo frangente non viene passato nessun argomento.
Viene richiamata come gestore dell'evento NET_COLLISION. Questo evento viene generato dalla classe Etp quando, durante l'esecuzione di un ETP ricevuto, si rileva una collisione di 2 reti disgiunte. In questo caso l'elenco neigh_list di vicini da esaminare è passato nell'evento ed è l'elenco dei nodi appartenenti all'altra rete. Infatti siamo nella rete più piccola e dobbiamo fare noi hook nella altra rete.
Viene richiamata nel metodo remotable communicating_vessels. Il metodo communicating_vessels può essere stato richiamato da remoto o da un evento ETP_EXECUTED locale. In ogni caso questo metodo eseguito localmente fa i suoi calcoli e poi richiama eventualmente hook, indicando i nodi con più spazi liberi del nostro e con gnumb=il numero di nodi liberi nel miglior candidato.

Cosa fa?

Si memorizza il proprio nip attuale in oldnip.
Deve scoprire se è solo. Per ora we_are_alone = False.

Ricorda che la maproute.free_nodes_list(lvl) restituisce una lista dei posti liberi di livello lvl, tipo ad esempio [1, 2, 56, 57, 123, 124, 125, 200]
La funzione highest_free_nodes() restituisce (lvl, free_nodes_list) per il primo livello in cui self.maproute.free_nodes_list(lvl) non è vuoto.
Quindi una cosa tipo (3, [1, 2, 56, 57, 123, 124, 125, 200])

Si inizia a preparare hfn che conterrà una lista di coppie (nip, highestfreenodes) partendo dal proprio attuale nip.
Quindi tipo [([44,33,22,11], (3, [1, 2, 56, 57, 123, 124, 125, 200])), ...]
Cioè
hfn = [ ( nip, ( lvl, [ id, id, id, ...] ) ), ( nip2, ( lvl2, [ id2, id2, id2, ...] ) ), ... ]
Per ora contiene il proprio nip e il livello più alto in cui la propria mappa ha qualche free_node

Se è stato specificato quali neighbour prendere in esame (caso collisione di 2 reti disgiunte) guarda solo quelli, sennò recupera tutti i neighbour conosciuti col metodo neigh_list della classe Neighbour.
Qui vediamo se siamo soli e valoriziamo we_are_alone.

Viene definita una funzione is_neigh_forbidden, per vedere se un neigh è incluso nell'elenco vietato forbidden_neighs.

Ogni neighbour passa al vaglio di is_neigh_forbidden. Inoltre ci si assicura di esaminare solo neighbour esterni. Per vedere se è del nostro stesso gnodo di livello 1 usiamo il metodo nip_cmp della classe Map, che restituirebbe 0.
Se passa queste verifiche si richiama su questo neighbour il metodo remotable highest_free_nodes e si aggiunge nip e lista nella hfn.

Dalla hfn cosi ottenuta si tolgono i livelli più bassi. Dall'elenco rimasto si prende la prima tupla con più nodi liberi, di questa il primo id di nodo libero.
Il caso estremo di Netsukuku is full viene rilevato qui.
Si genera il nuovo nip newnip, appartenente al (g)nodo libero trovato.
Se we_are_alone si genera anche un nuovo netid.

Se è stata richiesta la verifica della condizione (tipo |G'| < |G| and gnumb < |G| ) questa viene eseguita con l'uso del coordinator node e i metodi going_in, going_out, going_out_ok.

Per completare la fase di hook, si smette di rispondere ai radar.reply.
Si attiva il newnip nelle proprie interfacce di rete.
Si cambia il nip in me della mappa e si resettano i vari livelli della mappa.
Si esegue il metodo di Neighbour readvertise().
Si avvertono i nostri vicini chiamando il loro metodo remotable ip_change(oldip, newip)
Si riprende a rispondere al radar e si genera l'evento HOOKED.

Netsukuku/ita/MicrofuncHook (last edited 2009-05-25 22:28:57 by lukisi)