X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=sockctrl.tex;h=ae340ef9484a64a5239109c8c813af2cdc09ee12;hb=3925d42aafd1c1ac743c2f0a748981c26335915d;hp=10dad74342cb02bb5d2ea8d631129b7de5189f2a;hpb=28599073a393d82523d36111d1137edbb96cde11;p=gapil.git diff --git a/sockctrl.tex b/sockctrl.tex index 10dad74..ae340ef 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2274,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} @@ -2684,42 +2688,42 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file. \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} @@ -2996,60 +3000,64 @@ 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 protocolli sono entrambi trasportati -su IP, 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, ma - quelle per TCP e UDP sono le stesse anche quando si usa IPv6.} + 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 è -riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_tcp}. Le -costanti indicanti le opzioni del protocollo TCP e tutte le altre costanti ad -esse collegate sono definite in \file{netinet/tcp.h}, ed accessibili -includendo detto file.\footnote{in realtà questo è il file usato dalle - liberie; 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}.} +\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|l|} + \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$&&\texttt{}& %??? - .\\ - \const{TCP\_MAXSEG} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_KEEPINTVL} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_KEEPCNT} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_SYNCNT} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_LINGER2} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_INFO} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_QUICKACK} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_CONGESTION} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ + \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 @@ -3057,16 +3065,37 @@ includendo detto file.\footnote{in realt \label{tab:sock_opt_tcplevel} \end{table} -Le descrizioni di tab.~\ref{tab:sock_opt_tcplevel} sono estremamente -sintetiche, una maggiore quantità di dettagli su queste opzioni è fornita nel -seguente elenco: +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}] - -\item[\const{TCP\_MAXSEG}] - -\item[\const{TCP\_CORK}] +\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}] @@ -3090,14 +3119,14 @@ seguente elenco: Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero -ridootto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo -caso per poterle utilizzare occorrerà impostare l'opportuni valore per +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/tcp.h}, ed accessibili includendo detto +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 nel file \texttt{linux/udp.h}, dal quale si - sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.} + 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 @@ -3108,10 +3137,10 @@ file.\footnote{come per TCP, la definizione delle opzioni effettivamente \textbf{Descrizione}\\ \hline \hline - \const{UDP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ + \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 @@ -3210,21 +3239,163 @@ 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}: @@ -3256,16 +3427,17 @@ essere sempre il puntatore ad una variabile di tipo \ctyp{int}: \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} @@ -3553,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