Materiale sulle opzioni dei socket e qualche riferimento alla futura
[gapil.git] / sockctrl.tex
index 40a0474c678f495db3ec56f03f710ae7e9f9f669..ae340ef9484a64a5239109c8c813af2cdc09ee12 100644 (file)
@@ -2013,7 +2013,8 @@ tab.~\ref{tab:sock_opt_socklevel}.
     \const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
                           controlla l'attività della connessione.\\
     \const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          lascia in linea i dati \textit{out-of-band}.\\
+                          lascia in linea i dati \itindex{out-of-band}
+                          \textit{out-of-band}.\\
     \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
                           basso livello sul buffer di ricezione.\\
     \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$&         &\texttt{int}&
@@ -2085,13 +2086,14 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   forniti in sez.~\ref{sec:sock_options_main}.
 
 \item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati
-  \textit{out-of-band} vengono inviati direttamente nel flusso di dati del
-  socket (e sono quindi letti con una normale \func{read}) invece che restare
-  disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di
-  \func{recvmsg}. L'argomento è trattato in dettaglio in
+  \itindex{out-of-band} \textit{out-of-band} vengono inviati direttamente nel
+  flusso di dati del socket (e sono quindi letti con una normale \func{read})
+  invece che restare disponibili solo per l'accesso con l'uso del flag
+  \const{MSG\_OOB} di \func{recvmsg}. L'argomento è trattato in dettaglio in
   sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che
-  supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad
-  esempio), ed utilizza per \param{optval} un intero usato come valore logico.
+  supportino i dati \itindex{out-of-band} \textit{out-of-band} (non ha senso
+  per socket UDP ad esempio), ed utilizza per \param{optval} un intero usato
+  come valore logico.
 
 \item[\const{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il
   numero minimo di byte che devono essere presenti nel buffer di ricezione
@@ -2272,7 +2274,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
-  \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}
 
 
@@ -2659,8 +2665,6 @@ specificato in \var{l\_linger}.
 
 
 
-
-
 \subsection{Le opzioni per il protocollo IPv4}
 \label{sec:sock_ipv4_options}
 
@@ -2669,11 +2673,10 @@ socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni
   generiche una descrizione di esse è disponibile nella settima sezione delle
   pagine di manuale, nel caso specifico la documentazione si può consultare
   con \texttt{man 7 ip}.}  Se si vuole operare su queste opzioni generiche il
-livello da utilizzare è \const{SOL\_IP}; si è riportato un elenco di queste
-opzioni in tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e
-tutte le altre costanti ad esse collegate sono definite in
-\file{netinet/ip.h}, ed accessibili includendo detto file.
-
+livello da utilizzare è \const{SOL\_IP} (o l'equivalente \const{IPPROTO\_IP});
+si è riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_iplevel}.
+Le costanti indicanti le opzioni e tutte le altre costanti ad esse collegate
+sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
 
 \begin{table}[!htb]
   \centering
@@ -2685,42 +2688,42 @@ tutte le altre costanti ad esse collegate sono definite in
     \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}& 
-      Passa un messaggio di informazione.\\
+      passa un messaggio di informazione.\\
     \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}& 
-      Passa un messaggio col campo TTL.\\
+      passa un messaggio col campo TTL.\\
     \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}& 
-      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}& 
-      Imposta il valore del campo TOS.\\
+      imposta il valore del campo TOS.\\
     \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}& 
-      Passa l'intestazione di IP nei dati.\\
+      passa l'intestazione di IP nei dati.\\
     \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}& 
-      Imposta il Path MTU Discovery.\\
+      imposta il Path MTU Discovery.\\
     \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}& 
-      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}& 
-      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}& 
-      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}& 
-      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}& 
-      Si sgancia da un gruppo di \textit{multicast}.\\
+      si sgancia da un gruppo di \textit{multicast}.\\
     \const{IP\_MULTICAST\_IF}   &         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Imposta l'interfaccia locale di un socket \itindex{multicast} 
+      imposta l'interfaccia locale di un socket \itindex{multicast} 
       \textit{multicast}.\\ 
    \hline
   \end{tabular}
@@ -2728,9 +2731,9 @@ tutte le altre costanti ad esse collegate sono definite in
   \label{tab:sock_opt_iplevel}
 \end{table}
 
-Le descrizioni di tab.~\ref{tab:sock_opt_iplevel} sono estremamente succinte,
-una maggiore quantità di dettagli su queste opzioni è fornito nel seguente
-elenco:
+Le descrizioni riportate in tab.~\ref{tab:sock_opt_iplevel} sono estremamente
+succinte, una maggiore quantità di dettagli sulle varie opzioni è fornita nel
+seguente elenco:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 
 
@@ -2988,6 +2991,177 @@ sez.~\ref{sec:net_sendmsg}).
 
 
 
+\subsection{Le opzioni per i protocolli TCP e UDP}
+\label{sec:sock_tcp_udp_options}
+
+In questa sezione tratteremo le varie opzioni disponibili per i socket che
+usano i due principali protocolli di comunicazione del livello di trasporto;
+UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni
+  è disponibile nella settima sezione delle pagine di manuale, che si può
+  consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le
+  pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono
+  alquanto incomplete.}  Dato che questi 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
+\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
+  \footnotesize
+  \begin{tabular}[c]{|l|c|c|c|l|p{7cm}|}
+    \hline
+    \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
+                    \textbf{Descrizione}\\
+    \hline
+    \hline
+    \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 del pacchetto SYN.\\
+    \const{TCP\_LINGER2}      &$\bullet$&$\bullet$&         &\texttt{int}&
+      tempo di vita in stato \texttt{FIN\_WAIT2}.\\
+    \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+      ritorna da \func{accept} solo in presenza di dati.\\
+    \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&         &\texttt{int}&
+      valore della \textit{advertised window}.\\
+    \const{TCP\_INFO}         &$\bullet$&?        &       &\struct{tcp\_info}& 
+      raccoglie 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
+    \const{SOL\_TCP}.}
+  \label{tab:sock_opt_tcplevel}
+\end{table}
+
+Le descrizioni riportata in tab.~\ref{tab:sock_opt_tcplevel} sono estremamente
+sintetiche, una maggiore quantità di dettagli e la spiegazione delle singole
+opzioni è fornita nel seguente elenco:
+\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\const{TCP\_NODELAY}] il protocollo TCP prevede, per evitare la
+  trasmissione di tanti pacchetti piccoli, che comporta un utilizzo non
+  ottimale della banda disponibile, un meccanismo di bufferizzazione dei
+  pacchetti uscenti controllato da un apposito algoritmo (detto
+  \textsl{algoritmo di Nagle}, vedi sez.\ref{sez:tcp_protocol_xxx}).
+  Il comportamento normale prevede invece 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 \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}.
+
+\item[\const{TCP\_MAXSEG}] permette di leggere e modificare il valore della
+  \itindex{Maximum~Segment~Size} MSS dei pacchetti uscenti, e se l'opzione è
+  impostata prima di stabilire la connessione, cambia anche il valore della
+  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 pacchetti rimasti in coda saranno inviati. 
+
+\item[\const{TCP\_KEEPINTVL}] 
+
+\item[\const{TCP\_KEEPCNT}] 
+
+\item[\const{TCP\_SYNCNT}] 
+
+\item[\const{TCP\_LINGER2}] 
+
+\item[\const{TCP\_DEFER\_ACCEPT}] 
+
+\item[\const{TCP\_WINDOW\_CLAMP}] 
+
+\item[\const{TCP\_INFO}] 
+
+\item[\const{TCP\_QUICKACK}] 
+
+\item[\const{TCP\_CONGESTION}] Introdotta con il kernel 2.6.13.
+
+\end{basedescript}
+
+
+Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero
+ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo
+caso per poterle utilizzare occorrerà impostare l'opportuno valore per
+l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente
+\const{IPPROTO\_UDP}).  Le costanti che identificano dette opzioni sono
+definite in \file{netinet/udp.h}, ed accessibili includendo detto
+file.\footnote{come per TCP, la definizione delle opzioni effettivamente
+  supportate dal kernel si trova in realtà nel file \texttt{linux/udp.h}, dal
+  quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.}
+
+\begin{table}[!htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|c|c|c|l|l|}
+    \hline
+    \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
+                    \textbf{Descrizione}\\
+    \hline
+    \hline
+    \const{UDP\_CORK}  &$\bullet$&$\bullet$&$\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
+    \const{SOL\_UDP}.}
+  \label{tab:sock_opt_udplevel}
+\end{table}
+
+Ancora una volta le descrizioni contenute tab.~\ref{tab:sock_opt_udplevel}
+sono un semplice riferimento, una maggiore quantità di dettagli sulle
+caratteristiche delle opzioni citate è quello dell'elenco seguente:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\const{UDP\_CORK}] Introdotta con il kernel 2.5.44
+
+\item[\const{UDP\_ENCAP}] Introdotta con il kernel 2.5.67.
+
+\end{basedescript}
+
+
+
+
 \section{La gestione attraverso le funzioni di controllo}
 \label{sec:sock_ctrl_func}
 
@@ -3032,11 +3206,12 @@ identificano le operazioni sono le seguenti:
 \item[\const{SIOCSPGRP}] imposta il processo o il \itindex{process~group}
   \textit{process group} a cui inviare i segnali \const{SIGIO} e
   \const{SIGURG} quando viene completata una operazione di I/O asincrono o
-  arrivano dei dati urgenti. Il terzo argomento deve essere un puntatore ad una
-  variabile di tipo \type{pid\_t}; un valore positivo indica direttamente il
-  \acr{pid} del processo, mentre un valore negativo indica (col valore
-  assoluto) il \textit{process group}. Senza privilegi di amministratore o la
-  capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio
+  arrivano dei dati urgenti \itindex{out-of-band} (\texttt{out-of-band}). Il
+  terzo argomento deve essere un puntatore ad una variabile di tipo
+  \type{pid\_t}; un valore positivo indica direttamente il \acr{pid} del
+  processo, mentre un valore negativo indica (col valore assoluto) il
+  \textit{process group}. Senza privilegi di amministratore o la capability
+  \const{CAP\_KILL} si può impostare solo se stessi o il proprio
   \textit{process group}.
 
 \item[\const{SIOCGPGRP}] legge le impostazioni presenti sul socket
@@ -3064,40 +3239,205 @@ processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con
 \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 carattestiche specifiche di un qualche protocollo, ma si applica a
+tutti i socket, indipendentemente dal tipo o famiglia dello stesso, 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 carateristiche 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 amministatore 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 \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. 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 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}] .
+\item[\const{SIOCSIFMETRIC}] .
+\item[\const{SIOCGIFMTU}] .
+\item[\const{SIOCSIFMTU}] .
+\item[\const{SIOCGIFHWADDR}] .
+\item[\const{SIOCSIFHWADDR}] .
+\item[\const{SIOCSIFHWBROADCAST}] .
+\item[\const{SIOCGIFMAP}] .
+\item[\const{SIOCSIFMAP}] . 
+\item[\const{SIOCADDMULTI}] .
+\item[\const{SIOCDELMULTI}] .
+\item[\const{SIOCGIFTXQLEN}] .
+\item[\const{SIOCSIFTXQLEN}] .
+\item[\const{SIOCSIFNAME}] .
+\item[\const{SIOCGIFCONF}] .
+\end{basedescript}
+
+
+
 \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
-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}:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{SIOCINQ}] 
-\item[\const{SIOCATMARK}] 
-\item[\const{SIOCOUTQ}] 
+\item[\const{SIOCINQ}] restituisce la quantità di dati non ancora letti
+  presenti nel buffer di ricezione; il socket non deve essere in stato
+  \texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}.
+\item[\const{SIOCATMARK}] ritorna un intero non nullo, da intendere come
+  valore logico, se il flusso di dati letti sul socket è arrivato sulla
+  posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti
+  \itindex{out-of-band} dati urgenti (vedi sez.~\ref{sec:TCP_urgent_data}).
+  Una operazione di lettura da un socket non attraversa mai questa posizione,
+  per cui è possibile controllare se la si è raggiunta o meno con questa
+  operazione.
+
+  Questo è utile quando si attiva l'opzione \const{SO\_OOBINLINE} (vedi
+  sez.~\ref{sec:sock_generic_options}) per ricevere i dati urgenti all'interno
+  del flusso dei dati ordinari del socket;\footnote{vedremo in
+    sez.~\ref{sec:TCP_urgent_data} che in genere i dati urgenti presenti su un
+    socket si leggono \textit{out-of-band} usando un opportuno flag per
+    \func{recvmsg}.}  in tal caso quando \const{SIOCATMARK} restituisce un
+  valore non nullo si saprà che la successiva lettura dal socket restituirà i
+  dati urgenti e non il normale traffico; torneremo su questo in maggior
+  dettaglio in sez.~\ref{sec:TCP_urgent_data}.
+
+\item[\const{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati
+  presenti nel buffer di spedizione; come per \const{SIOCINQ} il socket non
+  deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di
+  \errval{EINVAL}.
 \end{basedescript}
 
-
-Le operazioni di controllo disponibili per i socket UDP, come illustrate dalla
-relativa pagina di manuale, accessibile con \texttt{man 7 udp}, sono quelle
-indicate nelle costanti del seguente elenco; come per i socket TCP il terzo
-argomento viene gestito come \itindex{value~result~argument} \textit{value
-  result argument} e deve essere un puntatore ad una variabile di tipo
-\ctyp{int}:
+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}}
-\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}
 
 
@@ -3153,7 +3493,7 @@ sottonodi di quest'ultima sono mappati come file e directory sotto
 \texttt{/proc/sys/}, non è vero il contrario, ed in particolare Linux consente
 di impostare alcuni parametri o leggere lo stato della rete a livello di
 sistema sotto \texttt{/proc/net}, dove sono presenti dei file che non
-corrispondono a nessun nodi di \func{sysctl}.
+corrispondono a nessun nodo di \func{sysctl}.
 
 
 
@@ -3385,3 +3725,5 @@ accessibile con \texttt{man 7 ip}, sono i seguenti:
 % 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:  linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO
+% LocalWords:  DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent