Altre note sulle ''sysctl'', ed alcune correzioni alla appendice sul
[gapil.git] / sockctrl.tex
index 69894b38bcee7acf474f037ee8070383bc6f3ef9..f69597ffc504d8912d1662a3ebe1582c2fa23a46 100644 (file)
@@ -2775,7 +2775,9 @@ seguente elenco:
   una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che
   mantiene una serie di informazioni riguardo i pacchetti in arrivo. In
   particolare è possibile conoscere l'interfaccia su cui è stato ricevuto un
-  pacchetto (nel campo \var{ipi\_ifindex}), l'indirizzo locale da esso
+  pacchetto (nel campo \var{ipi\_ifindex}),\footnote{in questo campo viene
+    restituito il valore numerico dell'indice dell'interfaccia,
+    sez.~\ref{sec:sock_ioctl_netdevice}.} l'indirizzo locale da esso
   utilizzato (nel campo \var{ipi\_spec\_dst}) e l'indirizzo remoto dello
   stesso (nel campo \var{ipi\_addr}).
 
@@ -3297,7 +3299,7 @@ quantit
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \includestruct{listati/is_closing.c}
+    \includecodesnip{listati/is_closing.c}
   \end{minipage}
   \caption{Codice della funzione \texttt{is\_closing.c}, che controlla lo stato
     di un socket TCP per verificare se si sta chiudendo.}
@@ -3595,9 +3597,10 @@ sono le seguenti:
   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}.
+  all'interno dei comandi. Una modalità per ottenere questo valore è usare il
+  comando \cmd{ip link}, che fornisce un elenco delle interfacce presenti
+  ordinato in base a tale valore (riportato come primo campo).
+  
 
 \item[\const{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore
   numerico dell'indice dell'interfaccia specificata con \var{ifr\_name}, è in
@@ -3665,8 +3668,8 @@ sono le seguenti:
 
 \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.
+  \var{ifr\_metric}.  Attualmente non è implementato, e l'operazione
+  restituisce sempre un valore nullo.
 
 \item[\const{SIOCSIFMETRIC}] permette di impostare il valore della metrica del
   dispositivo al valore specificato nel campo \var{ifr\_metric}, attualmente
@@ -3750,11 +3753,12 @@ sono le seguenti:
 
 \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}.
+Una ulteriore operazione, che consente di ricavare le caratteristiche delle
+interfacce di rete, è \const{SIOCGIFCONF}; però per ragioni di compatibilità
+questa operazione è disponibile soltanto per i socket della famiglia
+\const{AF\_INET} (vale ad dire per socket IPv4). 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
@@ -3765,6 +3769,69 @@ questo caso l'utente dovr
   \label{fig:netdevice_ifconf_struct}
 \end{figure}
 
+Per eseguire questa operazione occorrerà allocare preventivamente un buffer di
+contenente un vettore di strutture \struct{ifreq}. La dimensione (in byte) di
+questo buffer deve essere specificata nel campo \var{ifc\_len} di
+\struct{ifconf}, mentre il suo indirizzo andrà specificato nel campo
+\var{ifc\_req}. Qualora il buffer sia stato allocato come una stringa, il suo
+indirizzo potrà essere fornito usando il campo \var{ifc\_buf}.\footnote{si
+  noti che l'indirizzo del buffer è definito in \struct{ifconf} con una
+  \ctyp{union}, questo consente di utilizzare una delle due forme a piacere.}
+
+La funzione restituisce nel buffer indicato una serie di strutture
+\struct{ifreq} contenenti nel campo \var{ifr\_name} il nome dell'interfaccia e
+nel campo \var{ifr\_addr} il relativo indirizzo IP.  Se lo spazio allocato nel
+buffer è sufficiente il kernel scriverà una struttura \struct{ifreq} per
+ciascuna interfaccia attiva, restituendo nel campo \var{ifc\_len} il totale
+dei byte effettivamente scritti. Il valore di ritorno è 0 se l'operazione ha
+avuto successo e negativo in caso contrario. 
+
+Si tenga presente che il kernel non scriverà mai sul buffer di uscita dati
+eccedenti numero di byte specificato col valore di \var{ifc\_len} impostato
+alla chiamata della funzione, troncando il risultato se questi non dovessero
+essere sufficienti. Questa condizione non viene segnalata come errore per cui
+occorre controllare il valore di \var{ifc\_len} all'uscita della funzione, e
+verificare che esso sia inferiore a quello di ingresso. In caso contrario si è
+probabilmente\footnote{probabilmente perché si potrebbe essere nella
+  condizione in cui sono stati usati esattamente quel numero di byte.} avuta
+una situazione di troncamento dei dati.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includecodesample{listati/iflist.c}
+  \end{minipage}
+  \caption{Il corpo principale del programma \texttt{iflist.c}.}
+  \label{fig:netdevice_iflist}
+\end{figure}
+
+Come esempio dell'uso di queste funzioni si è riportato in
+fig.~\ref{fig:netdevice_iflist} il corpo principale del programma
+\texttt{iflist} in cui si utilizza l'operazione \const{SIOCGIFCONF} per
+ottenere una lista delle interfacce attive e dei relativi indirizzi. Al solito
+il codice completo è fornito nei sorgenti allegati alla guida.
+
+Il programma inizia (\texttt{\small 7--11}) con la creazione del socket
+necessario ad eseguire l'operazione, dopo di che si inizializzano
+opportunamente (\texttt{\small 13--14}) i valori della struttura
+\struct{ifconf} indicando la dimensione del buffer ed il suo
+indirizzo;\footnote{si noti come in questo caso si sia specificato l'indirizzo
+  usando il campo \var{ifc\_buf}, mentre nel seguito del programma si accederà
+  ai valori contenuti nel buffer usando \var{ifc\_req}.} si esegue poi
+l'operazione invocando \func{ioctl}, controllando come sempre la corretta
+esecuzione, ed uscendo in caso di errore (\texttt{\small 15--19}).
+
+Si esegue poi un controllo sulla quantità di dati restituiti segnalando un
+eventuale overflow del buffer (\texttt{\small 21--23}); se invece è tutto a
+posto (\texttt{\small 24--27}) si calcola e si stampa a video il numero di
+interfacce attive trovate.  L'ultima parte del programma (\texttt{\small
+  28--33}) è il ciclo sul contenuto delle varie strutture \struct{ifreq}
+restituite in cui si estrae (\texttt{\small 30}) l'indirizzo ad esse
+assegnato\footnote{si è definito \var{access} come puntatore ad una struttura
+  di tipo \struct{sockaddr\_in} per poter eseguire un \textit{casting}
+  dell'indirizzo del valore restituito nei vari campi \var{ifr\_addr}, così
+  poi da poterlo poi usare come argomento di \func{inet\_ntoa}.}  e lo si
+stampa (\texttt{\small 31--32}) insieme al nome dell'interfaccia.
 
 
 
@@ -3954,7 +4021,9 @@ nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di
 questi però non è documentato:
 \begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{dev\_weight}] blocco di lavoro (\textit{work quantum}) dello
-  scheduler di processo dei pacchetti. % TODO da documentare meglio
+  scheduler di processo dei pacchetti. 
+
+% TODO da documentare meglio
 
 \item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione
   sotto la quale si considera di avere una bassa congestione.
@@ -3994,9 +4063,17 @@ accessibile con \texttt{man 7 ip}, sono i seguenti:
 \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ò
-  essere modificato per il singolo socket con l'opzione \const{IP\_TTL}.
-  Prende un valore intero.
+  (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti, stabilendo
+  così il numero massimo di router che i pacchetti possono attraversare. Il
+  valore può essere modificato anche per il singolo socket con l'opzione
+  \const{IP\_TTL}.  Prende un valore intero, ma dato che il campo citato è di
+  8 bit hanno senso solo valori fra 0 e 255. Il valore di default è 64, e non
+  ci normalmente non c'è nessuna necessità di modificarlo,\footnote{l'unico
+    motivo sarebbe per raggiungere macchine estremamente ``lontane'' in
+    termini di \textit{hop}, ma è praticamente } aumentare il valore è una
+  pratica poco gentile, in quanto in caso di problemi di routing si allunga
+  inutilmente il numero di ritrasmissioni.
+  
 
 \item[\texttt{ip\_forward}] abilita l'inoltro dei pacchetti da una interfaccia
   ad un altra, e può essere impostato anche per la singola interfaccia. Prende
@@ -4058,13 +4135,41 @@ 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\_abort\_on\_overflow}] è un valore logico (disabilitato di
+  default) che indica di azzerare le connessioni quando il programma che le
+  riceve è troppo lento ed incapace di accettarle. Questo consente di
+  recuperare le connessioni se si è avuto un eccesso dovuto ad un qualche
+  picco di traffico, ma ovviamente va a discapito dei client che interrogano
+  il server. Pertanto è da abilitare soltanto quando si è sicuri che non è
+  possibile ottimizzare il server in modo che sia in grado di accettare
+  connessioni più rapidamente.
+
+\item[\texttt{tcp\_adv\_win\_scale}] questo valore indica al kernel quanto
+  spazio all'interno del buffer associato a un socket (quello impostato con
+  \texttt{tcp\_rmem}) deve essere utilizzato per la
+
 \item[\texttt{tcp\_app\_win}] 
+
+\item[\texttt{tcp\_bic}]
 \item[\texttt{tcp\_bic\_low\_window}] 
 \item[\texttt{tcp\_bic\_fast\_convergence}] 
-\item[\texttt{tcp\_dsack}] 
-\item[\texttt{tcp\_ecn}] 
+
+\item[\texttt{tcp\_dsack}] Abilita il supporto definito
+  nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884} per il
+  \textit{Duplicate SACK}.\footnote{si indica con SACK (\textit{Selective
+      Acknowledgement}) un'opzione TCP, definita
+    nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}, usata per dare
+    un \textit{acknowledgement} unico su blocchi di pacchetti non contigui.}
+
+\item[\texttt{tcp\_ecn}] Abilita il meccanismo della \textit{Explicit
+    Congestion Notification} (o ECN) definito
+  nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}. Si tenga presente
+  che se si abilita questa opzione si possono avere dei malfunzionamenti
+  apparentemente casuali dipendenti dalla destizione, dovuti al fatto che
+  alcuni vecchi router non supportano il meccanismo ed alla sua attivazione
+  scartano i relativi pacchetti.\\
+
 \item[\texttt{tcp\_fack}] 
 
 \item[\texttt{tcp\_fin\_timeout}] specifica il numero di secondi (il default è
@@ -4106,16 +4211,29 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 \item[\texttt{tcp\_orphan\_retries}] 
 \item[\texttt{tcp\_reordering}] 
 \item[\texttt{tcp\_retrans\_collapse}] 
-\item[\texttt{tcp\_retries1}] 
+
+\item[\texttt{tcp\_retries1}] imposta il massimo numero di volte che
+  protocollo tenterà la ritrasmissione si un pacchetto su una connessione
+  stabilita prima di fare ricorso ad ulteriori sforzi che coinvolgano anche il
+  livello di rete. Passato questo numero di ritrasmissioni verrà fatto
+  eseguire al livello di rete un tentativo di aggiornamento della rotta verso
+  la destinazione prima di eseguire ogni successiva ritrasmissione.
 
 \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}).
+  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}). Il valore default è 15, che significa un
+  tempo variabile fra 13 e 30 minuti; questo non corrisponde a quanto
+  richiesto nell'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} dove è
+  indicato un massimo di 100 secondi, che però è un valore considerato troppo
+  basso.
 
 
 \item[\texttt{tcp\_rfc1337}] 
-\item[\texttt{tcp\_rmem}]
+
+\item[\texttt{tcp\_rmem}] 
+
+
 \item[\texttt{tcp\_sack}] 
 \item[\texttt{tcp\_stdurg}] 
 \item[\texttt{tcp\_synack\_retries}] 
@@ -4131,6 +4249,8 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 \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}] 
@@ -4210,7 +4330,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 % LocalWords:  metric EOPNOTSUPP mtu hwaddr ARPHRD interrupt DMA map qlen silly
 % LocalWords:  rename ifconf syndrome dell'ACK FTP ACCEPTFILTER advanced reno
 % LocalWords:  congestion control Networking cubic CUBIC highspeed HSTCP htcp
-% LocalWords:  HTCP hybla HYBLA scalable SCALABLE
+% LocalWords:  HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa
 
 %%% Local Variables: 
 %%% mode: latex