\subsection{La struttura del \textit{resolver}}
\label{sec:sock_resolver}
-\index{\textit{resolver}|(}
+\itindbeg{resolver}
La risoluzione dei nomi è associata tradizionalmente al servizio del
\textit{Domain Name Service} che permette di identificare le macchine su
internet invece che per numero IP attraverso il relativo \textsl{nome a
funzioni di libreria, prevedendo un ordine di interrogazione predefinito e
non modificabile (a meno di una ricompilazione delle librerie stesse).}
-\index{\textit{Name~Service~Switch}|(}
+\itindbeg{Name~Service~Switch}
Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
eseguirà dal \textit{resolver} è stata inclusa all'interno di un meccanismo
generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
\label{tab:sys_NSS_classes}
\end{table}
-Il sistema del \textit{Name Service Switch} è controllato dal contenuto del
+Il sistema del \textit{Name Service Switch} è controllato dal contenuto del
file \file{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una
convezione comune per i file di configurazione le righe vuote vengono
ignorate e tutto quello che segue un carattere ``\texttt{\#}'' viene
disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
quelle che tratteremo nelle sezioni successive.
-\index{\textit{Name~Service~Switch}|)}
+\itindend{Name~Service~Switch}
\subsection{Le funzioni di interrogazione del \textit{resolver}}
\noindent che, come l'analoga \func{strerror}, restituisce una stringa con un
messaggio di errore già formattato, corrispondente al codice passato come
argomento (che si presume sia dato da \var{h\_errno}).
-\index{\textit{resolver}|)}
-
+\itindend{resolver}
\subsection{La risoluzione dei nomi a dominio}
\label{sec:sock_name_services}
-La principale funzionalità del \index{\textit{resolver}}\textit{resolver}
-resta quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
+La principale funzionalità del \itindex{resolver}\textit{resolver} resta
+quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le
funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui
scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il
IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
-modificare le opzioni del \index{\textit{resolver}}\textit{resolver}; dato che
+modificare le opzioni del \itindex{resolver}\textit{resolver}; dato che
questo non è molto comodo è stata definita\footnote{questa è una estensione
fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.}
un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un
programma che esegue una semplice interrogazione al
-\index{\textit{resolver}}\textit{resolver} usando \func{gethostbyname} e poi
-ne stampa a video i risultati. Al solito il sorgente completo, che comprende
-il trattamento delle opzioni ed una funzione per stampare un messaggio di
-aiuto, è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
+\itindex{resolver}\textit{resolver} usando \func{gethostbyname} e poi ne
+stampa a video i risultati. Al solito il sorgente completo, che comprende il
+trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto,
+è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
Il programma richiede un solo argomento che specifichi il nome da cercare,
senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che
i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
una chiamata, occorrerà eseguire quella che si chiama una
-\index{\textit{deep~copy}}\textit{deep copy}.\footnote{si chiama così quella
- tecnica per cui, quando si deve copiare il contenuto di una struttura
- complessa (con puntatori che puntano ad altri dati, che a loro volta possono
- essere puntatori ad altri dati) si deve copiare non solo il contenuto della
+\itindex{deep~copy}\textit{deep copy}.\footnote{si chiama così quella tecnica
+ per cui, quando si deve copiare il contenuto di una struttura complessa (con
+ puntatori che puntano ad altri dati, che a loro volta possono essere
+ puntatori ad altri dati) si deve copiare non solo il contenuto della
struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
contenuti in essa (e così via se vi sono altre sottostrutture con altri
puntatori) e copiare anche i dati da questi referenziati.}
\param{buf} e \param{buflen}.
Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
-come \index{\textit{value~result~argument}}\textit{value result argument}, si
-deve specificare l'indirizzo della variabile su cui la funzione dovrà salvare
-il codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
+come \itindex{value~result~argument}\textit{value result argument}, si deve
+specificare l'indirizzo della variabile su cui la funzione dovrà salvare il
+codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
puntatore che si userà per accedere i dati con \param{result}.
In caso di successo entrambe le funzioni restituiscono un valore nullo,
In questo caso l'argomento \param{addr} dovrà essere il puntatore ad una
appropriata struttura contenente il valore dell'indirizzo IP (o IPv6) che si
-vuole risolvere. L'uso del tipo \type{char *} per questo argomento è storico,
-il dato dovrà essere fornito in una struttura \struct{in\_addr}\footnote{si
- ricordi che, come illustrato in fig.~\ref{fig:sock_sa_ipv4_struct}, questo
- in realtà corrisponde ad un numero intero, da esprimere comunque in
- \textit{network order}, non altrettanto avviene però per \var{in6\_addr},
- pertanto è sempre opportuno inizializzare questi indirizzi con
- \func{inet\_pton} (vedi sez.~\ref{sec:sock_conv_func_gen}).} per un
-indirizzo IPv4 ed una struttura \struct{in6\_addr} per un indirizzo IPv6,
-mentre in \param{len} se ne dovrà specificare la dimensione (rispettivamente 4
-o 16), infine l'argomento \param{type} indica il tipo di indirizzo e dovrà
-essere o \const{AF\_INET} o \const{AF\_INET6}.
+vuole risolvere. L'uso del tipo \texttt{char *} per questo argomento è
+storico, il dato dovrà essere fornito in una struttura
+\struct{in\_addr}\footnote{si ricordi che, come illustrato in
+ fig.~\ref{fig:sock_sa_ipv4_struct}, questo in realtà corrisponde ad un
+ numero intero, da esprimere comunque in \textit{network order}, non
+ altrettanto avviene però per \struct{in6\_addr}, pertanto è sempre opportuno
+ inizializzare questi indirizzi con \func{inet\_pton} (vedi
+ sez.~\ref{sec:sock_conv_func_gen}).} per un indirizzo IPv4 ed una struttura
+\struct{in6\_addr} per un indirizzo IPv6, mentre in \param{len} se ne dovrà
+specificare la dimensione (rispettivamente 4 o 16), infine l'argomento
+\param{type} indica il tipo di indirizzo e dovrà essere o \const{AF\_INET} o
+\const{AF\_INET6}.
La funzione restituisce, in caso di successo, un puntatore ad una struttura
\struct{hostent}, solo che in questo caso la ricerca viene eseguita
sistema è associata ad un indirizzo di tale tipo.\\
\const{AI\_DEFAULT} & il valore di default, è equivalente alla
combinazione di \const{AI\_ADDRCONFIG} e di
- \const{AI\_V4MAPPED)}.\\
+ \const{AI\_V4MAPPED}.\\
\hline
\end{tabular}
\caption{Valori possibili per i bit dell'argomento \param{flags} della
\textbf{Informazione}&\multicolumn{3}{|c|}{\textbf{Funzioni}}\\
\hline
\hline
- indirizzo&\func{sethostent}&\func{gethostent}&\func{endhostent} \\
- servizio &cd te\func{setservent}&\func{getservent}&\func{endservent}\\
- rete &\func{setnetent}&\func{getnetent}&\func{endnetent}\\
+ indirizzo &\func{sethostent} &\func{gethostent} &\func{endhostent} \\
+ servizio &\func{setservent} &\func{getservent} &\func{endservent}\\
+ rete &\func{setnetent} &\func{getnetent} &\func{endnetent}\\
protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\
\hline
\end{tabular}
risoluzioni sui nomi dei servizi indipendentemente dal protocollo (ad esempio
TCP o UDP) che questi possono utilizzare.
+Come ultimo argomento in \param{res} deve essere passato un puntatore ad una
+variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che verrà
+utilizzata dalla funzione per riportare (come \itindex{value~result~argument}
+\textit{value result argument}) i propri risultati. La funzione infatti è
+rientrante, ed alloca autonomamente tutta la memoria necessaria in cui
+verranno riportati i risultati della risoluzione. La funzione scriverà
+all'indirizzo puntato da \param{res} il puntatore iniziale ad una
+\itindex{linked~list}\textit{linked list} di strutture di tipo
+\struct{addrinfo} contenenti tutte le informazioni ottenute.
+
\begin{figure}[!htb]
\footnotesize \centering
\begin{minipage}[c]{15cm}
\label{fig:sock_addrinfo_struct}
\end{figure}
-La struttura \struct{addrinfo}, la cui definizione\footnote{la definizione è
- ripresa direttamente dal file \texttt{netdb.h} in questa struttura viene
- dichiarata, la pagina di manuale riporta \type{size\_t} come tipo di dato
- per il campo \var{ai\_addrlen}, qui viene usata quanto previsto dallo
- standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi di
- dati sono comunque equivalenti.} è riportata in
+Come illustrato la struttura \struct{addrinfo}, la cui definizione\footnote{la
+ definizione è ripresa direttamente dal file \texttt{netdb.h} in questa
+ struttura viene dichiarata, la pagina di manuale riporta \type{size\_t} come
+ tipo di dato per il campo \var{ai\_addrlen}, qui viene usata quanto previsto
+ dallo standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi
+ di dati sono comunque equivalenti.} è riportata in
fig.~\ref{fig:sock_addrinfo_struct}, viene usata sia in ingresso, per passare
dei valori di controllo alla funzione, che in uscita, per ricevere i
risultati. Il primo campo, \var{ai\_flags}, è una maschera binaria di bit che
famiglia di indirizzi, il tipo di socket e il protocollo, in ingresso vengono
usati per impostare una selezione (impostandone il valore nella struttura
puntata da \param{hints}), mentre in uscita indicano il tipo di risultato
-contenuto nella struttura.
+contenuto nella struttura.
Tutti i campi seguenti vengono usati soltanto in uscita; il campo
\var{ai\_addrlen} indica la dimensione della struttura degli indirizzi
\label{tab:ai_flags_values}
\end{table}
-Come ultimo argomento di \func{getaddrinfo} deve essere passato un puntatore
-ad una variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che
-verrà utilizzata dalla funzione per riportare (come \textit{value result
- argument}) i propri risultati. La funzione infatti è rientrante, ed alloca
-autonomamente tutta la memoria necessaria in cui verranno riportati i
-risultati della risoluzione. La funzione scriverà in \param{res} il puntatore
-iniziale ad una \index{\textit{linked~list}}\textit{linked list} di strutture
-di tipo \struct{addrinfo} contenenti tutte le informazioni ottenute.
-
La funzione restituisce un valore nullo in caso di successo, o un codice in
caso di errore. I valori usati come codice di errore sono riportati in
tab.~\ref{tab:addrinfo_error_code}; dato che la funzione utilizza altre
\const{EAI\_SYSTEM} & c'è stato un errore di sistema, si può controllare
\var{errno} per i dettagli. \\
% \hline
-% estensioni GNU, trovarne la documentazione
+% TODO estensioni GNU, trovarne la documentazione
% \const{EAI\_INPROGRESS}& richiesta in corso. \\
% \const{EAI\_CANCELED}& la richiesta è stata cancellata.\\
% \const{EAI\_NOTCANCELED}& la richiesta non è stata cancellata. \\
\begin{figure}[!htb]
\centering
\includegraphics[width=10cm]{img/addrinfo_list}
- \caption{La \index{\textit{linked~list}}\textit{linked list} delle strutture
+ \caption{La \itindex{linked~list}\textit{linked list} delle strutture
\struct{addrinfo} restituite da \func{getaddrinfo}.}
\label{fig:sock_addrinfo_list}
\end{figure}
Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
-elementare di interrogazione del \index{\textit{resolver}}\textit{resolver}
-basato questa funzione, il cui corpo principale è riportato in
+elementare di interrogazione del \itindex{resolver}\textit{resolver} basato
+questa funzione, il cui corpo principale è riportato in
fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa
la gestione delle opzioni in cui è gestita l'eventuale inizializzazione
dell'argomento \var{hints} per restringere le ricerche su protocolli, tipi di
\end{Verbatim}
%$
-Una volta estratti i risultati dalla
-\index{\textit{linked~list}}\textit{linked list} puntata da \param{res} se
-questa non viene più utilizzata si dovrà avere cura di disallocare
-opportunamente tutta la memoria, per questo viene fornita l'apposita funzione
-\funcd{freeaddrinfo}, il cui prototipo è:
+Una volta estratti i risultati dalla \itindex{linked~list}\textit{linked list}
+puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura
+di disallocare opportunamente tutta la memoria, per questo viene fornita
+l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
\begin{functions}
\headdecl{netdb.h}
Si tenga presente infine che se si copiano i risultati da una delle strutture
\struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
-avere cura di eseguire una \index{\textit{deep~copy}}\textit{deep copy} in cui
+avere cura di eseguire una \itindex{deep~copy}\textit{deep copy} in cui
si copiano anche tutti i dati presenti agli indirizzi contenuti nella
struttura \struct{addrinfo}, perché una volta disallocati i dati con
\func{freeaddrinfo} questi non sarebbero più disponibili.
per entrambe le funzioni. In questo caso \param{optval} viene usato per
ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
-che viene usata come \textit{value result argument} per indicare, prima della
-chiamata della funzione, la lunghezza del buffer allocato per \param{optval} e
-per ricevere indietro, dopo la chiamata della funzione, la dimensione
-effettiva dei dati scritti su di esso. Se la dimenzione del buffer allocato
-per \param{optval} non è sufficiente si avrà un errore.
+che viene usata come \itindex{value~result~argument}\textit{value result
+ argument} per indicare, prima della chiamata della funzione, la lunghezza
+del buffer allocato per \param{optval} e per ricevere indietro, dopo la
+chiamata della funzione, la dimensione effettiva dei dati scritti su di esso.
+Se la dimenzione del buffer allocato per \param{optval} non è sufficiente si
+avrà un errore.
consente però di impostare il timout per l'uso di \func{connect}, per avere
il quale si può ricorrere a questa opzione.
-% verificare con un programma di test
+% TODO verificare il timeout con un programma di test
\item[\const{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo
sulle operazioni di scrittura su un socket, ed usa gli stessi valori di
\item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
dei socket; l'opzione utilizza per \param{optval} un intero usato come
valore logico, e può essere utilizzata solo da un processo con i privilegi
- di amministratore (in particolare con la \textit{capability}
- \const{CAP\_NET\_ADMIN}). L'opzione necessita inoltre dell'opportuno
- supporto nel kernel;\footnote{deve cioè essere definita la macro di
- preprocessore \macro{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
- dei sorgenti del kernel, questo è sempre vero nei kernel delle serie
- superiori alla 2.3, per i kernel delle serie precedenti invece è
- necessario aggiungere a mano detta definizione; è inoltre possibile
- abilitare anche il tracciamento degli stati del TCP definendo la macro
- \macro{STATE\_TRACE} in \file{include/net/tcp.h}.} quando viene
- abilitata una serie di messaggi con le informazioni di debug vengono inviati
- direttamente al sistema del kernel log.\footnote{si tenga presente che il
- comportamento è diverso da quanto avviene con BSD, dove l'opzione opera
- solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati
- sulla rete su un buffer circolare che viene letto da un apposito
- programma, \cmd{trpt}.}
+ di amministratore (in particolare con la \itindex{capabilities}
+ \textit{capability} \const{CAP\_NET\_ADMIN}). L'opzione necessita inoltre
+ dell'opportuno supporto nel kernel;\footnote{deve cioè essere definita la
+ macro di preprocessore \macro{SOCK\_DEBUGGING} nel file
+ \file{include/net/sock.h} dei sorgenti del kernel, questo è sempre vero
+ nei kernel delle serie superiori alla 2.3, per i kernel delle serie
+ precedenti invece è necessario aggiungere a mano detta definizione; è
+ inoltre possibile abilitare anche il tracciamento degli stati del TCP
+ definendo la macro \macro{STATE\_TRACE} in \file{include/net/tcp.h}.}
+ quando viene abilitata una serie di messaggi con le informazioni di debug
+ vengono inviati direttamente al sistema del kernel log.\footnote{si tenga
+ presente che il comportamento è diverso da quanto avviene con BSD, dove
+ l'opzione opera solo sui socket TCP, causando la scrittura di tutti i
+ pacchetti inviati sulla rete su un buffer circolare che viene letto da un
+ apposito programma, \cmd{trpt}.}
\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
\func{bind} su indirizzi locali che siano già in uso da altri socket;
valori del campo \textit{type of service} (noto come TOS, vedi
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}.
+ privilegi di amministratore con la \itindex{capabilities} 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
approfondimento sul significato delle opzioni generiche più importanti.
-\index{\texttt{SO\_KEEPALIVE} (costante)|(}
+\index{costante!{SO\_KEEPALIVE}@{{\tt {SO\_KEEPALIVE}}}|(}
\subsubsection{L'opzione \const{SO\_KEEPALIVE}}
La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
necessariamente ad una reale conclusione della connessione, il problema
potrebbe anche essere dovuto ad un problema di routing che perduri per un
tempo maggiore di quello impiegato nei vari tentativi di ritrasmissione del
-\textit{keep-alive} (anche se questa non è una una condizione molto
-probabile).
+\textit{keep-alive} (anche se questa non è una condizione molto probabile).
Come esempio dell'utilizzo di questa opzione introduciamo all'interno del
nostro server per il servizio \textit{echo} la nuova opzione \texttt{-k} che
connessione verrà pertanto eseguita o meno la sezione (\texttt{\small 14--17})
che esegue l'impostazione di \const{SO\_KEEPALIVE} sul socket connesso,
attivando il relativo comportamento.
-\index{\texttt{SO\_KEEPALIVE} (costante)|)}
+\index{costante!{SO\_KEEPALIVE}@{{\tt {SO\_KEEPALIVE}}}|)}
-\index{\texttt{SO\_REUSEADDR} (costante)|(}
+
+\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|(}
\subsubsection{L'opzione \const{SO\_REUSEADDR}}
La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di
primo programma a consentirlo, avendo usato fin dall'inizio
\const{SO\_REUSEADDR}.}
-\index{\texttt{SO\_REUSEADDR} (costante)|)}
-
+\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|)}
-\index{\texttt{SO\_LINGER} (costante)|(}
+\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|(}
\subsubsection{L'opzione \const{SO\_LINGER}}
La terza opzione da approfondire è \const{SO\_LINGER}; essa, come il nome
completamento della trasmissione dei dati sul buffer.} pari al valore
specificato in \var{l\_linger}.
-
-
-\index{\texttt{SO\_LINGER} (costante)|)}
+\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|)}
\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 usante nella determinazione della \textit{Maximum
- Tranfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) per il socket.
+ 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}] Permette di leggere il valore della \textit{Maximum
Tranfer Unit} di percorso del socket. L'opzione richiede per
disponibili in locale l'uso di questa opzione permette di disabilitare
questo tipo di traffico.
-\item[\const{IP\_ADD\_MEMBERSHIP}]
+\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).
+
+ Per compatibilità è possibile utilizzare anche un argomento di tipo
+ \struct{ip\_mreq}, una precedente versione di \struct{ip\_mreqn}, che
+ differisce da essa soltanto per l'assenza del campo \var{imr\_ifindex}.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \includestruct{listati/ip_mreqn.h}
+ \end{minipage}
+ \caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei socket
+ per le operazioni concernenti l'appartenenza ai gruppi di multicast.}
+ \label{fig:ip_mreqn_struct}
+\end{figure}
+
+
+
\item[\const{IP\_DROP\_MEMBERSHIP}]
manuale.\footnote{quella accessibile con \texttt{man 7 ip}.} I principali
sono:
\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
-\item[\texttt{ip_no_pmtu_disc}] imposta la discliplina di ricerca della
+\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}).
\end{basedescript}