+\subsection{L'uso di \func{ioctl} per l'accesso ai dispositivi di rete}
+\label{sec:sock_ioctl_netdevice}
+
+Benché non strettamente attinenti alla gestione dei socket, vale la pena di
+trattare qui l'interfaccia di accesso a basso livello ai dispositivi di rete
+che viene appunto fornita attraverso la funzione \texttt{ioctl}. Questa non è
+attinente a caratteristiche specifiche di un qualche protocollo, ma si applica
+a tutti i socket, indipendentemente da tipo e famiglia degli stessi, e
+permette di impostare e rilevare le funzionalità delle interfacce di rete.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{0.80\textwidth}
+ \includestruct{listati/ifreq.h}
+ \end{minipage}
+ \caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le
+ operazioni di controllo sui dispositivi di rete.}
+ \label{fig:netdevice_ifreq_struct}
+\end{figure}
+
+Tutte le operazioni di questo tipo utilizzano come terzo argomento di
+\func{ioctl} il puntatore ad una struttura \struct{ifreq}, la cui definizione
+è illustrata in fig.~\ref{fig:netdevice_ifreq_struct}. Normalmente si utilizza
+il primo campo della struttura, \var{ifr\_name} per specificare il nome
+dell'interfaccia su cui si vuole operare (ad esempio \texttt{eth0},
+\texttt{ppp0}, ecc.), e si inseriscono (o ricevono) i valori relativi alle
+diversa caratteristiche e funzionalità nel secondo campo, che come si può
+notare è definito come una \dirct{union} proprio in quanto il suo significato
+varia a secondo dell'operazione scelta.
+
+Si tenga inoltre presente che alcune di queste operazioni (in particolare
+quelle che modificano le caratteristiche dell'interfaccia) sono privilegiate e
+richiedono i privilegi di amministratore o la \textit{capability}
+\const{CAP\_NET\_ADMIN}, altrimenti si otterrà un errore di \errval{EPERM}.
+Le costanti che identificano le operazioni disponibili sono le seguenti:
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\constd{SIOCGIFNAME}] questa è l'unica operazione che usa il campo
+ \var{ifr\_name} per restituire un risultato, tutte le altre lo utilizzano
+ per indicare l'interfaccia sulla quale operare. L'operazione richiede che si
+ indichi nel campo \var{ifr\_ifindex} il valore numerico dell'\textsl{indice}
+ dell'interfaccia, e restituisce il relativo nome in \var{ifr\_name}.
+
+ Il kernel infatti assegna ad ogni interfaccia un numero progressivo, detto
+ appunto \itindex{interface~index} \textit{interface index}, che è quello che
+ effettivamente la identifica nelle operazioni a basso livello, il nome
+ dell'interfaccia è soltanto una etichetta associata a detto \textsl{indice},
+ che permette di rendere più comprensibile l'indicazione dell'interfaccia
+ all'interno dei comandi. Una modalità per ottenere questo valore è usare il
+ comando \cmd{ip link}, che fornisce un elenco delle interfacce presenti
+ ordinato in base a tale valore (riportato come primo campo).
+
+
+\item[\constd{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore
+ numerico dell'indice dell'interfaccia specificata con \var{ifr\_name}, è in
+ sostanza l'operazione inversa di \const{SIOCGIFNAME}.
+
+\item[\constd{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il
+ valore corrente dei flag dell'interfaccia specificata (con \var{ifr\_name}).
+ Il valore restituito è una maschera binaria i cui bit sono identificabili
+ attraverso le varie costanti di tab.~\ref{tab:netdevice_iface_flag}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{8cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \constd{IFF\_UP} & L'interfaccia è attiva.\\
+ \constd{IFF\_BROADCAST} & L'interfaccia ha impostato un indirizzo di
+ \textit{broadcast} valido.\\
+ \constd{IFF\_DEBUG} & È attivo il flag interno di debug.\\
+ \constd{IFF\_LOOPBACK} & L'interfaccia è una interfaccia di
+ \textit{loopback}.\\
+ \constd{IFF\_POINTOPOINT}&L'interfaccia è associata ad un collegamento
+ \textsl{punto-punto}.\\
+ \constd{IFF\_RUNNING} & L'interfaccia ha delle risorse allocate (non può
+ quindi essere disattivata).\\
+ \constd{IFF\_NOARP} & L'interfaccia ha il protocollo ARP disabilitato o
+ l'indirizzo del livello di rete non è impostato.\\
+ \constd{IFF\_PROMISC} & L'interfaccia è nel cosiddetto
+ \index{modo~promiscuo} \textsl{modo promiscuo},
+ riceve cioè tutti i pacchetti che vede passare,
+ compresi quelli non direttamente indirizzati a
+ lei.\\
+ \constd{IFF\_NOTRAILERS}& Evita l'uso di \textit{trailer} nei pacchetti.\\
+ \constd{IFF\_ALLMULTI} & Riceve tutti i pacchetti di \textit{multicast}.\\
+ \constd{IFF\_MASTER} & L'interfaccia è il master di un bundle per il
+ bilanciamento di carico.\\
+ \constd{IFF\_SLAVE} & L'interfaccia è uno slave di un bundle per il
+ bilanciamento di carico.\\
+ \constd{IFF\_MULTICAST} & L'interfaccia ha il supporto per il
+ \textit{multicast} attivo.\\
+ \constd{IFF\_PORTSEL} & L'interfaccia può impostare i suoi parametri
+ hardware (con l'uso di \struct{ifmap}).\\
+ \constd{IFF\_AUTOMEDIA} & L'interfaccia è in grado di selezionare
+ automaticamente il tipo di collegamento.\\
+ \constd{IFF\_DYNAMIC} & Gli indirizzi assegnati all'interfaccia vengono
+ persi quando questa viene disattivata.\\
+% \const{IFF\_} & .\\
+ \hline
+ \end{tabular}
+ \caption{Le costanti che identificano i vari bit della maschera binaria
+ \var{ifr\_flags} che esprime i flag di una interfaccia di rete.}
+ \label{tab:netdevice_iface_flag}
+\end{table}
+
+
+\item[\constd{SIOCSIFFLAGS}] permette di impostare il valore dei flag
+ dell'interfaccia specificata (sempre con \var{ifr\_name}, non staremo a
+ ripeterlo oltre) attraverso il valore della maschera binaria da passare nel
+ campo \var{ifr\_flags}, che può essere ottenuta con l'OR aritmetico delle
+ costanti di tab.~\ref{tab:netdevice_iface_flag}; questa operazione è
+ privilegiata.
+
+\item[\constd{SIOCGIFMETRIC}] permette di leggere il valore della metrica del
+ dispositivo associato all'interfaccia specificata nel campo
+ \var{ifr\_metric}. Attualmente non è implementato, e l'operazione
+ restituisce sempre un valore nullo.
+
+\item[\constd{SIOCSIFMETRIC}] permette di impostare il valore della metrica del
+ dispositivo al valore specificato nel campo \var{ifr\_metric}, attualmente
+ non ancora implementato, restituisce un errore di \errval{EOPNOTSUPP}.
+
+\item[\constd{SIOCGIFMTU}] permette di leggere il valore della \textit{Maximum
+ Transfer Unit} del dispositivo nel campo \var{ifr\_mtu}.
+
+\item[\constd{SIOCSIFMTU}] permette di impostare il valore della
+ \textit{Maximum Transfer Unit} del dispositivo al valore specificato campo
+ \var{ifr\_mtu}. L'operazione è privilegiata, e si tenga presente che
+ impostare un valore troppo basso può causare un blocco del kernel.
+
+\item[\constd{SIOCGIFHWADDR}] permette di leggere il valore dell'indirizzo
+ hardware del dispositivo associato all'interfaccia nel campo
+ \var{ifr\_hwaddr}; questo viene restituito come struttura \struct{sockaddr}
+ in cui il campo \var{sa\_family} contiene un valore \texttt{ARPHRD\_*}
+ indicante il tipo di indirizzo ed il campo \var{sa\_data} il valore binario
+ dell'indirizzo hardware a partire dal byte 0.
+
+\item[\constd{SIOCSIFHWADDR}] permette di impostare il valore dell'indirizzo
+ hardware del dispositivo associato all'interfaccia attraverso il valore
+ della struttura \struct{sockaddr} (con lo stesso formato illustrato per
+ \const{SIOCGIFHWADDR}) passata nel campo \var{ifr\_hwaddr}. L'operazione è
+ privilegiata.
+
+\item[\constd{SIOCSIFHWBROADCAST}] imposta l'indirizzo \textit{broadcast}
+ hardware dell'interfaccia al valore specificato dal campo
+ \var{ifr\_hwaddr}. L'operazione è privilegiata.
+
+\item[\constd{SIOCGIFMAP}] legge alcuni parametri hardware (memoria, interrupt,
+ canali di DMA) del driver dell'interfaccia specificata, restituendo i
+ relativi valori nel campo \var{ifr\_map}; quest'ultimo contiene una
+ struttura di tipo \struct{ifmap}, la cui definizione è illustrata in
+ fig.~\ref{fig:netdevice_ifmap_struct}.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{0.80\textwidth}
+ \includestruct{listati/ifmap.h}
+ \end{minipage}
+ \caption{La struttura \structd{ifmap} utilizzata per leggere ed impostare i
+ valori dei parametri hardware di un driver di una interfaccia.}
+ \label{fig:netdevice_ifmap_struct}
+\end{figure}
+
+\item[\constd{SIOCSIFMAP}] imposta i parametri hardware del driver
+ dell'interfaccia specificata, restituendo i relativi valori nel campo
+ \var{ifr\_map}. Come per \const{SIOCGIFMAP} questo deve essere passato come
+ struttura \struct{ifmap}, secondo la definizione di
+ fig.~\ref{fig:netdevice_ifmap_struct}.
+
+\item[\constd{SIOCADDMULTI}] aggiunge un indirizzo di \textit{multicast} ai
+ filtri del livello di collegamento associati dell'interfaccia. Si deve usare
+ un indirizzo hardware da specificare attraverso il campo \var{ifr\_hwaddr},
+ che conterrà l'opportuna struttura \struct{sockaddr}; l'operazione è
+ privilegiata. Per una modalità alternativa per eseguire la stessa operazione
+ si possono usare i \textit{packet socket}, vedi
+ sez.~\ref{sec:packet_socket}.
+
+\item[\constd{SIOCDELMULTI}] rimuove un indirizzo di \textit{multicast} ai
+ filtri del livello di collegamento dell'interfaccia, vuole un indirizzo
+ hardware specificato come per \const{SIOCADDMULTI}. Anche questa operazione
+ è privilegiata e può essere eseguita in forma alternativa con i
+ \textit{packet socket}.
+
+\item[\constd{SIOCGIFTXQLEN}] permette di leggere la lunghezza della coda di
+ trasmissione del dispositivo associato all'interfaccia specificata nel campo
+ \var{ifr\_qlen}.
+
+\item[\constd{SIOCSIFTXQLEN}] permette di impostare il valore della lunghezza
+ della coda di trasmissione del dispositivo associato all'interfaccia, questo
+ deve essere specificato nel campo \var{ifr\_qlen}. L'operazione è
+ privilegiata.
+
+\item[\constd{SIOCSIFNAME}] consente di cambiare il nome dell'interfaccia
+ indicata da \var{ifr\_name} utilizzando il nuovo nome specificato nel campo
+ \var{ifr\_rename}.
+
+\end{basedescript}
+
+
+% TODO aggiunta con il kernel 3.14 SIOCGHWTSTAMP per ottenere il timestamp
+% hardware senza modificarlo
+
+Una ulteriore operazione, che consente di ricavare le caratteristiche delle
+interfacce di rete, è \constd{SIOCGIFCONF}; però per ragioni di compatibilità
+questa operazione è disponibile soltanto per i socket della famiglia
+\const{AF\_INET} (vale ad dire per socket IPv4). In questo caso l'utente dovrà
+passare come argomento una struttura \struct{ifconf}, definita in
+fig.~\ref{fig:netdevice_ifconf_struct}.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{0.80\textwidth}
+ \includestruct{listati/ifconf.h}
+ \end{minipage}
+ \caption{La struttura \structd{ifconf}.}
+ \label{fig:netdevice_ifconf_struct}
+\end{figure}
+
+Per eseguire questa operazione occorrerà allocare preventivamente un buffer di
+contenente un vettore di strutture \struct{ifreq}. La dimensione (in byte) di
+questo buffer deve essere specificata nel campo \var{ifc\_len} di
+\struct{ifconf}, mentre il suo indirizzo andrà specificato nel campo
+\var{ifc\_req}. Qualora il buffer sia stato allocato come una stringa, il suo
+indirizzo potrà essere fornito usando il campo \var{ifc\_buf}.\footnote{si
+ noti che l'indirizzo del buffer è definito in \struct{ifconf} con una
+ \dirct{union}, questo consente di utilizzare una delle due forme a piacere.}
+
+La funzione restituisce nel buffer indicato una serie di strutture
+\struct{ifreq} contenenti nel campo \var{ifr\_name} il nome dell'interfaccia e
+nel campo \var{ifr\_addr} il relativo indirizzo IP. Se lo spazio allocato nel
+buffer è sufficiente il kernel scriverà una struttura \struct{ifreq} per
+ciascuna interfaccia attiva, restituendo nel campo \var{ifc\_len} il totale
+dei byte effettivamente scritti. Il valore di ritorno è 0 se l'operazione ha
+avuto successo e negativo in caso contrario.
+
+Si tenga presente che il kernel non scriverà mai sul buffer di uscita dati
+eccedenti numero di byte specificato col valore di \var{ifc\_len} impostato
+alla chiamata della funzione, troncando il risultato se questi non dovessero
+essere sufficienti. Questa condizione non viene segnalata come errore per cui
+occorre controllare il valore di \var{ifc\_len} all'uscita della funzione, e
+verificare che esso sia inferiore a quello di ingresso. In caso contrario si è
+probabilmente\footnote{probabilmente perché si potrebbe essere nella
+ condizione in cui sono stati usati esattamente quel numero di byte.} avuta
+una situazione di troncamento dei dati.
+
+\begin{figure}[!htbp]
+ \footnotesize \centering
+ \begin{minipage}[c]{\codesamplewidth}
+ \includecodesample{listati/iflist.c}
+ \end{minipage}
+ \caption{Il corpo principale del programma \texttt{iflist.c}.}
+ \label{fig:netdevice_iflist}
+\end{figure}
+
+Come esempio dell'uso di queste funzioni si è riportato in
+fig.~\ref{fig:netdevice_iflist} il corpo principale del programma
+\texttt{iflist} in cui si utilizza l'operazione \const{SIOCGIFCONF} per
+ottenere una lista delle interfacce attive e dei relativi indirizzi. Al solito
+il codice completo è fornito nei sorgenti allegati alla guida.
+
+Il programma inizia (\texttt{\small 7--11}) con la creazione del socket
+necessario ad eseguire l'operazione, dopo di che si inizializzano
+opportunamente (\texttt{\small 13--14}) i valori della struttura
+\struct{ifconf} indicando la dimensione del buffer ed il suo
+indirizzo;\footnote{si noti come in questo caso si sia specificato l'indirizzo
+ usando il campo \var{ifc\_buf}, mentre nel seguito del programma si accederà
+ ai valori contenuti nel buffer usando \var{ifc\_req}.} si esegue poi
+l'operazione invocando \func{ioctl}, controllando come sempre la corretta
+esecuzione, ed uscendo in caso di errore (\texttt{\small 15--19}).
+
+Si esegue poi un controllo sulla quantità di dati restituiti segnalando un
+eventuale overflow del buffer (\texttt{\small 21--23}); se invece è tutto a
+posto (\texttt{\small 24--27}) si calcola e si stampa a video il numero di
+interfacce attive trovate. L'ultima parte del programma (\texttt{\small
+ 28--33}) è il ciclo sul contenuto delle varie strutture \struct{ifreq}
+restituite in cui si estrae (\texttt{\small 30}) l'indirizzo ad esse
+assegnato\footnote{si è definito \var{access} come puntatore ad una struttura
+ di tipo \struct{sockaddr\_in} per poter eseguire un \textit{casting}
+ dell'indirizzo del valore restituito nei vari campi \var{ifr\_addr}, così
+ poi da poterlo poi usare come argomento di \func{inet\_ntoa}.} e lo si
+stampa (\texttt{\small 31--32}) insieme al nome dell'interfaccia.
+
+
+
+\subsection{L'uso di \func{ioctl} per i socket TCP e UDP}
+\label{sec:sock_ioctl_IP}
+
+Non esistono operazioni specifiche per i socket IP in quanto tali,\footnote{a
+ parte forse \const{SIOCGIFCONF}, che però resta attinente alle proprietà
+ delle interfacce di rete, per cui l'abbiamo trattata in
+ sez.~\ref{sec:sock_ioctl_netdevice} insieme alle altre che comunque si
+ applicano anche ai socket IP.} mentre per i pacchetti di altri protocolli
+trasportati su IP, qualora li si gestisca attraverso dei socket, si dovrà fare
+riferimento direttamente all'eventuale supporto presente per il tipo di socket
+usato: ad esempio si possono ricevere pacchetti ICMP con socket di tipo
+\texttt{raw}, nel qual caso si dovrà fare riferimento alle operazioni di
+quest'ultimo.
+
+Tuttavia la gran parte dei socket utilizzati nella programmazione di rete
+utilizza proprio il protocollo IP, e quello che succede è che in realtà la
+funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per
+i socket che usano questo protocollo, ma queste vendono eseguite, invece che a
+livello di IP, al successivo livello di trasporto, vale a dire in maniera
+specifica per i socket TCP e UDP.
+
+Le operazioni di controllo disponibili per i socket TCP sono illustrate dalla
+relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, e prevedono
+come possibile valore per il secondo argomento della funzione le costanti
+illustrate nell'elenco seguente; il terzo argomento della funzione, gestito
+come \textit{value result argument}, deve essere sempre il puntatore ad una
+variabile di tipo \ctyp{int}:
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\constd{SIOCINQ}] restituisce la quantità di dati non ancora letti
+ presenti nel buffer di ricezione; il socket non deve essere in stato
+ \texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}.
+\item[\constd{SIOCATMARK}] ritorna un intero non nullo, da intendere come
+ valore logico, se il flusso di dati letti sul socket è arrivato sulla
+ posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti dati
+ urgenti (vedi sez.~\ref{sec:TCP_urgent_data}). Una operazione di lettura da
+ un socket non attraversa mai questa posizione, per cui è possibile
+ controllare se la si è raggiunta o meno con questa operazione.
+
+ Questo è utile quando si attiva l'opzione \const{SO\_OOBINLINE} (vedi
+ sez.~\ref{sec:sock_generic_options}) per ricevere i dati urgenti all'interno
+ del flusso dei dati ordinari del socket;\footnote{vedremo in
+ sez.~\ref{sec:TCP_urgent_data} che in genere i dati urgenti presenti su un
+ socket si leggono \textit{out-of-band} usando un opportuno flag per
+ \func{recvmsg}.} in tal caso quando \const{SIOCATMARK} restituisce un
+ valore non nullo si saprà che la successiva lettura dal socket restituirà i
+ dati urgenti e non il normale traffico; torneremo su questo in maggior
+ dettaglio in sez.~\ref{sec:TCP_urgent_data}.
+
+\item[\constd{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati
+ presenti nel buffer di spedizione; come per \const{SIOCINQ} il socket non
+ deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di
+ \errval{EINVAL}.
+\end{basedescript}
+
+Le operazioni di controllo disponibili per i socket UDP, anch'esse illustrate
+dalla relativa pagina di manuale accessibile con \texttt{man 7 udp}, sono
+quelle indicate dalle costanti del seguente elenco; come per i socket TCP il
+terzo argomento viene gestito come \textit{value result argument} e deve
+essere un puntatore ad una variabile di tipo \ctyp{int}:
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{FIONREAD}] restituisce la dimensione in byte del primo pacchetto
+ in attesa di ricezione, o 0 qualora non ci sia nessun pacchetto.
+\item[\const{TIOCOUTQ}] restituisce il numero di byte presenti nella coda di
+ invio locale; questa opzione è supportata soltanto a partire dal kernel 2.4
+\end{basedescript}
+
+
+
+\section{La gestione con \func{sysctl} ed il filesystem \texttt{/proc}}
+\label{sec:sock_sysctl_proc}
+
+Come ultimo argomento di questo capitolo tratteremo l'uso della funzione
+\func{sysctl} (che è stata introdotta nelle sue funzionalità generiche in
+sez.~\ref{sec:sys_sysctl}) per quanto riguarda le sue capacità di effettuare
+impostazioni relative alle proprietà dei socket. Dato che le stesse
+funzionalità sono controllabili direttamente attraverso il filesystem
+\texttt{/proc}, le tratteremo attraverso i file presenti in quest'ultimo.
+
+
+\subsection{L'uso di \func{sysctl} e \texttt{/proc} per le proprietà della
+ rete}
+\label{sec:sock_sysctl}
+
+La differenza nell'uso di \func{sysctl} e del filesystem \texttt{/proc}
+rispetto a quello delle funzioni \func{ioctl} e \func{fcntl} visto in
+sez.~\ref{sec:sock_ctrl_func} o all'uso di \func{getsockopt} e
+\func{setsockopt} è che queste funzioni consentono di controllare le proprietà
+di un singolo socket, mentre con \func{sysctl} e con \texttt{/proc} si
+impostano proprietà (o valori di default) validi a livello dell'intero
+sistema, e cioè per tutti i socket.
+
+Le opzioni disponibili per le proprietà della rete, nella gerarchia dei valori
+impostabili con \func{sysctl}, sono riportate sotto il nodo \texttt{net}, o,
+se acceduti tramite l'interfaccia del filesystem \texttt{/proc}, sotto
+\texttt{/proc/sys/net}. In genere sotto questa directory compaiono le
+sottodirectory (corrispondenti ad altrettanti sotto-nodi per \func{sysctl})
+relative ai vari protocolli e tipi di interfacce su cui è possibile
+intervenire per effettuare impostazioni; un contenuto tipico di questa
+directory è il seguente:
+\begin{verbatim}
+/proc/sys/net/
+|-- core
+|-- ethernet
+|-- ipv4
+|-- ipv6
+|-- irda
+|-- token-ring
+`-- unix
+\end{verbatim}
+e sono presenti varie centinaia di parametri, molti dei quali non sono neanche
+documentati; nel nostro caso ci limiteremo ad illustrare quelli più
+significativi.
+
+Si tenga presente infine che se è sempre possibile utilizzare il filesystem
+\texttt{/proc} come sostituto di \func{sysctl}, dato che i valori di nodi e
+sotto-nodi di quest'ultima sono mappati come file e directory sotto
+\texttt{/proc/sys/}, non è vero il contrario, ed in particolare Linux consente
+di impostare alcuni parametri o leggere lo stato della rete a livello di
+sistema sotto \texttt{/proc/net}, dove sono presenti dei file che non
+corrispondono a nessun nodo di \func{sysctl}.
+
+
+\subsection{I valori di controllo per i socket generici}
+\label{sec:sock_gen_sysctl}
+
+Nella directory \texttt{/proc/sys/net/core/} sono presenti i file
+corrispondenti ai parametri generici di \textit{sysctl} validi per tutti i
+socket. Quelli descritti anche nella pagina di manuale, accessibile con
+\texttt{man 7 socket} sono i seguenti:
+
+\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
+\item[\sysctlrelfiled{net/core}{rmem\_default}] imposta la dimensione
+ di default del buffer di ricezione (cioè per i dati in ingresso) dei socket.
+\item[\sysctlrelfiled{net/core}{rmem\_max}] imposta la dimensione
+ massima che si può assegnare al buffer di ricezione dei socket attraverso
+ l'uso dell'opzione \const{SO\_RCVBUF}.
+\item[\sysctlrelfiled{net/core}{wmem\_default}] imposta la dimensione
+ di default del buffer di trasmissione (cioè per i dati in uscita) dei
+ socket.
+\item[\sysctlrelfiled{net/core}{wmem\_max}] imposta la dimensione
+ massima che si può assegnare al buffer di trasmissione dei socket attraverso
+ l'uso dell'opzione \const{SO\_SNDBUF}.
+\item[\sysctlrelfiled{net/core}{message\_cost},
+ \sysctlrelfiled{net/core}{message\_burst}] contengono le impostazioni del
+ \textit{bucket filter} che controlla l'emissione di
+ messaggi di avviso da parte del kernel per eventi relativi a problemi sulla
+ rete, imponendo un limite che consente di prevenire eventuali attacchi di
+ \textit{Denial of Service} usando i log.\footnote{senza questo limite un
+ attaccante potrebbe inviare ad arte un traffico che generi
+ intenzionalmente messaggi di errore, per saturare il sistema dei log.}
+
+ \itindbeg{bucket~filter}
+
+ Il \textit{bucket filter} è un algoritmo generico che permette di impostare
+ dei limiti di flusso su una quantità\footnote{uno analogo viene usato per
+ imporre dei limiti sul flusso dei pacchetti nel \itindex{netfilter}
+ \textit{netfilter} di Linux (il \textit{netfilter} è l'infrastruttura
+ usata per il filtraggio dei pacchetti del kernel, per maggiori dettagli si
+ consulti il cap.~2 di \cite{FwGL}).} senza dovere eseguire medie
+ temporali, che verrebbero a dipendere in misura non controllabile dalla
+ dimensione dell'intervallo su cui si media e dalla distribuzione degli
+ eventi;\footnote{in caso di un picco di flusso (il cosiddetto
+ \textit{burst}) il flusso medio verrebbe a dipendere in maniera esclusiva
+ dalla dimensione dell'intervallo di tempo su cui calcola la media.} in
+ questo caso si definisce la dimensione di un ``\textsl{bidone}'' (il
+ \textit{bucket}) e del flusso che da esso può uscire, la presenza di una
+ dimensione iniziale consente di assorbire eventuali picchi di emissione,
+ l'aver fissato un flusso di uscita garantisce che a regime questo sarà il
+ valore medio del flusso ottenibile dal \textit{bucket}.
+
+ \itindend{bucket~filter}
+
+ I due valori indicano rispettivamente il flusso a regime (non sarà inviato
+ più di un messaggio per il numero di secondi specificato da
+ \texttt{message\_cost}) e la dimensione iniziale per in caso di picco di
+ emissione (verranno accettati inizialmente fino ad un massimo di
+ \texttt{message\_cost/message\_burst} messaggi).
+
+\item[\sysctlrelfiled{net/core}{netdev\_max\_backlog}] numero massimo
+ di pacchetti che possono essere contenuti nella coda di ingresso generale.
+
+\item[\sysctlrelfiled{net/core}{optmem\_max}] lunghezza massima dei
+ dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}).
+\end{basedescript}
+
+Oltre a questi nella directory \texttt{/proc/sys/net/core} si trovano altri
+file, la cui documentazione dovrebbe essere mantenuta nei sorgenti del kernel,
+nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di
+questi però non è documentato:
+\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
+\item[\sysctlrelfiled{net/core}{dev\_weight}] blocco di lavoro (\textit{work
+ quantum}) dello \textit{scheduler} di processo dei pacchetti.
+
+% TODO da documentare meglio
+
+\item[\sysctlrelfiled{net/core}{lo\_cong}] valore per l'occupazione
+ della coda di ricezione sotto la quale si considera di avere una bassa
+ congestione.
+
+\item[\sysctlrelfiled{net/core}{mod\_cong}] valore per l'occupazione della
+ coda di ricezione sotto la quale si considera di avere una congestione
+ moderata.
+
+\item[\sysctlrelfiled{net/core}{no\_cong}] valore per l'occupazione della coda
+ di ricezione sotto la quale si considera di non avere congestione.
+
+\item[\sysctlrelfiled{net/core}{no\_cong\_thresh}] valore minimo (\textit{low
+ water mark}) per il riavvio dei dispositivi congestionati.
+
+ % \item[\sysctlrelfiled{net/core}{netdev\_fastroute}] è presente
+ % soltanto quando si è compilato il kernel con l'apposita opzione di
+ % ottimizzazione per l'uso come router.
+
+\item[\sysctlrelfiled{net/core}{somaxconn}] imposta la dimensione massima
+ utilizzabile per il \textit{backlog} della funzione \func{listen} (vedi
+ sez.~\ref{sec:TCP_func_listen}), e corrisponde al valore della costante
+ \constd{SOMAXCONN}; il suo valore di default è 128.
+
+\end{basedescript}
+
+
+\subsection{I valori di controllo per il protocollo IPv4}
+\label{sec:sock_ipv4_sysctl}
+
+Nella directory \texttt{/proc/sys/net/ipv4} sono presenti i file che
+corrispondono ai parametri dei socket che usano il protocollo IPv4, relativi
+quindi sia alle caratteristiche di IP, che a quelle degli altri protocolli che
+vengono usati all'interno di quest'ultimo (come ICMP, TCP e UDP) o a fianco
+dello stesso (come ARP).
+
+I file che consentono di controllare le caratteristiche specifiche del
+protocollo IP in quanto tale, che sono descritti anche nella relativa pagina
+di manuale accessibile con \texttt{man 7 ip}, sono i seguenti:
+\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\sysctlrelfiled{net/ipv4}{ip\_default\_ttl}] imposta il valore di
+ default per il campo TTL (vedi sez.~\ref{sec:IP_header}) di tutti i
+ pacchetti uscenti, stabilendo così il numero massimo di router che i
+ pacchetti possono attraversare. Il valore può essere modificato anche per il
+ singolo socket con l'opzione \const{IP\_TTL}. Prende un valore intero, ma
+ dato che il campo citato è di 8 bit hanno senso solo valori fra 0 e 255. Il
+ valore di default è 64, e normalmente non c'è nessuna necessità di
+ modificarlo.\footnote{l'unico motivo sarebbe per raggiungere macchine
+ estremamente ``{lontane}'' in termini di \textit{hop}, ma è praticamente
+ impossibile trovarne.} Aumentare il valore è una pratica poco gentile, in
+ quanto in caso di problemi di routing si allunga inutilmente il numero di
+ ritrasmissioni.
+
+\item[\sysctlrelfiled{net/ipv4}{ip\_forward}] abilita l'inoltro dei
+ pacchetti da una interfaccia ad un altra, e può essere impostato anche per
+ la singola interfaccia. Prende un valore logico (0 disabilita, diverso da
+ zero abilita), di default è disabilitato.
+
+\item[\sysctlrelfiled{net/ipv4}{ip\_dynaddr}] abilita la riscrittura
+ automatica degli indirizzi associati ad un socket quando una interfaccia
+ cambia indirizzo. Viene usato per le interfacce usate nei collegamenti in
+ dial-up, il cui indirizzo IP viene assegnato dinamicamente dal provider, e
+ può essere modificato. Prende un valore intero, con 0 si disabilita la
+ funzionalità, con 1 la si abilita, con 2 (o con qualunque altro valore
+ diverso dai precedenti) la si abilità in modalità \textsl{prolissa}; di
+ default la funzionalità è disabilitata.
+
+\item[\sysctlrelfiled{net/ipv4}{ip\_autoconfig}] specifica se
+ l'indirizzo IP è stato configurato automaticamente dal kernel all'avvio
+ attraverso DHCP, BOOTP o RARP. Riporta un valore logico (0 falso, 1 vero)
+ accessibile solo in lettura, è inutilizzato nei kernel recenti ed eliminato
+ a partire dal kernel 2.6.18.
+
+\item[\sysctlrelfiled{net/ipv4}{ip\_local\_port\_range}] imposta l'intervallo
+ dei valori usati per l'assegnazione delle porte effimere, permette cioè di
+ modificare i valori illustrati in fig.~\ref{fig:TCP_port_alloc}; prende due
+ valori interi separati da spazi, che indicano gli estremi
+ dell'intervallo. Si abbia cura di non definire un intervallo che si
+ sovrappone a quello delle porte usate per il \textit{masquerading}, il
+ kernel può gestire la sovrapposizione, ma si avrà una perdita di
+ prestazioni. Si imposti sempre un valore iniziale maggiore di 1024 (o meglio
+ ancora di 4096) per evitare conflitti con le porte usate dai servizi noti.
+
+\item[\sysctlrelfiled{net/ipv4}{ip\_no\_pmtu\_disc}] permette di disabilitare
+ per i socket \const{SOCK\_STREAM} la ricerca automatica della \textit{Path
+ MTU} (vedi sez.~\ref{sec:net_lim_dim} e
+ sez.~\ref{sec:sock_ipv4_options}). Prende un valore logico, e di default è
+ disabilitato (cioè la ricerca viene eseguita).
+
+ In genere si abilita questo parametro quando per qualche motivo il
+ procedimento del \textit{Path MTU discovery} fallisce; dato che questo può
+ avvenire a causa di router\footnote{ad esempio se si scartano tutti i
+ pacchetti ICMP, il problema è affrontato anche in sez.~3.4.4 di
+ \cite{SGL}.} o interfacce\footnote{ad esempio se i due capi di un
+ collegamento \textit{point-to-point} non si accordano sulla stessa MTU.}
+ mal configurati è opportuno correggere le configurazioni, perché
+ disabilitare globalmente il procedimento con questo parametro ha pesanti
+ ripercussioni in termini di prestazioni di rete.
+
+\item[\sysctlrelfiled{net/ipv4}{ip\_always\_defrag}] fa si che tutti i
+ pacchetti IP frammentati siano riassemblati, anche in caso in successivo
+ immediato inoltro.\footnote{introdotto con il kernel 2.2.13, nelle versioni
+ precedenti questo comportamento poteva essere solo stabilito un volta per
+ tutte in fase di compilazione del kernel con l'opzione
+ \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.} Prende un valore logico e di default
+ è disabilitato. Con i kernel dalla serie 2.4 in poi la deframmentazione
+ viene attivata automaticamente quando si utilizza il sistema del
+ \textit{netfilter}, e questo parametro non è più presente.
+
+\item[\sysctlrelfiled{net/ipv4}{ipfrag\_high\_thresh}] indica il limite
+ massimo (espresso in numero di byte) sui pacchetti IP frammentati presenti
+ in coda; quando questo valore viene raggiunta la coda viene ripulita fino al
+ valore \texttt{ipfrag\_low\_thresh}. Prende un valore intero.
+
+\item[\sysctlrelfiled{net/ipv4}{ipfrag\_low\_thresh}] soglia bassa
+ (specificata in byte) a cui viene riportata la coda dei pacchetti IP
+ frammentati quando si raggiunge il valore massimo dato da
+ \texttt{ipfrag\_high\_thresh}. Prende un valore intero.
+
+\item[\sysctlrelfiled{net/ipv4}{ip\_nonlocal\_bind}] se abilitato rende
+ possibile ad una applicazione eseguire \func{bind} anche su un indirizzo che
+ non è presente su nessuna interfaccia locale. Prende un valore logico e di
+ default è disabilitato.
+
+ Questo può risultare utile per applicazioni particolari (come gli
+ \textit{sniffer}) che hanno la necessità di ricevere pacchetti anche non
+ diretti agli indirizzi presenti sulla macchina, ad esempio per intercettare
+ il traffico per uno specifico indirizzo che si vuole tenere sotto
+ controllo. Il suo uso però può creare problemi ad alcune applicazioni.
+
+% \item[\texttt{neigh/*}] La directory contiene i valori
+% TODO trattare neigh/* nella parte su arp, da capire dove sarà.
+
+\end{basedescript}
+
+I file di \texttt{/proc/sys/net/ipv4} che invece fanno riferimento alle
+caratteristiche specifiche del protocollo TCP, elencati anche nella rispettiva
+pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
+\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_abort\_on\_overflow}] indica al
+ kernel di azzerare le connessioni quando il programma che le riceve è troppo
+ lento ed incapace di accettarle. Prende un valore logico ed è disabilitato
+ di default. Questo consente di recuperare le connessioni se si è avuto un
+ eccesso dovuto ad un qualche picco di traffico, ma ovviamente va a discapito
+ dei client che interrogano il server. Pertanto è da abilitare soltanto
+ quando si è sicuri che non è possibile ottimizzare il server in modo che sia
+ in grado di accettare connessioni più rapidamente.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_adv\_win\_scale}] indica al kernel quale
+ frazione del buffer associato ad un socket\footnote{quello impostato con
+ \sysctlrelfile{net/ipv4}{tcp\_rmem}.} deve essere utilizzata per la
+ finestra del protocollo TCP\footnote{in sostanza il valore che costituisce
+ la \textit{advertised window} annunciata all'altro capo del socket.} e
+ quale come buffer applicativo per isolare la rete dalle latenze
+ dell'applicazione. Prende un valore intero che determina la suddetta
+ frazione secondo la formula
+ $\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se positivo o con
+ $\texttt{buffer}-\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se
+ negativo. Il default è 2 che significa che al buffer dell'applicazione
+ viene riservato un quarto del totale.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_app\_win}] indica la frazione della
+ finestra TCP che viene riservata per gestire l'overhaed dovuto alla
+ bufferizzazione. Prende un valore valore intero che consente di calcolare la
+ dimensione in byte come il massimo fra la MSS e
+ $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che
+ non viene riservato nessuno spazio; il valore di default è 31.
+
+% vecchi, presumibilmente usati quando gli algoritmi di congestione non erano
+% modularizzabili
+% \item[\texttt{tcp\_bic}]
+% \item[\texttt{tcp\_bic\_low\_window}]
+% \item[\texttt{tcp\_bic\_fast\_convergence}]
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_dsack}] abilita il supporto,
+ definito nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}, per il
+ cosiddetto \textit{Duplicate SACK}.\footnote{si indica con SACK
+ (\textit{Selective Acknowledgement}) un'opzione TCP, definita
+ nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}, usata per dare
+ un \textit{acknowledgement} unico su blocchi di pacchetti non contigui,
+ che consente di diminuire il numero di pacchetti scambiati.} Prende un
+ valore logico e di default è abilitato.
+% TODO documentare o descrivere che cos'è il Duplicate SACK o
+% mettere riferimento nelle appendici
+
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_ecn}] abilita il meccanismo della
+ \textit{Explicit Congestion Notification} (in breve ECN) nelle connessioni
+ TCP. Prende valore logico che di default è disabilitato. La \textit{Explicit
+ Congestion Notification} \itindex{Explicit~Congestion~Notification} è un
+ meccanismo che consente di notificare quando una rotta o una rete è
+ congestionata da un eccesso di traffico,\footnote{il meccanismo è descritto
+ in dettaglio nell'\href{http://www.ietf.org/rfc/rfc3168.txt}{RFC~3168}
+ mentre gli effetti sulle prestazioni del suo utilizzo sono documentate
+ nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}.} si può così
+ essere avvisati e cercare rotte alternative oppure diminuire l'emissione di
+ pacchetti (in modo da non aumentare la congestione).
+
+ Si tenga presente che se si abilita questa opzione si possono avere dei
+ malfunzionamenti apparentemente casuali dipendenti dalla destinazione,
+ dovuti al fatto che alcuni vecchi router non supportano il meccanismo ed
+ alla sua attivazione scartano i relativi pacchetti, bloccando completamente
+ il traffico.
+% TODO documentare o descrivere che cos'è l'Explicit Congestion Notification o
+% mettere riferimento nelle appendici
+
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_fack}] abilita il supporto per il
+ \textit{TCP Forward Acknowledgement}, un algoritmo per il controllo della
+ congestione del traffico. Prende un valore logico e di default è abilitato.
+
+% TODO documentare o descrivere che cos'è il TCP Forward Acknowledgement o
+% mettere riferimento nelle appendici
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_fin\_timeout}] specifica il numero di
+ secondi da passare in stato \texttt{FIN\_WAIT2} nell'attesa delle ricezione
+ del pacchetto FIN conclusivo, passati quali il socket viene comunque chiuso
+ forzatamente. Prende un valore intero che indica i secondi e di default è
+ 60.\footnote{nei kernel della serie 2.2.x era il valore utilizzato era
+ invece di 120 secondi.} L'uso di questa opzione realizza quella che in
+ sostanza è una violazione delle specifiche del protocollo TCP, ma è utile
+ per fronteggiare alcuni attacchi di \textit{Denial of Service}.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_frto}] abilita il supporto per
+ l'algoritmo F-RTO, un algoritmo usato per la ritrasmissione dei timeout del
+ protocollo TCP, che diventa molto utile per le reti wireless dove la perdita
+ di pacchetti è usualmente dovuta a delle interferenze radio, piuttosto che
+ alla congestione dei router. Prende un valore logico e di default è
+ disabilitato.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_intvl}] indica il
+ numero di secondi che deve trascorrere fra l'emissione di due successivi
+ pacchetti di test quando è abilitata la funzionalità del \textit{keepalive}
+ (vedi sez.~\ref{sec:sock_options_main}). Prende un valore intero che di
+ default è 75.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_probes}] indica il
+ massimo numero pacchetti di \textit{keepalive} (vedi
+ sez.~\ref{sec:sock_options_main}) che devono essere inviati senza ricevere
+ risposta prima che il kernel decida che la connessione è caduta e la
+ termini. Prende un valore intero che di default è 9.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_time}] indica il numero
+ di secondi che devono passare senza traffico sulla connessione prima che il
+ kernel inizi ad inviare pacchetti di pacchetti di
+ \textit{keepalive}.\footnote{ha effetto solo per i socket per cui si è
+ impostata l'opzione \const{SO\_KEEPALIVE} (vedi
+ sez.~\ref{sec:sock_options_main}.} Prende un valore intero che di default
+ è 7200, pari a due ore.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_low\_latency}] indica allo stack
+ TCP del kernel di ottimizzare il comportamento per ottenere tempi di latenza
+ più bassi a scapito di valori più alti per l'utilizzo della banda. Prende un
+ valore logico che di default è disabilitato in quanto un maggior utilizzo
+ della banda è preferito, ma esistono applicazioni particolari in cui la
+ riduzione della latenza è più importante (ad esempio per i cluster di
+ calcolo parallelo) nelle quali lo si può abilitare.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_max\_orphans}] indica il numero
+ massimo di socket TCP ``\textsl{orfani}'' (vale a dire non associati a
+ nessun file descriptor) consentito nel sistema.\footnote{trattasi in genere
+ delle connessioni relative a socket chiusi che non hanno completato il
+ processo di chiusura.} Quando il limite viene ecceduto la connessione
+ orfana viene resettata e viene stampato un avvertimento. Questo limite viene
+ usato per contrastare alcuni elementari attacchi di \textit{denial of
+ service}. Diminuire il valore non è mai raccomandato, in certe condizioni
+ di rete può essere opportuno aumentarlo, ma si deve tenere conto del fatto
+ che ciascuna connessione orfana può consumare fino a 64K di memoria del
+ kernel. Prende un valore intero, il valore di default viene impostato
+ inizialmente al valore del parametro del kernel \texttt{NR\_FILE}, e viene
+ aggiustato a seconda della memoria disponibile.
+
+% TODO verificare la spiegazione di connessione orfana.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_max\_syn\_backlog}] indica la lunghezza
+ della coda delle connessioni incomplete, cioè delle connessioni per le quali
+ si è ricevuto un SYN di richiesta ma non l'ACK finale del \textit{three way
+ handshake} (si riveda quanto illustrato in
+ sez.~\ref{sec:TCP_func_listen}).
+
+ Quando questo valore è superato il kernel scarterà immediatamente ogni
+ ulteriore richiesta di connessione. Prende un valore intero; il default, che
+ è 256, viene automaticamente portato a 1024 qualora nel sistema ci sia
+ sufficiente memoria (se maggiore di 128Mb) e ridotto a 128 qualora la
+ memoria sia poca (inferiore a 32Mb).\footnote{si raccomanda, qualora si
+ voglia aumentare il valore oltre 1024, di seguire la procedura citata
+ nella pagina di manuale di TCP, e modificare il valore della costante
+ \texttt{TCP\_SYNQ\_HSIZE} nel file \texttt{include/net/tcp.h} dei sorgenti
+ del kernel, in modo che sia $\mathtt{tcp\_max\_syn\_backlog} \ge
+ \mathtt{16*TCP\_SYNQ\_HSIZE}$, per poi ricompilare il kernel.}
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_max\_tw\_buckets}] indica il
+ numero massimo di socket in stato \texttt{TIME\_WAIT} consentito nel
+ sistema. Prende un valore intero di default è impostato al doppio del valore
+ del parametro \texttt{NR\_FILE}, ma che viene aggiustato automaticamente a
+ seconda della memoria presente. Se il valore viene superato il socket viene
+ chiuso con la stampa di un avviso; l'uso di questa funzionalità consente di
+ prevenire alcuni semplici attacchi di \textit{denial of service}.
+
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_mem}] viene usato dallo stack TCP
+ per gestire le modalità con cui esso utilizzerà la memoria. Prende una
+ tripletta di valori interi, che indicano un numero di pagine:
+
+ \begin{itemize*}
+ \item il primo valore, chiamato \textit{low} nelle pagine di manuale, indica
+ il numero di pagine allocate sotto il quale non viene usato nessun
+ meccanismo di regolazione dell'uso della memoria.
+
+ \item il secondo valore, chiamato \textit{pressure} indica il numero di
+ pagine allocate passato il quale lo stack TCP inizia a moderare il suo
+ consumo di memoria; si esce da questo stato di \textsl{pressione} sulla
+ memoria quando il numero di pagine scende sotto il precedente valore
+ \textit{low}.
+
+ \item il terzo valore, chiamato \textit{high} indica il numero massimo di
+ pagine che possono essere utilizzate dallo stack TCP/IP, e soprassiede
+ ogni altro valore specificato dagli altri limiti del kernel.
+ \end{itemize*}
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_orphan\_retries}] indica il numero
+ massimo di volte che si esegue un tentativo di controllo sull'altro capo di
+ una connessione che è stata già chiusa dalla nostra parte. Prende un valore
+ intero che di default è 8.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_reordering}] indica il numero
+ massimo di volte che un pacchetto può essere riordinato nel flusso di dati,
+ prima che lo stack TCP assuma che è andato perso e si ponga nello stato di
+ \textit{slow start} (si veda sez.~\ref{sec:tcp_protocol_xxx}) viene usata
+ questa metrica di riconoscimento dei riordinamenti per evitare inutili
+ ritrasmissioni provocate dal riordinamento. Prende un valore intero che di
+ default che è 3, e che non è opportuno modificare.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_retrans\_collapse}] in caso di
+ pacchetti persi durante una connessione, per ottimizzare l'uso della banda
+ il kernel cerca di eseguire la ritrasmissione inviando pacchetti della
+ massima dimensione possibile; in sostanza dati che in precedenza erano stati
+ trasmessi su pacchetti diversi possono essere ritrasmessi riuniti su un solo
+ pacchetto (o su un numero minore di pacchetti di dimensione
+ maggiore). Prende un valore logico e di default è abilitato.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_retries1}] imposta il massimo
+ numero di volte che protocollo tenterà la ritrasmissione si un pacchetto su
+ una connessione stabilita prima di fare ricorso ad ulteriori sforzi che
+ coinvolgano anche il livello di rete. Passato questo numero di
+ ritrasmissioni verrà fatto eseguire al livello di rete un tentativo di
+ aggiornamento della rotta verso la destinazione prima di eseguire ogni
+ successiva ritrasmissione. Prende un valore intero che di default è 3.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_retries2}] imposta il numero di
+ tentativi di ritrasmissione di un pacchetto inviato su una connessione già
+ stabilita per il quale non si sia ricevuto una risposta di ACK (si veda
+ anche quanto illustrato in sez.~\ref{sec:TCP_server_crash}). Prende un
+ valore intero che di default è 15, il che comporta un tempo variabile fra 13
+ e 30 minuti; questo non corrisponde a quanto richiesto
+ nell'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} dove è indicato un
+ massimo di 100 secondi, che però è un valore considerato troppo basso.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_rfc1337}] indica al kernel di
+ abilitare il comportamento richiesto
+ nell'\href{http://www.ietf.org/rfc/rfc1337.txt}{RFC~1337}. Prende un valore
+ logico e di default è disabilitato, il che significa che alla ricezione di
+ un segmento RST in stato \texttt{TIME\_WAIT} il socket viene chiuso
+ immediatamente senza attendere la conclusione del periodo di
+ \texttt{TIME\_WAIT}.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_rmem}] viene usato dallo stack TCP
+ per controllare dinamicamente le dimensioni dei propri buffer di ricezione,
+ anche in rapporto alla memoria disponibile. Prende una tripletta di valori
+ interi separati da spazi che indicano delle dimensioni in byte:
+
+ \begin{itemize}
+ \item il primo valore, chiamato \textit{min} nelle pagine di manuale, indica
+ la dimensione minima in byte del buffer di ricezione; il default è 4Kb, ma
+ in sistemi con poca memoria viene automaticamente ridotto a
+ \const{PAGE\_SIZE}. Questo valore viene usato per assicurare che anche in
+ situazioni di pressione sulla memoria (vedi quanto detto per
+ \sysctlrelfile{net/ipv4}{tcp\_rmem}) le allocazioni al di sotto di
+ questo limite abbiamo comunque successo. Questo valore non viene comunque
+ ad incidere sulla dimensione del buffer di ricezione di un singolo socket
+ dichiarata con l'opzione \const{SO\_RCVBUF}.
+
+ \item il secondo valore, denominato \textit{default} nelle pagine di
+ manuale, indica la dimensione di default, in byte, del buffer di ricezione
+ di un socket TCP. Questo valore sovrascrive il default iniziale impostato
+ per tutti i socket con \sysctlfile{net/core/mem\_default} che vale per
+ qualunque protocollo. Il default è 87380 byte, ridotto a 43689 per sistemi
+ con poca memoria. Se si desiderano dimensioni più ampie per tutti i socket
+ si può aumentare questo valore, ma se si vuole che in corrispondenza
+ aumentino anche le dimensioni usate per la finestra TCP si deve abilitare
+ il \textit{TCP window scaling} (di default è abilitato, vedi più avanti
+ \sysctlrelfile{net/ipv4}{tcp\_window\_scaling}).
+
+ \item il terzo valore, denominato \textit{max} nelle pagine di manuale,
+ indica la dimensione massima in byte del buffer di ricezione di un socket
+ TCP; il default è 174760 byte, che viene ridotto automaticamente a 87380
+ per sistemi con poca memoria. Il valore non può comunque eccedere il
+ limite generale per tutti i socket posto con
+ \sysctlfile{net/core/rmem\_max}. Questo valore non viene ad
+ incidere sulla dimensione del buffer di ricezione di un singolo socket
+ dichiarata con l'opzione \const{SO\_RCVBUF}.
+ \end{itemize}
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_sack}] indica al kernel di
+ utilizzare il meccanismo del \textit{TCP selective acknowledgement} definito
+ nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}. Prende un valore
+ logico e di default è abilitato.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_stdurg}] indica al kernel di
+ utilizzare l'interpretazione che viene data
+ dall'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} del puntatore dei
+ \textit{dati urgenti} (vedi sez.~\ref{sec:TCP_urgent_data}) in cui questo
+ punta all'ultimo byte degli stessi; se disabilitato viene usata
+ l'interpretazione usata da BSD per cui esso punta al primo byte successivo.
+ Prende un valore logico e di default è disabilitato, perché abilitarlo può
+ dar luogo a problemi di interoperabilità.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_synack\_retries}] indica il numero
+ massimo di volte che verrà ritrasmesso il segmento SYN/ACK nella creazione di
+ una connessione (vedi sez.~\ref{sec:TCP_conn_cre}). Prende un valore intero
+ ed il valore di default è 5; non si deve superare il valore massimo di 255.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_syncookies}] abilita i \textit{TCP
+ syncookies}.\footnote{per poter usare questa funzionalità è necessario
+ avere abilitato l'opzione \texttt{CONFIG\_SYN\_COOKIES} nella compilazione
+ del kernel.} Prende un valore logico, e di default è disabilitato. Questa
+ funzionalità serve a fornire una protezione in caso di un attacco di tipo
+ \textit{SYN flood}, e deve essere utilizzato come ultima risorsa dato che
+ costituisce una violazione del protocollo TCP e confligge con altre
+ funzionalità come le estensioni e può causare problemi per i client ed il
+ reinoltro dei pacchetti.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_syn\_retries}] imposta il numero di
+ tentativi di ritrasmissione dei pacchetti SYN di inizio connessione del
+ \textit{three way handshake} (si ricordi quanto illustrato in
+ sez.~\ref{sec:TCP_func_connect}). Prende un valore intero che di default è
+ 5; non si deve superare il valore massimo di 255.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_timestamps}] abilita l'uso dei
+ \textit{TCP timestamps}, come definiti
+ nell'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}. Prende un valore
+ logico e di default è abilitato.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_recycle}] abilita il riutilizzo
+ rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore logico e di
+ default è disabilitato. Non è opportuno abilitare questa opzione che può
+ causare problemi con il NAT.\footnote{il
+ \itindex{Network~Address~Translation} \textit{Network Address Translation}
+ è una tecnica, impiegata nei firewall e nei router, che consente di
+ modificare al volo gli indirizzi dei pacchetti che transitano per una
+ macchina, Linux la supporta con il \textit{netfilter}.}
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo
+ dello stato \texttt{TIME\_WAIT} quando questo è sicuro dal punto di vista
+ del protocollo. Prende un valore logico e di default è disabilitato.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_window\_scaling}] un valore
+ logico, attivo di default, che abilita la funzionalità del
+ \itindex{TCP~window~scaling} \textit{TCP window scaling} definita
+ dall'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}. Prende un valore
+ logico e di default è abilitato. Come accennato in
+ sez.~\ref{sec:TCP_TCP_opt} i 16 bit della finestra TCP comportano un limite
+ massimo di dimensione di 64Kb, ma esiste una opportuna opzione del
+ protocollo che permette di applicare un fattore di scale che consente di
+ aumentarne le dimensioni. Questa è pienamente supportata dallo stack TCP di
+ Linux, ma se lo si disabilita la negoziazione del
+ \itindex{TCP~window~scaling} \textit{TCP window scaling} con l'altro capo
+ della connessione non viene effettuata.
+
+%\item[\sysctlrelfiled{net/ipv4}{tcp\_vegas\_cong\_avoid}]
+% TODO: controllare su internet
+
+%\item[\sysctlrelfiled{net/ipv4}{tcp\_westwood}]
+% TODO: controllare su internet
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_wmem}] viene usato dallo stack TCP
+ per controllare dinamicamente le dimensioni dei propri buffer di spedizione,
+ adeguandole in rapporto alla memoria disponibile. Prende una tripletta di
+ valori interi separati da spazi che indicano delle dimensioni in byte:
+
+ \begin{itemize}
+ \item il primo valore, chiamato \textit{min}, indica la dimensione minima in
+ byte del buffer di spedizione; il default è 4Kb. Come per l'analogo di
+ \sysctlrelfile{net/ipv4}{tcp\_rmem}) viene usato per assicurare
+ che anche in situazioni di pressione sulla memoria (vedi
+ \sysctlrelfile{net/ipv4}{tcp\_mem}) le allocazioni al di sotto di
+ questo limite abbiamo comunque successo. Di nuovo questo valore non viene
+ ad incidere sulla dimensione del buffer di trasmissione di un singolo
+ socket dichiarata con l'opzione \const{SO\_SNDBUF}.
+
+ \item il secondo valore, denominato \textit{default}, indica la dimensione
+ di default in byte del buffer di spedizione di un socket TCP. Questo
+ valore sovrascrive il default iniziale impostato per tutti i tipi di
+ socket con \sysctlfile{net/core/wmem\_default}. Il default è 87380 byte,
+ ridotto a 43689 per sistemi con poca memoria. Si può aumentare questo
+ valore quando si desiderano dimensioni più ampie del buffer di
+ trasmissione per i socket TCP, ma come per il precedente
+ \sysctlrelfile{net/ipv4}{tcp\_rmem}) se si vuole che in corrispondenza
+ aumentino anche le dimensioni usate per la finestra TCP si deve abilitare
+ il \textit{TCP window scaling} con
+ \sysctlrelfile{net/ipv4}{tcp\_window\_scaling}.
+
+ \item il terzo valore, denominato \textit{max}, indica la dimensione massima
+ in byte del buffer di spedizione di un socket TCP; il default è 128Kb, che
+ viene ridotto automaticamente a 64Kb per sistemi con poca memoria. Il
+ valore non può comunque eccedere il limite generale per tutti i socket
+ posto con \sysctlfile{net/core/wmem\_max}. Questo valore non viene
+ ad incidere sulla dimensione del buffer di trasmissione di un singolo
+ socket dichiarata con l'opzione \const{SO\_SNDBUF}.
+ \end{itemize}
+
+\end{basedescript}
+
+
+
+% LocalWords: socket sez dotted decimal resolver Domain Name Service cap DNS
+% LocalWords: client fig LDAP Lightweight Access Protocol NIS Information Sun
+% LocalWords: like netgroup Switch Solaris glibc libc uclib NSS tab shadow uid
+% LocalWords: username group aliases ethers MAC address hosts networks rpc RPC
+% LocalWords: protocols services dns db lib libnss org truelite it root res HS
+% LocalWords: resource init netinet resolv int void conf host LOCALDOMAIN TCP
+% LocalWords: options DEBUG debug AAONLY USEVC UDP PRIMARY IGNTC RECURSE INET
+% LocalWords: DEFNAMES search STAYOPEN DNSRCH INSECURE NOALIASES HOSTALIASES
+% LocalWords: IPv gethostbyname NOCHECKNAME KEEPTSIG TSIG BLAST RETRY retry NS
+% LocalWords: retrans query FQDN Fully Qualified const char dname class type
+% LocalWords: unsigned answer anslen CSNET Hesiod MIT CHAOS Chaosnet ANY BIND
+% LocalWords: nameser compat Berkley MF CNAME SOA MB MR NULL WKS PTR HINFO TXT
+% LocalWords: MINFO RP responsible person AFSDB AFS RT router NSAP SIG KEY PX
+% LocalWords: GPOS AAAA LOC NXT EID NIMLOC nimrod SRV ATMA ATM NAPTR naming AF
+% LocalWords: authority IXFR AXFR MAILB MAILA errno NOT FOUND RECOVERY TRY err
+% LocalWords: AGAIN herror netdb string perror error hstrerror strerror struct
+% LocalWords: hostent name addrtype length addr list sys af mygethost inet ret
+% LocalWords: ntop deep copy buf size buflen result errnop value argument len
+% LocalWords: ERANGE sethostent stayopen endhostent gethostbyaddr order pton
+% LocalWords: getipnodebyname getipnodebyaddr flags num MAPPED ALL ADDRCONFIG
+% LocalWords: freehostent ip getXXXbyname getXXXbyaddr servent getservbyname
+% LocalWords: netent getnetbyname getnetbyaddr protoent smtp udp
+% LocalWords: getprotobyname getprotobyaddr getservbyport port tcp setservent
+% LocalWords: getservent endservent setXXXent getXXXent endXXXent gethostent
+% LocalWords: setnetent getnetent endnetent setprotoent getprotoent POSIX RFC
+% LocalWords: endprotoent getaddrinfo getnameinfo nell' node service addrinfo
+% LocalWords: hints linked addrlen socklen family socktype protocol sockaddr
+% LocalWords: canonname next PF UNSPEC SOCK STREAM DGRAM bind INADDR loopback
+% LocalWords: connect sendto NUMERICHOST EAI NONAME SYSTEM BADFLAGS ADDRFAMILY
+% LocalWords: NODATA MEMORY FAIL errcode echo mygetaddr ptr casting Canonical
+% LocalWords: freeaddrinfo getservname salen hostlen serv servlen l'OR NI NUL
+% LocalWords: NOFQDN NAMEREQD NUMERICSERV MAXHOST MAXSERV sockconn SockUtil of
+% LocalWords: descriptor hint fifth sockbind setsockopt getsockopt sock level
+% LocalWords: optname optval optlen EBADF EFAULT EINVAL ENOPROTOOPT ENOTSOCK
+% LocalWords: IPPROTO Stevens ICMP ICMPV ICMPv get KEEPALIVE OOBINLINE timeval
+% LocalWords: RCVLOWAT SNDLOWAT RCVTIMEO SNDTIMEO BSDCOMPAT BSD PASSCRED ucred
+% LocalWords: PEERCRED BINDTODEVICE REUSEADDR ACCEPTCONN DONTROUTE gateway MSG
+% LocalWords: BROADCAST broadcast SNDBUF RCVBUF LINGER linger PRIORITY read IF
+% LocalWords: OOB recvmsg kernel select write readv recv recvfrom EAGAIN send
+% LocalWords: EWOULDBLOCK writev sendmsg raw domain SCM CREDENTIALS eth packet
+% LocalWords: IFNAMSIZ capabilities capability ADMIN log trpt EADDRINUSE close
+% LocalWords: listen routing sysctl shutdown Quality TOS keep alive ACK RST to
+% LocalWords: ECONNRESET ETIMEDOUT keepalive echod fourth newsgroup WAIT reuse
+% LocalWords: sockbindopt SockUtils homed completely binding RECVDSTADDR onoff
+% LocalWords: PKTINFO getsockname multicast streaming unicast REUSEPORT reset
+% LocalWords: stealing ling RECVTOS RECVTTL TTL RECVOPTS RETOPTS HDRINCL MTU
+% LocalWords: RECVERR DISCOVER Path Discovery ALERT alert ADD MEMBERSHIP mreqn
+% LocalWords: pktinfo ipi ifindex spec dst RECVIF Live IPTOS LOWDELAY Advanced
+% LocalWords: Transfer Unit PMTUDISC DONT WANT route dall' pmtu EMSGSIZE imr
+% LocalWords: multiaddr mreq fcntl ioctl request SIOCGSTAMP trip SIOCSPGRP pid
+% LocalWords: process SIGIO SIGURG KILL FIOASYNC SIOCGPGRP filesystem proc ttl
+% LocalWords: rmem wmem message cost burst bucket filter netdev backlog optmem
+% LocalWords: forward dynaddr dial autoconfig local masquerading ipfrag high
+% LocalWords: thresh low always defrag CONFIG SETSIG cmd FIOGETOWN FIOSETOWN
+% LocalWords: quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS
+% LocalWords: Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work
+% LocalWords: netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer is
+% LocalWords: linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO
+% LocalWords: DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent MSS
+% LocalWords: Segment SYN accept advertised window info quickack Nagle ifreq
+% LocalWords: ifr ppp union EPERM SIOCGIFNAME dell' interface index IFF NOARP
+% LocalWords: SIOCGIFINDEX SIOCGIFFLAGS POINTOPOINT RUNNING PROMISC NOTRAILERS
+% LocalWords: ALLMULTI bundle PORTSEL ifmap AUTOMEDIA DYNAMIC SIOCSIFFLAGS way
+% LocalWords: SIOCGIFMETRIC SIOCSIFMETRIC SIOCGIFMTU SIOCSIFMTU SIOCGIFHWADDR
+% LocalWords: SIOCSIFHWADDR SIOCSIFHWBROADCAST SIOCGIFMAP SIOCSIFMAP sendfile
+% LocalWords: SIOCADDMULTI SIOCDELMULTI SIOCGIFTXQLEN SIOCSIFTXQLEN three syn
+% LocalWords: SIOCSIFNAME SIOCGIFCONF handshake retries MIN FreeBSD closing Mb
+% LocalWords: abort overflow adv win app bic convergence dsack ecn fack frto
+% LocalWords: intvl probes latency orphans l'ACK SYNQ HSIZE tw buckets mem rfc
+% LocalWords: orphan reordering collapse sack stdurg synack syncookies recycle
+% LocalWords: timestamps scaling vegas avoid westwood tcpi l'incapsulazione NR
+% LocalWords: metric EOPNOTSUPP mtu hwaddr ARPHRD interrupt DMA map qlen silly
+% LocalWords: rename ifconf syndrome dell'ACK FTP ACCEPTFILTER advanced reno
+% LocalWords: congestion control Networking cubic CUBIC highspeed HSTCP htcp
+% LocalWords: HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa Kb
+% LocalWords: hop Selective acknowledgement Explicit RTO stack firewall passwd
+% LocalWords: Notification wireless denial pressure ATTACH DETACH publickey
+% LocalWords: libpcap discovery point l'overhaed min PAGE flood NFS blast
+% LocalWords: selective COOKIES NAT Translation
+