Materiale sulle {{{ioctl}}} delle interfacce di rete.
[gapil.git] / sockctrl.tex
index 10dad74342cb02bb5d2ea8d631129b7de5189f2a..886d6d09edfa281ef3cb205d3f99c29390aaeb0a 100644 (file)
@@ -2239,9 +2239,10 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 
 \item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
   uscita del socket. Prende per \param{optval} un intero indicante il numero
 
 \item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
   uscita del socket. Prende per \param{optval} un intero indicante il numero
-  di byte. Il valore di default ed il valore massimo che si può specificare
-  come argomento per questa opzione sono impostabili tramiti gli opportuni
-  valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
+  di byte. Il valore di default ed il valore massimo che si possono
+  specificare come argomento per questa opzione sono impostabili
+  rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi
+  sez.~\ref{sec:sock_sysctl}).
 
 \item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di
   ingresso del socket. Prende per \param{optval} un intero indicante il numero
 
 \item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di
   ingresso del socket. Prende per \param{optval} un intero indicante il numero
@@ -2249,6 +2250,23 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   come argomento per questa opzione sono impostabili tramiti gli opportuni
   valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
 
   come argomento per questa opzione sono impostabili tramiti gli opportuni
   valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
 
+  Si tenga presente che nel caso di socket TCP, per entrambe le opzioni
+  \const{SO\_RCVBUF} e \const{SO\_SNDBUF}, il kernel alloca effettivamente una
+  quantità di memoria doppia rispetto a quanto richiesto con
+  \func{setsockopt}. Questo comporta che una successiva lettura con
+  \func{getsockopt} riporterà un valore diverso da quello impostato con
+  \func{setsockopt}.  Questo avviene perché TCP necessita dello spazio in più
+  per mantenere dati amministrativi e strutture interne, e solo una parte
+  viene usata come buffer per i dati, mentre il valore letto da
+  \func{getsockopt} e quello riportato nei vari parametri di
+  \textit{sysctl}\footnote{cioè \texttt{wmem\_max} e \texttt{rmem\_max} in
+    \texttt{/proc/sys/net/core} e \texttt{tcp\_wmem} e \texttt{tcp\_rmem} in
+    \texttt{/proc/sys/net/ipv4}, vedi sez.~\ref{sec:sock_sysctl}.} indica la
+  memoria effettivamente impiegata.  Si tenga presente inoltre che le
+  modifiche alle dimensioni dei buffer di ingresso e di uscita, per poter
+  essere effettive, devono essere impostate prima della chiamata alle funzioni
+  \func{listen} o \func{connect}.
+
 \item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene
   chiuso un socket quando si utilizza un protocollo che supporta le
   connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e
 \item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene
   chiuso un socket quando si utilizza un protocollo che supporta le
   connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e
@@ -2274,7 +2292,11 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 
 \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
   può essere utilizzata soltanto con \func{getsockopt} e prende per
 
 \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
   può essere utilizzata soltanto con \func{getsockopt} e prende per
-  \param{optval} un valore intero.  
+  \param{optval} un valore intero, nel quale viene restituito il codice di
+  errore, e la condizione di errore sul socket viene cancellata. Viene
+  usualmente utilizzata per ricevere il codice di errore, come accennato in
+  sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una
+  \func{select} che ritorna a causa dello stesso.
 \end{basedescript}
 
 
 \end{basedescript}
 
 
@@ -2294,52 +2316,53 @@ approfondimento sul significato delle opzioni generiche pi
 
 La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
 tenere sotto controllo lo stato di una connessione. Una connessione infatti
 
 La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
 tenere sotto controllo lo stato di una connessione. Una connessione infatti
-resta attiva anche quando non viene effettuato alcun traffico su di essa,
-questo può comportare che un crollo della connessione, qualora avvenisse ad
-esempio in conseguenza di una interruzione completa della rete, potrebbe
-passare inosservato.
+resta attiva anche quando non viene effettuato alcun traffico su di essa; è
+allora possibile, in caso di una interruzione completa della rete, che la
+caduta della connessione non venga rilevata, dato che sulla stessa non passa
+comunque alcun traffico.
 
 Se si imposta questa opzione, è invece cura del kernel inviare degli appositi
 messaggi sulla rete, detti appunto \textit{keep-alive}, per verificare se la
 
 Se si imposta questa opzione, è invece cura del kernel inviare degli appositi
 messaggi sulla rete, detti appunto \textit{keep-alive}, per verificare se la
-connessione è attiva.  L'opzione funziona soltanto con socket che supportino
+connessione è attiva.  L'opzione funziona soltanto con i socket che supportano
 le connessioni (non ha senso per socket UDP ad esempio) e si applica
 principalmente ai socket TCP.
 
 Con le impostazioni di default (che sono riprese da BSD) Linux emette un
 messaggio di \textit{keep-alive}\footnote{in sostanza un segmento ACK vuoto,
   cui sarà risposto con un altro segmento ACK vuoto.} verso l'altro capo della
 le connessioni (non ha senso per socket UDP ad esempio) e si applica
 principalmente ai socket TCP.
 
 Con le impostazioni di default (che sono riprese da BSD) Linux emette un
 messaggio di \textit{keep-alive}\footnote{in sostanza un segmento ACK vuoto,
   cui sarà risposto con un altro segmento ACK vuoto.} verso l'altro capo della
-connessione se questa è rimasta senza traffico per più di due ore. Se è tutto
+connessione se questa è rimasta senza traffico per più di due ore.  Se è tutto
 a posto il messaggio viene ricevuto e verrà emesso un segmento ACK di
 risposta, alla cui ricezione ripartirà un altro ciclo di attesa per altre due
 ore di inattività; il tutto avviene all'interno del kernel e le applicazioni
 non riceveranno nessun dato.
 
 a posto il messaggio viene ricevuto e verrà emesso un segmento ACK di
 risposta, alla cui ricezione ripartirà un altro ciclo di attesa per altre due
 ore di inattività; il tutto avviene all'interno del kernel e le applicazioni
 non riceveranno nessun dato.
 
-In caso di problemi invece si possono avere i due casi già illustrati in
-sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione precoce del server:
-il primo è quello in cui la macchina remota è caduta ed è stata riavviata, per
-cui dopo il riavvio la connessione non viene più riconosciuta,\footnote{si
-  ricordi che un normale riavvio non ha questo effetto, in quanto in tal caso
-  si passa per la chiusura del processo, e questo, come illustrato in
-  sez.~\ref{sec:file_close}, comporta la chiusura del socket con l'invio di un
-  segmento FIN all'altro capo della connessione, che verrà regolarmente
-  chiusa.} 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. In tal caso il socket viene
-chiuso dopo aver impostato un errore \errcode{ECONNRESET}.
+Qualora ci siano dei problemi di rete si possono invece verificare i due casi
+di terminazione precoce del server già illustrati in
+sez.~\ref{sec:TCP_conn_crash}. Il primo è quello in cui la macchina remota ha
+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}.
 
 Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
 più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75
 secondi per un massimo di 9 volte\footnote{entrambi questi valori possono
 
 Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
 più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75
 secondi per un massimo di 9 volte\footnote{entrambi questi valori possono
-  essere opportunamente modificati con gli opportuni parametri illustrati in
-  sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a livello
-  di kernel ed i suddetti valori saranno applicati a \textsl{tutti} i socket.}
-(per un totale di 11 minuti e 15 secondi) dopo di che, se non si è ricevuta
-nessuna risposta, il socket viene chiuso dopo aver impostato un errore di
-\errcode{ETIMEDOUT}. Qualora la connessione si sia ristabilita e si riceva un
-successivo messaggio di risposta il ciclo riparte come se niente fosse
-avvenuto.  Infine se invece si riceve come risposta un pacchetto ICMP di
-destinazione irraggiungibile (vedi sez.~\ref{sec:icmp_protocol_xxx}), verrà
-restituito l'errore corrispondente.
+  essere modificati a livello di sistema (cioè per tutti i socket) con gli
+  opportuni parametri illustrati in sez.~\ref{sec:sock_sysctl} ed a livello di
+  singolo socket con le opzioni \texttt{TCP\_KEEP*} di
+  sez.~\ref{sec:sock_tcp_udp_options}.}  (per un totale di 11 minuti e 15
+secondi) dopo di che, se non si è ricevuta nessuna risposta, il socket viene
+chiuso dopo aver impostato un errore di \errcode{ETIMEDOUT}. Qualora la
+connessione si sia ristabilita e si riceva un successivo messaggio di risposta
+il ciclo riparte come se niente fosse avvenuto.  Infine se si riceve come
+risposta un pacchetto ICMP di destinazione irraggiungibile (vedi
+sez.~\ref{sec:icmp_protocol_xxx}), verrà restituito l'errore corrispondente.
 
 In generale questa opzione serve per individuare una caduta della connessione
 anche quando non si sta facendo traffico su di essa.  Viene usata
 
 In generale questa opzione serve per individuare una caduta della connessione
 anche quando non si sta facendo traffico su di essa.  Viene usata
@@ -2347,9 +2370,9 @@ principalmente sui server per evitare di mantenere impegnate le risorse che
 verrebbero dedicate a trattare delle connessioni che in realtà sono già
 terminate (quelle che vengono anche chiamate connessioni
 \textsl{semi-aperte}); in tutti quei casi cioè in cui il server si trova in
 verrebbero dedicate a trattare delle connessioni che in realtà sono già
 terminate (quelle che vengono anche chiamate connessioni
 \textsl{semi-aperte}); in tutti quei casi cioè in cui il server si trova in
-attesa di dati in ingresso su una connessione che non arriveranno mai perché o
-il client sull'altro capo non è più attivo o non è più in grado di comunicare
-con il server via rete.
+attesa di dati in ingresso su una connessione che non arriveranno mai o perché
+il client sull'altro capo non è più attivo o perché non è più in grado di
+comunicare con il server via rete.
 
 \begin{figure}[!htb]
   \footnotesize \centering
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2684,42 +2707,42 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
     \hline
     \hline
     \const{IP\_OPTIONS}         &$\bullet$&$\bullet$&&\texttt{void *}& %??? 
     \hline
     \hline
     \const{IP\_OPTIONS}         &$\bullet$&$\bullet$&&\texttt{void *}& %??? 
-      Imposta o riceve le opzioni di IP.\\
+      imposta o riceve le opzioni di IP.\\
     \const{IP\_PKTINFO}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_PKTINFO}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio di informazione.\\
+      passa un messaggio di informazione.\\
     \const{IP\_RECVTOS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RECVTOS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio col campo TOS.\\
+      passa un messaggio col campo TOS.\\
     \const{IP\_RECVTTL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RECVTTL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio col campo TTL.\\
+      passa un messaggio col campo TTL.\\
     \const{IP\_RECVOPTS}        &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RECVOPTS}        &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio con le opzioni IP.\\
+      passa un messaggio con le opzioni IP.\\
     \const{IP\_RETOPTS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RETOPTS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio con le opzioni IP non trattate.\\
+      passa un messaggio con le opzioni IP non trattate.\\
     \const{IP\_TOS}             &$\bullet$&$\bullet$&         &\texttt{int}& 
     \const{IP\_TOS}             &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il valore del campo TOS.\\
+      imposta il valore del campo TOS.\\
     \const{IP\_TTL}             &$\bullet$&$\bullet$&         &\texttt{int}& 
     \const{IP\_TTL}             &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il valore del campo TTL.\\
+      imposta il valore del campo TTL.\\
     \const{IP\_HDRINCL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_HDRINCL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa l'intestazione di IP nei dati.\\
+      passa l'intestazione di IP nei dati.\\
     \const{IP\_RECVERR}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RECVERR}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Abilita la gestione degli errori.\\
+      abilita la gestione degli errori.\\
     \const{IP\_MTU\_DISCOVER}   &$\bullet$&$\bullet$&         &\texttt{int}& 
     \const{IP\_MTU\_DISCOVER}   &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il Path MTU Discovery.\\
+      imposta il Path MTU Discovery.\\
     \const{IP\_MTU}             &$\bullet$&         &         &\texttt{int}& 
     \const{IP\_MTU}             &$\bullet$&         &         &\texttt{int}& 
-      Legge il valore attuale della MTU.\\
+      legge il valore attuale della MTU.\\
     \const{IP\_ROUTER\_ALERT}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_ROUTER\_ALERT}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Imposta l'opzione \textit{IP router alert} sui pacchetti.\\
+      imposta l'opzione \textit{IP router alert} sui pacchetti.\\
     \const{IP\_MULTICAST\_TTL}  &$\bullet$&$\bullet$&         &\texttt{int}& 
     \const{IP\_MULTICAST\_TTL}  &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
+      imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
     \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Controlla il reinvio a se stessi dei dati di \itindex{multicast} 
+      controlla il reinvio a se stessi dei dati di \itindex{multicast} 
       \textit{multicast}.\\ 
     \const{IP\_ADD\_MEMBERSHIP} &         &$\bullet$&   &\struct{ip\_mreqn}& 
       \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 \itindex{multicast} \textit{multicast}.\\
     \const{IP\_DROP\_MEMBERSHIP}&         &$\bullet$&   &\struct{ip\_mreqn}& 
     \const{IP\_DROP\_MEMBERSHIP}&         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Si sgancia da un gruppo di \textit{multicast}.\\
+      si sgancia da un gruppo di \textit{multicast}.\\
     \const{IP\_MULTICAST\_IF}   &         &$\bullet$&   &\struct{ip\_mreqn}& 
     \const{IP\_MULTICAST\_IF}   &         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Imposta l'interfaccia locale di un socket \itindex{multicast} 
+      imposta l'interfaccia locale di un socket \itindex{multicast} 
       \textit{multicast}.\\ 
    \hline
   \end{tabular}
       \textit{multicast}.\\ 
    \hline
   \end{tabular}
@@ -2996,24 +3019,26 @@ UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni
   è disponibile nella settima sezione delle pagine di manuale, che si può
   consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le
   pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono
   è disponibile nella settima sezione delle pagine di manuale, che si può
   consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le
   pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono
-  alquanto incomplete.}  Dato che questi protocolli sono entrambi trasportati
-su IP, oltre alle opzioni generiche di sez.~\ref{sec:sock_generic_options}
-saranno comunque disponibili anche le precedenti opzioni di
-sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in
-  sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, ma
-  quelle per TCP e UDP sono le stesse anche quando si usa IPv6.}
-
+  alquanto incomplete.}  Dato che questi due protocolli sono entrambi
+trasportati su IP,\footnote{qui si sottintende IPv4, ma le opzioni per TCP e
+  UDP sono le stesse anche quando si usa IPv6.} oltre alle opzioni generiche
+di sez.~\ref{sec:sock_generic_options} saranno comunque disponibili anche le
+precedenti opzioni di sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in
+  sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, al
+  solito, qualora si stesse utilizzando IPv6, si potrebbero utilizzare le
+  opzioni di quest'ultimo.}
 
 Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle
 utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente
 
 Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle
 utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente
-\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si è
-riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_tcp}.  Le
-costanti indicanti le opzioni del protocollo TCP e tutte le altre costanti ad
-esse collegate sono definite in \file{netinet/tcp.h}, ed accessibili
-includendo detto file.\footnote{in realtà questo è il file usato dalle
-  liberie; 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}.}
+\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono
+riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcp}, 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}.}
 
 \begin{table}[!htb]
   \centering
 
 \begin{table}[!htb]
   \centering
@@ -3024,32 +3049,33 @@ includendo detto file.\footnote{in realt
                     \textbf{Descrizione}\\
     \hline
     \hline
                     \textbf{Descrizione}\\
     \hline
     \hline
-    \const{TCP\_NODELAY}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_MAXSEG}       &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_CORK}         &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPIDLE}     &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPINTVL}    &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPCNT}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_SYNCNT}       &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_LINGER2}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_INFO}         &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_QUICKACK}     &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_CONGESTION}   &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
+    \const{TCP\_NODELAY}      &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      spedisce tutti i pacchetti il prima possibile.\\
+    \const{TCP\_MAXSEG}       &$\bullet$&$\bullet$&         &\texttt{int}&
+      valore della \itindex{Maximum~Segment~Size} MSS per i pacchetti in
+      uscita.\\  
+    \const{TCP\_CORK}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+      non invia frame parziali.\\
+    \const{TCP\_KEEPIDLE}     &$\bullet$&$\bullet$&         &\texttt{int}& 
+      tempo in secondi prima di inviare un \textit{keepalive}.\\
+    \const{TCP\_KEEPINTVL}    &$\bullet$&$\bullet$&         &\texttt{int}&
+      tempo in secondi prima fra \textit{keepalive} successivi.\\
+    \const{TCP\_KEEPCNT}      &$\bullet$&$\bullet$&         &\texttt{int}& 
+      numero massimo di \textit{keepalive} inviati.\\
+    \const{TCP\_SYNCNT}       &$\bullet$&$\bullet$&         &\texttt{int}& 
+      numero massimo di ritrasmissioni di un SYN.\\
+    \const{TCP\_LINGER2}      &$\bullet$&$\bullet$&         &\texttt{int}&
+      tempo di vita in stato \texttt{FIN\_WAIT2}.\\
+    \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}.\\
+    \const{TCP\_INFO}         &$\bullet$&        &       &\struct{tcp\_info}& 
+      restituisce informazioni sul socket.\\
+    \const{TCP\_QUICKACK}     &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+      abilita la modalità \textit{quickack}.\\
+    \const{TCP\_CONGESTION}   &$\bullet$&$\bullet$&?        &\texttt{?}& %??? 
+      non ancora documentata.\\
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket TCP disponibili al livello
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket TCP disponibili al livello
@@ -3057,47 +3083,172 @@ includendo detto file.\footnote{in realt
   \label{tab:sock_opt_tcplevel}
 \end{table}
 
   \label{tab:sock_opt_tcplevel}
 \end{table}
 
-Le descrizioni di tab.~\ref{tab:sock_opt_tcplevel} sono estremamente
-sintetiche, una maggiore quantità di dettagli su queste opzioni è fornita nel
-seguente elenco:
-\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
-
-\item[\const{TCP\_NODELAY}] 
-
-\item[\const{TCP\_MAXSEG}] 
-
-\item[\const{TCP\_CORK}] 
+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{3.3cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\const{TCP\_NODELAY}] il protocollo TCP un meccanismo di bufferizzazione
+  dei pacchetti uscenti, per evitare la trasmissione di tanti pacchetti
+  piccoli con un utilizzo non ottimale della banda disponibile. Questo
+  meccanismo è controllato da un apposito algoritmo (detto \textsl{algoritmo
+    di Nagle}, vedi sez.\ref{sez:tcp_protocol_xxx}).  Il comportamento normale
+  del protocollo prevede che i pacchetti siano accumulati fintanto che non si
+  raggiunge una quantità di dati considerata adeguata per eseguire la
+  trasmissione.
+
+  Impostando questa opzione si disabilita questo meccanismo ed i pacchetti
+  vengono inviati immediatamente qualunque sia la loro dimensione; l'opzione
+  viene sovrascritta dall'eventuale impostazione dell'opzione
+  \const{TCP\_CORK}, che blocca l'invio immediato. Tuttavia quando la si
+  abilita viene sempre forzato lo scaricamento della coda di invio (con
+  conseguente trasmissione di tutti i pacchetti pendenti), anche qualora si
+  fosse già abilitata \const{TCP\_CORK}.\footnote{si tenga presente però che
+    \const{TCP\_CORK} può essere specificata insieme a \const{TCP\_NODELAY}
+    soltanto a partire dal kernel 2.5.71.}
+
+\item[\const{TCP\_MAXSEG}] permette di leggere e modificare il valore della
+  \itindex{Maximum~Segment~Size} MSS (vedi sez.~\ref{sec:net_lim_dim} e
+  sez.\ref{sez:tcp_protocol_xxx}) dei pacchetti uscenti, e se l'opzione è
+  impostata prima di stabilire la connessione, cambia anche il valore della
+  \itindex{Maximum~Segment~Size} MSS annunciata all'altro capo della
+  connessione. Se si specificano valori maggiori della MTU questi verranno
+  ignorati, inoltre TCP imporrà anche i suoi limiti massimo e minimo per
+  questo valore.
+
+\item[\const{TCP\_CORK}] quando questa opzione viene abilitata non vengono
+  inviati pacchetti di dati fintanto che essa non venga disabilitata; a quel
+  punto tutti i dati rimasti in coda saranno inviati in un solo pacchetto.
+  Questa opzione viene usata per gestire manualmente il flusso dei dati
+  mettendo una sorta di ``\textsl{tappo}'' (da cui il nome in inglese) al
+  flusso di uscita, in modo ottimizzare a mano l'uso della banda. È molto
+  utile anche quando si effettua il trasferimento di dati da un file con
+  \func{sendfile} (vedi sez.~\ref{sec:file_sendfile}), se si vuole inserire
+  una intestazione prima della chiamata a questa funzione.
+
+  Si tenga presente che l'implementazione corrente di \const{TCP\_CORK} non
+  consente di bloccare l'invio dei pacchetti per più di 200 millisecondi,
+  passati i quali i dati accumulati in coda sanno inviati comunque.  Questa
+  opzione non è disponibile su tutti i kernel unix-like e deve essere evitata
+  se si vuole scrivere codice portabile.
+
+\item[\const{TCP\_KEEPIDLE}] imposta l'intervallo di tempo, in secondi, che
+  deve trascorrere senza traffico sul socket prima che vengano inviati,
+  qualora si sia attivata su di esso l'opzione \const{SO\_KEEPALIVE}, i
+  messaggi di \textit{keep-alive} (si veda la trattazione relativa al
+  \textit{keep-alive} in sez.~\ref{sec:sock_options_main}).  Anche questa
+  opzione non è disponibile su tutti i kernel unix-like e deve essere evitata
+  se si vuole scrivere codice portabile.
+
+\item[\const{TCP\_KEEPINTVL}] imposta l'intervallo di tempo, in secondi, fra
+  due messaggi di \textit{keep-alive} successivi (si veda sempre quanto
+  illustrato in sez.~\ref{sec:sock_options_main}). Come la precedente non è
+  disponibile su tutti i kernel unix-like e deve essere evitata se si vuole
+  scrivere codice portabile.
+
+\item[\const{TCP\_KEEPCNT}] imposta il numero totale di messaggi di
+  \textit{keep-alive} da inviare prima di concludere che la connessione è
+  caduta per assenza di risposte ad un messaggio di \textit{keep-alive} (di
+  nuovo vedi sez.~\ref{sec:sock_options_main}). Come la precedente non è
+  disponibile su tutti i kernel unix-like e deve essere evitata se si vuole
+  scrivere codice portabile.
+
+\item[\const{TCP\_SYNCNT}] imposta il numero di tentativi di ritrasmissione
+  dei segmenti SYN usati nel \itindex{three~way~handshake} \textit{three way
+    handshake} prima che il tentativo di connessione venga abortito (si
+  ricordi quanto accennato in sez.\ref{sec:TCP_func_connect}). Sovrascrive per
+  il singolo socket il valore globale impostato con la \textit{sysctl}
+  \texttt{tcp\_syn\_retries} (vedi sez.~\ref{sec:sock_ipv4_sysctl}).  Non
+  vengono accettati valori maggiori di 255; anche questa opzione non è
+  standard e deve essere evitata se si vuole scrivere codice portabile.
+
+\item[\const{TCP\_LINGER2}] imposta, in numero di secondi, il tempo di
+  sussistenza dei socket terminati nello stato \texttt{FIN\_WAIT2} (si ricordi
+  quanto visto in sez.~\ref{sec:TCP_conn_term}).\footnote{si tenga ben
+    presente che questa opzione non ha nulla a che fare con l'opzione
+    \const{SO\_LINGER} che abbiamo visto in sez.~\ref{sec:sock_options_main}.}
+  Questa opzione consente di sovrascrivere per il singolo socket il valore
+  globale impostato con la \textit{sysctl} \texttt{tcp\_fin\_timeout} (vedi
+  sez.~\ref{sec:sock_ipv4_sysctl}).  Anche questa opzione è da evitare se si
+  ha a cuore la portabilità del codice.
+
+\item[\const{TCP\_DEFER\_ACCEPT}] consente ad un socket in ascolto di
+  ritornare da \func{accept} soltanto quando sono presenti dati sullo stesso,
+  e non alla conclusione del \itindex{three~way~handshake} \textit{three way
+    handshake}. Prende un valore intero che indica il numero massimo di
+  secondi per cui il ritorno di \func{accept} viene rimandato; non deve essere
+  utilizzata in codice che vuole essere portabile.
+
+\item[\const{TCP\_WINDOW\_CLAMP}] limita alla dimensione specificata (in byte)
+  il valore dichiarato della \itindex{advertised~window} \textit{advertised
+    window} (vedi sez.\ref{sez: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.
+
+\item[\const{TCP\_INFO}] opzione, specifica di Linux, ma introdotta anche in
+  altri kernel (ad esempio FreeBSD) di controllare lo stato di un socket TCP
+  in user space. L'opzione restituisce in una speciale struttura
+  \struct{tcp\_info}, la cui definizione è riportata in
+  fig.~\ref{fig:tcp_info_struct}, tutta una serie di dati relativi al socket.
+  Anche questa opzione deve essere evitata se si vuole scrivere codice
+  portabile.
 
 
-\item[\const{TCP\_KEEPINTVL}] 
-
-\item[\const{TCP\_KEEPCNT}] 
-
-\item[\const{TCP\_SYNCNT}] 
-
-\item[\const{TCP\_LINGER2}] 
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/tcp_info.h}
+  \end{minipage}
+  \caption{La struttura \structd{tcp\_info} contenente le informazioni sul
+    socket restituita dall'opzione \const{TCP\_INFO}.}
+  \label{fig:tcp_info_struct}
+\end{figure}
 
 
-\item[\const{TCP\_DEFER\_ACCEPT}] 
+Con questa opzione diventa possibile ricevere una serie di informazioni
+relative ad un socket TCP così da poter effettuare dei controlli senza dover
+passare attraverso delle operazioni di lettura. Ad esempio si può verificare
+se un socket è stato chiuso usando una funzione analoga a quella illustrata in
+fig.~\ref{fig:is_closing}, in cui si utilizza il valore del campo
+\var{tcpi\_state} di \struct{tcp\_info} per controllare lo stato del socket.
 
 
-\item[\const{TCP\_WINDOW\_CLAMP}] 
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/tcp_info.h}
+  \end{minipage}
+  \caption{Codice della funzione \texttt{is\_closing.c}, che controlla lo stato
+    di un socket TCP per verificare se si sta chiudendo.}
+  \label{fig:is_closing}
+\end{figure}
 
 
-\item[\const{TCP\_INFO}] 
+\item[\const{TCP\_QUICKACK}] abilita o disabilita la modalità speciale
+  \textit{quickack}, in cui i pacchetti ACK vengono inviati immediatamente
+  senza le attese talvolta imposte dal normale funzionamento del protocollo
+  TCP. Questa opzione prende un valore logico, e non è permanente, nel senso
+  che si limita a forzare al momento della chiamata un passaggio da o verso la
+  modalità \textit{quickack}; le operazioni successive potrebbero a loro volta
+  entrare o uscire da questa modalità a seconda del processo interno del
+  protocollo o dalle condizioni della connessione (ad esempio in presenza di
+  timeout ritardati per i pacchetti ACK).
 
 
-\item[\const{TCP\_QUICKACK}] 
+% TODO trattare con gli esempi di apache
 
 
-\item[\const{TCP\_CONGESTION}] Introdotta con il kernel 2.6.13.
+\item[\const{TCP\_CONGESTION}] questa opzione permette di controllare gli
+  algoritmi usati dal protocollo TCP per la gestione della connessione. É
+  stata introdotta con il kernel 2.6.13, e non è documentata.
 
 \end{basedescript}
 
 
 Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero
 
 \end{basedescript}
 
 
 Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero
-ridootto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo
-caso per poterle utilizzare occorrerà impostare l'opportuni valore per
+ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo
+caso per poterle utilizzare occorrerà impostare l'opportuno valore per
 l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente
 \const{IPPROTO\_UDP}).  Le costanti che identificano dette opzioni sono
 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/tcp.h}, ed accessibili includendo detto
+definite in \file{netinet/udp.h}, ed accessibili includendo detto
 file.\footnote{come per TCP, la definizione delle opzioni effettivamente
 file.\footnote{come per TCP, la definizione delle opzioni effettivamente
-  supportate dal kernel si trova 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{linux/udp.h}, dal
+  quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.}
 
 \begin{table}[!htb]
   \centering
 
 \begin{table}[!htb]
   \centering
@@ -3108,10 +3259,10 @@ file.\footnote{come per TCP, la definizione delle opzioni effettivamente
                     \textbf{Descrizione}\\
     \hline
     \hline
                     \textbf{Descrizione}\\
     \hline
     \hline
-    \const{UDP\_CORK}  &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
+    \const{UDP\_CORK}  &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? 
+      accumula tutti i dati su un unico pacchetto.\\
+    \const{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? 
+      non documentata.\\
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket UDP disponibili al livello
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket UDP disponibili al livello
@@ -3124,9 +3275,17 @@ sono un semplice riferimento, una maggiore quantit
 caratteristiche delle opzioni citate è quello dell'elenco seguente:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 
 caratteristiche delle opzioni citate è quello dell'elenco seguente:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 
-\item[\const{UDP\_CORK}] Introdotta con il kernel 2.5.44
+\item[\const{UDP\_CORK}] questa opzione ha l'identico effetto dell'analoga
+  \const{TCP\_CORK} vista in precedenza per il protocollo TCP, e quando
+  abilitata consente di accumulare i dati in uscita su un solo pacchetto che
+  verrà inviato una volta che la si disabiliti. L'opzione è stata introdotta
+  con il kernel 2.5.44, e non deve essere utilizzata in codice che vuole
+  essere portabile.
 
 
-\item[\const{UDP\_ENCAP}] Introdotta con il kernel 2.5.67.
+\item[\const{UDP\_ENCAP}] Questa opzione permette di gestire l'incapsulazione
+  dei dati nel protocollo UDP. L'opzione è stata introdotta con il kernel
+  2.5.67, e non è documentata. Come la precedente è specifica di Linux e non
+  deve essere utilizzata in codice portabile.
 
 \end{basedescript}
 
 
 \end{basedescript}
 
@@ -3210,21 +3369,251 @@ processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con
 \const{SIOCGPGRP} e \const{SIOCSPGRP}.
 
 
 \const{SIOCGPGRP} e \const{SIOCSPGRP}.
 
 
+\subsection{L'uso di \func{ioctl} per l'accesso ai dispositivi di rete}
+\label{sec:sock_ioctl_netdevice}
+
+Benché non strettamente attinenti alla gestione dei socket, vale la pena di
+trattare qui l'interfaccia di accesso a basso livello ai dispositivi di rete
+che viene appunto fornita attraverso la funzione \texttt{ioctl}. Questa non è
+attinente a caratteristiche specifiche di un qualche protocollo, ma si applica
+a tutti i socket, indipendentemente da tipo e famiglia degli stessi, e
+permette di impostare e rilevare le funzionalità delle interfacce di rete.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/ifreq.h}
+  \end{minipage}
+  \caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le
+    operazioni di controllo sui dispositivi di rete.}
+  \label{fig:netdevice_ifreq_struct}
+\end{figure}
+
+Tutte le operazioni di questo tipo utilizzano come terzo argomento di
+\func{ioctl} il puntatore ad una struttura \struct{ifreq}, la cui definizione
+è illustrata in fig.~\ref{fig:netdevice_ifreq_struct}. Normalmente si utilizza
+il primo campo della struttura, \var{ifr\_name} per specificare il nome
+dell'interfaccia su cui si vuole operare (ad esempio \texttt{eth0},
+\texttt{ppp0}, ecc.), e si inseriscono (o ricevono) i valori relativi alle
+diversa caratteristiche e funzionalità nel secondo campo, che come si può
+notare è definito come una \ctyp{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}}
+\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
+  indichi nel campo \var{ifr\_ifindex} il valore numerico dell'\textsl{indice}
+  dell'interfaccia, e restituisce il relativo nome in \var{ifr\_name}.
+
+  Il kernel infatti assegna ad ogni interfaccia un numero progressivo, detto
+  appunto \index{interface index} \textit{interface index}, che è quello che
+  effettivamente la identifica nelle operazioni a basso livello, il nome
+  dell'interfaccia è soltanto una etichetta associata a detto \textsl{indice},
+  che permette di rendere più comprensibile l'indicazione dell'interfaccia
+  all'interno dei comandi; si può ottenere un elenco delle interfacce che
+  contiene anche il valore del relativo indice usando il comando \cmd{ip
+    link}.
+
+\item[\const{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore
+  numerico dell'indice dell'interfaccia specificata con \var{ifr\_name}, è in
+  sostanza l'operazione inversa di \const{SIOCGIFNAME}.
+
+\item[\const{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il
+  valore corrente dei flag dell'interfaccia specificata (con \var{ifr\_name}).
+  Il valore restituito è una maschera binaria i cui bit sono identificabili
+  attraverso le varie costanti di tab.~\ref{tab:netdevice_iface_flag}.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Flag} & \textbf{Significato} \\
+    \hline
+    \hline
+    \const{IFF\_UP}        & l'interfaccia è attiva.\\
+    \const{IFF\_BROADCAST} & l'interfaccia ha impostato un indirizzo di
+                             \itindex{broadcast} \textit{broadcast} valido.\\
+    \const{IFF\_DEBUG}     & è attivo il flag interno di debug.\\
+    \const{IFF\_LOOPBACK}  & l'interfaccia è una interfaccia di
+                             \textit{loopback}.\\ 
+    \const{IFF\_POINTOPOINT}& l'interfaccia è associata ad un collegamento
+                             \textsl{punto-punto}.\\ 
+    \const{IFF\_RUNNING}   & l'interfaccia ha delle risorse allocate (non può
+                             quindi essere disattivata).\\
+    \const{IFF\_NOARP}     & l'interfaccia ha il protocollo ARP disabilitato o
+                             l'indirizzo del livello di rete non è impostato.\\
+    \const{IFF\_PROMISC}   & l'interfaccia è in \index{modo~promiscuo}
+                             \textsl{modo promiscuo} (riceve cioè tutti i
+                             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\_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.\\
+    \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
+                             automaticamente il tipo di collegamento.\\
+    \const{IFF\_DYNAMIC}   & gli indirizzi assegnati all'interfaccia vengono
+                             persi quando questa viene disattivata.\\
+%    \const{IFF\_}      & .\\
+    \hline
+  \end{tabular}
+  \caption{Le costanti che identificano i vari bit della maschera binaria
+    \var{ifr\_flags} che esprime i flag di una interfaccia di rete.}
+  \label{tab:netdevice_iface_flag}
+\end{table}
+
+
+\item[\const{SIOCSIFFLAGS}] permette di impostare il valore dei flag
+  dell'interfaccia specificata (sempre con \var{ifr\_name}, non staremo a
+  ripeterlo oltre) attraverso il valore della maschera binaria da passare nel
+  campo \var{ifr\_flags}, che può essere ottenuta con l'OR aritmetico delle
+  costanti di tab.~\ref{tab:netdevice_iface_flag}; questa operazione è
+  privilegiata.
+
+\item[\const{SIOCGIFMETRIC}] permette di leggere il valore della metrica del
+  dispositivo associato all'interfaccia specificata nel campo
+  \var{ifr\_metric}, attualmente non ancora implementato, restituisce sempre 0
+  come valore.
+
+\item[\const{SIOCSIFMETRIC}] permette di impostare il valore della metrica del
+  dispositivo al valore specificato nel campo \var{ifr\_metric}, attualmente
+  non ancora implementato, restituisce un errore di \errval{EOPNOTSUPP}.
+
+\item[\const{SIOCGIFMTU}] permette di leggere il valore della
+  \itindex{Maximum~Transfer~Unit} \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
+  dispositivo al valore specificato campo \var{ifr\_mtu}. L'operazione è
+  privilegiata, e si tenga presente che impostare un valore troppo basso può
+  causare un blocco del kernel.
+
+\item[\const{SIOCGIFHWADDR}] permette di leggere il valore dell'indirizzo
+  hardware del dispositivo associato all'interfaccia nel campo
+  \var{ifr\_hwaddr}; questo viene restituito come struttura \struct{sockaddr}
+  in cui il campo \var{sa\_family} contiene un valore \texttt{ARPHRD\_*}
+  indicante il tipo di indirizzo ed il campo \var{sa\_data} il valore binario
+  dell'indirizzo hardware a partire dal byte 0.
+
+\item[\const{SIOCSIFHWADDR}] permette di impostare il valore dell'indirizzo
+  hardware del dispositivo associato all'interfaccia attraverso il valore
+  della struttura \struct{sockaddr} (con lo stesso formato illustrato per
+  \const{SIOCGIFHWADDR}) passata nel campo \var{ifr\_hwaddr}. L'operazione è
+  privilegiata.
+
+\item[\const{SIOCSIFHWBROADCAST}] imposta l'indirizzo \textit{broadcast}
+  \itindex{broadcast} 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
+  relativi valori nel campo \var{ifr\_map}; quest'ultimo contiene una
+  struttura di tipo \struct{ifmap}, la cui definizione è illustrata in
+  fig.~\ref{fig:netdevice_ifmap_struct}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/ifmap.h}
+  \end{minipage}
+  \caption{La struttura \structd{ifmap} utilizzata per leggere ed impostare i
+    valori dei parametri hardware di un driver di una interfaccia.}
+  \label{fig:netdevice_ifmap_struct}
+\end{figure}
+
+\item[\const{SIOCSIFMAP}] imposta i parametri hardware del driver
+  dell'interfaccia specificata, restituendo i relativi valori nel campo
+  \var{ifr\_map}. Come per \const{SIOCGIFMAP} questo deve essere passato come
+  struttura \struct{ifmap}, secondo la definizione di
+  fig.~\ref{fig:netdevice_ifmap_struct}.
+
+\item[\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{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{SIOCGIFTXQLEN}] permette di leggere la lunghezza della coda di
+  trasmissione del dispositivo associato all'interfaccia specificata nel campo
+  \var{ifr\_qlen}.
+
+\item[\const{SIOCSIFTXQLEN}] permette di impostare il valore della lunghezza
+  della coda di trasmissione del dispositivo associato all'interfaccia, questo
+  deve essere specificato nel campo \var{ifr\_qlen}. L'operazione è
+  privilegiata. 
+
+\item[\const{SIOCSIFNAME}] consente di cambiare il nome dell'interfaccia
+  indicata da \var{ifr\_name} utilizzando il nuovo nome specificato nel campo
+  \var{ifr\_rename}.
+
+\end{basedescript}
+
+Una ulteriore operazione che consente di ricavare le caratteristiche delle
+interfacce di rete, che però è disponibile soltanto per socket della famiglia
+\const{AF\_INET} (vale ad dire per socket IPv4), è \const{SIOCGIFCONF}. In
+questo caso l'utente dovrà passare come argomento una struttura
+\struct{ifconf}, definita in fig.~\ref{fig:netdevice_ifconf_struct}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/ifconf.h}
+  \end{minipage}
+  \caption{La struttura \structd{ifconf}.}
+  \label{fig:netdevice_ifconf_struct}
+\end{figure}
+
+
+
+
 \subsection{L'uso di \func{ioctl} per i socket TCP e UDP}
 \label{sec:sock_ioctl_IP}
 
 \subsection{L'uso di \func{ioctl} per i socket TCP e UDP}
 \label{sec:sock_ioctl_IP}
 
-Oltre alle caratteristiche che si possono impostare per i socket generici, la
+Non esistono operazioni specifiche per i socket IP in quanto tali,\footnote{a
+  parte forse \const{SIOCGIFCONF}, che però resta attinente alle proprietà
+  delle interfacce di rete, per cui l'abbiamo trattata in
+  sez.~\ref{sec:sock_ioctl_netdevice} insieme alle altre che comunque si
+  applicano anche ai socket IP.} mentre per i pacchetti di altri protocolli
+trasportati su IP, qualora li si gestisca attraverso dei socket, si dovrà fare
+riferimento direttamente all'eventuale supporto presente per il tipo di socket
+usato: ad esempio si possono ricevere pacchetti ICMP con socket di tipo
+\texttt{raw}, nel qual caso si dovrà fare riferimento alle operazioni di
+quest'ultimo.
+
+Tuttavia la gran parte dei socket utilizzati nella programmazione di rete
+utilizza proprio il protocollo IP, e quello che succede è che in realtà la
 funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per
 funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per
-i socket UDP e TCP. Non esistono operazioni specifiche per i socket IP
-generici, mentre per i pacchetti di altri protocolli trasportati su IP,
-qualora li si gestisca attraverso dei socket, si dovrà fare riferimento
-direttamente all'eventuale supporto presente per il tipo di socket usato (ad
-esempio si possono ricevere pacchetti ICMP con socket di tipo \texttt{raw},
-nel qual caso si dovrà fare riferimento alle operazioni di quest'ultimo).
-
-Le operazioni di controllo disponibili per i socket TCP, come illustrate dalla
-relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, prevedono come
-possibile valore per il secondo argomento della funzione le costanti
+i socket che usano questo protocollo, ma queste vendono eseguite, invece che a
+livello di IP, al successivo livello di trasporto, vale a dire in maniera
+specifica per i socket TCP e UDP.
+
+Le operazioni di controllo disponibili per i socket TCP sono illustrate dalla
+relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, e prevedono
+come possibile valore per il secondo argomento della funzione le costanti
 illustrate nell'elenco seguente; il terzo argomento della funzione, gestito
 come \itindex{value~result~argument} \textit{value result argument}, deve
 essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
 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}:
@@ -3256,16 +3645,17 @@ essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
   \errval{EINVAL}.
 \end{basedescript}
 
   \errval{EINVAL}.
 \end{basedescript}
 
-
-Le operazioni di controllo disponibili per i socket UDP, come illustrate dalla
-relativa pagina di manuale, accessibile con \texttt{man 7 udp}, sono quelle
-indicate nelle costanti del seguente elenco; come per i socket TCP il terzo
-argomento viene gestito come \itindex{value~result~argument} \textit{value
-  result argument} e deve essere un puntatore ad una variabile di tipo
-\ctyp{int}:
+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}}
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{FIONREAD}] 
-\item[\const{TIOCOUTQ}] 
+\item[\const{FIONREAD}] restituisce la dimensione in byte del primo pacchetto
+  in attesa di ricezione, o 0 qualora non ci sia nessun pacchetto.
+\item[\const{TIOCOUTQ}] restituisce il numero di byte presenti nella coda di
+  invio locale; questa opzione è supportata soltanto a partire dal kernel 2.4
 \end{basedescript}
 
 
 \end{basedescript}
 
 
@@ -3324,14 +3714,13 @@ sistema sotto \texttt{/proc/net}, dove sono presenti dei file che non
 corrispondono a nessun nodo di \func{sysctl}.
 
 
 corrispondono a nessun nodo di \func{sysctl}.
 
 
-
 \subsection{I valori di controllo per i socket generici}
 \label{sec:sock_gen_sysctl}
 
 Nella directory \texttt{/proc/sys/net/core} sono presenti i file
 \subsection{I valori di controllo per i socket generici}
 \label{sec:sock_gen_sysctl}
 
 Nella directory \texttt{/proc/sys/net/core} sono presenti i file
-corrispondenti ai parametri generici validi per tutti i socket. Quelli
-descritti anche nella pagina di manuale, accessibile con \texttt{man 7 socket}
-sono i seguenti:
+corrispondenti ai parametri generici di \textit{sysctl} validi per tutti i
+socket.  Quelli descritti anche nella pagina di manuale, accessibile con
+\texttt{man 7 socket} sono i seguenti:
 
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
 
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
@@ -3424,7 +3813,7 @@ dello stesso (come ARP).
 I file che consentono di controllare le caratteristiche specifiche del
 protocollo IP in quanto tale, descritti anche nella pagina di manuale
 accessibile con \texttt{man 7 ip}, sono i seguenti:
 I file che consentono di controllare le caratteristiche specifiche del
 protocollo IP in quanto tale, descritti anche nella pagina di manuale
 accessibile con \texttt{man 7 ip}, sono i seguenti:
-\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{3.5cm}\desclabelstyle{\nextlinelabel}}
 
 \item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL
   (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti. Il valore può
 
 \item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL
   (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti. Il valore può
@@ -3485,11 +3874,89 @@ accessibile con \texttt{man 7 ip}, sono i seguenti:
 
 % \item[\texttt{neigh/*}] La directory contiene i valori 
 % TODO trattare neigh/* nella parte su arp, da capire dove sarà.
 
 % \item[\texttt{neigh/*}] La directory contiene i valori 
 % TODO trattare neigh/* nella parte su arp, da capire dove sarà.
-
 \end{basedescript}
 
 \end{basedescript}
 
-
-
+I file di \texttt{/proc/sys/net/ipv4} che invece fanno riferimento alle
+caratteristiche specifiche del protocollo TCP, elencati anche nella rispettiva
+pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
+\begin{basedescript}{\desclabelwidth{3.9cm}\desclabelstyle{\nextlinelabel}}
+\item[\texttt{tcp\_abort\_on\_overflow}] 
+\item[\texttt{tcp\_adv\_win\_scale}] 
+\item[\texttt{tcp\_app\_win}] 
+\item[\texttt{tcp\_bic\_low\_window}] 
+\item[\texttt{tcp\_bic\_fast\_convergence}] 
+\item[\texttt{tcp\_dsack}] 
+\item[\texttt{tcp\_ecn}] 
+\item[\texttt{tcp\_fack}] 
+
+\item[\texttt{tcp\_fin\_timeout}] specifica il numero di secondi (il default è
+  60\footnote{nei kernel della serie 2.2.x era invece di 120 secondi.}) da
+  passare in stato \texttt{FIN\_WAIT2} nell'attesa delle ricezione del
+  pacchetto FIN conclusivo, passati quali il socket viene comunque chiuso
+  forzatamente.  L'uso di questa opzione realizza quella che in sostanza è una
+  violazione delle specifiche del protocollo TCP, ma è utile per fronteggiare
+  alcuni attacchi di \itindex{Denial~of~Service~(DoS)} \textit{Denial of
+    Service}.
+
+
+\item[\texttt{tcp\_frto}] 
+\item[\texttt{tcp\_keepalive\_intvl}] 
+\item[\texttt{tcp\_keepalive\_probes}] 
+\item[\texttt{tcp\_keepalive\_time}] 
+\item[\texttt{tcp\_low\_latency}] 
+\item[\texttt{tcp\_max\_orphans}] 
+
+\item[\texttt{tcp\_max\_syn\_backlog}] un numero intero che indica la
+  lunghezza della coda delle connessioni incomplete, cioè delle connessioni
+  per le quali si è ricevuto un SYN di richiesta ma non l'ACK finale del
+  \itindex{three~way~handshake} \textit{three way handshake} (si riveda quanto
+  illustrato in sez.\ref{sec:TCP_func_listen}).
+
+  Quando questo valore è superato il kernel scarterà immediatamente ogni
+  ulteriore richiesta di connessione. Il valore di default (che è 256) viene
+  automaticamente portato a 1024 qualora nel sistema ci sia sufficiente
+  memoria (se maggiore di 128Mb) e ridotto a 128 qualora la memoria sia poca
+  (inferiore a 32Mb).\footnote{si raccomanda, qualora si voglia aumentare il
+    valore oltre 1024, di seguire la procedura citata nella pagina di manuale
+    di TCP, e modificare il valore della costante \texttt{TCP\_SYNQ\_HSIZE}
+    nel file \texttt{include/net/tcp.h} dei sorgenti del kernel, in modo che
+    sia $\mathtt{tcp\_max\_syn\_backlog} \ge \mathtt{16*TCP\_SYNQ\_HSIZE}$,
+    per poi ricompilare il kernel.}
+
+\item[\texttt{tcp\_max\_tw\_buckets}] 
+\item[\texttt{tcp\_mem}] 
+\item[\texttt{tcp\_orphan\_retries}] 
+\item[\texttt{tcp\_reordering}] 
+\item[\texttt{tcp\_retrans\_collapse}] 
+\item[\texttt{tcp\_retries1}] 
+
+\item[\texttt{tcp\_retries2}] imposta il numero di tentativi di ritrasmissione
+  (il default è 15) di un pacchetto inviato su una connessione già stabilita
+  per il quale non si sia ricevuto una risposta di ACK (si veda anche quanto
+  illustrato in sez.~\ref{sec:TCP_server_crash}).
+
+
+\item[\texttt{tcp\_rfc1337}] 
+\item[\texttt{tcp\_rmem}]
+\item[\texttt{tcp\_sack}] 
+\item[\texttt{tcp\_stdurg}] 
+\item[\texttt{tcp\_synack\_retries}] 
+\item[\texttt{tcp\_syncookies}] 
+
+\item[\texttt{tcp\_syn\_retries}] imposta il numero di tentativi (il default è
+  5) di ritrasmissione dei pacchetti SYN di inizio connessione del
+  \itindex{three~way~handshake} \textit{three way handshake} (si ricordi
+  quanto illustrato in sez.\ref{sec:TCP_func_connect}). Il valore non deve
+  superare 255. 
+
+\item[\texttt{tcp\_timestamps}] 
+\item[\texttt{tcp\_tw\_recycle}] 
+\item[\texttt{tcp\_tw\_reuse}] 
+\item[\texttt{tcp\_window\_scaling}] 
+\item[\texttt{tcp\_vegas\_cong\_avoid}] 
+\item[\texttt{tcp\_westwood}] 
+\item[\texttt{tcp\_wmem}] 
+\end{basedescript}
 
 % LocalWords:  socket sez dotted decimal resolver Domain Name Service cap DNS
 % LocalWords:  client fig LDAP Lightweight Access Protocol NIS Information Sun
 
 % LocalWords:  socket sez dotted decimal resolver Domain Name Service cap DNS
 % LocalWords:  client fig LDAP Lightweight Access Protocol NIS Information Sun
@@ -3545,11 +4012,31 @@ accessibile con \texttt{man 7 ip}, sono i seguenti:
 % LocalWords:  rmem wmem message cost burst bucket filter netdev backlog optmem
 % LocalWords:  forward dynaddr dial autoconfig local masquerading ipfrag high
 % LocalWords:  thresh low always defrag CONFIG SETSIG cmd FIOGETOWN FIOSETOWN
 % LocalWords:  rmem wmem message cost burst bucket filter netdev backlog optmem
 % LocalWords:  forward dynaddr dial autoconfig local masquerading ipfrag high
 % LocalWords:  thresh low always defrag CONFIG SETSIG cmd FIOGETOWN FIOSETOWN
+% LocalWords:  quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS
+% LocalWords:  Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work
+% LocalWords:  netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer is
+% LocalWords:  linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO
+% LocalWords:  DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent MSS
+% LocalWords:  Segment SYN accept advertised window info quickack Nagle ifreq
+% LocalWords:  ifr ppp union EPERM SIOCGIFNAME dell' interface index IFF NOARP
+% LocalWords:  SIOCGIFINDEX SIOCGIFFLAGS POINTOPOINT RUNNING PROMISC NOTRAILERS
+% LocalWords:  ALLMULTI bundle PORTSEL ifmap AUTOMEDIA DYNAMIC SIOCSIFFLAGS way
+% LocalWords:  SIOCGIFMETRIC SIOCSIFMETRIC SIOCGIFMTU SIOCSIFMTU SIOCGIFHWADDR
+% LocalWords:  SIOCSIFHWADDR SIOCSIFHWBROADCAST SIOCGIFMAP SIOCSIFMAP sendfile
+% LocalWords:  SIOCADDMULTI SIOCDELMULTI SIOCGIFTXQLEN SIOCSIFTXQLEN three syn
+% LocalWords:  SIOCSIFNAME SIOCGIFCONF handshake retries MIN FreeBSD closing Mb
+% LocalWords:  abort overflow adv win app bic convergence dsack ecn fack frto
+% LocalWords:  intvl probes latency orphans l'ACK SYNQ HSIZE tw buckets mem rfc
+% LocalWords:  orphan reordering collapse sack stdurg synack syncookies recycle
+% LocalWords:  timestamps scaling vegas avoid westwood tcpi l'incapsulazione
+
+
+
+
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
-% LocalWords:  quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS
-% LocalWords:  Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work
-% LocalWords:  netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer
+% LocalWords:  metric EOPNOTSUPP mtu hwaddr ARPHRD interrupt DMA map qlen
+% LocalWords:  rename ifconf