== How To Configurare IPv6 ==
Lo scopo di questa pagina è quello di aiutare nella configurazione di IPv6 delle antenne nella fase di deployment di questo protocollo sulla rete ninux. Dato che è in fase di sperimentazione potrebbero verificarsi la necessità di ulteriori passaggi non inclusi in questa guida. In quel caso è bene integrare la seguente pagina.

== Requirements ==
1) Firmware che supporti IPv6 (scaricabile da [[http://nnx.me/sburratone4|qui]] - MD5SUM: 225baa919da285498549568e99916595 )

2) Un indirizzo IPv4 sulle interfacce ath0 e eth0 (nel caso sceglierli nella pagina GestioneIndirizzi)

== Come aggiornare il firmware ==
''' /!\ ATTENZIONE QUESTO FIRMWARE E' STATO PROVATO E TESTATO CON I SEGUENTI APPARATI: Ubiquiti Nanostation M5, Ubiquiti !AirGrid 5, Ubiquiti NanoBridge 5.'''

Per aggiornare il firmware alla versione che supporta IPv6 basta semplicemente accedere alla cartella dove è stato scaricato, rinominarlo e copiarlo nella cartella /tmp/ dell'Access Point. Quindi ad esempio con scp:

{{{
mv XM.v5.3.3.sdk.9634.111221.2238.bin fwupdate.bin && scp fwupdate.bin root@<ip_della_vostra_antenna_>:/tmp/
}}}
a questo punto fare l'accesso all'antenna in ssh e digitare:

{{{
/sbin/ubntbox fwupdate.real -m /tmp/fwupdate.bin -d
}}}
dopo qualche "strano output" :-) la connessione ssh dovrebbe chiudersi...calmi, è tutto normale! Provare quindi a ricollegarsi dopo qualche secondo e verificare che i file di configurazione non siano stati modificati (es. configurazione di olsr, ip delle interfacce, etc..)

== Creazione dello script per IPv6 ==
Dopo aver aggiornato il firmware, bisogna creare lo script di avvio per la configurazione automatica degli ip delle interfacce in IPv6.

'''''__ {i} __ __Premessa__''''': per le interfacce wireless (ath0) si utilizza la subnet '''''2001:4c00:893b:1::/128''''', per le hna6 basta sceglierne una, nella pagina GestioneIndirizzi, da annunciare agli altri (per questa guida noi utilizzeremo la '''''2001:4c00:893b:caca::/64''''')

La logica da seguire per la configurazione delle interfacce ath0 ed eth0 è la seguente:

Considerando l'attuale indirizzo IPv4 dell'interfaccia wireless ath0 (es. 172.16.174.1) prendere il 3 e il 4 ottetto (174 e 1) e sostituirli al posto di X e Y nella subnet per le interfacce wireless '''''2001:4c00:893b:1:X::Y/128''''' (quindi nel nostro caso: IPv4: 172.16.174.1 --> IPv6: 2001:4c00:893b:1:'''174'''::'''1'''/128)

Per l'interfaccia eth0, dopo aver scelto la subnet da annunciare (es. 2001:4c00:893b:caca::/64) prendere l'ultimo ottetto dell'attuale indirizzo IPv4 della eth0 (es. dell'indirizzo 192.168.105.102 prendere solo 102) e sostituirlo alla X dell'indirizzo 2001:4c00:893b:caca::X/64 (quindi nel nostro caso: IPv4/eth0: 192.168.105.102 --> IPv6/eth0: 2001:4c00:893b:caca::102/64)

Una volta ricavati gli indirizzi IPv6 delle interfacce ath0 ed eth0 creare un nuovo file chiamato "ninux" in /etc/persistent/ con il comando

{{{
vi /etc/persistent/ninux
}}}
una volta dentro vi digitare

{{{
:set noautoindent
}}}
premere il tasto " i " per entrare nella modalità di "Insert" e incollare il seguente script avendo cura di sostituire gli indirizzi IP con quelli sopra ricavati

{{{
( sleep 60
if [ -e /etc/persistent/olsrd.conf ]; then
     olsrd -f /etc/persistent/olsrd.conf -d 0
     elif [ -e /olsrd.conf ]; then
             olsrd -f /olsrd.conf -d 0
fi
insmod ip_tables
insmod iptable_filter
#insmod ip_conntrack
#insmod ip_nat
#insmod iptable_nat
#echo 300 > /proc/sys/net/ipv4/netfilter/ip_conntrack_timeout_established
echo 0 > /proc/sys/net/ipv6/conf/all/accept_ra
ip -6 addr flush dev eth0 scope global
ip -6 addr flush dev ath0 scope global
ip addr add 2001:4c00:893b:1:174::1/128 dev ath0
ip addr add 2001:4c00:893b:caca::102/64 dev eth0
olsrd -f /etc/persistent/olsrd6.conf -d 0
radvd -C /etc/persistent/radvd.conf
) &
}}}

'''Nota:'''
Chi avessse bisogno di rimuovere un default gateway che non riesce a togliere dalla interfaccia grafica (bug noto a tutti) puo' inserire questa riga prima delle parentesi '') &''
{{{
route del default gw <default_gateway_da_rimuovere>
}}}

una volta incollato e modificato gli IP premere "ESC" e digitare

{{{
:wq
}}}
a questo punto per verificare che sia tutto memorizzato correttamente dare il comando:

{{{
cat /etc/persistent/ninux
}}}
in output dovrebbe comparirvi lo script che avete appena incollato!

''' /!\ ATTENZIONE verificate che gli IPv6 appena inseriti in questo script siano giusti. Un errore rischia di mettere fuori uso la rete'''

Dare i permessi di esecuzione allo script con il comando:

{{{
chmod a+x /etc/persistent/ninux
}}}
== Configurazione OLSRv6 ==
OLSR è il protocollo di routing utilizzato nella rete ninux per permette ai vari Access Point di scambiarsi le rotte e quindi inoltrare le informazioni in modo corretto. OLSR ha bisogno di una ulteriore istanza per il protocollo IPv6. Sull'antenna quindi risulteranno attivi due daemond OLSR, uno per IPv4 e uno per IPv6. Chiaramente questi due demoni utilizzano dei files di configurazione differenti. La configurazione di OLSR quindi è abbastanza semplice. Basta semplicemente creare questo file di configurazione (se non già presente) sempre in /etc/persistent/ con il comando:

{{{
vi /etc/persistent/olsrd6.conf
}}}
Una volta dentro l'editor di test, dare i seguenti comandi:

{{{
:set noautoindent
}}}
premere il tasto "i" per entrare in Insert Mode e incollare il seguente template '''avendo cura di sostituire tra le parentesti graffe dell'hna6''':

{{{
DebugLevel  0

IpVersion 6

Pollrate  0.025
FIBMetric "flat"
UseNiit no
SmartGateway no

Hna6
{
#Inserire qui la subnet IPv6 scelta nella pagina GestioneIndirizzi
2001:4c00:893b:caca:: 64
}

UseHysteresis no
TcRedundancy  2

MprCoverage 7

LinkQualityLevel 2
LinkQualityAlgorithm    "etx_ff"
LinkQualityAging 0.05
LinkQualityFishEye  1

LoadPlugin "olsrd_txtinfo.so.0.1"
{
   PlParam     "port"   "2007"
   PlParam     "Accept"   "::"

}

InterfaceDefaults {
      HelloInterval 3.0
      HelloValidityTime 125.0
      TcInterval 2.0
      TcValidityTime 500.0
      MidInterval 25.0
      MidValidityTime 500.0
      HnaInterval 10.0
      HnaValidityTime 125.0
}

Interface "ath0" "eth0"
{
      Mode "mesh"
      IPv6Multicast FF02::6D
}
}}}
dopo aver incollato il template premere "ESC" e dare il comando

{{{
:wq
}}}
Verifichiamo che sia tutto ok visualizzando il file appena creato:

{{{
cat /etc/persistent/olsrd6.conf
}}}
dovrebbe venirvi fuori la configurazione appena incollata.

''' /!\ ATTENZIONE verificate che gli IPv6 appena inseriti in questo script siano giusti. Un errore rischia di mettere fuori uso la rete'''

== Configurazione Radvd ==
Il '''Router ADVertisement Daemon''' è molto utile in una LAN quando i client  devono essere configurati automaticamente. E' una sorta di configuratore automatico di IPv6. Questo router ascolta le RS (Router Solicitations) e risponde con delle RA (Router Advertisement) oltre che inviare delle unsolicited RAs ogni tanto.

Per configurarlo basta creare un file nella cartella /etc/persistent/ con il comando

{{{
vi /etc/persistent/radvd.conf
}}}
Una volta dentro l'editor di testo, dare i seguenti comandi:

{{{
:set noautoindent
}}}
premere il tasto "i" per entrare in Insert Mode e incollare il seguente template avendo cura di sostituire la subnet con quella scelta precedentemente nella pagine GestioneIndirizzi, quindi nel nostro caso (con la subnet 2001:4c00:893b:caca::/64) avremo:

{{{
interface eth0 {
   AdvSendAdvert on;
   MinRtrAdvInterval 3;
   MaxRtrAdvInterval 10;
   AdvLinkMTU      1280;
   prefix 2001:4c00:893b:caca::/64 {
     AdvOnLink on;
     AdvAutonomous on;
     AdvRouterAddr on;
   };
};
}}}
dopo aver incollato il template premere "ESC" e dare il comando

{{{
:wq
}}}
Verifichiamo che sia tutto ok visualizzando il file appena creato:

{{{
cat /etc/persistent/radvd.conf
}}}
dovrebbe venirvi fuori la configurazione appena incollata.

''' /!\ ATTENZIONE verificate che gli IPv6 appena inseriti in questo script siano giusti. Un errore rischia di mettere fuori uso la rete'''


== Solo per chi utilizza come username di accesso qualcosa di diverso da root (es ubnt) ==

Correggiamo i permessi perchè alcune macchine stentano ad avviare radvd se non hanno i permessi settati in questo modo (rimuovere i permessi di scrittura agli other)

{{{
chmod 400 /etc/persistent/radvd.conf
}}}

nello script ninux il comando di avvio di radvd deve includere la direttiva -u ubnt (o quello che si utilizza) per cui le ultime due righe dello script devono diventare qualcosa di simile a questo
{{{
....
radvd -C /etc/persistent/radvd.conf -u ubnt
) &
}}}


== Rendere il tutto "persistent" ==
La configurazione è terminata. Per rendere persistenti le modifiche fatte e riavviare l'antenna dare il comando:

{{{
cfgmtd -w -p /etc/ && reboot
}}}
== Verifica ==
Una volta riavviata l'antenna verificate che l'interfaccia ath0 e la eth0 abbiamo effettivamente preso gli indirizzi indicati nello script "ninux" con i comandi:

{{{
ifconfig ath0

ath0      Link encap:Ethernet  HWaddr 00:15:6D:9C:46:C8
          inet addr:172.16.174.1  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: 2001:4c00:893b:1:174::1/128 Scope:Global
          inet6 addr: fe80::215:6dff:fe9c:46c8/64 Scope:Link
          UP BROADCAST RUNNING PROMISC ALLMULTI MULTICAST  MTU:1500  Metric:1
          RX packets:701231 errors:0 dropped:0 overruns:0 frame:0
          TX packets:562196 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:591008817 (563.6 MiB)  TX bytes:184695095 (176.1 MiB)

ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:15:6D:9D:46:C8
          inet addr:192.168.105.102  Bcast:192.168.105.255  Mask:255.255.255.0
          inet6 addr: 2001:4c00:893b:caca::102/64 Scope:Global
          inet6 addr: fe80::215:6dff:fe9d:46c8/64 Scope:Link
          UP BROADCAST RUNNING PROMISC ALLMULTI MULTICAST  MTU:1500  Metric:1
          RX packets:553188 errors:0 dropped:0 overruns:0 frame:0
          TX packets:677134 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:112033873 (106.8 MiB)  TX bytes:571749011 (545.2 MiB)
}}}
''' /!\ ''''''ATTENZIONE!!! La direttiva "sleep" all'inizio dello script "ninux" potrebbe far tardare l'assegnazione dell'IPv6 all'interfaccia. Questa direttiva è stata inserita per essere sicuri che l'IP venga assegnato solo una volta che l'antenna si sia correttamente allineata a livello fisico!'''

''' {i} Nota''': Per poter raggiungere un altro punto IPv6 i vostri hop intermedi devono supportare IPv6. Se un nodo nel percorso fino a destinazione non supporta IPv6 il vostro pacchetto si fermerà li non permettendovi di raggiungere la vostra destinazione.