per primi, in modalità che dipendono dalla disciplina di gestione della
coda. Nel caso di protocollo IP questa opzione permette anche di impostare i
valori del campo \textit{type of service} (noto come TOS, vedi
- sez.~\ref{sec:IP_xxx}) per i pacchetti uscenti. Per impostare una priorità
- al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i privilegi
- di amministratore con la capability \const{CAP\_NET\_ADMIN}.
+ sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una
+ priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i
+ privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}.
\item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
può essere utilizzata soltanto con \func{getsockopt} e prende per
sviluppo del kernel 2.1.x, ma è in seguito stata soppiantata dall'uso di
\const{IP\_PKTINFO} (vedi sez.~\ref{sec:sock_ipv4_options}).} in tale modo
si può sapere a quale socket corrisponde un certo indirizzo. Non ha senso
-fare questa operazionie per socket TCP dato che su di essi si può sempre
+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
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}.
+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]
\textbf{Descrizione}\\
\hline
\hline
- \const{IP\_OPTIONS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Imposta o riceve le opzioni di IP.\\
- \const{IP\_PKTINFO}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio di informazione.\\
- \const{IP\_RECVTOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio col campo TOS.\\
- \const{IP\_RECVTTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio col campo TTL.\\
- \const{IP\_RECVOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio con le opzioni IP.\\
- \const{IP\_RETOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio con le opzioni IP non
- trattate.\\
- \const{IP\_TOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Imposta il valore del campo TOS.\\
- \const{IP\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Imposta il valore del campo TTL.\\
- \const{IP\_HDRINCL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa l'intestazione di IP nei dati.\\
- \const{IP\_RECVERR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Abilita la gestione degli errori.\\
- \const{IP\_MTU\_DISCOVER}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Imposta il Path MTU Discovery.\\
- \const{IP\_MTU}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Legge il valore attuale della MTU.\\
- \const{IP\_ROUTER\_ALERT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Imposta l'opzione \textit{IP router alert} sui
- pacchetti.\\
- \const{IP\_MULTICAST\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Imposta il TTL per i pacchetti multicast.\\
- \const{IP\_MULTICAST\_LOOP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Controlla il reinvio a se
- stessi dei dati di multicast.\\
- \const{IP\_ADD\_MEMBERSHIP}& &$\bullet$&$\bullet$&\texttt{int}&
- Si unisce a un gruppo di multicast.\\
+ \const{IP\_OPTIONS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Imposta o riceve le opzioni di IP.\\
+ \const{IP\_PKTINFO} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio di informazione.\\
+ \const{IP\_RECVTOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio col campo TOS.\\
+ \const{IP\_RECVTTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio col campo TTL.\\
+ \const{IP\_RECVOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio con le opzioni IP.\\
+ \const{IP\_RETOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa un messaggio con le opzioni IP non trattate.\\
+ \const{IP\_TOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Imposta il valore del campo TOS.\\
+ \const{IP\_TTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Imposta il valore del campo TTL.\\
+ \const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Passa l'intestazione di IP nei dati.\\
+ \const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Abilita la gestione degli errori.\\
+ \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Imposta il Path MTU Discovery.\\
+ \const{IP\_MTU} &$\bullet$& &$\bullet$&\texttt{int}&
+ Legge il valore attuale della MTU.\\
+ \const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Imposta l'opzione \textit{IP router alert} sui pacchetti.\\
+ \const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Imposta il TTL per i pacchetti multicast.\\
+ \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Controlla il reinvio a se stessi dei dati di multicast.\\
+ \const{IP\_ADD\_MEMBERSHIP} & &$\bullet$&$\bullet$&\texttt{int}&
+ Si unisce a un gruppo di multicast.\\
\const{IP\_DROP\_MEMBERSHIP}& &$\bullet$&$\bullet$&\texttt{int}&
- Si sgancia da un gruppo di multicast.\\
- \const{IP\_MULTICAST\_IF}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Imposta l'interfaccia locale di un socket
- multicast.\\
+ Si sgancia da un gruppo di multicast.\\
+ \const{IP\_MULTICAST\_IF} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ Imposta l'interfaccia locale di un socket multicast.\\
\hline
\end{tabular}
\caption{Le opzioni disponibili al livello \const{SOL\_IP}.}
opzioni del protocollo IP (si veda sez.~\ref{sec:IP_options}). L'opzione
prende come valore dell'argomento \param{optval} un puntatore ad un buffer
dove sono mantenute le opzioni, mentre \param{optlen} indica la dimensione
- di quest'ultimo. Quando la si usa con \func{setsockopt}
-
-\item[\const{IP\_PKTINFO}]
-
-\item[\const{IP\_RECVTOS}]
-
-\item[\const{IP\_RECVTTL}]
-
-\item[\const{IP\_RECVOPTS}]
-
-\item[\const{IP\_RETOPTS}]
-
-
-\item[\const{IP\_TOS}]
-
-
-\item[\const{IP\_TTL}]
-
-
-\item[\const{IP\_HDRINCL}]
-
-
-\item[\const{IP\_RECVERR}]
-
-\item[\const{IP\_MTU\_DISCOVER}]
-
-\item[\const{IP\_MTU}]
-
-\item[\const{IP\_ROUTER\_ALERT}]
-
-\item[\const{IP\_MULTICAST\_TTL}]
+ di quest'ultimo. Quando la si usa con \func{getsockopt} vengono lette le
+ opzioni IP utilizzate per la spedizione, quando la si usa con
+ \func{setsockopt} vengono impostate le opzioni specificate. L'uso di questa
+ opzione richiede una profonda conoscenza del funzionamento del protocollo,
+ torneremo in parte sull'argomento in sez.~\ref{sec:sock_advanced_xxx}.
+
+
+\item[\const{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere
+ insieme ai pacchetti un messaggio ancillare (vedi
+ sez.~\ref{sec:TCP_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente
+ 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
+ utilizzato (nel campo \var{ipi\_spec\_dst}) e l'indirizzo remoto dello
+ stesso (nel campo \var{ipi\_addr}).
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \includestruct{listati/pktinfo.h}
+ \end{minipage}
+ \caption{La struttura \structd{pktinfo} usata dall'opzione
+ \const{IP\_PKTINFO} per ricavare informazioni sui pacchetti di un socket
+ di tipo \const{SOCK\_DGRAM}.}
+ \label{fig:sock_pktinfo_struct}
+\end{figure}
+L'opzione è utilizzabile solo per socket di tipo \const{SOCK\_DGRAM}. Questa è
+una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di
+Linux;\footnote{non dovrebbe pertanto essere utilizzata se si ha a cuore la
+ portabilità.} essa permette di sostituire le opzioni \const{IP\_RECVDSTADDR}
+e \const{IP\_RECVIF} presenti in altri Unix (la relativa informazione è quella
+ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
+\struct{pktinfo}).
+
+
+\item[\const{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere
+ insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_TOS}, che
+ contiene un byte con il valore del campo \textit{Type of Service}
+ dell'intestazione IP del pacchetto stesso (vedi sez.~\ref{sec:IP_header}).
+ Prende per \param{optval} un intero usato come valore logico.
+
+\item[\const{IP\_RECVTTL}] Quando abilitata l'opzione permette di ricevere
+ insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_RECVTTL},
+ contenente un byte con il valore del campo \textit{Time to Live}
+ dell'intestazione IP (vedi sez.~\ref{sec:IP_header}). L'opzione richiede
+ per \param{optval} un intero usato come valore logico. L'opzione non è
+ supportata per socket di tipo \const{SOCK\_STREAM}.
+
+\item[\const{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere
+ insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_OPTIONS},
+ contenente le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le
+ intestazioni di instradamento e le altre opzioni sono già riempite con i
+ dati locali. L'opzione richiede per \param{optval} un intero usato come
+ valore logico. L'opzione non è supportata per socket di tipo
+ \const{SOCK\_STREAM}.
+
+\item[\const{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma
+ in questo caso restituisce i dati grezzi delle opzioni, senza che siano
+ riempiti i capi di instradamento e le marche temporali. L'opzione richiede
+ per \param{optval} un intero usato come valore logico. L'opzione non è
+ supportata per socket di tipo \const{SOCK\_STREAM}.
+
+
+\item[\const{IP\_TOS}] L'opzione consente di leggere o impostare il campo
+ \textit{Type of Service} dell'intestazione IP (vedi
+ sez.~\ref{sec:IP_header}) che permette di indicare le priorità dei
+ pacchetti. Il campo TOS è di 8 bit e l'opzione richiede per \param{optval}
+ un intero che ne contiene il valore. Sono definite anche alcune costanti che
+ definiscono alcuni valori standardizzati per il \textit{Type of Service},
+ riportate in tab.~\ref{tab:IP_TOS_values}. Si ricordi che la priorità dei
+ pacchetti può essere impostata anche in maniera indipendente dal protocollo
+ utilizzando l'opzione \const{SO\_PRIORITY} illustrata in
+ sez.~\ref{sec:sock_generic_options}.
+
+
+\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.
+
+
+\item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso
+ l'intestazione IP in cima ai propri dati. L'opzione è valida soltanto per
+ socket di tipo \const{SOCK\_RAW}, e quando utilizzata eventuali valori
+ impostati con \const{IP\_OPTIONS}, \const{IP\_TOS} o \const{IP\_TTL} sono
+ ignorati. In ogni caso prima della spedizione alcuni campi
+ dell'instestazione vengono comunque modificati dal kernel, torneremo
+ sull'argomento in sez.~\ref{sec:socket_raw_xxx}
+
+
+\item[\const{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della
+ serie 2.2.x, ed è specifica di Linux.
+
+\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel
+ della serie 2.2.x, ed è specifica di Linux.
+
+\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum
+ Tranfer Unit} di percorso (vedi sez.~\ref{sec:net_lim_dim}) del socket.
+ L'opzione richiede per \param{optval} un intero che conterrà il valore della
+ MTU in byte. 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.
+
+\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. È
+ importante che questo valore sia il più basso possibile, ed il default è 1,
+ che significa che i pacchetti non potranno uscire dalla rete locale. Questa
+ opzione consente ai programmi che lo richiedono di superare questo limite.
+ 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
In generale se si vuole che eventuali client possano ricevere i dati che si
inviano occorre che questa funzionalità sia abilitata (come avviene di
default). Qualora però non si voglia generare traffico per dati che già sono
- disponibili l'uso di questa opzione permette di disabilitare questo tipo di
- traffico.
+ disponibili in locale l'uso di questa opzione permette di disabilitare
+ questo tipo di traffico.
\item[\const{IP\_ADD\_MEMBERSHIP}]
\item[\const{IP\_DROP\_MEMBERSHIP}]
-\item[\const{IP\_MULTICAST\_IF}]
+\item[\const{IP\_MULTICAST\_IF}]
\end{basedescript}