From: Simone Piccardi Date: Tue, 5 Sep 2006 16:02:11 +0000 (+0000) Subject: Altre informazioni sulle {{{ioctl}}} di {{{netdevice}}}. X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=089db6406b8f3c725a5830457fd591f9c86eb986;p=gapil.git Altre informazioni sulle {{{ioctl}}} di {{{netdevice}}}. --- diff --git a/sockctrl.tex b/sockctrl.tex index 5730bda..2946d86 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -3227,21 +3227,103 @@ di impostare e rilevare le funzionalit \end{minipage} \caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le operazioni di controllo sui dispositivi di rete.} - \label{fig:iface_ifreq_struct} + \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:iface_ifreq_struct}. La struttura utililzza il -primo campo, \var{ifr\_name} per mantenere il nome dell'interfaccia su cui si -vuole operare (ad esempio \texttt{eth0}, \texttt{ppp0}, ecc.), restituisce i -valori nel secondo campo, che è definito appunto come una \ctyp{union}. Le -costanti che identificano le operazioni disponibili sono le seguenti: -\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SIOCGIFNAME}] . -\item[\const{SIOCGIFINDEX}] . -\item[\const{SIOCGIFFLAGS}] . -\item[\const{SIOCSIFFLAGS}] . +è 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}] . diff --git a/socket.tex b/socket.tex index 64674af..820ae96 100644 --- a/socket.tex +++ b/socket.tex @@ -593,7 +593,7 @@ Il campo \var{sat\_family} deve essere sempre \const{AF\_APPLETALK}, mentre il campo \var{sat\_port} specifica la porta che identifica i vari servizi. Valori inferiori a 129 sono usati per le \textsl{porte riservate}, e possono essere usati solo da processi con i privilegi di amministratore o con la -\itindex{capabilities}\textit{capability} \const{CAP\_NET\_BIND\_SERVICE}. +\itindex{capabilities} \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}. L'indirizzo remoto è specificato nella struttura \var{sat\_addr}, e deve essere in \textit{network order} (vedi sez.~\ref{sec:sock_endianess}); esso è composto da un parte di rete data dal campo \var{s\_net}, che può assumere il @@ -612,8 +612,11 @@ un'interfaccia specifica di Linux per inviare e ricevere pacchetti direttamente su un'interfaccia di rete, senza passare per le funzioni di gestione dei protocolli di livello superiore. In questo modo è possibile implementare dei protocolli in user space, agendo direttamente sul livello -fisico. In genere comunque si preferisce usare la libreria \file{pcap}, che -assicura la portabilità su altre piattaforme, anche se con funzionalità +fisico. In genere comunque si preferisce usare la libreria +\file{pcap},\footnote{la libreria è mantenuta insieme al comando + \cmd{tcpdump}, informazioni e documentazione si possono trovare sul sito del + progetto \href{http://www.tcpdump.org/}{\texttt{http://www.tcpdump.org/}}.} +che assicura la portabilità su altre piattaforme, anche se con funzionalità ridotte. Questi socket possono essere di tipo \const{SOCK\_RAW} o \const{SOCK\_DGRAM}. @@ -701,9 +704,9 @@ macchina ricevente, \const{PACKET\_BROADCAST} per un pacchetto di \itindex{broadcast} \textit{broadcast}, \const{PACKET\_MULTICAST} per un pacchetto inviato ad un indirizzo fisico di \itindex{multicast} \textit{multicast}, \const{PACKET\_OTHERHOST} per un pacchetto inviato ad -un'altra stazione (e ricevuto su un'interfaccia in modo promiscuo), -\const{PACKET\_OUTGOING} per un pacchetto originato dalla propria macchina che -torna indietro sul socket. +un'altra stazione (e ricevuto su un'interfaccia in \index{modo~promiscuo} modo +promiscuo), \const{PACKET\_OUTGOING} per un pacchetto originato dalla propria +macchina che torna indietro sul socket. Si tenga presente infine che in fase di ricezione, anche se si richiede il