Un po' di materiale sulle sysctl dei socket, e qualche correzione sulle
[gapil.git] / sockctrl.tex
index 585e3712e22092777a4b6d4420ef063be881524e..38722cdb269fe98e8cf069d5f9d5dba962cc546b 100644 (file)
@@ -2520,32 +2520,37 @@ si pu
 fare questa operazione per un socket TCP dato che su di essi si può sempre
 invocare \func{getsockname} una volta che si è completata la connessione.
 
-Infine il quarto caso è quello in cui si vuole effettivamente ottenere un
-\textit{completely duplicate binding}, quando cioè si vuole eseguire
-\func{bind} su un indirizzo ed una porta che sono già \textsl{legati} ad un
-altro socket.  Questo ovviamente non ha senso per il normale traffico di rete,
-in cui i pacchetti vengono scambiati direttamente fra due applicazioni; ma
-quando un sistema supporta il traffico in multicast, in cui una applicazione
-invia i pacchetti a molte altre (vedi sez.~\ref{sec:multicast_xxx}), allora ha
-senso che su una macchina i pacchetti provenienti dal traffico in multicast
-possano essere ricevuti da più applicazioni\footnote{l'esempio classico di
-  traffico in multicast è quello di uno streaming di dati (audio, video,
-  ecc.), l'uso del multicast consente in tal caso di trasmettere un solo
-  pacchetto, che potrà essere ricevuto da tutti i possibili destinatari
-  (invece di inviarne un duplicato a ciascuno); in questo caso è perfettamente
-  logico aspettarsi che sulla stessa macchina più utenti possano lanciare un
-  programma che permetta loro di ricevere gli stessi dati.} o da diverse
-istanze della stessa applicazione.
+Infine il quarto caso è quello in cui si vuole effettivamente ottenere
+un \textit{completely duplicate binding}, quando cioè si vuole
+eseguire \func{bind} su un indirizzo ed una porta che sono già
+\textsl{legati} ad un altro socket.  Questo ovviamente non ha senso
+per il normale traffico di rete, in cui i pacchetti vengono scambiati
+direttamente fra due applicazioni; ma quando un sistema supporta il
+traffico in \itindex{multicast}\textit{multicast}, in cui una
+applicazione invia i pacchetti a molte altre (vedi
+sez.~\ref{sec:multicast_xxx}), allora ha senso che su una macchina i
+pacchetti provenienti dal traffico in multicast possano essere
+ricevuti da più applicazioni\footnote{l'esempio classico di traffico
+  in multicast è quello di uno streaming di dati (audio, video, ecc.),
+  l'uso del multicast consente in tal caso di trasmettere un solo
+  pacchetto, che potrà essere ricevuto da tutti i possibili
+  destinatari (invece di inviarne un duplicato a ciascuno); in questo
+  caso è perfettamente logico aspettarsi che sulla stessa macchina più
+  utenti possano lanciare un programma che permetta loro di ricevere
+  gli stessi dati.} o da diverse istanze della stessa applicazione.
+\itindex{multicast}
 
 In questo caso utilizzando \const{SO\_REUSEADDR} si consente ad una
-applicazione eseguire \func{bind} sulla stessa porta ed indirizzo usata da
-un'altra, così che anche essa possa ricevere gli stessi pacchetti (chiaramente
-la cosa non ha alcun senso per i socket TCP, ed infatti in questo tipo di
-applicazione è normale l'uso del protovollo UDP). La regola è che quando si
-hanno più applicazioni che hanno eseguito \func{bind} sulla stessa porta, di
-tutti pacchetti destinati ad un indirizzo di broadcast o di multicast viene
-inviata una copia a ciascuna applicazione. Non è definito invece cosa accade
-qualora il pacchetto sia destinato ad un indirizzo normale (unicast).
+applicazione eseguire \func{bind} sulla stessa porta ed indirizzo
+usata da un'altra, così che anche essa possa ricevere gli stessi
+pacchetti (chiaramente la cosa non ha alcun senso per i socket TCP, ed
+infatti in questo tipo di applicazione è normale l'uso del protovollo
+UDP). La regola è che quando si hanno più applicazioni che hanno
+eseguito \func{bind} sulla stessa porta, di tutti pacchetti destinati
+ad un indirizzo di broadcast o di \itindex{multicast}
+\texttt{multicast} viene inviata una copia a ciascuna applicazione.
+Non è definito invece cosa accade qualora il pacchetto sia destinato
+ad un indirizzo normale (unicast).
 
 Essendo questo un caso particolare in alcuni sistemi (come BSD) è stata
 introdotta una opzione ulteriore, \const{SO\_REUSEPORT} che richiede che detta
@@ -2812,9 +2817,10 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
 
 
 \item[\const{IP\_TTL}] L'opzione consente di leggere o impostare il campo
-  \textit{Time to Live} dell'intestazione IP (vedi sez.~\ref{sec:IP_header}).
-  Il campo TTL è di 8 bit e l'opzione richiede che \param{optval} sia un
-  intero, che ne conterrà il valore.
+  \textit{Time to Live} dell'intestazione IP (vedi sez.~\ref{sec:IP_header})
+  per tutti i pacchetti associati al socket.  Il campo TTL è di 8 bit e
+  l'opzione richiede che \param{optval} sia un intero, che ne conterrà il
+  valore.
 
 
 \item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso
@@ -2835,12 +2841,14 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   L'opzione richiede per \param{optval} un intero usato come valore logico;
   l'opzione non è applicabile a socket di tipo \const{SOCK\_STREAM}.
 
-\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel
-  della serie 2.2.x, ed è specifica di Linux.  L'opzione permette di scrivere
-  o leggere le impostazioni usate nella determinazione della \textit{Maximum
-    Tranfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) per il socket. Il valore
-  di default è determinato dal parametro \texttt{ip\_no\_pmtu\_disc} di
-  \func{sysctl}.
+\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i
+  kernel della serie 2.2.x, ed è specifica di Linux.  L'opzione
+  permette di scrivere o leggere le impostazioni usate nella
+  determinazione della \textit{Maximum Tranfer Unit} (vedi
+  sez.~\ref{sec:net_lim_dim}) per il socket. Il valore di default è
+  determinato dal parametro \texttt{ip\_no\_pmtu\_disc} di
+  \func{sysctl} per i socket di tipo \const{SOCK\_STREAM}, mentre è
+  diabilitato per tutti gli altri.
 
 \item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum
     Tranfer Unit} di percorso del socket.  L'opzione richiede per
@@ -2848,8 +2856,12 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di
   Linux.
 
-\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i kernel
-  della serie 2.2.x, ed è specifica di Linux.
+\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
+  kernel della serie 2.2.x, ed è specifica di Linux. Prende per
+  \param{optval} un intero usato come valore logico. Se abilitata
+  passa tutti i pacchetti con l'opzione \textit{IP Router Alert} (vedi
+  sez.\ref{sec:IP_options}) che devono essere inoltrati al socket
+  corrente. Può essere usata soltanto per socket di tipo raw.
 
 \item[\const{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il
   valore del campo TTL per i pacchetti in uscita associati al socket. È
@@ -2859,10 +2871,11 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   L'opzione richiede per \param{optval} un intero che conterrà il valore del
   TTL.
 
-\item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati
-  che si inviano su un socket usato con il multicast vengano ricevuti anche
-  sulla stessa macchina da cui li si stanno inviando.  Prende per
-  \param{optval} un intero usato come valore logico. 
+\item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i
+  dati che si inviano su un socket usato con il \itindex{multicast}
+  \texttt{multicast} vengano ricevuti anche sulla stessa macchina da
+  cui li si stanno inviando.  Prende per \param{optval} un intero
+  usato come valore logico.
 
   In generale se si vuole che eventuali client possano ricevere i dati che si
   inviano occorre che questa funzionalità sia abilitata (come avviene di
@@ -2870,15 +2883,17 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   disponibili in locale l'uso di questa opzione permette di disabilitare
   questo tipo di traffico.
 
-\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di
-  multicast, e può essere usata solo con \func{setsockopt}. L'argomento
-  \param{optval} in questo caso deve essere una struttura di tipo
-  \struct{ip\_mreqn}, illustrata in fig.~\ref{fig:ip_mreqn_struct}, che
-  permette di indicare, con il campo \var{imr\_multiaddr} l'indirizzo del
-  gruppo di multicast a cui ci si vuole unire, con il campo \var{imr\_address}
-  l'indirizzo dell'interfaccia locale con cui unirsi al gruppo di multicast e
-  con \var{imr\_ifindex} l'indice dell'interfaccia da utilizzare (un valore
-  nullo indica una interfaccia qualunque).  
+\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad
+  gruppo di \itindex{multicast} \texttt{multicast}, e può essere usata
+  solo con \func{setsockopt}. L'argomento \param{optval} in questo
+  caso deve essere una struttura di tipo \struct{ip\_mreqn},
+  illustrata in fig.~\ref{fig:ip_mreqn_struct}, che permette di
+  indicare, con il campo \var{imr\_multiaddr} l'indirizzo del gruppo
+  di multicast a cui ci si vuole unire, con il campo
+  \var{imr\_address} l'indirizzo dell'interfaccia locale con cui
+  unirsi al gruppo di multicast e con \var{imr\_ifindex} l'indice
+  dell'interfaccia da utilizzare (un valore nullo indica una
+  interfaccia qualunque).
 
   Per compatibilità è possibile utilizzare anche un argomento di tipo
   \struct{ip\_mreq}, una precedente versione di \struct{ip\_mreqn}, che
@@ -2895,11 +2910,15 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
 \end{figure}
 
 
+\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di
+  \itindex{multicast} \texttt{multicast}, prende per \param{optval} la
+  stessa struttura \struct{ip\_mreqn} (o \struct{ip\_mreq}) usata
+  anche per \const{IP\_ADD\_MEMBERSHIP}.
 
-
-\item[\const{IP\_DROP\_MEMBERSHIP}]
-
-\item[\const{IP\_MULTICAST\_IF}] 
+\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per
+  i'utilizzo del multicast, ed utilizza come \param{optval} le stesse
+  strutture \struct{ip\_mreqn} o \struct{ip\_mreq} delle due
+  precedenti opzioni.
 
 
 \end{basedescript}
@@ -2918,20 +2937,50 @@ classiche per il controllo delle propriet
 \func{ioctl}. 
 
 
-\subsection{L'uso di \func{fcntl} per i socket}
-\label{sec:sock_fcntl}
+\subsection{L'uso di \func{ioctl} per i socket}
+\label{sec:sock_ioctl}
 
-Abbiamo già trattato l'uso di \func{fcntl} in sez.~\ref{sec:file_fcntl}, dove
+Abbiamo già trattato l'uso di \func{ioctl} in sez.~\ref{sec:file_ioctl}, dove
 però ne abbiamo descritto le funzionalità nell'ambito della sua applicazione a
 file descriptor associati a file normali; tratteremo qui invece il suo uso
 specifico quando la si impiega su file descriptor associati a dei socket. 
 
+Quanto utilizzata con socket generici i valori utilizzabili per il secondo
+argomento della funzione (\param{request}, che indica il tipo di operazione
+richiesta) sono quelli riportati nel seguente elenco, il terzo argomento della
+funzione (quello usato per inviare o ricevere i dati) dipende dalla richiesta
+effettuata, ed è anch'esso illustrato nell'elenco in corrispondenza alla
+relativa richiesta:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SIOCGSTAMP}] restituisce una struttura \struct{timeval} con la
+  marca temporale dell'ultimo pacchetto ricevuto sul socket, questa operazione
+  può essere utilizzata per effettuare delle misurazioni precise del tempo di
+  andata e ritorno\footnote{il cosiddetto \itindex{round~trip~time}
+    \textit{round trip time}.} dei pacchetti sulla rete.
+\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}. Senxa privilegi di amministratore o la
+  capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio
+  \textit{process group}.
+
+\item[\const{FIOASYNC}] .
+
+
+\item[\const{SIOCGPGRP}] .
+
+\end{basedescript}
 
-\subsection{L'uso di \func{ioctl} per i socket}
-\label{sec:sock_ioctl}
 
-Come per \func{fcntl} abbiamo trattato l'uso di \func{ioctl} in
-sez.~\ref{sec:file_ioctl}, dove ne abbiamo descritto le funzionalità
+\subsection{L'uso di \func{fcntl} per i socket}
+\label{sec:sock_fcntl}
+
+Come per \func{ioctl} abbiamo trattato l'uso di \func{fcntl} in
+sez.~\ref{sec:file_fcntl}, dove ne abbiamo descritto le funzionalità
 nell'ambito dell'applicazione su file normali; tratteremo qui il suo uso
 specifico quando la si impiega su file descriptor associati a dei socket. 
 
@@ -2974,7 +3023,7 @@ generici validi per tutti i socket, quelli descritti anche nella rispettiva
 pagina di manuale.\footnote{quella accessibile con \texttt{man 7 socket}.}
 I principali sono:
 
-\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
   lettura (cioè per i dati in ingresso) dei socket.
 \item[\texttt{rmem\_max}] imposta la dimensione massima che si può assegnare al
@@ -2985,20 +3034,75 @@ I principali sono:
 \item[\texttt{wmem\_max}] imposta la dimensione massima che si può assegnare al
   buffer di uscita dei socket attraverso l'uso dell'opzione
   \const{SO\_SNDBUF}.
-\item[\texttt{message\_cost}] 
-\item[\texttt{message\_burst}] 
-\item[\texttt{netdev\_max\_backlog}] 
-\item[\texttt{optmem\_max}] 
+\item[\texttt{message\_cost}, \texttt{message\_burst}] impostano i valori
+  delle impostazioni del \itindex{bucket~filter} \textit{bucket filter}
+  (rispettivamente flusso a regime e dimensione di picchi di emissione) che
+  limita l'ammontare dei messaggi di avvertimento inviati dal kernel a causa
+  di eventi esterni sulla rete.
+% TODO: spiegare il ucket filter e questa opzione
+\item[\texttt{netdev\_max\_backlog}] numero massimo di pacchetti che possono
+  essere contenuti nella coda di ingresso generale.
+\item[\texttt{optmem\_max}] lunghezza massima dei dati ancillari e di
+  controllo (vedi sez.~\ref{sec:TCP_ancillary_data}).
 \end{basedescript}
 
 Nella directory \texttt{/proc/sys/net/ipv4} sono disponibili i parametri per i
 socket IPv4, descritti anche nella rispettiva pagina di
 manuale.\footnote{quella accessibile con \texttt{man 7 ip}.} I principali
 sono:
-\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{3.2cm}\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.
+
+\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 un valore logico (0 disabilita, diverso da zero abilita).
+
+\item[\texttt{ip\_dynaddr}] Abilita la riscrittura automatica degli indirizzi
+  associati ad un socket quando una interfaccia cambia indirizzo. Viene usato
+  per le interfacce usate nei collegamenti in dial-up, il cui indirizzo IP
+  viene assegnato dinamicamente dal provider, e può essere modificato. Un
+  valore nullo disabilita la funzionalità, con 1 la si abilita, con 2 la si
+  abilità in modalità \textsl{prolissa}.
+
+\item[\texttt{ip\_autoconfig}] non documentato
+
+\item[\texttt{ip\_local\_port\_range}] imposta l'intervallo dei valori usati
+  per l'assegnazione delle porte effimere, permette cioè di modificare i
+  valori illustrati in fig.~\ref{fig:TCP_port_alloc}; prende due valori
+  numerici, che indicano gli estremi dell'intervallo. Si abbia cura di non
+  definire un intervallo che si sovrappone a quello delle porte usate per il
+  \itindex{masquerading} \textit{masquerading}, il kernel può gestire la
+  sovrapposizione, ma si avrà una perdita di prestazioni. Si imposti sempre un
+  valore iniziale maggiore di 1024 (o meglio ancora di 4096) per evitare
+  conflitti con le porte usate dai servizi noti.
+
 \item[\texttt{ip\_no\_pmtu\_disc}] imposta la discliplina di ricerca della
   \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim} e
   sez.~\ref{sec:sock_ipv4_options}).
+
+\item[\texttt{ipfrag\_high\_thresh}] limite massimo (espresso in numero di
+  byte) sui pacchetti IP frammentati presenti in coda; quando questo valore
+  viene raggiunta la coda viene ripulita fino al valore
+  \texttt{ipfrag\_low\_thresh}.
+
+\item[\texttt{ipfrag\_low\_thresh}] soglia bassa (specificata in byte) cui
+  viene riportata la coda dei pacchetti IP frammentati quando si raggiunge il
+  valore \texttt{ipfrag\_high\_thresh}.
+
+\item[\texttt{ip\_always\_defrag}] se abilitato (prende un intero come valore
+  logico) tutti i pacchetti IP frammentati saranno riassemblati, anche in caso
+  in successivo immediato inoltro.\footnote{introdotto con il kernel 2.2.13,
+    nelle versioni precedenti questo comportamento poteva essere solo in fase
+    di compilazione del kernel con l'opzione
+    \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.}
+
+\item[\texttt{}] 
+
+
 \end{basedescript}