Novità del kernel
[gapil.git] / sockctrl.tex
index 3a2afa7b8a466f9a04caa67db9c048eecde84974..7b26d58364a0b2466a6dde3da3d9e2554b397375 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004-2012 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2014 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
@@ -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}}
@@ -875,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ò
@@ -1019,7 +1020,7 @@ 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
+\itindex{Name~Service~Switch~(NSS)} \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
@@ -1027,8 +1028,8 @@ 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).
+interno al \itindex{Name~Service~Switch~(NSS)} \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.
 
@@ -1044,15 +1045,15 @@ 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}.}
+    \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}.}
   \label{tab:name_resolution_functions}
 \end{table}
 
@@ -1060,13 +1061,13 @@ 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.
+\itindex{Name~Service~Switch~(NSS)} NSS 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}
@@ -1096,7 +1097,7 @@ 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
+  \itindex{Name~Service~Switch~(NSS)} \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
@@ -1131,7 +1132,7 @@ 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
+\itindex{Name~Service~Switch~(NSS)} \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
@@ -1163,7 +1164,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.
@@ -1188,12 +1189,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}.} 
+    \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}.} 
   \label{tab:name_sequential_read}
 \end{table}
 
@@ -1445,7 +1446,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} 
 
@@ -1603,7 +1604,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}
@@ -1687,8 +1688,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
@@ -1700,7 +1701,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}
 
@@ -1722,12 +1723,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.
@@ -1737,7 +1738,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
@@ -1771,7 +1772,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.
@@ -1782,14 +1783,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.
@@ -1806,16 +1807,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
@@ -1838,7 +1839,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.
 
@@ -2074,6 +2075,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 è
@@ -2339,6 +2345,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}
 
 
@@ -2385,12 +2394,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
@@ -2505,9 +2514,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
@@ -2520,15 +2529,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}.
 
@@ -2545,7 +2554,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] 
@@ -2555,7 +2564,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}
 
@@ -2623,16 +2632,20 @@ 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}.}
+
+% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
+
 
 \index{costante!{SO\_REUSEADDR}@{{\tt  {SO\_REUSEADDR}}}|)}
 
@@ -2772,9 +2785,9 @@ 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 Path MTU \itindex{Maximum~Transfer~Unit~(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}& 
@@ -2946,7 +2959,7 @@ sez.~\ref{sec:net_sendmsg}).
   come valore logico e non è applicabile a socket di tipo
   \const{SOCK\_STREAM}.
 
-\itindbeg{Maximum~Transfer~Unit}
+\itindbeg{Maximum~Transfer~Unit~(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
@@ -2984,12 +2997,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
@@ -3003,15 +3015,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{Maximum~Transfer~Unit~(MTU)}
 
 \item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
   kernel della serie 2.2.x, ed è specifica di Linux. Prende per
@@ -3074,6 +3086,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.
 
+% TODO chiarire quale è la struttura \struct{ip\_mreq}
+
+
 \itindend{multicast}
 \end{basedescript}
 
@@ -3122,7 +3137,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.\\
@@ -3198,13 +3213,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
@@ -3541,11 +3557,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}
@@ -3553,10 +3568,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
@@ -3573,7 +3588,7 @@ identificano le operazioni sono le seguenti:
   \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}
@@ -3596,10 +3611,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
@@ -3739,11 +3754,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.
@@ -3816,6 +3831,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
@@ -4177,19 +4196,20 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti:
 
 \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
+  \itindex{Maximum~Transfer~Unit~(MTU)} \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 \itindex{Maximum~Transfer~Unit~(MTU)} \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
@@ -4255,12 +4275,13 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   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 
@@ -4633,7 +4654,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