20. Comportamento dell'agente relay
L'agente relay PUÒ essere configurato per utilizzare un elenco di indirizzi di destinazione, che PUÒ includere indirizzi unicast, l'indirizzo multicast All_DHCP_Servers o altri indirizzi selezionati dall'amministratore di rete. Se l'agente relay non è stato esplicitamente configurato, DEVE utilizzare l'indirizzo multicast All_DHCP_Servers come predefinito.
Se l'agente relay inoltra messaggi all'indirizzo multicast All_DHCP_Servers o ad altri indirizzi multicast, imposta il campo Hop Limit su 32.
20.1. Inoltrare un messaggio client o un messaggio Relay-forward
Un agente relay inoltra sia i messaggi dai client sia i messaggi Relay-forward da altri agenti relay. Quando un agente relay riceve un messaggio valido da inoltrare, costruisce un nuovo messaggio Relay-forward. L'agente relay copia l'indirizzo sorgente dall'intestazione del datagramma IP in cui è stato ricevuto il messaggio nel campo peer-address del messaggio Relay-forward. L'agente relay copia il messaggio DHCP ricevuto (escluse eventuali intestazioni IP o UDP) in un'opzione Relay Message nel nuovo messaggio. L'agente relay aggiunge al messaggio Relay-forward qualsiasi altra opzione che è configurato per includere.
20.1.1. Inoltrare un messaggio da un client
Se l'agente relay ha ricevuto il messaggio da inoltrare da un client, l'agente relay inserisce un indirizzo globale o di ambito sito con un prefisso assegnato al collegamento su cui al client dovrebbe essere assegnato un indirizzo nel campo link-address. Questo indirizzo sarà utilizzato dal server per determinare il collegamento da cui al client dovrebbero essere assegnati un indirizzo e altre informazioni di configurazione. L'hop-count nel messaggio Relay-forward è impostato su 0.
Se l'agente relay non può utilizzare l'indirizzo nel campo link-address per identificare l'interfaccia attraverso la quale verrà inoltrata la risposta al client, l'agente relay DEVE includere un'opzione Interface-id (vedere sezione 22.18) nel messaggio Relay-forward. Il server includerà l'opzione Interface-id nel suo messaggio Relay-reply. L'agente relay compila il campo link-address come descritto nel paragrafo precedente indipendentemente dal fatto che l'agente relay includa un'opzione Interface-id nel messaggio Relay-forward.
20.1.2. Inoltrare un messaggio da un agente relay
Se il messaggio ricevuto dall'agente relay è un messaggio Relay-forward e l'hop-count nel messaggio è maggiore o uguale a HOP_COUNT_LIMIT, l'agente relay scarta il messaggio ricevuto.
L'agente relay copia l'indirizzo sorgente dal datagramma IP in cui è stato ricevuto il messaggio dal client nel campo peer-address nel messaggio Relay-forward e imposta il campo hop-count sul valore del campo hop-count nel messaggio ricevuto incrementato di 1.
Se l'indirizzo sorgente dall'intestazione del datagramma IP del messaggio ricevuto è un indirizzo globale o site-local (e il dispositivo su cui è in esecuzione l'agente relay appartiene a un solo sito), l'agente relay imposta il campo link-address su 0; altrimenti l'agente relay imposta il campo link-address su un indirizzo globale o site-local assegnato all'interfaccia su cui è stato ricevuto il messaggio, o include un'opzione Interface-ID per identificare l'interfaccia su cui è stato ricevuto il messaggio.
20.2. Inoltrare un messaggio Relay-reply
L'agente relay elabora tutte le opzioni incluse nel messaggio Relay-reply oltre all'opzione Relay Message, quindi scarta tali opzioni.
L'agente relay estrae il messaggio dall'opzione Relay Message e lo inoltra all'indirizzo contenuto nel campo peer-address del messaggio Relay-reply.
Se il messaggio Relay-reply include un'opzione Interface-id, l'agente relay inoltra il messaggio dal server al client sul collegamento identificato dall'opzione Interface-id. Altrimenti, se il campo link-address non è impostato su zero, l'agente relay inoltra il messaggio sul collegamento identificato dal campo link-address.
20.3. Costruzione di messaggi Relay-reply
Un server utilizza un messaggio Relay-reply per restituire una risposta a un client se il messaggio originale dal client è stato inoltrato al server in un messaggio Relay-forward o per inviare un messaggio Reconfigure a un client se il server non ha un indirizzo che può utilizzare per inviare il messaggio direttamente al client.
Una risposta al client DEVE essere inoltrata attraverso gli stessi agenti relay del messaggio client originale. Il server fa sì che ciò accada creando un messaggio Relay-reply che include un'opzione Relay Message contenente il messaggio per il prossimo agente relay nel percorso di ritorno verso il client. Il messaggio Relay-reply contenuto contiene un'altra opzione Relay Message da inviare al prossimo agente relay, e così via. Il server deve registrare il contenuto dei campi peer-address nel messaggio ricevuto in modo da poter costruire il messaggio Relay-reply appropriato che trasporta la risposta dal server.
Ad esempio, se il client C ha inviato un messaggio che è stato inoltrato dall'agente relay A all'agente relay B e poi al server, il server invierebbe il seguente messaggio Relay-Reply all'agente relay B:
msg-type: RELAY-REPLY
hop-count: 1
link-address: 0
peer-address: A
Relay Message option, contenente:
msg-type: RELAY-REPLY
hop-count: 0
link-address: indirizzo dal collegamento a cui C è collegato
peer-address: C
Relay Message option: <risposta dal server>
Quando invia un messaggio Reconfigure a un client tramite un agente relay, il server crea un messaggio Relay-reply che include un'opzione Relay Message contenente il messaggio Reconfigure per il prossimo agente relay nel percorso di ritorno verso il client. Il server imposta il campo peer-address nell'intestazione del messaggio Relay-reply sull'indirizzo del client e imposta il campo link-address come richiesto dall'agente relay per inoltrare il messaggio Reconfigure al client. Il server ottiene gli indirizzi del client e dell'agente relay tramite interazione precedente con il client o tramite un meccanismo esterno.