Altre informazioni sulle {{{ioctl}}} di {{{netdevice}}}.
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 5 Sep 2006 16:02:11 +0000 (16:02 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 5 Sep 2006 16:02:11 +0000 (16:02 +0000)
sockctrl.tex
socket.tex

index 5730bda7bba3ac62a862171d9dcecdbc30b2b00a..2946d86525124743424d14ad5b825d8deb6c01ee 100644 (file)
@@ -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}] .
index 64674af6c4326fba02e91bf99159d9e5e1085a72..820ae96df423ad23e5780d2c08480ca87efef8aa 100644 (file)
@@ -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