Differences between revisions 2 and 8 (spanning 6 versions)
Revision 2 as of 2014-11-24 22:25:23
Size: 6497
Editor: lukisi
Comment:
Revision 8 as of 2014-11-25 14:47:14
Size: 6776
Editor: lukisi
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Modulo Neighborhood = = Modulo Neighborhood - Analisi Funzionale =
Line 36: Line 36:
il RTT, ma può esserlo se rappresenta la larghezza di banda in uscita. il round-trip time, ma può esserlo se rappresenta la larghezza di banda in uscita.
Line 59: Line 59:
Line 79: Line 78:
 * ottenere uno stub per chiamare un metodo in broadcast; il modulo può specificare l'oggetto BroadcastID per indicare quali vicini sono interessati; può inoltre indicare una callback da richiamare sugli archi per i quali non riceve il messaggio di ACK.  * ottenere uno stub per chiamare un metodo in broadcast; il modulo può specificare una o più interfacce di rete sulle quali desidera che il messaggio venga inviato; il modulo può specificare l'oggetto BroadcastID per indicare a ogni vicino che riceve il messaggio se debba considerarsi tra i destinatari; può inoltre indicare una callback da richiamare sugli archi per i quali non riceve il messaggio di ACK.
Line 100: Line 99:
 * ottenere l'indirizzo IPv4 di scheda (vedi appunti, metodo 'string get_local_address')

Modulo Neighborhood - Analisi Funzionale

Rileva i nodi vicini raggiungibili attraverso una (o più) interfacce di rete e ne reperisce l'identificativo.

Con ogni vicino, poi, si accorda per la creazione (o meno) di un arco. L'accordo potrebbe non essere raggiunto perché uno dei due vertici ha già un numero di archi elevato, tutti con costo inferiore a questo. Oppure, più frequentemente, se i due vertici appartengono a reti distinte.

Per ogni arco mantiene l'identificativo del vertice collegato e il costo.

Nel tempo, gestisce la costituzione di nuovi archi, la rimozione di archi, i cambiamenti del costo degli archi.

Note

Tra due nodi vicini ci possono essere 2 o più archi, ma solo se sono su diversi domini di collisione.

Da questo deriva che i messaggi inviati in UDP Unicast vanno elaborati dal solo nodo destinatario e solo una volta, cioè quando sono ricevuti dall'arco che li invia. Per questo il nodo che li invia su un certo arco compone l'oggetto UnicastID con l'identificativo del nodo destinatario e il MAC del nodo destinatario associato a quell'arco.


Quando si crea un arco esso esiste per entrambi i nodi. Quindi ogni nodo può inoltrare i suoi pacchetti all'altro e deve inoltrare i pacchetti che provengono dall'altro.


Il costo di un arco in una direzione ( da A verso B ) può essere diverso dal costo nella direzione inversa. Questo non è utile quando il costo rappresenta il round-trip time, ma può esserlo se rappresenta la larghezza di banda in uscita.


Quando un nodo rimuove un arco tenta di comunicarlo al vertice collegato perché faccia altrettanto.

Requisiti

  • Identificativo del proprio nodo.
  • La (o le) interfaccia di rete da monitorare.
    Una interfaccia nic_xy è un oggetto che comprende:

    • il nome della interfaccia ( wlan0 )
    • il MAC address della interfaccia ( CC:AF:78:2E:C8:B6 )

    • Callback per misurare il RTT (ping) con un vicino.
  • Numero massimo di archi da realizzare.
  • Factory per ottenere uno "stub" per invocare metodi remoti nei nodi vicini.

Durante le operazioni del modulo è possibile aggiungere o rimuovere una interfaccia di rete da monitorare.

Quando si aggiunge una interfaccia al modulo, esso verifica che non sia un duplicato; se nome e MAC coincidono con una già inserita allora ignora la richiesta; se uno coincide e l'altro no, allora errore fatale.

Deliverables

  • Emette un segnale per:
    • rilevamento di una collisione con altra rete; questo evento scatenerà la procedura di fusione delle due reti su un altro modulo.
    • costituzione di un arco.
    • rimozione di un arco.
    • variazione del costo di un arco.
  • Fornisce on demand:
    • elenco degli archi ora presenti.
    • dato il nome di una interfaccia di rete (e.g. wlan0) [che di norma si ottiene dal parametro _rpc_caller di un metodo remoto che è in esecuzione, il che fa presumere che la suddetta interfaccia è gestita dal modulo] l'oggetto interfaccia che la rappresenta, se tale interfaccia è al momento gestita dal modulo. Altrimenti un RPCError?
    • dato un UnicastID (identificativo di un unicast) ricevuto da una data interfaccia di rete, stabilire se è un messaggio da processare.
    • dato un arco, un oggetto stub utilizzabile per inviare un messaggio tramite questo arco al vicino (chiamare un metodo remoto in unicast)
    • un oggetto stub utilizzabile per inviare un messaggio (chiamare un metodo remoto in broadcast) a tutti i vicini; oppure, dato un identificativo di un vicino, a tutti i vicini tranne quello; oppure, data una interfaccia di rete, a tutti i vicini raggiungibili tramite quella.
      Quando si invia un messaggio tramite questo oggetto l'invio del messaggio è asincrono: procederà in una nuova tasklet, mentre il metodo non fornirà alcuna risposta al chiamante. E' possibile fornire una callback che verrà richiamata dopo un certo tempo se per qualcuno degli archi noti al modulo non si avrà ricevuto un messaggio di ACK dal vicino collegato. Questo controllo viene fatto sugli archi che sono esistenti al momento dell'invio AND sono ancora presenti alla scadenza del timeout. La callback viene chiamata una volta per ogni arco che fallisce e avrà quell'arco come argomento, così che il chiamante possa prendere un provvedimento, ad esempio forzando la rimozione dell'arco.
      Quando si invia un broadcast a più vicini può essere necessario inviarlo in broadcast su una o più interfacce di rete.

  • Ha un metodo per forzare la rimozione di un arco.

Classi e interfacce

La stub factory è un oggetto di cui il modulo conosce l'interfaccia IStubFactory. Tramite essa il modulo può:

  • ottenere uno stub per chiamare un metodo in broadcast; il modulo può specificare una o più interfacce di rete sulle quali desidera che il messaggio venga inviato; il modulo può specificare l'oggetto BroadcastID per indicare a ogni vicino che riceve il messaggio se debba considerarsi tra i destinatari; può inoltre indicare una callback da richiamare sugli archi per i quali non riceve il messaggio di ACK.
  • ottenere uno stub per chiamare un metodo su uno specifico vicino; il modulo specifica l'oggetto UnicastID e può specificare se si vuole ricevere una risposta o no.


L'identificativo del proprio nodo, come anche l'identificativo di ogni vertice rilevato, è un oggetto il cui contenuto non è noto al modulo neighborhood. L'interfaccia di questo oggetto nota al modulo gli consente di:

  • verificare se due identificativi sono identici (metodo 'equals').
  • verificare se due identificativi appartengono alla stessa rete (metodo 'is_on_same_network').


Un arco è un oggetto noto al modulo. Grazie alle informazioni memorizzate in esso (my_nic) il modulo è in grado di produrre l'oggetto che realizza la chiamata di un metodo remoto in unicast.

L'interfaccia dell'oggetto arco nota all'esterno del modulo, invece, permette solo un sottoinsieme di operazioni:

  • leggere l'identificativo del vicino.
  • leggere il MAC del vicino.
  • ottenere l'indirizzo IPv4 di scheda (vedi appunti, metodo 'string get_local_address')
  • leggere il costo dell'arco.
  • verificare se due archi sono identici (metodo 'equals').
  • verificare se l'arco poggia su una data interfaccia di rete; abbiamo questo metodo, invece di avere direttamente l'interfaccia, per scoraggiare la creazione di un oggetto remoto unicast senza passare dal modulo.


Il costo di un arco rilevato è la latenza, cioè il tempo che impiega un messaggio da noi a raggiungere il vertice collegato. In realtà quello che si può misurare, quindi quello che il modulo memorizza come costo, è il round-trip time (RTT).

Netsukuku/ita/docs/ModuloNeighborhood/AnalisiFunzionale (last edited 2016-05-03 10:39:09 by lukisi)