• Non ci sono risultati.

Capitolo 4 Multi-layer routing in SDN-oriented MANET

4.3 Implementazione dell’estensione

4.3.2 Operating System Routing Manager

4.3.2.1 Protocollo di control plane

Dopo aver mostrato il funzionamento dell’OSRoutingManager, in questa sezione si presenterà il protocollo di comunicazione tra ControllerClient e ControllerService che porta al suo utilizzo. Rispetto alla descrizione qualita- tiva data nella presentazione generale della soluzione, si riporteranno i passi specifici che portano alla configurazione di un percorso caratterizzato da rou- ting a livello di sistema operativo.

Il protocollo è sempre iniziato dal ControllerClient che intende comunicare con un altro nodo della rete, che tramite l’invio di un messaggio di tipo

OS_ROUTING_REQUEST contenente:

• RampId del nodo destinazione. • La durata desiderata del percorso. • Selettore di percorso.

88

richiede al ControllerService di scoprire un nuovo percorso valido che rispetti i requisiti specificati. Il risultato finale del protocollo consiste nell’otteni- mento di un routeId e del percorso associato per raggiungere la destinazione.

Figura 37 - Diagramma temporale del protocollo di configurazione del percorso.

Alla ricezione della richiesta il ControllerService estrae dal messaggio le informazioni sopra riportate, genera un nuovo routeId che identificherà il per- corso bidirezionale e quindi calcola le strade di andata e di ritorno in accordo al selettore di percorso indicato. L’algoritmo relativo a tale operazione è mo- strato nell’elenco seguente:

1. ApplicationRequirements applicationRequirements =

2. requestMessage.getApplicationRequirements();

3. OsRoutingTopologyGraphSelector pathSelector = osRoutingPathSelector;

89

5. requestMessage.getPathSelectionMetric();

6.

7. if (pathSelectionMetric != null) {

8. if (pathSelectionMetric == PathSelectionMetric.BREADTH_FIRST)

9. pathSelector = new BreadthFirstOsRoutingPathSelector(topologyGraph);

10. else if (pathSelectionMetric == PathSelectionMetric.FEWEST_INTERSECTIONS)

11. pathSelector =

12. new FewestIntersectionsOsRoutingPathSelector(topologyGraph);

13. else if (pathSelectionMetric == PathSelectionMetric.MINIMUM_NETWORK_LOAD)

14. pathSelector =

15. new MinimumNetworkLoadOsRoutingPathSelector(topologyGraph);

16. }

17. System.out.println("ControllerService: first OS routing path request for

18. node ID" + clientNodeId + ", selecting a path");

19. 20. /*

21. * Generating the routeID

22. */

23. int routeId = ThreadLocalRandom.current().nextInt();

24. while (routeId == GenericPacket.UNUSED_FIELD ||

25. forwardOsRoutingPaths.containsKey(routeId)) {

26. routeId = ThreadLocalRandom.current().nextInt();

27. }

28.

29. boolean aborted = false;

30.

31. OsRoutingPathDescriptor oSRoutingForwardPath =

32. pathSelector.selectPath(clientNodeId, destNodeId, 33. applicationRequirements, forwardOsRoutingPaths);

34.

35. OsRoutingPathDescriptor oSRoutingBackwardPath = null;

36. if (pathSelectionMetric == PathSelectionMetric.FEWEST_INTERSECTIONS) {

37. OsRoutingPathDescriptor reversePath =

38. pathSelector.reversePath(oSRoutingForwardPath);

39.

40. Map<Integer, OsRoutingPathDescriptor> candidateBackwardOsRoutingPaths =

41. new ConcurrentHashMap<>(backwardOsRoutingPaths);

42.

43. candidateBackwardOsRoutingPaths.put(routeId, reversePath);

44.

45. oSRoutingBackwardPath =

46. pathSelector.selectPath(destNodeId, clientNodeId, 47. applicationRequirements, candidateBackwardOsRoutingPaths);

48. } else if(oSRoutingForwardPath != null) {

49. oSRoutingBackwardPath = pathSelector.reversePath(oSRoutingForwardPath);

50. }

Elenco 2 - Algoritmo di calcolo del percorso effettuato dal ControllerService.

I percorsi di andata e di ritorno sono contenuti in un due oggetti distinti appartenenti alla classe OsRoutingPathDescriptor riportati in linea 21 e in linea 35, contenenti:

• La lista completa di rampId dei nodi che compongono il percorso, inclusa la sorgente.

• La lista completa degli indirizzi IP degli hop che serviranno per configurare i segmenti intermedi.

• L’indirizzo IP sorgente del percorso. • L’indirizzo IP destinazione del percorso.

Ora che i percorsi sono stati correttamente individuati, il Controller Service si occupa di inviare un messaggio di tipo OS_ROUTING_ADD_ROUTE sia

90

al nodo sorgente del percorso di andata che a al nodo sorgente di quello di ritorno, finalizzati all’impostazione del primo segmento nelle due direzioni. Tale messaggio contiene:

• Indirizzo IP sorgente. • Indirizzo IP del primo hop. • Indirizzo IP destinazione. • RouteId.

Si è deciso di contattare per primi i nodi mittente e ricevente per valutare sin da subito la fattibilità del percorso. Le richieste di tipo OS_ROU-

TING_ADD_ROUTE sono infatti di tipo sincrono e prevedono in risposta un

messaggio di tipo OS_ROUTING_ACK in caso di operazione completata con successo o di tipo OS_ROUTING_ABORT in caso di errore. Se già in questa fase si ricevesse un messaggio di errore non avrebbe senso scomodare i nodi intermedi data l’impossibilità di creazione del percorso. Una volta ricevuta la richiesta, il Controller Client invoca la funzione addRoute dell’OsRouting-

Manager come mostrato nella sezione precedente e a seconda dell’esito

dell’operazione invia in messaggi di risposta appena menzionati.

Assumendo che tutto sia andato a buon fine e che il primo segmento del percorso di andata e di quello di ritorno siano stati correttamente configurati, il Controller Service procede all’invio di un messaggio di tipo OS_ROU-

TING_ADD_ROUTE per tutti i nodi intermedi del percorso di andata e del

percorso di ritorno. Come già detto, tutte queste richieste sono sincrone e in caso di messaggio OS_ROUTING_ABORT l’intero protocollo viene inter- rotto. Per i nodi intermedi il messaggio di richiesta contiene le seguenti infor- mazioni:

• Indirizzo IP sorgente.

• Indirizzo IP dell’hop successivo. • Indirizzo IP destinazione.

• RouteId.

Una volta terminata la distribuzione di tutte le istruzioni necessarie alla con- figurazione dell’intero percorso in ambo le direzioni, il ControllerService at- tua la fase conclusiva del protocollo notificando a tutti i nodi l’avvenuta crea- zione inviando:

91 • Al nodo richiedente il calcolo del percorso un messaggio di tipo

OS_ROUTING_PULL_RESPONSE contenente l’oggetto OsRouting- PathDescriptor del percorso di andata e il routeId.

• Al nodo destinazione un messaggio di tipo OS_ROU-

TING_PUSH_RESPONSE contenente l’oggetto OsRoutingPathDe- scriptor del percorso di ritorno e il routeId.

• A tutti i nodi intermedi del percorso di andata e di ritorno un messag- gio di tipo OS_ROUTING_PUSH_RESPONSE contenente la durata del percorso e il routeId.

Durante tutto il protocollo in caso di errore dovuto al ControllerService o alla ricezione di un messaggio OS_ROUTING_ABORT, il Controller invia un messaggio di controllo di tipo OS_ROUTING_DELETE_ROUTE a tutti quei nodi che durante il protocollo hanno correttamente configurato un segmento in modo da rimuovere tutte le informazioni relative ad esso e invia un mes- saggio al nodo richiedente un messaggio di controllo OS_ROU-

TING_PULL_RESPONSE con routeId con valore -1.