From 1becf93a9192baa0ef3a428a43014bc987df4459 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 21 Apr 2017 20:57:26 +0000 Subject: [PATCH] Modifiche rimaste indietro. --- sockctrl.tex | 283 +++++++++++++++++++++++++++------------------------ 1 file changed, 150 insertions(+), 133 deletions(-) diff --git a/sockctrl.tex b/sockctrl.tex index 2e6f324..d49586f 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2216,6 +2216,8 @@ tab.~\ref{tab:sock_opt_socklevel}. Abilita la compatibilità con BSD.\\ \const{SO\_DEBUG} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Abilita il debugging sul socket.\\ + \const{SO\_DOMAIN} &$\bullet$& & &\texttt{int}& + Legge il tipo di socket.\\ \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Non invia attraverso un gateway.\\ \const{SO\_ERROR} &$\bullet$& & &\texttt{int}& @@ -2236,22 +2238,30 @@ tab.~\ref{tab:sock_opt_socklevel}. Imposta la priorità del socket.\\ \const{SO\_PROTOCOL} &$\bullet$& & &\texttt{int}& Ottiene il protocollo usato dal socket.\\ + \const{SO\_RCVBUF} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta dimensione del buffer di ricezione.\\ + \const{SO\_RCVBUFFORCE}&$\bullet$&$\bullet$& &\texttt{int}& + Forza dimensione del buffer di ricezione.\\ \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Basso livello sul buffer di ricezione.\\ - \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& - Basso livello sul buffer di trasmissione.\\ \const{SO\_RCVTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& Timeout in ricezione.\\ - \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& - Timeout in trasmissione.\\ \const{SO\_REUSEADDR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Consente il riutilizzo di un indirizzo locale.\\ - \const{SO\_TYPE} &$\bullet$& & &\texttt{int}& - Restituisce il tipo di socket.\\ + \const{SO\_REUSEPORT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Consente il riutilizzo di una porta.\\ \const{SO\_SNDBUF} &$\bullet$&$\bullet$& &\texttt{int}& Imposta dimensione del buffer di trasmissione.\\ - \const{SO\_RCVBUF} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta dimensione del buffer di ricezione.\\ + \const{SO\_SNDBUFFORCE}&$\bullet$&$\bullet$& &\texttt{int}& + Forza dimensione del buffer di trasmissione.\\ + \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& + Basso livello sul buffer di trasmissione.\\ + \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& + Timeout in trasmissione.\\ + \const{SO\_TIMESTAMP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita/disabilita la ricezione dei \textit{timestamp}.\\ + \const{SO\_TYPE} &$\bullet$& & &\texttt{int}& + Restituisce il tipo di socket.\\ \hline \end{tabular} \caption{Le opzioni disponibili al livello \const{SOL\_SOCKET}.} @@ -2262,10 +2272,16 @@ tab.~\ref{tab:sock_opt_socklevel}. % vedi http://lwn.net/Articles/625224/ % TODO aggiungere e documentare SO_INCOMING_CPU, introdotta con il kernel 3.19, % vedi https://lwn.net/Articles/626150/ +% TODO documentare SO_PEEK_OFF +% TODO documentare SO_RXQ_OVFL +% TODO documentare SO_BUSYPOLL + % TODO documentare SO_MARK, cercare esempi e verificare il tipo di valore passato -% TODO documentare SO_PEEK_OFF % TODO documentare SO_PROTOCOL +% TODO documentare SO_REUSEPORT +% TODO documentare SO_TIMESTAMP +% TODO documentare SO_SNDBUFFORCE/SO_RCVBUFFORCE La tabella elenca le costanti che identificano le singole opzioni da usare @@ -2286,6 +2302,76 @@ soltanto un elenco più dettagliato della breve descrizione di tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} +\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket + su cui opera è stato posto in modalità di ricezione di eventuali connessioni + con una chiamata a \func{listen}. L'opzione può essere usata soltanto con + \func{getsockopt} e utilizza per \param{optval} un intero in cui viene + restituito 1 se il socket è in ascolto e 0 altrimenti. + +\item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il + socket ad una particolare interfaccia, in modo che esso possa ricevere ed + inviare pacchetti solo su quella. L'opzione richiede per \param{optval} il + puntatore ad una stringa contenente il nome dell'interfaccia (ad esempio + \texttt{eth0}); utilizzando una stringa nulla o un valore nullo per + \param{optlen} si può rimuovere un precedente collegamento. + + Il nome della interfaccia deve essere specificato con una stringa terminata + da uno zero e di lunghezza massima pari a \constd{IFNAMSIZ}; l'opzione è + effettiva solo per alcuni tipi di socket, ed in particolare per quelli della + famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet + socket} (vedi sez.~\ref{sec:socket_raw}). + +\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast}; + quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i + pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere + pacchetti su tale indirizzo. Prende per \param{optval} un intero usato come + valore logico. L'opzione non ha effetti su un socket di tipo + \const{SOCK\_STREAM}. + +\item[\constd{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il + comportamento di BSD (in particolare ne riproduce i bug). Attualmente è una + opzione usata solo per il protocollo UDP e ne è prevista la rimozione in + futuro. L'opzione utilizza per \param{optval} un intero usato come valore + logico. + + Quando viene abilitata gli errori riportati da messaggi ICMP per un socket + UDP non vengono passati al programma in user space. Con le versioni 2.0.x + del kernel erano anche abilitate altre opzioni per i socket raw, che sono + state rimosse con il passaggio al 2.2; è consigliato correggere i programmi + piuttosto che usare questa funzione. + +\item[\constd{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 \macrod{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 + \macrod{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[\constd{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei + pacchetti del socket, saltando ogni processo relativo all'uso della tabella + di routing del kernel. Prende per \param{optval} un intero usato come valore + logico. + +\item[\constd{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, 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. + \item[\const{SO\_KEEPALIVE}] questa opzione abilita un meccanismo di verifica della persistenza di una connessione associata al socket (ed è pertanto effettiva solo sui socket che supportano le connessioni, ed è usata @@ -2293,6 +2379,15 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: usato come valore logico. Maggiori dettagli sul suo funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. +\item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene + chiuso un socket quando si utilizza un protocollo che supporta le + connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e + modifica il comportamento delle funzioni \func{close} e \func{shutdown}. + L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo + \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in + fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento + sono forniti in sez.~\ref{sec:sock_options_main}. + \item[\constd{SO\_OOBINLINE}] se questa opzione viene abilitata i dati \textit{out-of-band} vengono inviati direttamente nel flusso di dati del socket (e sono quindi letti con una normale \func{read}) invece che restare @@ -2302,6 +2397,30 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad esempio), ed utilizza per \param{optval} un intero usato come valore logico. +\item[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain + (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di + tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato + come valore logico. + +\item[\constd{SO\_PEERCRED}] questa opzione restituisce le credenziali del + processo remoto connesso al socket; l'opzione è disponibile solo per socket + unix-domain e può essere usata solo con \func{getsockopt}. Utilizza per + \param{optval} una apposita struttura \struct{ucred} (vedi + sez.~\ref{sec:unix_socket}). + +\item[\constd{SO\_PRIORITY}] questa opzione permette di impostare le priorità + per tutti i pacchetti che sono inviati sul socket, prende per \param{optval} + un valore intero. Con questa opzione il kernel usa il valore per ordinare le + priorità sulle code di rete,\footnote{questo richiede che sia abilitato il + sistema di \textit{Quality of Service} disponibile con le opzioni di + routing avanzato.} i pacchetti con priorità più alta vengono processati + 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_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[\constd{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il numero minimo di byte che devono essere presenti nel buffer di ricezione perché il kernel passi i dati all'utente, restituendoli ad una \func{read} o @@ -2311,16 +2430,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: essere cambiato; \func{getsockopt} leggerà questo valore mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. -\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il - numero minimo di byte che devono essere presenti nel buffer di trasmissione - perché il kernel li invii al protocollo successivo, consentendo ad una - \func{write} di ritornare o segnalando ad una \func{select} (vedi - sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura. - L'opzione utilizza per \param{optval} un intero che specifica il numero di - byte, come per la precedente \const{SO\_RCVLOWAT} con Linux questo valore è - sempre 1 e non può essere cambiato; \func{getsockopt} leggerà questo valore - mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. - \item[\constd{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo sulle operazioni di lettura da un socket, e prende per \param{optval} una struttura di tipo \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct}) @@ -2347,70 +2456,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: consente però di impostare il timeout per l'uso di \func{connect}, per avere il quale si può ricorrere a questa opzione. -% TODO verificare il timeout con un programma di test - -\item[\constd{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo - sulle operazioni di scrittura su un socket, ed usa gli stessi valori di - \const{SO\_RCVTIMEO}. In questo caso però si avrà un errore di - \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura - \func{write}, \func{writev}, \func{send}, \func{sendto} e \func{sendmsg} - qualora queste restino bloccate per un tempo maggiore di quello specificato. - -\item[\constd{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il - comportamento di BSD (in particolare ne riproduce i bug). Attualmente è una - opzione usata solo per il protocollo UDP e ne è prevista la rimozione in - futuro. L'opzione utilizza per \param{optval} un intero usato come valore - logico. - - Quando viene abilitata gli errori riportati da messaggi ICMP per un socket - UDP non vengono passati al programma in user space. Con le versioni 2.0.x - del kernel erano anche abilitate altre opzioni per i socket raw, che sono - state rimosse con il passaggio al 2.2; è consigliato correggere i programmi - piuttosto che usare questa funzione. - -\item[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain - (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di - tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato - come valore logico. - -\item[\constd{SO\_PEERCRED}] questa opzione restituisce le credenziali del - processo remoto connesso al socket; l'opzione è disponibile solo per socket - unix-domain e può essere usata solo con \func{getsockopt}. Utilizza per - \param{optval} una apposita struttura \struct{ucred} (vedi - sez.~\ref{sec:unix_socket}). - -\item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il - socket ad una particolare interfaccia, in modo che esso possa ricevere ed - inviare pacchetti solo su quella. L'opzione richiede per \param{optval} il - puntatore ad una stringa contenente il nome dell'interfaccia (ad esempio - \texttt{eth0}); utilizzando una stringa nulla o un valore nullo per - \param{optlen} si può rimuovere un precedente collegamento. - - Il nome della interfaccia deve essere specificato con una stringa terminata - da uno zero e di lunghezza massima pari a \constd{IFNAMSIZ}; l'opzione è - effettiva solo per alcuni tipi di socket, ed in particolare per quelli della - famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet - socket} (vedi sez.~\ref{sec:socket_raw}). - -\item[\constd{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 \macrod{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 - \macrod{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; l'opzione utilizza per \param{optval} un intero usato come valore logico. @@ -2421,28 +2466,24 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: socket. Maggiori dettagli sul suo funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. -\item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket - su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per - \param{optval} un intero in cui verrà restituito il valore numerico che lo - identifica (ad esempio \const{SOCK\_STREAM}). - -\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket - su cui opera è stato posto in modalità di ricezione di eventuali connessioni - con una chiamata a \func{listen}. L'opzione può essere usata soltanto con - \func{getsockopt} e utilizza per \param{optval} un intero in cui viene - restituito 1 se il socket è in ascolto e 0 altrimenti. +\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il + numero minimo di byte che devono essere presenti nel buffer di trasmissione + perché il kernel li invii al protocollo successivo, consentendo ad una + \func{write} di ritornare o segnalando ad una \func{select} (vedi + sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura. + L'opzione utilizza per \param{optval} un intero che specifica il numero di + byte, come per la precedente \const{SO\_RCVLOWAT} con Linux questo valore è + sempre 1 e non può essere cambiato; \func{getsockopt} leggerà questo valore + mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. -\item[\constd{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei - pacchetti del socket, saltando ogni processo relativo all'uso della tabella - di routing del kernel. Prende per \param{optval} un intero usato come valore - logico. +% TODO verificare il timeout con un programma di test -\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast}; - quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i - pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere - pacchetti su tale indirizzo. Prende per \param{optval} un intero usato come - valore logico. L'opzione non ha effetti su un socket di tipo - \const{SOCK\_STREAM}. +\item[\constd{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo + sulle operazioni di scrittura su un socket, ed usa gli stessi valori di + \const{SO\_RCVTIMEO}. In questo caso però si avrà un errore di + \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura + \func{write}, \func{writev}, \func{send}, \func{sendto} e \func{sendmsg} + qualora queste restino bloccate per un tempo maggiore di quello specificato. \item[\constd{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di trasmissione del socket. Prende per \param{optval} un intero indicante il @@ -2475,36 +2516,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: essere effettive, devono essere impostate prima della chiamata alle funzioni \func{listen} o \func{connect}. -\item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene - chiuso un socket quando si utilizza un protocollo che supporta le - connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e - modifica il comportamento delle funzioni \func{close} e \func{shutdown}. - L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo - \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in - fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento - sono forniti in sez.~\ref{sec:sock_options_main}. - -\item[\constd{SO\_PRIORITY}] questa opzione permette di impostare le priorità - per tutti i pacchetti che sono inviati sul socket, prende per \param{optval} - un valore intero. Con questa opzione il kernel usa il valore per ordinare le - priorità sulle code di rete,\footnote{questo richiede che sia abilitato il - sistema di \textit{Quality of Service} disponibile con le opzioni di - routing avanzato.} i pacchetti con priorità più alta vengono processati - 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_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[\constd{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, 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. - \item[\constd{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un socket un filtro di pacchetti che consente di selezionare quali pacchetti, fra tutti quelli ricevuti, verranno letti. Viene usato principalmente con i @@ -2512,6 +2523,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: implementare programmi di cattura dei pacchetti, torneremo su questo in sez.~\ref{sec:packet_socket}. +\item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket + su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per + \param{optval} un intero in cui verrà restituito il valore numerico che lo + identifica (ad esempio \const{SOCK\_STREAM}). + + \item[\constd{SO\_DETACH\_FILTER}] consente di distaccare un filtro precedentemente aggiunto ad un socket. -- 2.30.2