+L'uso di \const{SO\_LINGER} con \func{setsockopt} permette di modificare (ed
+eventualmente ripristinare) questo comportamento in base ai valori passati nei
+campi della struttura \struct{linger}, illustrata in
+fig.~\ref{fig:sock_linger_struct}. Fintanto che il valore del campo
+\var{l\_onoff} di \struct{linger} è nullo la modalità che viene impostata
+(qualunque sia il valore di \var{l\_linger}) è quella standard appena
+illustrata; questa combinazione viene utilizzata per riportarsi al
+comportamento normale qualora esso sia stato cambiato da una precedente
+chiamata.
+
+Se si utilizza un valore di \var{l\_onoff} diverso da zero, il comportamento
+alla chiusura viene a dipendere dal valore specificato per il campo
+\var{l\_linger}; se quest'ultimo è nullo l'uso delle funzioni \func{close} e
+\func{shutdown} provoca la terminazione immediata della connessione: nel caso
+di TCP cioè non viene eseguito il procedimento di chiusura illustrato in
+sez.~\ref{sec:TCP_conn_term}, ma tutti i dati ancora presenti nel buffer
+vengono immediatamente scartati e sulla rete viene inviato un segmento di RST
+che termina immediatamente la connessione.
+
+Un esempio di questo comportamento si può abilitare nel nostro client del
+servizio \textit{echo} utilizzando l'opzione \texttt{-r}; riportiamo in
+fig.~\ref{fig:TCP_echo_sixth} la sezione di codice che permette di introdurre
+questa funzionalità,; al solito il codice completo è disponibile nei sorgenti
+allegati.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \includecodesample{listati/TCP_echo_sixth.c}
+ \end{minipage}
+ \normalsize
+ \caption{La sezione del codice del client \textit{echo} che imposta la
+ terminazione immediata della connessione in caso di chiusura.}
+ \label{fig:TCP_echo_sixth}
+\end{figure}
+
+La sezione indicata viene eseguita dopo aver effettuato la connessione e prima
+di chiamare la funzione di gestione, cioè fra le righe (\texttt{\small 12}) e
+(\texttt{\small 13}) del precedente esempio di fig.~\ref{fig:TCP_echo_fifth}.
+Il codice si limita semplicemente a controllare (\texttt{\small 3}) il
+valore della variabile \var{reset} che assegnata nella gestione delle opzioni
+in corrispondenza all'uso di \texttt{-r} nella chiamata del client. Nel caso
+questa sia diversa da zero vengono impostati (\texttt{\small 5--6}) i valori
+della struttura \var{ling} che permettono una terminazione immediata della
+connessione. Questa viene poi usata nella successiva (\texttt{\small 7})
+chiamata a \func{setsockopt}. Al solito si controlla (\texttt{\small 7--10})
+il valore di ritorno e si termina il programma in caso di errore, stampandone
+il valore.
+
+Infine l'ultima possibilità, quella in cui si utilizza effettivamente
+\const{SO\_LINGER} per \textsl{indugiare} nella chiusura, è quella in cui sia
+\var{l\_onoff} che \var{l\_linger} hanno un valore diverso da zero. Se si
+esegue l'impostazione con questi valori sia \func{close} che \func{shutdown}
+si bloccano, nel frattempo viene eseguita la normale procedura di conclusione
+della connessione (quella di sez.~\ref{sec:TCP_conn_term}) ma entrambe le
+funzioni non ritornano fintanto che non si sia concluso il procedimento di
+chiusura della connessione, o non sia passato un numero di
+secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata da
+ Linux, altri kernel possono usare unità di misura diverse, oppure usare il
+ campo \var{l\_linger} come valore logico (ignorandone il valore) per rendere
+ (quando diverso da zero) \func{close} e \func{shutdown} bloccanti fino al
+ completamento della trasmissione dei dati sul buffer.} pari al valore
+specificato in \var{l\_linger}.
+
+\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|)}
+
+
+
+\subsection{Le opzioni per il protocollo IPv4}
+\label{sec:sock_ipv4_options}
+
+Il secondo insieme di opzioni dei socket che tratteremo è quello relativo ai
+socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni
+ generiche una descrizione di esse è disponibile nella settima sezione delle
+ pagine di manuale, nel caso specifico la documentazione si può consultare
+ con \texttt{man 7 ip}.} Se si vuole operare su queste opzioni generiche il
+livello da utilizzare è \const{SOL\_IP} (o l'equivalente \const{IPPROTO\_IP});
+si è riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_iplevel}.
+Le costanti indicanti le opzioni e tutte le altre costanti ad esse collegate
+sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|c|c|c|l|l|}
+ \hline
+ \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
+ \textbf{Descrizione}\\
+ \hline
+ \hline
+ \const{IP\_OPTIONS} &$\bullet$&$\bullet$&&\texttt{void *}& %???
+ Imposta o riceve le opzioni di IP.\\
+ \const{IP\_PKTINFO} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio di informazione.\\
+ \const{IP\_RECVTOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio col campo TOS.\\
+ \const{IP\_RECVTTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio col campo TTL.\\
+ \const{IP\_RECVOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio con le opzioni IP.\\
+ \const{IP\_RETOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio con le opzioni IP non trattate.\\
+ \const{IP\_TOS} &$\bullet$&$\bullet$& &\texttt{int}&
+ Imposta il valore del campo TOS.\\
+ \const{IP\_TTL} &$\bullet$&$\bullet$& &\texttt{int}&
+ Imposta il valore del campo TTL.\\
+ \const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa l'intestazione di IP nei dati.\\
+ \const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Abilita la gestione degli errori.\\
+ \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}&
+ Imposta il Path MTU Discovery.\\
+ \const{IP\_MTU} &$\bullet$& & &\texttt{int}&
+ Legge il valore attuale della MTU.\\
+ \const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Imposta l'opzione \textit{IP router alert} sui pacchetti.\\
+ \const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$& &\texttt{int}&
+ Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
+ \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Controlla il reinvio a se stessi dei dati di \itindex{multicast}
+ \textit{multicast}.\\
+ \const{IP\_ADD\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreqn}&
+ Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
+ \const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}&
+ Si sgancia da un gruppo di \textit{multicast}.\\
+ \const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}&
+ Imposta l'interfaccia locale di un socket \itindex{multicast}
+ \textit{multicast}.\\
+ \hline
+ \end{tabular}
+ \caption{Le opzioni disponibili al livello \const{SOL\_IP}.}
+ \label{tab:sock_opt_iplevel}
+\end{table}
+
+Le descrizioni riportate in tab.~\ref{tab:sock_opt_iplevel} sono estremamente
+succinte, una maggiore quantità di dettagli sulle varie opzioni è fornita nel
+seguente elenco:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+
+
+\item[\const{IP\_OPTIONS}] l'opzione permette di impostare o leggere le
+ opzioni del protocollo IP (si veda sez.~\ref{sec:IP_options}). L'opzione
+ prende come valore dell'argomento \param{optval} un puntatore ad un buffer
+ dove sono mantenute le opzioni, mentre \param{optlen} indica la dimensione
+ di quest'ultimo. Quando la si usa con \func{getsockopt} vengono lette le
+ opzioni IP utilizzate per la spedizione, quando la si usa con
+ \func{setsockopt} vengono impostate le opzioni specificate. L'uso di questa
+ opzione richiede una profonda conoscenza del funzionamento del protocollo,
+ torneremo in parte sull'argomento in sez.~\ref{sec:sock_IP_options}.
+
+
+\item[\const{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere
+ insieme ai pacchetti un messaggio ancillare (vedi
+ sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente
+ una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che
+ mantiene una serie di informazioni riguardo i pacchetti in arrivo. In
+ particolare è possibile conoscere l'interfaccia su cui è stato ricevuto un
+ pacchetto (nel campo \var{ipi\_ifindex}), l'indirizzo locale da esso
+ utilizzato (nel campo \var{ipi\_spec\_dst}) e l'indirizzo remoto dello
+ stesso (nel campo \var{ipi\_addr}).
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \includestruct{listati/pktinfo.h}
+ \end{minipage}
+ \caption{La struttura \structd{pktinfo} usata dall'opzione
+ \const{IP\_PKTINFO} per ricavare informazioni sui pacchetti di un socket
+ di tipo \const{SOCK\_DGRAM}.}
+ \label{fig:sock_pktinfo_struct}
+\end{figure}
+
+
+L'opzione è utilizzabile solo per socket di tipo \const{SOCK\_DGRAM}. Questa è
+una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di
+Linux;\footnote{non dovrebbe pertanto essere utilizzata se si ha a cuore la
+ portabilità.} essa permette di sostituire le opzioni \const{IP\_RECVDSTADDR}
+e \const{IP\_RECVIF} presenti in altri Unix (la relativa informazione è quella
+ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
+\struct{pktinfo}).
+
+L'opzione prende per \param{optval} un intero usato come valore logico, che
+specifica soltanto se insieme al pacchetto deve anche essere inviato o
+ricevuto il messaggio \const{IP\_PKTINFO} (vedi
+sez.~\ref{sec:net_ancillary_data}); il messaggio stesso dovrà poi essere
+letto o scritto direttamente con \func{recvmsg} e \func{sendmsg} (vedi
+sez.~\ref{sec:net_sendmsg}).
+
+
+\item[\const{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere
+ insieme ai pacchetti un messaggio ancillare (vedi
+ sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_TOS}, che contiene un
+ byte con il valore del campo \textit{Type of Service} dell'intestazione IP
+ del pacchetto stesso (vedi sez.~\ref{sec:IP_header}). Prende per
+ \param{optval} un intero usato come valore logico.
+
+\item[\const{IP\_RECVTTL}] Quando abilitata l'opzione permette di ricevere
+ insieme ai pacchetti un messaggio ancillare (vedi
+ sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_RECVTTL}, contenente
+ un byte con il valore del campo \textit{Time to Live} dell'intestazione IP
+ (vedi sez.~\ref{sec:IP_header}). L'opzione richiede per \param{optval} un
+ intero usato come valore logico. L'opzione non è supportata per socket di
+ tipo \const{SOCK\_STREAM}.
+
+\item[\const{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere
+ insieme ai pacchetti un messaggio ancillare (vedi
+ sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_OPTIONS}, contenente
+ le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le
+ intestazioni di instradamento e le altre opzioni sono già riempite con i
+ dati locali. L'opzione richiede per \param{optval} un intero usato come
+ valore logico. L'opzione non è supportata per socket di tipo
+ \const{SOCK\_STREAM}.
+
+\item[\const{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma
+ in questo caso restituisce i dati grezzi delle opzioni, senza che siano
+ riempiti i capi di instradamento e le marche temporali. L'opzione richiede
+ per \param{optval} un intero usato come valore logico. L'opzione non è
+ supportata per socket di tipo \const{SOCK\_STREAM}.
+
+\item[\const{IP\_TOS}] L'opzione consente di leggere o impostare il campo
+ \textit{Type of Service} dell'intestazione IP (vedi
+ sez.~\ref{sec:IP_header}) che permette di indicare le priorità dei
+ pacchetti. Se impostato il valore verrà mantenuto per tutti i pacchetti del
+ socket; alcuni valori (quelli che aumentano la priorità) richiedono i
+ privilegi di amministrazione con la \itindex{capabilities} capability
+ \const{CAP\_NET\_ADMIN}.
+
+ Il campo TOS è di 8 bit e l'opzione richiede per \param{optval} un intero
+ che ne contenga il valore. Sono definite anche alcune costanti che
+ definiscono alcuni valori standardizzati per il \textit{Type of Service},
+ riportate in tab.~\ref{tab:IP_TOS_values}, il valore di default usato da
+ Linux è \const{IPTOS\_LOWDELAY}, ma esso può essere modificato con le
+ funzionalità del cosiddetto \textit{Advanced Routing}. Si ricordi che la
+ priorità dei pacchetti può essere impostata anche in maniera indipendente
+ dal protocollo utilizzando l'opzione \const{SO\_PRIORITY} illustrata in
+ sez.~\ref{sec:sock_generic_options}.
+
+\item[\const{IP\_TTL}] L'opzione consente di leggere o impostare il campo
+ \textit{Time to Live} dell'intestazione IP (vedi sez.~\ref{sec:IP_header})
+ per tutti i pacchetti associati al socket. Il campo TTL è di 8 bit e
+ l'opzione richiede che \param{optval} sia un intero, che ne conterrà il
+ valore.
+
+\item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso
+ l'intestazione IP in cima ai propri dati. L'opzione è valida soltanto per
+ socket di tipo \const{SOCK\_RAW}, e quando utilizzata eventuali valori
+ impostati con \const{IP\_OPTIONS}, \const{IP\_TOS} o \const{IP\_TTL} sono
+ ignorati. In ogni caso prima della spedizione alcuni campi
+ dell'intestazione vengono comunque modificati dal kernel, torneremo
+ sull'argomento in sez.~\ref{sec:socket_raw}
+
+\item[\const{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della
+ serie 2.2.x, ed è specifica di Linux. Essa permette di usufruire di un
+ meccanismo affidabile per ottenere un maggior numero di informazioni in caso
+ di errori. Se l'opzione è abilitata tutti gli errori generati su un socket
+ vengono memorizzati su una coda, dalla quale poi possono essere letti con
+ \func{recvmsg} (vedi sez.~\ref{sec:net_sendmsg}) come messaggi ancillari
+ (torneremo su questo in sez.~\ref{sec:net_ancillary_data}) di tipo
+ \const{IP\_RECVERR}. L'opzione richiede per \param{optval} un intero usato
+ come valore logico e non è applicabile a socket di tipo
+ \const{SOCK\_STREAM}.
+
+\itindbeg{Maximum~Transfer~Unit}
+\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel
+ della serie 2.2.x, ed è specifica di Linux. L'opzione permette di scrivere
+ o leggere le impostazioni della modalità usata per la determinazione della
+ \textit{Path Maximum Transfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) del
+ socket. L'opzione prende per \param{optval} un valore intero che indica la
+ modalità usata, da specificare con una delle costanti riportate in
+ tab.~\ref{tab:sock_ip_mtu_discover}.
+
+ \begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|p{7cm}|}
+ \hline
+ \multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato} \\
+ \hline
+ \hline
+ \const{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path
+ MTU}.\\
+ \const{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta
+ utilizzata dai pacchetti (dal comando
+ \texttt{route}).\\
+ \const{IP\_PMTUDISC\_DO} &2& Esegue la procedura di determinazione
+ della \textit{Path MTU} come richiesto
+ dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\
+ \hline
+ \end{tabular}
+ \caption{Valori possibili per l'argomento \param{optval} di
+ \const{IP\_MTU\_DISCOVER}.}
+ \label{tab:sock_ip_mtu_discover}
+ \end{table}
+
+ Il valore di default applicato ai socket di tipo \const{SOCK\_STREAM} è
+ determinato dal parametro \texttt{ip\_no\_pmtu\_disc} (vedi
+ sez.~\ref{sec:sock_sysctl}), mentre per tutti gli altri socket di default la
+ ricerca è disabilitata ed è responsabilità del programma creare pacchetti di
+ dimensioni appropriate e ritrasmettere eventuali pacchetti persi. Se
+ l'opzione viene abilitata, il kernel si incaricherà di tenere traccia
+ automaticamente della \textit{Path MTU} verso ciascuna destinazione, e
+ rifiuterà immediatamente la trasmissione di pacchetti di dimensioni maggiori
+ della MTU con un errore di \errval{EMSGSIZE}.\footnote{in caso contrario la
+ trasmissione del pacchetto sarebbe effettuata, ottenendo o un fallimento
+ successivo della trasmissione, o la frammentazione dello stesso.}
+
+\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
+ di percorso del socket. L'opzione richiede per \param{optval} un intero che
+ conterrà il valore della \textit{Path MTU} in byte. Questa è una opzione
+ introdotta con i kernel della serie 2.2.x, ed è specifica di Linux.
+
+ È tramite questa opzione che un programma può leggere, quando si è avuto un
+ errore di \errval{EMSGSIZE}, il valore della MTU corrente del socket. Si
+ tenga presente che per poter usare questa opzione, oltre ad avere abilitato
+ la scoperta della \textit{Path MTU}, occorre che il socket sia stato
+ esplicitamente connesso con \func{connect}.
+
+ Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
+ \textit{Path MTU} eseguendo prima una \func{connect} verso la destinazione,
+ e poi usando \func{getsockopt} con questa opzione. Si può anche avviare
+ esplicitamente il procedimento di scoperta inviando un pacchetto di grosse
+ dimensioni (che verrà scartato) e ripetendo l'invio coi dati aggiornati. Si
+ tenga infine conto che durante il procedimento i pacchetti iniziali possono
+ essere perduti, ed è compito dell'applicazione gestirne una eventuale
+ ritrasmissione.
+
+\itindend{Maximum~Transfer~Unit}
+
+\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
+ kernel della serie 2.2.x, ed è specifica di Linux. Prende per
+ \param{optval} un intero usato come valore logico. Se abilitata
+ passa tutti i pacchetti con l'opzione \textit{IP Router Alert} (vedi
+ sez.~\ref{sec:IP_options}) che devono essere inoltrati al socket
+ corrente. Può essere usata soltanto per socket di tipo raw.
+
+\itindbeg{multicast}
+\item[\const{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il
+ valore del campo TTL per i pacchetti \textit{multicast} in uscita associati
+ al socket. È importante che questo valore sia il più basso possibile, ed il
+ default è 1, che significa che i pacchetti non potranno uscire dalla rete
+ locale. Questa opzione consente ai programmi che lo richiedono di superare
+ questo limite. L'opzione richiede per
+ \param{optval} un intero che conterrà il valore del TTL.
+
+\item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati
+ che si inviano su un socket usato con il \textit{multicast} vengano ricevuti
+ anche sulla stessa macchina da cui li si stanno inviando. Prende per
+ \param{optval} un intero usato come valore logico.
+
+ In generale se si vuole che eventuali client possano ricevere i dati che si
+ inviano occorre che questa funzionalità sia abilitata (come avviene di
+ default). Qualora però non si voglia generare traffico per dati che già sono
+ disponibili in locale l'uso di questa opzione permette di disabilitare
+ questo tipo di traffico.
+
+\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di
+ \textit{multicast}, e può essere usata solo con \func{setsockopt}.
+ L'argomento \param{optval} in questo caso deve essere una struttura di tipo
+ \struct{ip\_mreqn}, illustrata in fig.~\ref{fig:ip_mreqn_struct}, che
+ permette di indicare, con il campo \var{imr\_multiaddr} l'indirizzo del
+ gruppo di \textit{multicast} a cui ci si vuole unire, con il campo
+ \var{imr\_address} l'indirizzo dell'interfaccia locale con cui unirsi al
+ gruppo di \textit{multicast} e con \var{imr\_ifindex} l'indice
+ dell'interfaccia da utilizzare (un valore nullo indica una interfaccia
+ qualunque).
+
+ Per compatibilità è possibile utilizzare anche un argomento di tipo
+ \struct{ip\_mreq}, una precedente versione di \struct{ip\_mreqn}, che
+ differisce da essa soltanto per l'assenza del campo \var{imr\_ifindex}.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \includestruct{listati/ip_mreqn.h}
+ \end{minipage}
+ \caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei
+ socket per le operazioni concernenti l'appartenenza ai gruppi di
+ \textit{multicast}.}
+ \label{fig:ip_mreqn_struct}
+\end{figure}
+
+\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast},
+ prende per \param{optval} la stessa struttura \struct{ip\_mreqn} (o
+ \struct{ip\_mreq}) usata anche per \const{IP\_ADD\_MEMBERSHIP}.
+
+\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per l'utilizzo
+ del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture
+ \struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni.
+
+\itindend{multicast}
+\end{basedescript}
+
+
+
+\subsection{Le opzioni per i protocolli TCP e UDP}
+\label{sec:sock_tcp_udp_options}
+
+In questa sezione tratteremo le varie opzioni disponibili per i socket che
+usano i due principali protocolli di comunicazione del livello di trasporto;
+UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni
+ è disponibile nella settima sezione delle pagine di manuale, che si può
+ consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le
+ pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono
+ alquanto incomplete.} Dato che questi protocolli sono entrambi trasportati
+su IP, oltre alle opzioni generiche di sez.~\ref{sec:sock_generic_options}
+saranno comunque disponibili anche le precedenti opzioni di
+sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in
+ sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, ma
+ quelle per TCP e UDP sono le stesse anche quando si usa IPv6.}
+
+
+Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle
+utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente
+\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si è
+riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_tcp}. Le
+costanti indicanti le opzioni del protocollo TCP e tutte le altre costanti ad
+esse collegate sono definite in \file{netinet/tcp.h}, ed accessibili
+includendo detto file.\footnote{in realtà questo è il file usato dalle
+ librerie; la definizione delle opzioni effettivamente supportate da Linux si
+ trova nel file \texttt{linux/tcp.h}, dal quale si sono estratte le costanti
+ di tab.~\ref{tab:sock_opt_tcplevel}.}
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|c|c|c|l|l|}
+ \hline
+ \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
+ \textbf{Descrizione}\\
+ \hline
+ \hline
+ \const{TCP\_NODELAY} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_MAXSEG} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_KEEPINTVL} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_KEEPCNT} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_SYNCNT} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_LINGER2} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_INFO} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_QUICKACK} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_CONGESTION} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \hline
+ \end{tabular}
+ \caption{Le opzioni per i socket TCP disponibili al livello
+ \const{SOL\_TCP}.}
+ \label{tab:sock_opt_tcplevel}
+\end{table}
+
+Le descrizioni di tab.~\ref{tab:sock_opt_tcplevel} sono estremamente
+sintetiche, una maggiore quantità di dettagli su queste opzioni è fornita nel
+seguente elenco:
+\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\const{TCP\_NODELAY}]
+
+\item[\const{TCP\_MAXSEG}]
+
+\item[\const{TCP\_CORK}]
+
+\item[\const{TCP\_KEEPINTVL}]
+
+\item[\const{TCP\_KEEPCNT}]
+
+\item[\const{TCP\_SYNCNT}]
+
+\item[\const{TCP\_LINGER2}]
+
+\item[\const{TCP\_DEFER\_ACCEPT}]
+
+\item[\const{TCP\_WINDOW\_CLAMP}]
+
+\item[\const{TCP\_INFO}]
+
+\item[\const{TCP\_QUICKACK}]
+
+\item[\const{TCP\_CONGESTION}] Introdotta con il kernel 2.6.13.
+
+\end{basedescript}
+
+
+Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero
+ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo
+caso per poterle utilizzare occorrerà impostare l'opportuno valore per
+l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente
+\const{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono
+definite in \file{netinet/udp.h}, ed accessibili includendo detto
+file.\footnote{come per TCP, la definizione delle opzioni effettivamente
+ supportate dal kernel si trova in realtà nel file \texttt{linux/udp.h}, dal
+ quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.}
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|c|c|c|l|l|}
+ \hline
+ \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
+ \textbf{Descrizione}\\
+ \hline
+ \hline
+ \const{UDP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \hline
+ \end{tabular}
+ \caption{Le opzioni per i socket UDP disponibili al livello
+ \const{SOL\_UDP}.}
+ \label{tab:sock_opt_udplevel}
+\end{table}
+
+Ancora una volta le descrizioni contenute tab.~\ref{tab:sock_opt_udplevel}
+sono un semplice riferimento, una maggiore quantità di dettagli sulle
+caratteristiche delle opzioni citate è quello dell'elenco seguente:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\const{UDP\_CORK}] Introdotta con il kernel 2.5.44
+
+\item[\const{UDP\_ENCAP}] Introdotta con il kernel 2.5.67.
+
+\end{basedescript}
+
+
+
+
+\section{La gestione attraverso le funzioni di controllo}
+\label{sec:sock_ctrl_func}
+
+Benché la maggior parte delle caratteristiche dei socket sia gestibile con le
+funzioni \func{setsockopt} e \func{getsockopt}, alcune proprietà possono
+essere impostate attraverso le funzioni \func{fcntl} e \func{ioctl} già
+trattate in sez.~\ref{sec:file_fcntl} e sez.~\ref{sec:file_ioctl}; in
+quell'occasione abbiamo parlato di queste funzioni esclusivamente nell'ambito
+della loro applicazione a file descriptor associati a dei file normali; qui
+tratteremo invece i dettagli del loro utilizzo con file descriptor associati a
+dei socket.
+
+
+\subsection{L'uso di \func{ioctl} e \func{fcntl} per i socket generici}
+\label{sec:sock_ioctl}
+
+Tratteremo in questa sezione le caratteristiche specifiche delle funzioni
+\func{ioctl} e \func{fcntl} quando esse vengono utilizzate con dei socket
+generici. Quanto già detto in precedenza in sez.~\ref{sec:file_fcntl} e
+sez.~\ref{sec:file_ioctl} continua a valere; quello che tratteremo qui sono le
+operazioni ed i comandi che sono validi, o che hanno significati peculiari,
+quando queste funzioni vengono applicate a dei socket generici.
+
+Nell'elenco seguente si riportano i valori specifici che può assumere il
+secondo argomento della funzione \func{ioctl} (\param{request}, che indica il
+tipo di operazione da effettuare) quando essa viene applicata ad un socket
+generico. Nell'elenco si illustrerà anche, per ciascuna operazione, il tipo di
+dato usato come terzo argomento della funzione ed il significato che esso
+viene ad assumere. Dato che in caso di lettura questi dati vengono restituiti
+come \itindex{value~result~argument} \textit{value result argument}, con
+queste operazioni il terzo argomento deve sempre essere passato come puntatore
+ad una variabile (o struttura) precedentemente allocata. Le costanti che
+identificano le operazioni sono le seguenti:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SIOCGSTAMP}] restituisce il contenuto di una struttura
+ \struct{timeval} con la marca temporale dell'ultimo pacchetto ricevuto sul
+ socket, questa operazione può essere utilizzata per effettuare delle
+ misurazioni precise del tempo di andata e ritorno\footnote{il
+ \itindex{Round~Trip~Time} \textit{Round Trip Time} cui abbiamo già
+ accennato in sez.~\ref{sec:net_tcp}.} dei pacchetti sulla rete.
+
+\item[\const{SIOCSPGRP}] imposta il processo o il \itindex{process~group}
+ \textit{process group} a cui inviare i segnali \const{SIGIO} e
+ \const{SIGURG} quando viene completata una operazione di I/O asincrono o
+ arrivano dei dati urgenti \itindex{out-of-band} (\texttt{out-of-band}). Il
+ terzo argomento deve essere un puntatore ad una variabile di tipo
+ \type{pid\_t}; un valore positivo indica direttamente il \acr{pid} del
+ processo, mentre un valore negativo indica (col valore assoluto) il
+ \textit{process group}. Senza privilegi di amministratore o la capability
+ \const{CAP\_KILL} si può impostare solo se stessi o il proprio
+ \textit{process group}.
+
+\item[\const{SIOCGPGRP}] legge le impostazioni presenti sul socket
+ relativamente all'eventuale processo o \itindex{process~group}
+ \textit{process group} cui devono essere inviati i segnali \const{SIGIO} e
+ \const{SIGURG}. Come per \const{SIOCSPGRP} l'argomento passato deve un
+ puntatore ad una variabile di tipo \type{pid\_t}, con lo stesso significato.
+ Qualora non sia presente nessuna impostazione verrà restituito un valore
+ nullo.
+
+\item[\const{FIOASYNC}] Abilita o disabilita la modalità di I/O asincrono sul
+ socket. Questo significa (vedi sez.~\ref{sec:file_asyncronous_operation})
+ che verrà inviato il segnale di \const{SIGIO} (o quanto impostato con
+ \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O
+ sul socket.
+\end{basedescript}
+
+Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi
+specifici; in questo caso il secondo argomento (\param{cmd}, che indica il
+comando) può assumere i due valori \const{FIOGETOWN} e \const{FIOSETOWN},
+mentre il terzo argomento dovrà essere un puntatore ad una variabile di tipo
+\type{pid\_t}. Questi due comandi sono una modalità alternativa di eseguire le
+stesse operazioni (lettura o impostazione del processo o del gruppo di
+processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con
+\const{SIOCGPGRP} e \const{SIOCSPGRP}.
+
+
+\subsection{L'uso di \func{ioctl} per i socket TCP e UDP}
+\label{sec:sock_ioctl_IP}
+
+Oltre alle caratteristiche che si possono impostare per i socket generici, la
+funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per
+i socket UDP e TCP. Non esistono operazioni specifiche per i socket IP
+generici, 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).
+
+Le operazioni di controllo disponibili per i socket TCP, come illustrate dalla
+relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, prevedono come
+possibile valore per il secondo argomento della funzione le costanti
+illustrate nell'elenco seguente; il terzo argomento della funzione, gestito
+come \itindex{value~result~argument} \textit{value result argument}, deve
+essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{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[\const{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
+ \itindex{out-of-band} 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[\const{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, come illustrate dalla
+relativa pagina di manuale, accessibile con \texttt{man 7 udp}, sono quelle
+indicate nelle costanti del seguente elenco; come per i socket TCP il terzo
+argomento viene gestito come \itindex{value~result~argument} \textit{value
+ result argument} e deve essere un puntatore ad una variabile di tipo
+\ctyp{int}:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{FIONREAD}]
+\item[\const{TIOCOUTQ}]
+\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 sottonodi 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
+sottonodi 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 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.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
+ lettura (cioè per i dati in ingresso) dei socket.
+\item[\texttt{rmem\_max}] imposta la dimensione massima che si può assegnare al
+ buffer di ingresso dei socket attraverso l'uso dell'opzione
+ \const{SO\_RCVBUF}.
+\item[\texttt{wmem\_default}] imposta la dimensione di default del buffer di
+ scrittura (cioè per i dati in uscita) dei socket.
+\item[\texttt{wmem\_max}] imposta la dimensione massima che si può assegnare al
+ buffer di uscita dei socket attraverso l'uso dell'opzione
+ \const{SO\_SNDBUF}.
+\item[\texttt{message\_cost}, \texttt{message\_burst}] contengono le
+ impostazioni del \itindex{bucket~filter} \textit{bucket filter} che
+ controlla l'emissione di messaggi di avviso da parte kernel per eventi
+ relativi a problemi sulla rete, imponendo un limite che consente di
+ prevenire eventuali attacchi di \itindex{Denial~of~Service~(DoS)}
+ \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.}
+
+ Il \itindex{bucket~filter} \textit{bucket filter} è un algoritmo generico
+ che permette di impostare dei limiti di flusso su una quantità\footnote{uno
+ analogo viene usato nel \index{netfilter} \textit{netfilter} per imporre
+ dei limiti sul flusso dei pacchetti.} 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}.
+
+ 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[\texttt{netdev\_max\_backlog}] numero massimo di pacchetti che possono
+ essere contenuti nella coda di ingresso generale.
+
+\item[\texttt{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{3.0cm}\desclabelstyle{\nextlinelabel}}
+\item[\texttt{dev\_weight}] blocco di lavoro (\textit{work quantum}) dello
+ scheduler di processo dei pacchetti. % TODO da documentare meglio
+
+\item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione
+ sotto la quale si considera di avere una bassa congestione.
+
+\item[\texttt{mod\_cong}] valore per l'occupazione della coda di ricezione
+ sotto la quale si considera di avere una congestione moderata.
+
+\item[\texttt{no\_cong}] valore per l'occupazione della coda di ricezione
+ sotto la quale si si considera di non avere congestione.
+
+\item[\texttt{no\_cong\_thresh}] valore minimo (\textit{low water mark}) per
+ il riavvio dei dispositivi congestionati.
+
+%\item[\texttt{netdev\_fastroute}] è presente soltanto quando si è compilato il
+% kernel con l'apposita opzione di ottimizzazione per l'uso come router (.
+
+\item[\texttt{somaxconn}] imposta la dimensione massima del \textit{backlog}
+ della funzione \func{listen} (vedi sez.~\ref{sec:TCP_func_listen}), e
+ corrisponde al valore della costante \const{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, descritti anche nella pagina di manuale
+accessibile con \texttt{man 7 ip}, sono i seguenti:
+\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL
+ (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti. Il valore può
+ essere modificato per il singolo socket con l'opzione \const{IP\_TTL}.
+ Prende un valore intero.
+
+\item[\texttt{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).
+
+\item[\texttt{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. Un
+ valore nullo disabilita la funzionalità, con 1 la si abilita, con 2 la si
+ abilità in modalità \textsl{prolissa}.
+
+\item[\texttt{ip\_autoconfig}] Specifica se l'indirizzo IP è stato configurato
+ automaticamente via DHCP, BOOTP o RARP.
+
+\item[\texttt{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
+ numerici, che indicano gli estremi dell'intervallo. Si abbia cura di non
+ definire un intervallo che si sovrappone a quello delle porte usate per il
+ \itindex{masquerading} \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[\texttt{ip\_no\_pmtu\_disc}] imposta la disciplina di ricerca della
+ \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim} e
+ sez.~\ref{sec:sock_ipv4_options}).
+
+\item[\texttt{ipfrag\_high\_thresh}] 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}.
+
+\item[\texttt{ipfrag\_low\_thresh}] soglia bassa (specificata in byte) cui
+ viene riportata la coda dei pacchetti IP frammentati quando si raggiunge il
+ valore \texttt{ipfrag\_high\_thresh}.
+
+\item[\texttt{ip\_always\_defrag}] se abilitato (prende un intero come valore
+ logico) tutti i pacchetti IP frammentati saranno riassemblati, anche in caso
+ in successivo immediato inoltro.\footnote{introdotto con il kernel 2.2.13,
+ nelle versioni precedenti questo comportamento poteva essere solo in fase
+ di compilazione del kernel con l'opzione
+ \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.}
+
+\item[\texttt{ip\_nonlocal\_bind}] se abilitato (prende un intero come valore
+ logico) è possibile che una applicazione possa collegarsi (con \func{bind}
+ su un indirizzo non locale. 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.
+
+% \item[\texttt{neigh/*}] La directory contiene i valori
+% TODO trattare neigh/* nella parte su arp, da capire dove sarà.
+
+\end{basedescript}