Modulo QSPN - Dettagli Tecnici
Requisiti
L'utilizzatore del modulo QSPN per prima cosa inizializza il modulo richiamando il metodo statico QspnManager.init ( ) .
Prima di iniziare ad usare il modulo QSPN, il nodo deve essere a conoscenza del suo indirizzo Netsukuku; deve essere un indirizzo non ancora preso nella rete; deve essere un indirizzo compatibile con gli archi del nodo, cioè tale che se il nodo entra in un g-nodo esistente g di livello i abbia almeno un arco verso un altro nodo appartenente a g. Di fatto per ottenere questo il nodo contatta i suoi vicini e raccoglie informazioni sui loro g-nodi di appartenenza ai vari livelli, compreso il livello più alto; poi valuta quale strategia voglia seguire per scegliere su quale g-nodo tra questi voglia entrare, quindi contatta il Coordinator del g-nodo scelto e si accorda con lui per farsi assegnare un posto al suo interno.
Dallo stesso Coordinator del g-nodo g il nodo ottiene anche altre informazioni che servono al modulo QSPN, come l'anzianità di g e dei suoi g-nodi superiori e l'anzianità del g-nodo che il nodo corrente costituirà, per poter produrre il proprio fingerprint di nodo. L'identificativo del fingerprint è generato dal nodo come numero random in uno spazio abbastanza grande di modo che sia presumibilmente univoco a livello di rete.
Quindi il nodo istanzia il suo QspnManager passando al costruttore:
Il proprio indirizzo Netsukuku (istanza di IQspnNaddr my_naddr).
Il numero massimo di percorsi per destinazione da memorizzare (int max_paths).
Il massimo rapporto di hops comuni nella verifica di disgiunzione (double max_common_hops_ratio).
Gli archi che esistono tra il nodo e i suoi vicini (lista di istanze di IQspnArc my_arcs).
Il suo fingerprint come nodo (istanza di IQspnFingerprint my_fingerprint).
Il calcolatore del tempo di tolleranza (istanza di IQspnThresholdCalculator threshold_calculator).
La stub factory (istanza di IQspnStubFactory stub_factory).
La factory per produrre istanze di ETP (istanza di IQspnEtpFactory etp_factory).
Quando ci sono variazioni sugli archi, richiama sul QspnManager i metodi:
arc_add (IQspnArc arc).
arc_is_changed (IQspnArc changed_arc).
arc_remove (IQspnArc removed_arc).
Deliverables
Quando viene costruito il QspnManager gli viene passata una lista di archi. Se non ci sono archi significa che il nodo sta generando una nuova rete, quindi il modulo si considera da subito maturo. Il modulo lo segnala attraverso il segnale qspn_mature di QspnManager.
Se invece ci sono degli archi il modulo si considera non maturo. In questo caso chiede ai vicini di comunicargli le loro mappe con un ETP completo.
Le richieste sono fatte su ogni singolo arco, in parallelo, con protocollo reliable. Se una richiesta fallisce (per problemi al link) il relativo arco viene rimosso e viene emesso il segnale arc_removed di QspnManager.
Alcuni degli archi possono rifiutare la richiesta perché a loro volta non sono ancora maturi. Per questi non viene rimosso l'arco, ma semplicemente non abbiamo potuto ricevere da loro un ETP.
Quando tutte le richieste hanno terminato si avrà una lista di ETP. Se tale lista risultasse vuota allora il modulo emette il segnale failed_hook di QspnManager affinché il nodo consideri fallito l'ingresso nella rete e riprovi da capo.
Se invece la lista contiene uno o più ETP, il modulo li elabora. Poi si considera maturo, quindi emette il segnale qspn_mature di QspnManager.
Il modulo segnala.