Un po' di materiale sulle sysctl dei socket, e qualche correzione sulle
[gapil.git] / sockctrl.tex
index 815ceb18e35a1e6f3bb62a6f1621003604a4a148..38722cdb269fe98e8cf069d5f9d5dba962cc546b 100644 (file)
@@ -34,7 +34,7 @@ porte o altre propriet
 \subsection{La struttura del \textit{resolver}}
 \label{sec:sock_resolver}
 
-\index{\textit{resolver}|(}
+\itindbeg{resolver}
 La risoluzione dei nomi è associata tradizionalmente al servizio del
 \textit{Domain Name Service} che permette di identificare le macchine su
 internet invece che per numero IP attraverso il relativo \textsl{nome a
@@ -117,7 +117,7 @@ dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni
   funzioni di libreria, prevedendo un ordine di interrogazione predefinito e
   non modificabile (a meno di una ricompilazione delle librerie stesse).}
 
-\index{\textit{Name~Service~Switch}|(}
+\itindbeg{Name~Service~Switch}
 Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
 eseguirà dal \textit{resolver} è stata inclusa all'interno di un meccanismo
 generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
@@ -168,7 +168,7 @@ tab.~\ref{tab:sys_NSS_classes}.
   \label{tab:sys_NSS_classes}
 \end{table}
 
-Il sistema  del \textit{Name Service  Switch} è controllato dal  contenuto del
+Il sistema  del \textit{Name Service Switch} è controllato dal  contenuto del
 file \file{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una
   convezione  comune per  i  file  di configurazione  le  righe vuote  vengono
   ignorate  e  tutto  quello  che  segue un  carattere  ``\texttt{\#}''  viene
@@ -193,7 +193,7 @@ quello che conta sono le funzioni classiche che il \textit{resolver} mette a
 disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
   tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
 quelle che tratteremo nelle sezioni successive.
-\index{\textit{Name~Service~Switch}|)}
+\itindend{Name~Service~Switch}
 
 
 \subsection{Le funzioni di interrogazione del \textit{resolver}}
@@ -610,16 +610,15 @@ Restituisce una stringa corrispondente ad un errore di risoluzione.
 \noindent che, come  l'analoga \func{strerror}, restituisce una stringa con un
 messaggio di errore già formattato, corrispondente al codice passato come
 argomento (che si presume sia dato da \var{h\_errno}).
-\index{\textit{resolver}|)}
-
 
+\itindend{resolver}
 
 
 \subsection{La risoluzione dei nomi a dominio}
 \label{sec:sock_name_services}
 
-La principale funzionalità del \index{\textit{resolver}}\textit{resolver}
-resta quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
+La principale funzionalità del \itindex{resolver}\textit{resolver} resta
+quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
 dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le
 funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui
 scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il
@@ -683,7 +682,7 @@ Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi
 IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
 l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
 chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
-modificare le opzioni del \index{\textit{resolver}}\textit{resolver}; dato che
+modificare le opzioni del \itindex{resolver}\textit{resolver}; dato che
 questo non è molto comodo è stata definita\footnote{questa è una estensione
   fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.}
 un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
@@ -720,10 +719,10 @@ suoi risultati.
 Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
 fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un
 programma che esegue una semplice interrogazione al
-\index{\textit{resolver}}\textit{resolver} usando \func{gethostbyname} e poi
-ne stampa a video i risultati. Al solito il sorgente completo, che comprende
-il trattamento delle opzioni ed una funzione per stampare un messaggio di
-aiuto, è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
+\itindex{resolver}\textit{resolver} usando \func{gethostbyname} e poi ne
+stampa a video i risultati. Al solito il sorgente completo, che comprende il
+trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto,
+è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
 
 Il programma richiede un solo argomento che specifichi il nome da cercare,
 senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che
@@ -778,10 +777,10 @@ copiare il contenuto della sola struttura non 
 i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
 essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
 una chiamata, occorrerà eseguire quella che si chiama una
-\index{\textit{deep~copy}}\textit{deep copy}.\footnote{si chiama così quella
-  tecnica per cui, quando si deve copiare il contenuto di una struttura
-  complessa (con puntatori che puntano ad altri dati, che a loro volta possono
-  essere puntatori ad altri dati) si deve copiare non solo il contenuto della
+\itindex{deep~copy}\textit{deep copy}.\footnote{si chiama così quella tecnica
+  per cui, quando si deve copiare il contenuto di una struttura complessa (con
+  puntatori che puntano ad altri dati, che a loro volta possono essere
+  puntatori ad altri dati) si deve copiare non solo il contenuto della
   struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
   contenuti in essa (e così via se vi sono altre sottostrutture con altri
   puntatori) e copiare anche i dati da questi referenziati.}
@@ -819,9 +818,9 @@ lunghezza di questo buffer devono essere indicati con gli argomenti
 \param{buf} e \param{buflen}.
 
 Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
-come \index{\textit{value~result~argument}}\textit{value result argument}, si
-deve specificare l'indirizzo della variabile su cui la funzione dovrà salvare
-il codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
+come \itindex{value~result~argument}\textit{value result argument}, si deve
+specificare l'indirizzo della variabile su cui la funzione dovrà salvare il
+codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
 puntatore che si userà per accedere i dati con \param{result}.
 
 In caso di successo entrambe le funzioni restituiscono un valore nullo,
@@ -883,17 +882,18 @@ usare la funzione \funcd{gethostbyaddr}, il cui prototipo 
 
 In questo caso l'argomento \param{addr} dovrà essere il puntatore ad una
 appropriata struttura contenente il valore dell'indirizzo IP (o IPv6) che si
-vuole risolvere. L'uso del tipo \type{char *} per questo argomento è storico,
-il dato dovrà essere fornito in una struttura \struct{in\_addr}\footnote{si
-  ricordi che, come illustrato in fig.~\ref{fig:sock_sa_ipv4_struct}, questo
-  in realtà corrisponde ad un numero intero, da esprimere comunque in
-  \textit{network order}, non altrettanto avviene però per \var{in6\_addr},
-  pertanto è sempre opportuno inizializzare questi indirizzi con
-  \func{inet\_pton} (vedi sez.~\ref{sec:sock_conv_func_gen}).}  per un
-indirizzo IPv4 ed una struttura \struct{in6\_addr} per un indirizzo IPv6,
-mentre in \param{len} se ne dovrà specificare la dimensione (rispettivamente 4
-o 16), infine l'argomento \param{type} indica il tipo di indirizzo e dovrà
-essere o \const{AF\_INET} o \const{AF\_INET6}.
+vuole risolvere. L'uso del tipo \texttt{char *} per questo argomento è
+storico, il dato dovrà essere fornito in una struttura
+\struct{in\_addr}\footnote{si ricordi che, come illustrato in
+  fig.~\ref{fig:sock_sa_ipv4_struct}, questo in realtà corrisponde ad un
+  numero intero, da esprimere comunque in \textit{network order}, non
+  altrettanto avviene però per \struct{in6\_addr}, pertanto è sempre opportuno
+  inizializzare questi indirizzi con \func{inet\_pton} (vedi
+  sez.~\ref{sec:sock_conv_func_gen}).}  per un indirizzo IPv4 ed una struttura
+\struct{in6\_addr} per un indirizzo IPv6, mentre in \param{len} se ne dovrà
+specificare la dimensione (rispettivamente 4 o 16), infine l'argomento
+\param{type} indica il tipo di indirizzo e dovrà essere o \const{AF\_INET} o
+\const{AF\_INET6}.
 
 La funzione restituisce, in caso di successo, un puntatore ad una struttura
 \struct{hostent}, solo che in questo caso la ricerca viene eseguita
@@ -969,7 +969,7 @@ tab.~\ref{tab:sock_getipnodebyname_flags}.
                             sistema è associata ad un indirizzo di tale tipo.\\
     \const{AI\_DEFAULT}   & il valore di default, è equivalente alla
                             combinazione di \const{AI\_ADDRCONFIG} e di
-                            \const{AI\_V4MAPPED)}.\\  
+                            \const{AI\_V4MAPPED}.\\  
     \hline
   \end{tabular}
   \caption{Valori possibili per i bit dell'argomento \param{flags} della
@@ -1173,9 +1173,9 @@ rimandando alle rispettive pagine di manuale.
     \textbf{Informazione}&\multicolumn{3}{|c|}{\textbf{Funzioni}}\\
     \hline
     \hline
-    indirizzo&\func{sethostent}&\func{gethostent}&\func{endhostent} \\
-    servizio &cd te\func{setservent}&\func{getservent}&\func{endservent}\\ 
-    rete     &\func{setnetent}&\func{getnetent}&\func{endnetent}\\ 
+    indirizzo &\func{sethostent} &\func{gethostent} &\func{endhostent} \\
+    servizio  &\func{setservent} &\func{getservent} &\func{endservent}\\ 
+    rete      &\func{setnetent}  &\func{getnetent}  &\func{endnetent}\\ 
     protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\ 
     \hline
   \end{tabular}
@@ -1248,6 +1248,16 @@ ricerche generiche sugli indirizzi, usando sia IPv4 che IPv6, e richiedere
 risoluzioni sui nomi dei servizi indipendentemente dal protocollo (ad esempio
 TCP o UDP) che questi possono utilizzare.
 
+Come ultimo argomento in \param{res} deve essere passato un puntatore ad una
+variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che verrà
+utilizzata dalla funzione per riportare (come \itindex{value~result~argument}
+\textit{value result argument}) i propri risultati. La funzione infatti è
+rientrante, ed alloca autonomamente tutta la memoria necessaria in cui
+verranno riportati i risultati della risoluzione.  La funzione scriverà
+all'indirizzo puntato da \param{res} il puntatore iniziale ad una
+\itindex{linked~list}\textit{linked list} di strutture di tipo
+\struct{addrinfo} contenenti tutte le informazioni ottenute.
+
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
@@ -1258,12 +1268,12 @@ TCP o UDP) che questi possono utilizzare.
   \label{fig:sock_addrinfo_struct}
 \end{figure}
 
-La struttura \struct{addrinfo}, la cui definizione\footnote{la definizione è
-  ripresa direttamente dal file \texttt{netdb.h} in questa struttura viene
-  dichiarata, la pagina di manuale riporta \type{size\_t} come tipo di dato
-  per il campo \var{ai\_addrlen}, qui viene usata quanto previsto dallo
-  standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi di
-  dati sono comunque equivalenti.} è riportata in
+Come illustrato la struttura \struct{addrinfo}, la cui definizione\footnote{la
+  definizione è ripresa direttamente dal file \texttt{netdb.h} in questa
+  struttura viene dichiarata, la pagina di manuale riporta \type{size\_t} come
+  tipo di dato per il campo \var{ai\_addrlen}, qui viene usata quanto previsto
+  dallo standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi
+  di dati sono comunque equivalenti.} è riportata in
 fig.~\ref{fig:sock_addrinfo_struct}, viene usata sia in ingresso, per passare
 dei valori di controllo alla funzione, che in uscita, per ricevere i
 risultati. Il primo campo, \var{ai\_flags}, è una maschera binaria di bit che
@@ -1273,7 +1283,7 @@ che viene usato soltanto in ingresso. I tre campi successivi \var{ai\_family},
 famiglia di indirizzi, il tipo di socket e il protocollo, in ingresso vengono
 usati per impostare una selezione (impostandone il valore nella struttura
 puntata da \param{hints}), mentre in uscita indicano il tipo di risultato
-contenuto nella struttura. 
+contenuto nella struttura.
 
 Tutti i campi seguenti vengono usati soltanto in uscita; il campo
 \var{ai\_addrlen} indica la dimensione della struttura degli indirizzi
@@ -1364,15 +1374,6 @@ bit della maschera.
   \label{tab:ai_flags_values}
 \end{table}
 
-Come ultimo argomento di \func{getaddrinfo} deve essere passato un puntatore
-ad una variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che
-verrà utilizzata dalla funzione per riportare (come \textit{value result
-  argument}) i propri risultati. La funzione infatti è rientrante, ed alloca
-autonomamente tutta la memoria necessaria in cui verranno riportati i
-risultati della risoluzione.  La funzione scriverà in \param{res} il puntatore
-iniziale ad una \index{\textit{linked~list}}\textit{linked list} di strutture
-di tipo \struct{addrinfo} contenenti tutte le informazioni ottenute.
-
 La funzione restituisce un valore nullo in caso di successo, o un codice in
 caso di errore. I valori usati come codice di errore sono riportati in
 tab.~\ref{tab:addrinfo_error_code}; dato che la funzione utilizza altre
@@ -1414,7 +1415,7 @@ corrispondente 
     \const{EAI\_SYSTEM}  & c'è stato un errore di sistema, si può controllare
                            \var{errno} per i dettagli. \\
 %    \hline
-% estensioni GNU, trovarne la documentazione
+% TODO estensioni GNU, trovarne la documentazione
 %    \const{EAI\_INPROGRESS}& richiesta in corso. \\
 %    \const{EAI\_CANCELED}& la richiesta è stata cancellata.\\
 %    \const{EAI\_NOTCANCELED}& la richiesta non è stata cancellata. \\
@@ -1461,14 +1462,14 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}.
 \begin{figure}[!htb]
   \centering
   \includegraphics[width=10cm]{img/addrinfo_list}
-  \caption{La \index{\textit{linked~list}}\textit{linked list} delle strutture
+  \caption{La \itindex{linked~list}\textit{linked list} delle strutture
     \struct{addrinfo} restituite da \func{getaddrinfo}.}
   \label{fig:sock_addrinfo_list}
 \end{figure}
 
 Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
-elementare di interrogazione del \index{\textit{resolver}}\textit{resolver}
-basato questa funzione, il cui corpo principale è riportato in
+elementare di interrogazione del \itindex{resolver}\textit{resolver} basato
+questa funzione, il cui corpo principale è riportato in
 fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa
 la gestione delle opzioni in cui è gestita l'eventuale inizializzazione
 dell'argomento \var{hints} per restringere le ricerche su protocolli, tipi di
@@ -1558,11 +1559,10 @@ IPv4 address:
 \end{Verbatim}
 %$
 
-Una volta estratti i risultati dalla
-\index{\textit{linked~list}}\textit{linked list} puntata da \param{res} se
-questa non viene più utilizzata si dovrà avere cura di disallocare
-opportunamente tutta la memoria, per questo viene fornita l'apposita funzione
-\funcd{freeaddrinfo}, il cui prototipo è:
+Una volta estratti i risultati dalla \itindex{linked~list}\textit{linked list}
+puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura
+di disallocare opportunamente tutta la memoria, per questo viene fornita
+l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
 \begin{functions}
   \headdecl{netdb.h} 
 
@@ -1581,7 +1581,7 @@ per \param{res}.
 
 Si tenga presente infine che se si copiano i risultati da una delle strutture
 \struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
-avere cura di eseguire una \index{\textit{deep~copy}}\textit{deep copy} in cui
+avere cura di eseguire una \itindex{deep~copy}\textit{deep copy} in cui
 si copiano anche tutti i dati presenti agli indirizzi contenuti nella
 struttura \struct{addrinfo}, perché una volta disallocati i dati con
 \func{freeaddrinfo} questi non sarebbero più disponibili. 
@@ -1979,11 +1979,12 @@ di \func{setsockopt}, anche se non 
 per entrambe le funzioni. In questo caso \param{optval} viene usato per
 ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
 letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
-che viene usata come \textit{value result argument} per indicare, prima della
-chiamata della funzione, la lunghezza del buffer allocato per \param{optval} e
-per ricevere indietro, dopo la chiamata della funzione, la dimensione
-effettiva dei dati scritti su di esso. Se la dimenzione del buffer allocato
-per \param{optval} non è sufficiente si avrà un errore.
+che viene usata come \itindex{value~result~argument}\textit{value result
+  argument} per indicare, prima della chiamata della funzione, la lunghezza
+del buffer allocato per \param{optval} e per ricevere indietro, dopo la
+chiamata della funzione, la dimensione effettiva dei dati scritti su di esso.
+Se la dimenzione del buffer allocato per \param{optval} non è sufficiente si
+avrà un errore.
 
 
 
@@ -2136,7 +2137,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   consente però di impostare il timout per l'uso di \func{connect}, per avere
   il quale si può ricorrere a questa opzione. 
 
-% verificare con un programma di test
+% TODO verificare il timeout con un programma di test
 
 \item[\const{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo
   sulle operazioni di scrittura su un socket, ed usa gli stessi valori di
@@ -2184,21 +2185,21 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 \item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
   dei socket; l'opzione utilizza per \param{optval} un intero usato come
   valore logico, e può essere utilizzata solo da un processo con i privilegi
-  di amministratore (in particolare con la \textit{capability}
-  \const{CAP\_NET\_ADMIN}).  L'opzione necessita inoltre dell'opportuno
-  supporto nel kernel;\footnote{deve cioè essere definita la macro di
-    preprocessore \macro{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
-    dei sorgenti del kernel, questo è sempre vero nei kernel delle serie
-    superiori alla 2.3, per i kernel delle serie precedenti invece è
-    necessario aggiungere a mano detta definizione; è inoltre possibile
-    abilitare anche il tracciamento degli stati del TCP definendo la macro
-    \macro{STATE\_TRACE} in \file{include/net/tcp.h}.}  quando viene
-  abilitata una serie di messaggi con le informazioni di debug vengono inviati
-  direttamente al sistema del kernel log.\footnote{si tenga presente che il
-    comportamento è diverso da quanto avviene con BSD, dove l'opzione opera
-    solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati
-    sulla rete su un buffer circolare che viene letto da un apposito
-    programma, \cmd{trpt}.} 
+  di amministratore (in particolare con la \itindex{capabilities}
+  \textit{capability} \const{CAP\_NET\_ADMIN}).  L'opzione necessita inoltre
+  dell'opportuno supporto nel kernel;\footnote{deve cioè essere definita la
+    macro di preprocessore \macro{SOCK\_DEBUGGING} nel file
+    \file{include/net/sock.h} dei sorgenti del kernel, questo è sempre vero
+    nei kernel delle serie superiori alla 2.3, per i kernel delle serie
+    precedenti invece è necessario aggiungere a mano detta definizione; è
+    inoltre possibile abilitare anche il tracciamento degli stati del TCP
+    definendo la macro \macro{STATE\_TRACE} in \file{include/net/tcp.h}.}
+  quando viene abilitata una serie di messaggi con le informazioni di debug
+  vengono inviati direttamente al sistema del kernel log.\footnote{si tenga
+    presente che il comportamento è diverso da quanto avviene con BSD, dove
+    l'opzione opera solo sui socket TCP, causando la scrittura di tutti i
+    pacchetti inviati sulla rete su un buffer circolare che viene letto da un
+    apposito programma, \cmd{trpt}.}
 
 \item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
   \func{bind} su indirizzi locali che siano già in uso da altri socket;
@@ -2264,7 +2265,8 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   valori del campo \textit{type of service} (noto come TOS, vedi
   sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una
   priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i
-  privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}.
+  privilegi di amministratore con la \itindex{capabilities} capability
+  \const{CAP\_NET\_ADMIN}.
 
 \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
   può essere utilizzata soltanto con \func{getsockopt} e prende per
@@ -2283,7 +2285,7 @@ programmazione dei socket.  Per questo motivo faremo in questa sezione un
 approfondimento sul significato delle opzioni generiche più importanti.
 
 
-\index{\texttt{SO\_KEEPALIVE} (costante)|(} 
+\index{costante!{SO\_KEEPALIVE}@{{\tt  {SO\_KEEPALIVE}}}|(}
 \subsubsection{L'opzione \const{SO\_KEEPALIVE}}
 
 La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
@@ -2365,8 +2367,7 @@ presente per
 necessariamente ad una reale conclusione della connessione, il problema
 potrebbe anche essere dovuto ad un problema di routing che perduri per un
 tempo maggiore di quello impiegato nei vari tentativi di ritrasmissione del
-\textit{keep-alive} (anche se questa non è una una condizione molto
-probabile).
+\textit{keep-alive} (anche se questa non è una condizione molto probabile).
 
 Come esempio dell'utilizzo di questa opzione introduciamo all'interno del
 nostro server per il servizio \textit{echo} la nuova opzione \texttt{-k} che
@@ -2385,10 +2386,11 @@ tutte le volte che un processo figlio viene eseguito in risposta ad una
 connessione verrà pertanto eseguita o meno la sezione (\texttt{\small 14--17})
 che esegue l'impostazione di \const{SO\_KEEPALIVE} sul socket connesso,
 attivando il relativo comportamento.
-\index{\texttt{SO\_KEEPALIVE} (costante)|)}
+\index{costante!{SO\_KEEPALIVE}@{{\tt  {SO\_KEEPALIVE}}}|)}
+
 
 
-\index{\texttt{SO\_REUSEADDR} (costante)|(}
+\index{costante!{SO\_REUSEADDR}@{{\tt  {SO\_REUSEADDR}}}|(}
 \subsubsection{L'opzione \const{SO\_REUSEADDR}}
 
 La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di
@@ -2518,32 +2520,37 @@ si pu
 fare questa operazione per un socket TCP dato che su di essi si può sempre
 invocare \func{getsockname} una volta che si è completata la connessione.
 
-Infine il quarto caso è quello in cui si vuole effettivamente ottenere un
-\textit{completely duplicate binding}, quando cioè si vuole eseguire
-\func{bind} su un indirizzo ed una porta che sono già \textsl{legati} ad un
-altro socket.  Questo ovviamente non ha senso per il normale traffico di rete,
-in cui i pacchetti vengono scambiati direttamente fra due applicazioni; ma
-quando un sistema supporta il traffico in multicast, in cui una applicazione
-invia i pacchetti a molte altre (vedi sez.~\ref{sec:multicast_xxx}), allora ha
-senso che su una macchina i pacchetti provenienti dal traffico in multicast
-possano essere ricevuti da più applicazioni\footnote{l'esempio classico di
-  traffico in multicast è quello di uno streaming di dati (audio, video,
-  ecc.), l'uso del multicast consente in tal caso di trasmettere un solo
-  pacchetto, che potrà essere ricevuto da tutti i possibili destinatari
-  (invece di inviarne un duplicato a ciascuno); in questo caso è perfettamente
-  logico aspettarsi che sulla stessa macchina più utenti possano lanciare un
-  programma che permetta loro di ricevere gli stessi dati.} o da diverse
-istanze della stessa applicazione.
+Infine il quarto caso è quello in cui si vuole effettivamente ottenere
+un \textit{completely duplicate binding}, quando cioè si vuole
+eseguire \func{bind} su un indirizzo ed una porta che sono già
+\textsl{legati} ad un altro socket.  Questo ovviamente non ha senso
+per il normale traffico di rete, in cui i pacchetti vengono scambiati
+direttamente fra due applicazioni; ma quando un sistema supporta il
+traffico in \itindex{multicast}\textit{multicast}, in cui una
+applicazione invia i pacchetti a molte altre (vedi
+sez.~\ref{sec:multicast_xxx}), allora ha senso che su una macchina i
+pacchetti provenienti dal traffico in multicast possano essere
+ricevuti da più applicazioni\footnote{l'esempio classico di traffico
+  in multicast è quello di uno streaming di dati (audio, video, ecc.),
+  l'uso del multicast consente in tal caso di trasmettere un solo
+  pacchetto, che potrà essere ricevuto da tutti i possibili
+  destinatari (invece di inviarne un duplicato a ciascuno); in questo
+  caso è perfettamente logico aspettarsi che sulla stessa macchina più
+  utenti possano lanciare un programma che permetta loro di ricevere
+  gli stessi dati.} o da diverse istanze della stessa applicazione.
+\itindex{multicast}
 
 In questo caso utilizzando \const{SO\_REUSEADDR} si consente ad una
-applicazione eseguire \func{bind} sulla stessa porta ed indirizzo usata da
-un'altra, così che anche essa possa ricevere gli stessi pacchetti (chiaramente
-la cosa non ha alcun senso per i socket TCP, ed infatti in questo tipo di
-applicazione è normale l'uso del protovollo UDP). La regola è che quando si
-hanno più applicazioni che hanno eseguito \func{bind} sulla stessa porta, di
-tutti pacchetti destinati ad un indirizzo di broadcast o di multicast viene
-inviata una copia a ciascuna applicazione. Non è definito invece cosa accade
-qualora il pacchetto sia destinato ad un indirizzo normale (unicast).
+applicazione eseguire \func{bind} sulla stessa porta ed indirizzo
+usata da un'altra, così che anche essa possa ricevere gli stessi
+pacchetti (chiaramente la cosa non ha alcun senso per i socket TCP, ed
+infatti in questo tipo di applicazione è normale l'uso del protovollo
+UDP). La regola è che quando si hanno più applicazioni che hanno
+eseguito \func{bind} sulla stessa porta, di tutti pacchetti destinati
+ad un indirizzo di broadcast o di \itindex{multicast}
+\texttt{multicast} viene inviata una copia a ciascuna applicazione.
+Non è definito invece cosa accade qualora il pacchetto sia destinato
+ad un indirizzo normale (unicast).
 
 Essendo questo un caso particolare in alcuni sistemi (come BSD) è stata
 introdotta una opzione ulteriore, \const{SO\_REUSEPORT} che richiede che detta
@@ -2560,10 +2567,9 @@ questa opzione.\footnote{Questa restrizione permette di evitare il cosiddetto
   primo programma a consentirlo, avendo usato fin dall'inizio
   \const{SO\_REUSEADDR}.}  
 
-\index{\texttt{SO\_REUSEADDR} (costante)|)}
+\index{costante!{SO\_REUSEADDR}@{{\tt  {SO\_REUSEADDR}}}|)}
 
-
-\index{\texttt{SO\_LINGER} (costante)|(} 
+\index{costante!{SO\_LINGER}@{{\tt  {SO\_LINGER}}}|(}
 \subsubsection{L'opzione \const{SO\_LINGER}}
 
 La terza opzione da approfondire è \const{SO\_LINGER}; essa, come il nome
@@ -2649,9 +2655,7 @@ secondi\footnote{questa 
   completamento della trasmissione dei dati sul buffer.}  pari al valore
 specificato in \var{l\_linger}.
 
-
-
-\index{\texttt{SO\_LINGER} (costante)|)}
+\index{costante!{SO\_LINGER}@{{\tt  {SO\_LINGER}}}|)}
 
 
 
@@ -2813,9 +2817,10 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
 
 
 \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}).
-  Il campo TTL è di 8 bit e l'opzione richiede che \param{optval} sia un
-  intero, che ne conterrà il valore.
+  \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
@@ -2836,12 +2841,14 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   L'opzione richiede per \param{optval} un intero usato come valore logico;
   l'opzione non è applicabile a socket di tipo \const{SOCK\_STREAM}.
 
-\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 usate nella determinazione della \textit{Maximum
-    Tranfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) per il socket. Il valore
-  di default è determinato dal parametro \texttt{ip\_no\_pmtu\_disc} di
-  \func{sysctl}.
+\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 usate nella
+  determinazione della \textit{Maximum Tranfer Unit} (vedi
+  sez.~\ref{sec:net_lim_dim}) per il socket. Il valore di default è
+  determinato dal parametro \texttt{ip\_no\_pmtu\_disc} di
+  \func{sysctl} per i socket di tipo \const{SOCK\_STREAM}, mentre è
+  diabilitato per tutti gli altri.
 
 \item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum
     Tranfer Unit} di percorso del socket.  L'opzione richiede per
@@ -2849,8 +2856,12 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di
   Linux.
 
-\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i kernel
-  della serie 2.2.x, ed è specifica di Linux.
+\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.
 
 \item[\const{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il
   valore del campo TTL per i pacchetti in uscita associati al socket. È
@@ -2860,10 +2871,11 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   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 multicast vengano ricevuti anche
-  sulla stessa macchina da cui li si stanno inviando.  Prende per
-  \param{optval} un intero usato come valore logico. 
+\item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i
+  dati che si inviano su un socket usato con il \itindex{multicast}
+  \texttt{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
@@ -2871,15 +2883,17 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   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
-  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 multicast a cui ci si vuole unire, con il campo \var{imr\_address}
-  l'indirizzo dell'interfaccia locale con cui unirsi al gruppo di multicast e
-  con \var{imr\_ifindex} l'indice dell'interfaccia da utilizzare (un valore
-  nullo indica una interfaccia qualunque).  
+\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad
+  gruppo di \itindex{multicast} \texttt{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 multicast a cui ci si vuole unire, con il campo
+  \var{imr\_address} l'indirizzo dell'interfaccia locale con cui
+  unirsi al gruppo di 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
@@ -2896,11 +2910,15 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
 \end{figure}
 
 
+\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di
+  \itindex{multicast} \texttt{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\_DROP\_MEMBERSHIP}]
-
-\item[\const{IP\_MULTICAST\_IF}] 
+\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per
+  i'utilizzo del multicast, ed utilizza come \param{optval} le stesse
+  strutture \struct{ip\_mreqn} o \struct{ip\_mreq} delle due
+  precedenti opzioni.
 
 
 \end{basedescript}
@@ -2919,20 +2937,50 @@ classiche per il controllo delle propriet
 \func{ioctl}. 
 
 
-\subsection{L'uso di \func{fcntl} per i socket}
-\label{sec:sock_fcntl}
+\subsection{L'uso di \func{ioctl} per i socket}
+\label{sec:sock_ioctl}
 
-Abbiamo già trattato l'uso di \func{fcntl} in sez.~\ref{sec:file_fcntl}, dove
+Abbiamo già trattato l'uso di \func{ioctl} in sez.~\ref{sec:file_ioctl}, dove
 però ne abbiamo descritto le funzionalità nell'ambito della sua applicazione a
 file descriptor associati a file normali; tratteremo qui invece il suo uso
 specifico quando la si impiega su file descriptor associati a dei socket. 
 
+Quanto utilizzata con socket generici i valori utilizzabili per il secondo
+argomento della funzione (\param{request}, che indica il tipo di operazione
+richiesta) sono quelli riportati nel seguente elenco, il terzo argomento della
+funzione (quello usato per inviare o ricevere i dati) dipende dalla richiesta
+effettuata, ed è anch'esso illustrato nell'elenco in corrispondenza alla
+relativa richiesta:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SIOCGSTAMP}] restituisce 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 cosiddetto \itindex{round~trip~time}
+    \textit{round trip time}.} 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. 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}. Senxa privilegi di amministratore o la
+  capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio
+  \textit{process group}.
+
+\item[\const{FIOASYNC}] .
+
+
+\item[\const{SIOCGPGRP}] .
+
+\end{basedescript}
 
-\subsection{L'uso di \func{ioctl} per i socket}
-\label{sec:sock_ioctl}
 
-Come per \func{fcntl} abbiamo trattato l'uso di \func{ioctl} in
-sez.~\ref{sec:file_ioctl}, dove ne abbiamo descritto le funzionalità
+\subsection{L'uso di \func{fcntl} per i socket}
+\label{sec:sock_fcntl}
+
+Come per \func{ioctl} abbiamo trattato l'uso di \func{fcntl} in
+sez.~\ref{sec:file_fcntl}, dove ne abbiamo descritto le funzionalità
 nell'ambito dell'applicazione su file normali; tratteremo qui il suo uso
 specifico quando la si impiega su file descriptor associati a dei socket. 
 
@@ -2975,7 +3023,7 @@ generici validi per tutti i socket, quelli descritti anche nella rispettiva
 pagina di manuale.\footnote{quella accessibile con \texttt{man 7 socket}.}
 I principali sono:
 
-\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{3.2cm}\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
@@ -2986,20 +3034,75 @@ I principali sono:
 \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}] 
-\item[\texttt{message\_burst}] 
-\item[\texttt{netdev\_max\_backlog}] 
-\item[\texttt{optmem\_max}] 
+\item[\texttt{message\_cost}, \texttt{message\_burst}] impostano i valori
+  delle impostazioni del \itindex{bucket~filter} \textit{bucket filter}
+  (rispettivamente flusso a regime e dimensione di picchi di emissione) che
+  limita l'ammontare dei messaggi di avvertimento inviati dal kernel a causa
+  di eventi esterni sulla rete.
+% TODO: spiegare il ucket filter e questa opzione
+\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:TCP_ancillary_data}).
 \end{basedescript}
 
 Nella directory \texttt{/proc/sys/net/ipv4} sono disponibili i parametri per i
 socket IPv4, descritti anche nella rispettiva pagina di
 manuale.\footnote{quella accessibile con \texttt{man 7 ip}.} I principali
 sono:
-\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
+\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}] non documentato
+
+\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 discliplina 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{}] 
+
+
 \end{basedescript}