Ancora indicizzazioni
[gapil.git] / sockctrl.tex
index 5ec3d43c35bc20eac75e71a086da066090a74836..06ba55f78e96f75ffc7b0a9869a933b43f6a816a 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2015 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
@@ -118,7 +118,7 @@ problema dell'ordine in cui questi vengono interrogati.\footnote{con le
   predefinito e non modificabile (a meno di una ricompilazione delle librerie
   stesse).}
 
-\itindbeg{Name~Service~Switch}
+\itindbeg{Name~Service~Switch~(NSS)}
 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
@@ -145,7 +145,7 @@ tab.~\ref{tab:sys_NSS_classes}.
     \hline
     \hline
     \texttt{passwd}   & Corrispondenze fra nome dell'utente e relative
-                        proprietà (\acr{uid}, gruppo principale, ecc.).\\  
+                        proprietà (\ids{UID}, gruppo principale, ecc.).\\  
     \texttt{shadow}   & Corrispondenze fra username e password dell'utente
                         (e altre informazioni relative alle password).\\  
     \texttt{group}    & Corrispondenze fra nome del gruppo e proprietà dello 
@@ -200,7 +200,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.
-\itindend{Name~Service~Switch}
+\itindend{Name~Service~Switch~(NSS)}
 
 
 \subsection{Le funzioni di interrogazione del \textit{resolver}}
@@ -269,16 +269,16 @@ gli indirizzi dei server DNS da contattare e l'ordine delle ricerche; se non
 sono specificati server verrà utilizzato l'indirizzo locale, e se non è
 definito un dominio di default sarà usato quello associato con l'indirizzo
 locale (ma questo può essere sovrascritto con l'uso della variabile di
-ambiente \texttt{LOCALDOMAIN}). In genere non è necessario eseguire questa
+ambiente \envvar{LOCALDOMAIN}). In genere non è necessario eseguire questa
 funzione direttamente in quanto viene automaticamente chiamata la prima volta
 che si esegue una delle altre.
 
 Le impostazioni e lo stato del \textit{resolver} vengono mantenuti in una
 serie di variabili raggruppate nei campi di una apposita struttura \var{\_res}
-usata da tutte queste funzioni. Essa viene definita in \file{resolv.h} ed è
-utilizzata internamente alle funzioni essendo definita come variabile globale;
-questo consente anche di accedervi direttamente all'interno di un qualunque
-programma, una volta che la sia opportunamente dichiarata come:
+usata da tutte queste funzioni. Essa viene definita in \headfiled{resolv.h} ed
+è utilizzata internamente alle funzioni essendo definita come variabile
+globale; questo consente anche di accedervi direttamente all'interno di un
+qualunque programma, una volta che la sia opportunamente dichiarata come:
 \includecodesnip{listati/resolv_option.c}
 
 Tutti i campi della struttura sono ad uso interno, e vengono usualmente
@@ -320,7 +320,7 @@ comportamento del \textit{resolver}.
     \const{RES\_INSECURE1}  & Blocca i controlli di sicurezza di tipo 1.\\
     \const{RES\_INSECURE2}  & Blocca i controlli di sicurezza di tipo 2.\\
     \const{RES\_NOALIASES}  & Blocca l'uso della variabile di ambiente
-                              \texttt{HOSTALIASES}.\\ 
+                              \envvar{HOSTALIASES}.\\ 
     \const{RES\_USE\_INET6} & Restituisce indirizzi IPv6 con
                               \func{gethostbyname}. \\
     \const{RES\_ROTATE}     & Ruota la lista dei server DNS dopo ogni
@@ -354,22 +354,23 @@ Non tratteremo il significato degli altri campi non essendovi necessità di
 modificarli direttamente; gran parte di essi sono infatti impostati dal
 contenuto dei file di configurazione, mentre le funzionalità controllate da
 alcuni di esse possono essere modificate con l'uso delle opportune variabili
-di ambiente come abbiamo visto per \texttt{LOCALDOMAIN}. In particolare con
-\texttt{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
+di ambiente come abbiamo visto per \envvar{LOCALDOMAIN}. In particolare con
+\envvar{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
 controlla quante volte viene ripetuto il tentativo di connettersi ad un server
 DNS prima di dichiarare fallimento; il valore di default è 4, un valore nullo
-significa bloccare l'uso del DNS. Infine con \texttt{RES\_TIMEOUT} si
+significa bloccare l'uso del DNS. Infine con \envvar{RES\_TIMEOUT} si
 soprassiede il valore del campo \var{retrans},\footnote{preimpostato al valore
-  della omonima costante \const{RES\_TIMEOUT} di \file{resolv.h}.} che è il
-valore preso come base (in numero di secondi) per definire la scadenza di una
-richiesta, ciascun tentativo di richiesta fallito viene ripetuto raddoppiando
-il tempo di scadenza per il numero massimo di volte stabilito da
+  della omonima costante \const{RES\_TIMEOUT} di \headfile{resolv.h}.} che è
+il valore preso come base (in numero di secondi) per definire la scadenza di
+una richiesta, ciascun tentativo di richiesta fallito viene ripetuto
+raddoppiando il tempo di scadenza per il numero massimo di volte stabilito da
 \texttt{RES\_RETRY}.
 
 La funzione di interrogazione principale è \funcd{res\_query}, che serve ad
 eseguire una richiesta ad un server DNS per un nome a dominio
-\textsl{completamente specificato} (quello che si chiama FQDN, \textit{Fully
-  Qualified Domain Name}); il suo prototipo è:
+\textsl{completamente specificato} (quello che si chiama
+\itindex{Fully~Qualified~Domain~Name~(FQDN)} FQDN, \textit{Fully Qualified
+  Domain Name}); il suo prototipo è:
 
 \begin{functions}
 \headdecl{netinet/in.h}
@@ -452,20 +453,20 @@ tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe
 
 Come accennato le tipologie di dati che sono mantenibili su un server DNS sono
 diverse, ed a ciascuna di essa corrisponde un diverso tipo di \textit{resource
-  record}. L'elenco delle costanti\footnote{ripreso dai file di dichiarazione
-  \file{arpa/nameser.h} e \file{arpa/nameser\_compat.h}.} che definiscono i
-valori che si possono usare per l'argomento \param{type} per specificare il
-tipo di \textit{resource record} da richiedere è riportato in
+  record}. L'elenco delle costantiripreso dai file di dichiarazione
+  \headfiled{arpa/nameser.h} e \headfiled{arpa/nameser\_compat.h}, che
+definiscono i valori che si possono usare per l'argomento \param{type} per
+specificare il tipo di \textit{resource record} da richiedere è riportato in
 tab.~\ref{tab:DNS_record_type}; le costanti (tolto il \texttt{T\_} iniziale)
 hanno gli stessi nomi usati per identificare i record nei file di zona di
 BIND,\footnote{BIND, acronimo di \textit{Berkley Internet Name Domain}, è una
   implementazione di un server DNS, ed, essendo utilizzata nella stragrande
-  maggioranza dei casi, fa da riferimento; i dati relativi ad un certo
-  dominio (cioè i suoi \textit{resource record} vengono mantenuti in quelli
-  che sono usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo
-  di dominio è identificato da un nome che è appunto identico a quello delle
-  costanti di tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.}
-e che normalmente sono anche usati come nomi per indicare i record.
+  maggioranza dei casi, fa da riferimento; i dati relativi ad un certo dominio
+  (cioè i suoi \textit{resource record} vengono mantenuti in quelli che sono
+  usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo di dominio
+  è identificato da un nome che è appunto identico a quello delle costanti di
+  tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.}  e che
+normalmente sono anche usati come nomi per indicare i record.
 
 \begin{table}[!htb]
   \centering
@@ -649,7 +650,7 @@ definizione è riportata in fig.~\ref{fig:sock_hostent_struct}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/hostent.h}
   \end{minipage}
   \caption{La struttura \structd{hostent} per la risoluzione dei nomi a
@@ -710,7 +711,7 @@ Determina l'indirizzo di tipo \param{af} associato al nome a dominio
 
 In questo caso la funzione prende un secondo argomento \param{af} che indica
 (i soli valori consentiti sono \const{AF\_INET} o \const{AF\_INET6}, per
-questo è necessario l'uso di \texttt{sys/socket.h}) la famiglia di indirizzi
+questo è necessario l'uso di \headfile{sys/socket.h}) la famiglia di indirizzi
 che dovrà essere utilizzata nei risultati restituiti dalla funzione. Per tutto
 il resto la funzione è identica a \func{gethostbyname}, ed identici sono i
 suoi risultati.
@@ -780,25 +781,25 @@ ci sono precauzioni particolari da prendere.\footnote{volendo essere pignoli
 
 Le funzioni illustrate finora hanno un difetto: utilizzando una area di
 memoria interna per allocare i contenuti della struttura \struct{hostent} non
-possono essere\index{funzioni!rientranti} rientranti. Questo comporta anche
-che in due successive chiamate i dati potranno essere sovrascritti. Si tenga
-presente poi che copiare il contenuto della sola struttura non è sufficiente
-per salvare tutti 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
-\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 sotto-strutture con altri
-  puntatori) e copiare anche i dati da questi referenziati.}
+possono essere rientranti. Questo comporta anche che in due successive
+chiamate i dati potranno essere sovrascritti. Si tenga presente poi che
+copiare il contenuto della sola struttura non è sufficiente per salvare tutti
+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 \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 sotto-strutture con altri puntatori) e copiare anche i
+  dati da questi referenziati.}
 
 Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
-versioni \index{funzioni!rientranti} rientranti delle precedenti funzioni, al
-solito queste sono caratterizzate dall'avere un suffisso \texttt{\_r},
-pertanto avremo le due funzioni \funcd{gethostbyname\_r} e
-\funcd{gethostbyname2\_r} i cui prototipi sono:
+versioni rientranti delle precedenti funzioni, al solito queste sono
+caratterizzate dall'avere un suffisso \texttt{\_r}, pertanto avremo le due
+funzioni \funcd{gethostbyname\_r} e \funcd{gethostbyname2\_r} i cui prototipi
+sono:
 \begin{functions}
   \headdecl{netdb.h} 
   \headdecl{sys/socket.h}
@@ -827,17 +828,17 @@ 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 \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}.
+come \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,
 altrimenti restituiscono un codice di errore negativo e all'indirizzo puntato
 da \param{result} sarà salvato un puntatore nullo, mentre a quello puntato da
 \param{h\_errnop} sarà salvato il valore del codice di errore, dato che per
-essere \index{funzioni!rientranti} rientrante la funzione non può la variabile
-globale \var{h\_errno}. In questo caso il codice di errore, oltre ai valori di
+essere rientrante la funzione non può la variabile globale \var{h\_errno}. In
+questo caso il codice di errore, oltre ai valori di
 tab.~\ref{tab:h_errno_values}, può avere anche quello di \errcode{ERANGE}
 qualora il buffer allocato su \param{buf} non sia sufficiente a contenere i
 dati, in tal caso si dovrà semplicemente ripetere l'esecuzione della funzione
@@ -874,6 +875,7 @@ Disattiva l'uso di connessioni per le interrogazioni ad un server DNS.
 \noindent e come si può vedere la funzione è estremamente semplice, non
 richiedendo nessun argomento.
 
+% TODO manca gethostent (e gethostent_r) e altro ? (vedi man page)
 
 Infine si può richiedere la risoluzione inversa di un indirizzo IP od IPv6,
 per ottenerne il nome a dominio ad esso associato, per fare questo si può
@@ -1017,19 +1019,19 @@ nomi dobbiamo citare le funzioni che permettono di interrogare gli altri
 servizi di risoluzione dei nomi illustrati in sez.~\ref{sec:sock_resolver}; in
 generale infatti ci sono una serie di funzioni nella forma
 \texttt{getXXXbyname} e \texttt{getXXXbyaddr} (dove \texttt{XXX} indica il
-servizio) per ciascuna delle informazioni di rete mantenute dal
-\itindex{Name~Service~Switch} \textit{Name Service Switch} che permettono
-rispettivamente di trovare una corrispondenza cercando per nome o per numero.
+servizio) per ciascuna delle informazioni di rete mantenute dal \textit{Name
+  Service Switch} che permettono rispettivamente di trovare una corrispondenza
+cercando per nome o per numero.
 
 L'elenco di queste funzioni è riportato nelle colonne finali di
 tab.~\ref{tab:name_resolution_functions}, dove le si sono suddivise rispetto
 al tipo di informazione che forniscono (riportato in prima colonna). Nella
 tabella si è anche riportato il file su cui vengono ordinariamente mantenute
 queste informazioni, che però può essere sostituito da un qualunque supporto
-interno al \itindex{Name~Service~Switch} \textit{Name Service Switch} (anche
-se usualmente questo avviene solo per la risoluzione degli indirizzi).
-Ciascuna funzione fa riferimento ad una sua apposita struttura che contiene i
-relativi dati, riportata in terza colonna.
+interno al \textit{Name Service Switch} (anche se usualmente questo avviene
+solo per la risoluzione degli indirizzi).  Ciascuna funzione fa riferimento ad
+una sua apposita struttura che contiene i relativi dati, riportata in terza
+colonna.
 
 \begin{table}[!htb]
   \centering
@@ -1043,29 +1045,29 @@ relativi dati, riportata in terza colonna.
     indirizzo &\conffile{/etc/hosts}&\struct{hostent}&\func{gethostbyname}&
                \func{gethostbyaddr}\\ 
     servizio  &\conffile{/etc/services}&\struct{servent}&\func{getservbyname}&
-               \func{getservbyaddr}\\ 
-    rete      &\conffile{/etc/networks}&\struct{netent}&\func{getnetbyname}&
-               \func{getnetbyaddr}\\ 
+               \func{getservbyport}\\ 
+    rete      &\conffile{/etc/networks}&\struct{netent}&\funcm{getnetbyname}&
+               \funcm{getnetbyaddr}\\ 
     protocollo&\conffile{/etc/protocols}&\struct{protoent}&
-               \func{getprotobyname}&\func{getprotobyaddr}\\ 
+               \funcm{getprotobyname}&\funcm{getprotobyaddr}\\ 
     \hline
   \end{tabular}
   \caption{Funzioni di risoluzione dei nomi per i vari servizi del
-    \itindex{Name~Service~Switch} \textit{Name Service Switch}.}
+    \textit{Name Service Switch} riguardanti la rete.}
   \label{tab:name_resolution_functions}
 \end{table}
 
 Delle funzioni di tab.~\ref{tab:name_resolution_functions} abbiamo trattato
 finora soltanto quelle relative alla risoluzione dei nomi, dato che sono le
 più usate, e prevedono praticamente da sempre la necessità di rivolgersi ad
-una entità esterna; per le altre invece, estensioni fornite dal
-\itindex{Name~Service~Switch} NSS a parte, si fa sempre riferimento ai dati
-mantenuti nei rispettivi file.
+una entità esterna; per le altre invece, estensioni fornite dal \textit{Name
+  Service Switch} a parte, si fa sempre riferimento ai dati mantenuti nei
+rispettivi file.
 
 Dopo la risoluzione dei nomi a dominio una delle ricerche più comuni è quella
 sui nomi dei servizi di rete più comuni (cioè \texttt{http}, \texttt{smtp},
 ecc.) da associare alle rispettive porte. Le due funzioni da utilizzare per
-questo sono \funcd{getservbyname} e \funcd{getservbyaddr}, che permettono
+questo sono \funcd{getservbyname} e \funcd{getservbyport}, che permettono
 rispettivamente di ottenere il numero di porta associato ad un servizio dato
 il nome e viceversa; i loro prototipi sono:
 \begin{functions}
@@ -1094,19 +1096,18 @@ qualsiasi.
 Il primo argomento è il nome del servizio per \func{getservbyname},
 specificato tramite la stringa \param{name}, mentre \func{getservbyport}
 richiede il numero di porta in \param{port}. Entrambe le funzioni eseguono una
-ricerca sul file \conffile{/etc/services}\footnote{il
-  \itindex{Name~Service~Switch} \textit{Name Service Switch} astrae il
-  concetto a qualunque supporto su cui si possano mantenere i suddetti dati.}
-ed estraggono i dati dalla prima riga che corrisponde agli argomenti
-specificati; se la risoluzione ha successo viene restituito un puntatore ad
-una apposita struttura \struct{servent} contenente tutti i risultati,
-altrimenti viene restituito un puntatore nullo.  Si tenga presente che anche
-in questo caso i dati vengono mantenuti in una area di memoria statica e che
-quindi la funzione non è \index{funzioni!rientranti} rientrante.
+ricerca sul file \conffile{/etc/services}\footnote{il \textit{Name Service
+    Switch} astrae il concetto a qualunque supporto su cui si possano
+  mantenere i suddetti dati.}  ed estraggono i dati dalla prima riga che
+corrisponde agli argomenti specificati; se la risoluzione ha successo viene
+restituito un puntatore ad una apposita struttura \struct{servent} contenente
+tutti i risultati, altrimenti viene restituito un puntatore nullo.  Si tenga
+presente che anche in questo caso i dati vengono mantenuti in una area di
+memoria statica e che quindi la funzione non è rientrante.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/servent.h}
   \end{minipage}
   \caption{La struttura \structd{servent} per la risoluzione dei nomi dei
@@ -1129,13 +1130,13 @@ precedenti: tutti i dettagli relativi al loro funzionamento possono essere
 trovati nelle rispettive pagine di manuale.
 
 Oltre alle funzioni di ricerca esistono delle ulteriori funzioni che prevedono
-una lettura sequenziale delle informazioni mantenute nel
-\itindex{Name~Service~Switch} \textit{Name Service Switch} (in sostanza
-permettono di leggere i file contenenti le informazioni riga per riga), che
-sono analoghe a quelle elencate in tab.~\ref{tab:sys_passwd_func} per le
-informazioni relative ai dati degli utenti e dei gruppi. Nel caso specifico
-dei servizi avremo allora le tre funzioni \funcd{setservent},
-\funcd{getservent} e \funcd{endservent} i cui prototipi sono:
+una lettura sequenziale delle informazioni mantenute nel \textit{Name Service
+  Switch} (in sostanza permettono di leggere i file contenenti le informazioni
+riga per riga), che sono analoghe a quelle elencate in
+tab.~\ref{tab:sys_passwd_func} per le informazioni relative ai dati degli
+utenti e dei gruppi. Nel caso specifico dei servizi avremo allora le tre
+funzioni \funcd{setservent}, \funcd{getservent} e \funcd{endservent} i cui
+prototipi sono:
 \begin{functions}
   \headdecl{netdb.h} 
   \funcdecl{void setservent(int stayopen)} 
@@ -1162,7 +1163,7 @@ voce. La seconda funzione, \func{setservent}, permette di aprire il file
 aperto riporta la posizione di lettura alla prima voce del file, in questo
 modo si può far ricominciare da capo una lettura sequenziale. L'argomento
 \param{stayopen}, se diverso da zero, fa sì che il file resti aperto anche fra
-diverse chiamate a \func{getservbyname} e \func{getservbyaddr}.\footnote{di
+diverse chiamate a \func{getservbyname} e \func{getservbyport}.\footnote{di
   default dopo una chiamata a queste funzioni il file viene chiuso, cosicché
   una successiva chiamata a \func{getservent} riparte dall'inizio.}  La terza
 funzione, \funcd{endservent}, provvede semplicemente a chiudere il file.
@@ -1187,12 +1188,12 @@ rimandando alle rispettive pagine di manuale.
     \hline
     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}\\ 
+    rete      &\funcm{setnetent}  &\funcm{getnetent}  &\funcm{endnetent}\\ 
+    protocollo&\funcm{setprotoent}&\funcm{getprotoent}&\funcm{endprotoent}\\ 
     \hline
   \end{tabular}
   \caption{Funzioni lettura sequenziale dei dati del
-    \itindex{Name~Service~Switch} \textit{Name Service Switch}.} 
+    \textit{Name Service Switch}.} 
   \label{tab:name_sequential_read}
 \end{table}
 
@@ -1262,17 +1263,16 @@ 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 è
-\index{funzioni!rientranti} 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.
+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à 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]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/addrinfo.h}
   \end{minipage}
   \caption{La struttura \structd{addrinfo} usata nella nuova interfaccia POSIX
@@ -1280,15 +1280,16 @@ tipo \struct{addrinfo} contenenti tutte le informazioni ottenute.
   \label{fig:sock_addrinfo_struct}
 \end{figure}
 
-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
+Come illustrato la struttura \struct{addrinfo}, la cui definizione è 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. La definizione è ripresa direttamente dal file \headfiled{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.
+
+Il primo campo, \var{ai\_flags}, è una maschera binaria di bit che
 permettono di controllare le varie modalità di risoluzione degli indirizzi,
 che viene usato soltanto in ingresso. I tre campi successivi \var{ai\_family},
 \var{ai\_socktype}, e \var{ai\_protocol} contengono rispettivamente la
@@ -1444,7 +1445,7 @@ corrispondente è riportato tramite \var{errno}.
 Come per i codici di errore di \func{gethostbyname} anche in questo caso è
 fornita una apposita funzione, analoga di \func{strerror}, che consente di
 utilizzarli direttamente per stampare a video un messaggio esplicativo; la
-funzione è \func{gai\_strerror} ed il suo prototipo è:
+funzione è \funcd{gai\_strerror} ed il suo prototipo è:
 \begin{functions}
   \headdecl{netdb.h} 
 
@@ -1602,7 +1603,7 @@ struttura \struct{addrinfo}, perché una volta disallocati i dati con
 Anche la nuova interfaccia definita da POSIX prevede una nuova funzione per
 eseguire la risoluzione inversa e determinare nomi di servizi e di dominio
 dati i rispettivi valori numerici. La funzione che sostituisce le varie
-\func{gethostbyname}, \func{getipnodebyname} e \func{getservname} è
+\func{gethostbyname}, \func{getipnodebyname} e \func{getservbyname} è
 \funcd{getnameinfo}, ed il suo prototipo è:
 \begin{functions}
   \headdecl{sys/socket.h}
@@ -1671,10 +1672,10 @@ terminate dal carattere NUL, a meno che queste non debbano essere troncate
 qualora la loro dimensione ecceda quelle specificate dagli argomenti
 \param{hostlen} e \param{servlen}. Sono comunque definite le due costanti
 \const{NI\_MAXHOST} e \const{NI\_MAXSERV}\footnote{in Linux le due costanti
-  sono definite in \file{netdb.h} ed hanno rispettivamente il valore 1024 e
-  12.}  che possono essere utilizzate come limiti massimi.  In caso di errore
-viene restituito invece un codice che assume gli stessi valori illustrati in
-tab.~\ref{tab:addrinfo_error_code}.
+  sono definite in \headfile{netdb.h} ed hanno rispettivamente il valore 1024
+  e 12.}  che possono essere utilizzate come limiti massimi.  In caso di
+errore viene restituito invece un codice che assume gli stessi valori
+illustrati in tab.~\ref{tab:addrinfo_error_code}.
 
 A questo punto possiamo fornire degli esempi di utilizzo della nuova
 interfaccia, adottandola per le precedenti implementazioni del client e del
@@ -1686,8 +1687,8 @@ finora, quello in cui si specifica nel client un indirizzo remoto per la
 connessione al server, e quello in cui si specifica nel server un indirizzo
 locale su cui porsi in ascolto.
 
-La prima funzione della nostra interfaccia semplificata è \func{sockconn} che
-permette di ottenere un socket, connesso all'indirizzo ed al servizio
+La prima funzione della nostra interfaccia semplificata è \texttt{sockconn}
+che permette di ottenere un socket, connesso all'indirizzo ed al servizio
 specificati. Il corpo della funzione è riportato in
 fig.~\ref{fig:sockconn_code}, il codice completo è nel file \file{SockUtil.c}
 dei sorgenti allegati alla guida, che contiene varie funzioni di utilità per
@@ -1699,7 +1700,7 @@ l'uso dei socket.
     \includecodesample{listati/sockconn.c}
   \end{minipage}
   \normalsize
-  \caption{Il codice della funzione \func{sockconn}.}
+  \caption{Il codice della funzione \texttt{sockconn}.}
   \label{fig:sockconn_code}
 \end{figure}
 
@@ -1721,12 +1722,12 @@ Una volta definite le variabili necessarie (\texttt{\small 3--5}) la funzione
 prima (\texttt{\small 6}) azzera il contenuto della struttura \var{hint} e poi
 provvede (\texttt{\small 7--9}) ad inizializzarne i valori necessari per la
 chiamata (\texttt{\small 10}) a \func{getaddrinfo}. Di quest'ultima si
-controlla (\texttt{\small 12-16}) il codice di ritorno, in modo da stampare un
+controlla (\texttt{\small 12--16}) il codice di ritorno, in modo da stampare un
 avviso di errore, azzerare \var{errno} ed uscire in caso di errore.  Dato che
 ad una macchina possono corrispondere più indirizzi IP, e di tipo diverso (sia
 IPv4 che IPv6), mentre il servizio può essere in ascolto soltanto su uno solo
 di questi, si provvede a tentare la connessione per ciascun indirizzo
-restituito all'interno di un ciclo (\texttt{\small 18-40}) di scansione della
+restituito all'interno di un ciclo (\texttt{\small 18--40}) di scansione della
 lista restituita da \func{getaddrinfo}, ma prima (\texttt{\small 17}) si salva
 il valore del puntatore per poterlo riutilizzare alla fine per disallocare la
 lista.
@@ -1736,7 +1737,7 @@ validi, ed inizia (\texttt{\small 19}) con l'apertura del socket; se questa
 fallisce si controlla (\texttt{\small 20}) se sono disponibili altri
 indirizzi, nel qual caso si passa al successivo (\texttt{\small 21}) e si
 riprende (\texttt{\small 22}) il ciclo da capo; se non ve ne sono si stampa
-l'errore ritornando immediatamente (\texttt{\small 24-27}). Quando la
+l'errore ritornando immediatamente (\texttt{\small 24--27}). Quando la
 creazione del socket ha avuto successo si procede (\texttt{\small 29})
 direttamente con la connessione, di nuovo in caso di fallimento viene ripetuto
 (\texttt{\small 30--38}) il controllo se vi sono o no altri indirizzi da
@@ -1752,7 +1753,7 @@ valore del relativo puntatore precedentemente (\texttt{\small 17}) salvato.
 Si noti come per la funzione sia del tutto irrilevante se la struttura
 ritornata contiene indirizzi IPv6 o IPv4, in quanto si fa uso direttamente dei
 dati relativi alle strutture degli indirizzi di \struct{addrinfo} che sono
-\index{tipo!opaco} opachi rispetto all'uso della funzione \func{connect}.
+opachi rispetto all'uso della funzione \func{connect}.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
@@ -1770,7 +1771,7 @@ codice usato finora per collegarsi (vedi fig.~\ref{fig:TCP_echo_client_1})
 avremo una semplificazione per cui il corpo principale del nostro client
 diventerà quello illustrato in fig.~\ref{fig:TCP_echo_fifth}, in cui le
 chiamate a \func{socket}, \func{inet\_pton} e \func{connect} sono sostituite
-da una singola chiamata a \func{sockconn}. Inoltre il nuovo client (il cui
+da una singola chiamata a \texttt{sockconn}. Inoltre il nuovo client (il cui
 codice completo è nel file \file{TCP\_echo\_fifth.c} dei sorgenti allegati)
 consente di utilizzare come argomento del programma un nome a dominio al posto
 dell'indirizzo numerico, e può utilizzare sia indirizzi IPv4 che IPv6.
@@ -1781,14 +1782,14 @@ dell'indirizzo numerico, e può utilizzare sia indirizzi IPv4 che IPv6.
     \includecodesample{listati/sockbind.c}
   \end{minipage}
   \normalsize
-  \caption{Il codice della funzione \func{sockbind}.}
+  \caption{Il codice della funzione \texttt{sockbind}.}
   \label{fig:sockbind_code}
 \end{figure}
 
-La seconda funzione di ausilio è \func{sockbind}, il cui corpo principale è
+La seconda funzione di ausilio è \texttt{sockbind}, il cui corpo principale è
 riportato in fig.~\ref{fig:sockbind_code} (al solito il sorgente completo è
 nel file \file{sockbind.c} dei sorgenti allegati alla guida). Come si può
-notare la funzione è del tutto analoga alla precedente \func{sockconn}, e
+notare la funzione è del tutto analoga alla precedente \texttt{sockconn}, e
 prende gli stessi argomenti, però invece di eseguire una connessione con
 \func{connect} si limita a chiamare \func{bind} per collegare il socket ad una
 porta.
@@ -1805,16 +1806,16 @@ passare un valore \val{NULL} come valore per l'argomento \var{host}; l'uso
 del valore \const{AI\_PASSIVE} serve ad ottenere il valore generico nella
 rispettiva struttura degli indirizzi.
 
-Come già detto la funzione è analoga a \func{sockconn} ed inizia azzerando ed
-inizializzando (\texttt{\small 6-11}) opportunamente la struttura \var{hint}
-con i valori ricevuti come argomenti, soltanto che in questo caso si è usata
-(\texttt{\small 8}) una impostazione specifica dei flag di \var{hint} usando
-\const{AI\_PASSIVE} per indicare che il socket sarà usato per una apertura
-passiva. Per il resto la chiamata (\texttt{\small 12-18}) a \func{getaddrinfo}
-e ed il ciclo principale (\texttt{\small 20--42}) sono identici, solo che si è
-sostituita (\texttt{\small 31}) la chiamata a \func{connect} con una chiamata
-a \func{bind}. Anche la conclusione (\texttt{\small 43--44}) della funzione è
-identica. 
+Come già detto la funzione è analoga a \texttt{sockconn} ed inizia azzerando
+ed inizializzando (\texttt{\small 6--11}) opportunamente la struttura
+\var{hint} con i valori ricevuti come argomenti, soltanto che in questo caso
+si è usata (\texttt{\small 8}) una impostazione specifica dei flag di
+\var{hint} usando \const{AI\_PASSIVE} per indicare che il socket sarà usato
+per una apertura passiva. Per il resto la chiamata (\texttt{\small 12--18}) a
+\func{getaddrinfo} e ed il ciclo principale (\texttt{\small 20--42}) sono
+identici, solo che si è sostituita (\texttt{\small 31}) la chiamata a
+\func{connect} con una chiamata a \func{bind}. Anche la conclusione
+(\texttt{\small 43--44}) della funzione è identica.
 
 Si noti come anche in questo caso si siano inserite le stampe degli errori
 sullo standard error, nonostante la funzione possa essere invocata da un
@@ -1837,7 +1838,7 @@ Con l'uso di questa funzione si può modificare anche il codice del nostro
 server \textit{echo}, che rispetto a quanto illustrato nella versione iniziale
 di fig.~\ref{fig:TCP_echo_server_first_code} viene modificato nella forma
 riportata in fig.~\ref{fig:TCP_echod_third}. In questo caso il socket su cui
-porsi in ascolto viene ottenuto (\texttt{\small 15--18}) da \func{sockbind}
+porsi in ascolto viene ottenuto (\texttt{\small 15--18}) da \texttt{sockbind}
 che si cura anche della eventuale risoluzione di un indirizzo specifico sul
 quale si voglia far ascoltare il server.
 
@@ -1992,12 +1993,11 @@ di \func{setsockopt}, anche se non è detto che tutte le opzioni siano definite
 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 \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 dimensione del buffer allocato per \param{optval} non è sufficiente si
-avrà un errore.
+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 dimensione del buffer allocato
+per \param{optval} non è sufficiente si avrà un errore.
 
 
 
@@ -2055,8 +2055,7 @@ tab.~\ref{tab:sock_opt_socklevel}.
     \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
                           Non invia attraverso un gateway.\\
     \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Attiva o disattiva il \itindex{broadcast}
-                          \textit{broadcast}.\\ 
+                          Attiva o disattiva il \textit{broadcast}.\\ 
     \const{SO\_SNDBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
                           Imposta dimensione del buffer di trasmissione.\\
     \const{SO\_RCVBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
@@ -2073,6 +2072,11 @@ tab.~\ref{tab:sock_opt_socklevel}.
   \label{tab:sock_opt_socklevel}
 \end{table}
 
+% TODO aggiungere e documentare SO_ATTACH_BPF, introdotta con il kernel 3.19,
+% vedi http://lwn.net/Articles/625224/
+% TODO aggiungere e documentare SO_INCOMING_CPU, introdotta con il kernel 3.19,
+% vedi https://lwn.net/Articles/626150/
+
 La tabella elenca le costanti che identificano le singole opzioni da usare
 come valore per \param{optname}; le due colonne seguenti indicano per quali
 delle due funzioni (\func{getsockopt} o \func{setsockopt}) l'opzione è
@@ -2089,7 +2093,7 @@ gestione dei socket, e pertanto il loro utilizzo sarà approfondito
 separatamente in sez.~\ref{sec:sock_options_main}. Quello che segue è quindi
 soltanto un elenco più dettagliato della breve descrizione di
 tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 
 \item[\const{SO\_KEEPALIVE}] questa opzione abilita un meccanismo di verifica
   della persistenza di una connessione associata al socket (ed è pertanto
@@ -2201,21 +2205,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 \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}.}
+  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}.}
 
 \item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
   \func{bind} su indirizzi locali che siano già in uso da altri socket;
@@ -2243,12 +2247,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   di routing del kernel. Prende per \param{optval} un intero usato come valore
   logico.
 
-\item[\const{SO\_BROADCAST}] questa opzione abilita il \itindex{broadcast}
-  \textit{broadcast}; quanto abilitata i socket di tipo \const{SOCK\_DGRAM}
-  riceveranno i pacchetti inviati all'indirizzo di \textit{broadcast}, e
-  potranno scrivere pacchetti su tale indirizzo.  Prende per \param{optval} un
-  intero usato come valore logico. L'opzione non ha effetti su un socket di
-  tipo \const{SOCK\_STREAM}.
+\item[\const{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast};
+  quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i
+  pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere
+  pacchetti su tale indirizzo.  Prende per \param{optval} un intero usato come
+  valore logico. L'opzione non ha effetti su un socket di tipo
+  \const{SOCK\_STREAM}.
 
 \item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
   trasmissione del socket. Prende per \param{optval} un intero indicante il
@@ -2287,7 +2291,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e
   modifica il comportamento delle funzioni \func{close} e \func{shutdown}.
   L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo
-  \struct{linger}, definita in \texttt{sys/socket.h} ed illustrata in
+  \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in
   fig.~\ref{fig:sock_linger_struct}.  Maggiori dettagli sul suo funzionamento
   sono forniti in sez.~\ref{sec:sock_options_main}.
 
@@ -2302,8 +2306,7 @@ 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 \itindex{capabilities} capability
-  \const{CAP\_NET\_ADMIN}.
+  privilegi di amministratore con la 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
@@ -2338,6 +2341,9 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 % Documentation/networking/timestamping.txt
 
 
+% TOFO documentare SO_REUSEPORT introdotta con il kernel 3.9, vedi
+% http://git.kernel.org/linus/c617f398edd4db2b8567a28e899a88f8f574798d 
+
 \end{basedescript}
 
 
@@ -2352,7 +2358,7 @@ programmazione dei socket.  Per questo motivo faremo in questa sezione un
 approfondimento sul significato delle opzioni generiche più importanti.
 
 
-\index{costante!{SO\_KEEPALIVE}@{{\tt  {SO\_KEEPALIVE}}}|(}
+\constbeg{SO\_KEEPALIVE}
 \subsubsection{L'opzione \const{SO\_KEEPALIVE}}
 
 La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
@@ -2384,12 +2390,12 @@ avuto un crollo del sistema ed è stata riavviata, per cui dopo il riavvio la
 connessione non esiste più.\footnote{si ricordi che un normale riavvio o il
   crollo dell'applicazione non ha questo effetto, in quanto in tal caso si
   passa sempre per la chiusura del processo, e questo, come illustrato in
-  sez.~\ref{sec:file_close}, comporta anche la regolare chiusura del socket
-  con l'invio di un segmento FIN all'altro capo della connessione.} In questo
-caso all'invio del messaggio di \textit{keep-alive} si otterrà come risposta
-un segmento RST che indica che l'altro capo non riconosce più l'esistenza
-della connessione ed il socket verrà chiuso riportando un errore di
-\errcode{ECONNRESET}.
+  sez.~\ref{sec:file_open_close}, comporta anche la regolare chiusura del
+  socket con l'invio di un segmento FIN all'altro capo della connessione.} In
+questo caso all'invio del messaggio di \textit{keep-alive} si otterrà come
+risposta un segmento RST che indica che l'altro capo non riconosce più
+l'esistenza della connessione ed il socket verrà chiuso riportando un errore
+di \errcode{ECONNRESET}.
 
 Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
 più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75
@@ -2454,11 +2460,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{costante!{SO\_KEEPALIVE}@{{\tt  {SO\_KEEPALIVE}}}|)}
+\constend{SO\_KEEPALIVE}
 
 
 
-\index{costante!{SO\_REUSEADDR}@{{\tt  {SO\_REUSEADDR}}}|(}
+\constbeg{SO\_REUSEADDR}
 \subsubsection{L'opzione \const{SO\_REUSEADDR}}
 
 La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di
@@ -2504,9 +2510,9 @@ eventuali pacchetti rimasti intrappolati in una precedente connessione possano
 finire fra quelli di una nuova.
 
 Come esempio di uso di questa connessione abbiamo predisposto una nuova
-versione della funzione \func{sockbind} (vedi fig.~\ref{fig:sockbind_code})
+versione della funzione \texttt{sockbind} (vedi fig.~\ref{fig:sockbind_code})
 che consenta l'impostazione di questa opzione. La nuova funzione è
-\func{sockbindopt}, e le principali differenze rispetto alla precedente sono
+\texttt{sockbindopt}, e le principali differenze rispetto alla precedente sono
 illustrate in fig.~\ref{fig:sockbindopt_code}, dove si sono riportate le
 sezioni di codice modificate rispetto alla versione precedente. Il codice
 completo della funzione si trova, insieme alle altre funzioni di servizio dei
@@ -2519,15 +2525,15 @@ guida.
     \includecodesample{listati/sockbindopt.c}
   \end{minipage}
   \normalsize
-  \caption{Le sezioni della funzione \func{sockbindopt} modificate rispetto al
-    codice della precedente \func{sockbind}.} 
+  \caption{Le sezioni della funzione \texttt{sockbindopt} modificate rispetto al
+    codice della precedente \texttt{sockbind}.} 
   \label{fig:sockbindopt_code}
 \end{figure}
 
 In realtà tutto quello che si è fatto è stato introdurre nella nuova funzione
 (\texttt{\small 1}) un nuovo argomento intero, \param{reuse}, che conterrà il
 valore logico da usare nella successiva chiamata (\texttt{\small 14}) a
-\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13-17}) che
+\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13--17}) che
 esegue l'impostazione dell'opzione fra la chiamata a \func{socket} e quella a
 \func{bind}.
 
@@ -2544,7 +2550,7 @@ usata (\texttt{\small 14}) come ultimo argomento di \func{setsockopt}. Il
 valore di default di questa variabile è nullo, ma usando l'opzione \texttt{-r}
 nell'invocazione del server (al solito la gestione delle opzioni non è
 riportata in fig.~\ref{fig:TCP_echod_fifth}) se ne potrà impostare ad 1 il
-valore, per cui in tal caso la successiva chiamata (\texttt{\small 13-17}) a
+valore, per cui in tal caso la successiva chiamata (\texttt{\small 13--17}) a
 \func{setsockopt} attiverà l'opzione \const{SO\_REUSEADDR}.
 
 \begin{figure}[!htbp] 
@@ -2554,7 +2560,7 @@ valore, per cui in tal caso la successiva chiamata (\texttt{\small 13-17}) a
   \end{minipage}
   \normalsize
   \caption{Il nuovo codice per l'apertura passiva del server \textit{echo} che
-    usa la nuova funzione \func{sockbindopt}.}
+    usa la nuova funzione \texttt{sockbindopt}.}
   \label{fig:TCP_echod_fifth}
 \end{figure}
 
@@ -2593,10 +2599,8 @@ Infine il quarto caso è quello in cui si vuole effettivamente ottenere un
 \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:xxx_multicast}), allora ha senso che su una macchina i
-pacchetti provenienti dal traffico in \itindex{multicast} \textit{multicast}
+quando un sistema supporta il traffico in \textit{multicast}, allora ha senso
+che su una macchina i pacchetti provenienti dal traffico in \textit{multicast}
 possano essere ricevuti da più applicazioni\footnote{l'esempio classico di
   traffico in \textit{multicast} è quello di uno streaming di dati (audio,
   video, ecc.), l'uso del \textit{multicast} consente in tal caso di
@@ -2605,7 +2609,6 @@ possano essere ricevuti da più applicazioni\footnote{l'esempio classico di
   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
@@ -2613,29 +2616,32 @@ 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 protocollo 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 \itindex{broadcast}
-\textit{broadcast} o di \itindex{multicast} \textit{multicast} viene inviata
-una copia a ciascuna applicazione.  Non è definito invece cosa accade qualora
-il pacchetto sia destinato ad un indirizzo normale (unicast).
+tutti pacchetti destinati ad un indirizzo di \textit{broadcast} o di
+\textit{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
 opzione sia specificata per tutti i socket per i quali si vuole eseguire il
 \textit{completely duplicate binding}. Nel caso di Linux questa opzione non
-esiste, ma il comportamento di \const{SO\_REUSEADDR} è analogo, sarà cioè
-possibile effettuare un \textit{completely duplicate binding} ed ottenere il
-successo di \func{bind} su un socket legato allo stesso indirizzo e porta solo
-se il programma che ha eseguito per primo \func{bind} su di essi ha impostato
-questa opzione.\footnote{questa restrizione permette di evitare il cosiddetto
-  \textit{port stealing}, in cui un programma, usando \const{SO\_REUSEADDR},
-  può collegarsi ad una porta già in uso e ricevere i pacchetti destinati ad
-  un altro programma; con questa caratteristica ciò è possibile soltanto se il
+esisteva fino al kernel 3.9, ma il comportamento di \const{SO\_REUSEADDR} è
+analogo, sarà cioè possibile effettuare un \textit{completely duplicate
+  binding} ed ottenere il successo di \func{bind} su un socket legato allo
+stesso indirizzo e porta solo se il programma che ha eseguito per primo
+\func{bind} su di essi ha impostato questa opzione.\footnote{questa
+  restrizione permette di evitare parzialmente il cosiddetto \textit{port
+    stealing}, in cui un programma, usando \const{SO\_REUSEADDR}, può
+  collegarsi ad una porta già in uso e ricevere i pacchetti destinati ad un
+  altro programma; con questa caratteristica ciò è possibile soltanto se il
   primo programma a consentirlo, avendo usato fin dall'inizio
-  \const{SO\_REUSEADDR}.}  
+  \const{SO\_REUSEADDR}.}
 
-\index{costante!{SO\_REUSEADDR}@{{\tt  {SO\_REUSEADDR}}}|)}
+\constend{SO\_REUSEADDR}
 
-\index{costante!{SO\_LINGER}@{{\tt  {SO\_LINGER}}}|(}
+% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
+
+\constbeg{SO\_LINGER}
 \subsubsection{L'opzione \const{SO\_LINGER}}
 
 La terza opzione da approfondire è \const{SO\_LINGER}; essa, come il nome
@@ -2648,7 +2654,7 @@ dal kernel.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/linger.h}
   \end{minipage}
   \caption{La struttura \structd{linger} richiesta come valore dell'argomento
@@ -2679,7 +2685,7 @@ 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
+questa funzionalità; al solito il codice completo è disponibile nei sorgenti
 allegati.
 
 \begin{figure}[!htbp] 
@@ -2721,7 +2727,7 @@ secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata da
   completamento della trasmissione dei dati sul buffer.}  pari al valore
 specificato in \var{l\_linger}.
 
-\index{costante!{SO\_LINGER}@{{\tt  {SO\_LINGER}}}|)}
+\constend{SO\_LINGER}
 
 
 
@@ -2736,12 +2742,13 @@ socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni
 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.
+sono definite in \headfiled{netinet/ip.h}, ed accessibili includendo detto
+file.
 
 \begin{table}[!htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|c|c|c|l|l|}
+  \begin{tabular}[c]{|l|c|c|c|l|p{6cm}|}
     \hline
     \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
                     \textbf{Descrizione}\\
@@ -2770,23 +2777,21 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
     \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 \itindex{Maximum~Transfer~Unit} Discovery.\\
+      Imposta il \textit{Path MTU Discovery}.\\
     \const{IP\_MTU}             &$\bullet$&         &         &\texttt{int}& 
-      Legge il valore attuale della \itindex{Maximum~Transfer~Unit} MTU.\\
+      Legge il valore attuale della \itindex{Maximum~Transfer~Unit~(MTU)} 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}.\\
+      Imposta il TTL per i pacchetti \textit{multicast}.\\
     \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Controlla il reinvio a se stessi dei dati di \itindex{multicast} 
-      \textit{multicast}.\\ 
+      Controlla il reinvio a se stessi dei dati di \textit{multicast}.\\ 
     \const{IP\_ADD\_MEMBERSHIP} &         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
+      Si unisce a un gruppo di \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}.\\ 
+      Imposta l'interfaccia locale di un socket \textit{multicast}.\\ 
    \hline
   \end{tabular}
   \caption{Le opzioni disponibili al livello \const{SOL\_IP}.} 
@@ -2796,7 +2801,7 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
 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}}
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 
 
 \item[\const{IP\_OPTIONS}] l'opzione permette di impostare o leggere le
@@ -2824,7 +2829,7 @@ seguente elenco:
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/pktinfo.h}
   \end{minipage}
   \caption{La struttura \structd{pktinfo} usata dall'opzione
@@ -2886,8 +2891,8 @@ sez.~\ref{sec:net_sendmsg}).
   definizione si veda 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}.
+  richiedono i privilegi di amministrazione con la 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
@@ -2944,11 +2949,11 @@ sez.~\ref{sec:net_sendmsg}).
   come valore logico e non è applicabile a socket di tipo
   \const{SOCK\_STREAM}.
 
-\itindbeg{Maximum~Transfer~Unit}
+\itindbeg{Path~MTU}
 \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
+  \textit{Path MTU} (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}.
@@ -2982,12 +2987,11 @@ sez.~\ref{sec:net_sendmsg}).
   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 \itindex{Maximum~Transfer~Unit} \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.}
+  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
@@ -3001,15 +3005,15 @@ sez.~\ref{sec:net_sendmsg}).
   esplicitamente connesso con \func{connect}. 
 
   Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
-  \itindex{Maximum~Transfer~Unit} \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.
+  \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}
+\itindend{Path~MTU}
 
 \item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
   kernel della serie 2.2.x, ed è specifica di Linux. Prende per
@@ -3018,7 +3022,6 @@ sez.~\ref{sec:net_sendmsg}).
   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
@@ -3055,7 +3058,7 @@ sez.~\ref{sec:net_sendmsg}).
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/ip_mreqn.h}
   \end{minipage}
   \caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei
@@ -3072,7 +3075,9 @@ sez.~\ref{sec:net_sendmsg}).
   del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture
   \struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni.
 
-\itindend{multicast}
+% TODO chiarire quale è la struttura \struct{ip\_mreq}
+
+
 \end{basedescript}
 
 
@@ -3102,10 +3107,11 @@ riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcplevel},
 dove sono elencate le rispettive costanti da utilizzare come valore per
 l'argomento \param{optname}. Dette costanti e tutte le altre costanti e
 strutture collegate all'uso delle opzioni TCP 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}.}
+\headfiled{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{include/linux/tcp.h} dei sorgenti del kernel, dal quale si sono
+  estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.}
 
 \begin{table}[!htb]
   \centering
@@ -3119,7 +3125,7 @@ strutture collegate all'uso delle opzioni TCP sono definite in
     \const{TCP\_NODELAY}      &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
       Spedisce immediatamente i dati in segmenti singoli.\\
     \const{TCP\_MAXSEG}       &$\bullet$&$\bullet$&         &\texttt{int}&
-      Valore della \itindex{Maximum~Segment~Size} MSS per i segmenti in
+      Valore della \itindex{Maximum~Segment~Size~(MSS)} MSS per i segmenti in
       uscita.\\  
     \const{TCP\_CORK}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
       Accumula i dati in un unico segmento.\\
@@ -3136,7 +3142,7 @@ strutture collegate all'uso delle opzioni TCP sono definite in
     \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&         &\texttt{int}&
       Ritorna da \func{accept} solo in presenza di dati.\\
     \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&         &\texttt{int}&
-      Valore della \itindex{advertised~window} \textit{advertised window}.\\
+      Valore della \textit{advertised window}.\\
     \const{TCP\_INFO}         &$\bullet$&        &       &\struct{tcp\_info}& 
       Restituisce informazioni sul socket.\\
     \const{TCP\_QUICKACK}     &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
@@ -3154,8 +3160,7 @@ Le descrizioni delle varie opzioni riportate in
 tab.~\ref{tab:sock_opt_tcplevel} sono estremamente sintetiche ed indicative,
 la spiegazione del funzionamento delle singole opzioni con una maggiore
 quantità di dettagli è fornita nel seguente elenco:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
-
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 
 \item[\const{TCP\_NODELAY}] il protocollo TCP utilizza un meccanismo di
   bufferizzazione dei dati uscenti, per evitare la trasmissione di tanti
@@ -3195,13 +3200,14 @@ quantità di dettagli è fornita nel seguente elenco:
     kernel 2.5.71.}
 
 \item[\const{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore
-  della \itindex{Maximum~Segment~Size} MSS (\textit{Maximum~Segment~Size},
-  vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:tcp_protocol_xxx}) dei
-  segmenti TCP uscenti. Se l'opzione è impostata prima di stabilire la
-  connessione, si cambia anche il valore della \itindex{Maximum~Segment~Size}
-  MSS annunciata all'altro capo della connessione. Se si specificano valori
-  maggiori della \itindex{Maximum~Transfer~Unit} MTU questi verranno ignorati,
-  inoltre TCP imporrà anche i suoi limiti massimo e minimo per questo valore.
+  della \itindex{Maximum~Segment~Size~(MSS)} MSS
+  (\textit{Maximum~Segment~Size}, vedi sez.~\ref{sec:net_lim_dim} e
+  sez.~\ref{sec:tcp_protocol_xxx}) dei segmenti TCP uscenti. Se l'opzione è
+  impostata prima di stabilire la connessione, si cambia anche il valore della
+  \itindex{Maximum~Segment~Size~(MSS)} MSS annunciata all'altro capo della
+  connessione. Se si specificano valori maggiori della
+  \itindex{Maximum~Transfer~Unit~(MTU)} MTU questi verranno ignorati, inoltre
+  TCP imporrà anche i suoi limiti massimo e minimo per questo valore.
 
 \item[\const{TCP\_CORK}] questa opzione è il complemento naturale di
   \const{TCP\_NODELAY} e serve a gestire a livello applicativo la situazione
@@ -3331,14 +3337,14 @@ quantità di dettagli è fornita nel seguente elenco:
 
 \item[\const{TCP\_WINDOW\_CLAMP}] con questa opzione si legge o si imposta
   alla dimensione specificata, in byte, il valore dichiarato della
-  \itindex{advertised~window} \textit{advertised window} (vedi
-  sez.~\ref{sec:tcp_protocol_xxx}). Il kernel impone comunque una dimensione
-  minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}.  Questa opzione non deve essere
-  utilizzata in codice che vuole essere portabile.
+  \textit{advertised window} (vedi sez.~\ref{sec:tcp_protocol_xxx}). Il kernel
+  impone comunque una dimensione minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}.
+  Questa opzione non deve essere utilizzata in codice che vuole essere
+  portabile.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/tcp_info.h}
   \end{minipage}
   \caption{La struttura \structd{tcp\_info} contenente le informazioni sul
@@ -3444,36 +3450,28 @@ quantità di dettagli è fornita nel seguente elenco:
   \begin{table}[!htb]
     \centering
     \footnotesize
-    \begin{tabular}[c]{|l|l|p{10cm}|}
+    \begin{tabular}[c]{|l|l|l|}
       \hline
       \textbf{Nome}&\textbf{Configurazione}&\textbf{Riferimento} \\
       \hline
       \hline
       reno& -- &Algoritmo tradizionale, usato in caso di assenza degli altri.\\
       \texttt{bic}     &\texttt{TCP\_CONG\_BIC}     & 
-      \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
-      {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+      \url{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}.\\
       \texttt{cubic}   &\texttt{TCP\_CONG\_CUBIC}     & 
-      \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
-      {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+      \url{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}.\\
       \texttt{highspeed}&\texttt{TCP\_CONG\_HSTCP}  & 
-      \href{http://www.icir.org/floyd/hstcp.html}
-      {\textsf{http://www.icir.org/floyd/hstcp.html}}.\\
+      \url{http://www.icir.org/floyd/hstcp.html}.\\
       \texttt{htcp}    &\texttt{TCP\_CONG\_HTCP}    & 
-      \href{http://www.hamilton.ie/net/htcp/}
-      {\textsf{http://www.hamilton.ie/net/htcp/}}.\\
+      \url{http://www.hamilton.ie/net/htcp/}.\\
       \texttt{hybla}   &\texttt{TCP\_CONG\_HYBLA}   &       
-      \href{http://www.danielinux.net/projects.html}
-      {\textsf{http://www.danielinux.net/projects.html}}.\\
+      \url{http://www.danielinux.net/projects.html}.\\
       \texttt{scalable}&\texttt{TCP\_CONG\_SCALABLE}&  
-      \href{http://www.deneholme.net/tom/scalable/}
-      {\textsf{http://www.deneholme.net/tom/scalable/}}.\\
+      \url{http://www.deneholme.net/tom/scalable/}.\\
       \texttt{vegas}   &\texttt{TCP\_CONG\_VEGAS}   &  
-      \href{http://www.cs.arizona.edu/protocols/}
-      {\textsf{http://www.cs.arizona.edu/protocols/}}.\\
+      \url{http://www.cs.arizona.edu/protocols/}.\\
       \texttt{westwood}&\texttt{TCP\_CONG\_WESTWOOD}& 
-      \href{http://www.cs.ucla.edu/NRL/hpi/tcpw/}
-      {\textsf{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\
+      \url{http://www.cs.ucla.edu/NRL/hpi/tcpw/}.\\
 %      \texttt{}&\texttt{}& .\\
       \hline
     \end{tabular}
@@ -3490,10 +3488,11 @@ ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udplevel}; 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
+definite in \headfiled{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}.}
+  supportate dal kernel si trova in realtà nel file
+  \texttt{include/linux/udp.h}, dal quale si sono estratte le costanti di
+  tab.~\ref{tab:sock_opt_udplevel}.}
 
 \begin{table}[!htb]
   \centering
@@ -3520,7 +3519,7 @@ file.\footnote{come per TCP, la definizione delle opzioni effettivamente
 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}}
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 
 \item[\const{UDP\_CORK}] questa opzione ha l'identico effetto dell'analoga
   \const{TCP\_CORK} vista in precedenza per il protocollo TCP, e quando
@@ -3545,11 +3544,10 @@ caratteristiche delle opzioni citate è quello dell'elenco seguente:
 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.
+trattate in sez.~\ref{sec:file_fcntl_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}
@@ -3557,10 +3555,10 @@ dei socket.
 
 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.
+generici. Quanto già detto in precedenza sez.~\ref{sec:file_fcntl_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
@@ -3568,16 +3566,16 @@ 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}}
+come \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{1.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à
+    \itindex{Round~Trip~Time~(RTT)} \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}
@@ -3585,7 +3583,7 @@ identificano le operazioni sono le seguenti:
   \signal{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
+  \type{pid\_t}; un valore positivo indica direttamente il \ids{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
@@ -3600,10 +3598,10 @@ identificano le operazioni sono le seguenti:
   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 \signal{SIGIO} (o quanto impostato con
-  \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O
-  sul socket.
+  socket. Questo significa (vedi sez.~\ref{sec:signal_driven_io}) che verrà
+  inviato il segnale di \signal{SIGIO} (o quanto impostato con
+  \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl_ioctl}) in caso di eventi
+  di I/O sul socket.
 \end{basedescript}
 
 Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi
@@ -3628,7 +3626,7 @@ permette di impostare e rilevare le funzionalità delle interfacce di rete.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/ifreq.h}
   \end{minipage}
   \caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le
@@ -3643,16 +3641,15 @@ 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 \direct{union} proprio in quanto il suo significato
+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 \itindex{capabilities}
-\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{2.7cm}\desclabelstyle{\nextlinelabel}}
+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[\const{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
@@ -3688,7 +3685,7 @@ sono le seguenti:
     \hline
     \const{IFF\_UP}        & L'interfaccia è attiva.\\
     \const{IFF\_BROADCAST} & L'interfaccia ha impostato un indirizzo di
-                             \itindex{broadcast} \textit{broadcast} valido.\\
+                             \textit{broadcast} valido.\\
     \const{IFF\_DEBUG}     & È attivo il flag interno di debug.\\
     \const{IFF\_LOOPBACK}  & L'interfaccia è una interfaccia di
                              \textit{loopback}.\\ 
@@ -3703,14 +3700,13 @@ sono le seguenti:
                              pacchetti che vede passare, compresi quelli non
                              direttamente indirizzati a lei).\\
     \const{IFF\_NOTRAILERS}& Evita l'uso di \textit{trailer} nei pacchetti.\\
-    \const{IFF\_ALLMULTI}  & Riceve tutti i pacchetti di  \itindex{multicast}
-                             \textit{multicast}.\\
+    \const{IFF\_ALLMULTI}  & Riceve tutti i pacchetti di \textit{multicast}.\\
     \const{IFF\_MASTER}    & L'interfaccia è il master di un bundle per il
                              bilanciamento di carico.\\
     \const{IFF\_SLAVE}     & L'interfaccia è uno slave di un bundle per il
                              bilanciamento di carico.\\
     \const{IFF\_MULTICAST} & L'interfaccia ha il supporto per il
-                             \textit{multicast} \itindex{multicast} attivo.\\
+                             \textit{multicast} attivo.\\
     \const{IFF\_PORTSEL}   & L'interfaccia può impostare i suoi parametri
                              hardware (con l'uso di \struct{ifmap}).\\
     \const{IFF\_AUTOMEDIA} & L'interfaccia è in grado di selezionare
@@ -3743,11 +3739,11 @@ sono le seguenti:
   non ancora implementato, restituisce un errore di \errval{EOPNOTSUPP}.
 
 \item[\const{SIOCGIFMTU}] permette di leggere il valore della
-  \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del
+  \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Maximum Transfer Unit} del
   dispositivo nel campo \var{ifr\_mtu}.
 
 \item[\const{SIOCSIFMTU}] permette di impostare il valore della
-  \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del
+  \itindex{Maximum~Transfer~Unit~(MTU)} \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.
@@ -3766,8 +3762,8 @@ sono le seguenti:
   privilegiata.
 
 \item[\const{SIOCSIFHWBROADCAST}] imposta l'indirizzo \textit{broadcast}
-  \itindex{broadcast} hardware dell'interfaccia al valore specificato dal
-  campo \var{ifr\_hwaddr}. L'operazione è privilegiata.
+  hardware dell'interfaccia al valore specificato dal campo
+  \var{ifr\_hwaddr}. L'operazione è privilegiata.
 
 \item[\const{SIOCGIFMAP}] legge alcuni parametri hardware (memoria, interrupt,
   canali di DMA) del driver dell'interfaccia specificata, restituendo i
@@ -3777,7 +3773,7 @@ sono le seguenti:
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/ifmap.h}
   \end{minipage}
   \caption{La struttura \structd{ifmap} utilizzata per leggere ed impostare i
@@ -3791,19 +3787,19 @@ sono le seguenti:
   struttura \struct{ifmap}, secondo la definizione di
   fig.~\ref{fig:netdevice_ifmap_struct}.
 
-\item[\const{SIOCADDMULTI}] aggiunge un indirizzo di \itindex{multicast}
-  \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[\const{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[\const{SIOCDELMULTI}] rimuove un indirizzo di \itindex{multicast}
-  \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[\const{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[\const{SIOCGIFTXQLEN}] permette di leggere la lunghezza della coda di
   trasmissione del dispositivo associato all'interfaccia specificata nel campo
@@ -3820,6 +3816,10 @@ sono le seguenti:
 
 \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, è \const{SIOCGIFCONF}; però per ragioni di compatibilità
 questa operazione è disponibile soltanto per i socket della famiglia
@@ -3829,7 +3829,7 @@ fig.~\ref{fig:netdevice_ifconf_struct}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.80\textwidth}
     \includestruct{listati/ifconf.h}
   \end{minipage}
   \caption{La struttura \structd{ifconf}.}
@@ -3843,7 +3843,7 @@ questo buffer deve essere specificata nel campo \var{ifc\_len} di
 \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
-  \direct{union}, questo consente di utilizzare una delle due forme a piacere.}
+  \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
@@ -3927,9 +3927,9 @@ 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 \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}}
+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[\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}.
@@ -3960,10 +3960,9 @@ essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
 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 \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}}
+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
@@ -4089,8 +4088,8 @@ 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[\sysctlrelfile{net/core}{dev\_weight}] blocco di lavoro
-  (\textit{work quantum}) dello scheduler di processo dei pacchetti.
+\item[\sysctlrelfile{net/core}{dev\_weight}] blocco di lavoro (\textit{work
+    quantum}) dello \textit{scheduler} di processo dei pacchetti.
 
 % TODO da documentare meglio
 
@@ -4179,21 +4178,21 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti:
   valore iniziale maggiore di 1024 (o meglio ancora di 4096) per evitare
   conflitti con le porte usate dai servizi noti.
 
-\item[\sysctlrelfile{net/ipv4}{ip\_no\_pmtu\_disc}] permette di
-  disabilitare per i socket \const{SOCK\_STREAM} la ricerca automatica della
-  \itindex{Maximum~Transfer~Unit} \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).
+\item[\sysctlrelfile{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 \itindex{Maximum~Transfer~Unit} \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.
+  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[\sysctlrelfile{net/ipv4}{ip\_always\_defrag}] fa si che tutti i
   pacchetti IP frammentati siano riassemblati, anche in caso in successivo
@@ -4246,25 +4245,26 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   quando si è sicuri che non è possibile ottimizzare il server in modo che sia
   in grado di accettare connessioni più rapidamente.
 
-\item[\sysctlrelfile{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 \itindex{advertised~window} \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
+\item[\sysctlrelfile{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[\sysctlrelfile{net/ipv4}{tcp\_app\_win}] indica la frazione
-  della finestra TCP che viene riservata per gestire l'overhaed dovuto alla
+\item[\sysctlrelfile{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 \itindex{Maximum~Segment~Size}
-  MSS e $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa
-  che non viene riservato nessuno spazio; il valore di default è 31.
+  dimensione in byte come il massimo fra la
+  \itindex{Maximum~Segment~Size~(MSS)} 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 
@@ -4637,7 +4637,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 % LocalWords:  ERANGE sethostent stayopen endhostent gethostbyaddr order pton
 % LocalWords:  getipnodebyname getipnodebyaddr flags num MAPPED ALL ADDRCONFIG
 % LocalWords:  freehostent ip getXXXbyname getXXXbyaddr servent getservbyname
-% LocalWords:  getservbyaddr netent getnetbyname getnetbyaddr protoent smtp udp
+% 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