1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
|
.\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
.\" Permission is granted to distribute possibly modified copies
.\" of this page provided the header is included verbatim,
.\" and in case of nontrivial modification author and date
.\" of the modification is added to the header.
.\" $Id: packet.7,v 1.7 1999/06/12 10:11:38 freitag Exp $
.\"
.\" Translated on Sun Jul 4 1999 by Juan Piernas <piernas@ditec.um.es>
.\"
.TH PACKET 7 "29 abril 1999" "Pgina man de Linux" "Manual del Porgramador de Linux"
.SH NONBRE
packet, PF_PACKET \- Interfaz de paquetes a nivel de dispositivo.
.\" si, esto es horrible.
.SH SINOPSIS
.nf
.B #include <sys/socket.h>
.br
.B #include <features.h> /* para el nmero de versin de glibc */
.br
.B #if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
.br
.B #include <netpacket/packet.h>
.br
.B #include <net/ethernet.h> /* los protocolos de nivel 2 */
.br
.B #else
.br
.B #include <asm/types.h>
.br
.B #include <linux/if_packet.h>
.br
.B #include <linux/if_ether.h> /* los protocolos de nivel 2 */
.br
.B #endif
.sp
.PP
.BI "packet_socket = socket(PF_PACKET, int " socket_type ", int "protocol );
.fi
.SH DESCRIPCIN
Los conectores de paquetes (packet sockets) se usan para recibir o enviar
paquetes directos (raw) en el nivel del manejador de dispositivo (Nivel 2 de
OSI). Permiten al usuario implementar mdulos de protocolo en el espacio de
usuario por encima de la capa fsica.
.I socket_type
es o bien
.B SOCK_RAW
para paquetes directos incluyendo la cabecera del nivel de enlace o bien
.B SOCK_DGRAM
para paquetes preparados con la cabecer del nivel de enlace eliminada. La
informacin de la cabecera del nivel de enlace est disponible en un formato
comn en una estructura
.BR sockaddr_ll .
.I protocol
es el protocolo IEEE 802.3 con los bytes en orden de red. Vea el fichero
cabecera
.B <linux/if_ether.h>
para una lista de los protocolos permitidos. Cuando se asigna a
.I protocol
el valor
.BR htons(ETH_P_ALL) ,
se reciben todos los protocolos.
Todos los paquetes de entrada con el tipo de protocolo indicado se pasarn
al conector de paquetes antes de que sean pasados a los protocolos
implementados dentro del ncleo.
Slo los procesos con uid efectivo 0 o la capacidad
.B CAP_NET_RAW
pueden abrir conectores de paquetes.
Los paquetes
.B SOCK_RAW
se pasan a y desde el manejador de dispositivo sin ningn cambio en los
datos del paquete. Cuando se recibe un paquete, la direccin todava se
analiza y se pasa en una estructura de direccin
.B sockaddr_ll
estndar. Cuando se transmite un paquete, el buffer proporcionado por el
usuario debe contener la cabecera de la capa fsica. A continuacin, ese
paquete se encola sin modificar en la tarjeta de red de la interfaz
definida por la direccin de destino.
.B SOCK_RAW
es similar pero no compatible con el obsoleto
.B SOCK_PACKET
de la versin 2.0 de Linux.
.B SOCK_DGRAM
opera en un nivel ligeramente superior. Se elimina la cabecera fsica antes
de que el paquete se pase al usuario. Los paquetes enviados a travs de un
conector de paquetes
.B SOCK_DGRAM
obtienen una cabecera adecuada de la capa fsica segn la informacin de la
direccin de destino
.BR sockaddr_ll ,
antes de ser encolados.
Por defecto, todos los paquetes del tipo de protocolo especificado se pasan
a un conector de paquetes. Para obtener slo los paquetes de una interfaz
especfica, use
.BR bind (2)
especificando una direccin en una estructura
.B struct sockaddr_ll
para enlazar el conector de paquetes a una interfaz.
.SH TIPOS DE DIRECCIONES
sockaddr_ll es una direccin de la capa fsica independiente del dispositivo.
.RS
.nf
.ta 4n 20n 35n
struct sockaddr_ll
{
unsigned short sll_family; /* Siempre es AF_PACKET */
unsigned short sll_protocol; /* Protocolo de la capa fsica */
int sll_ifindex; /* Nmero de la interfaz */
unsigned short sll_hatype; /* Tipo de cabecera */
unsigned char sll_pkttype; /* Tipo de paquete */
unsigned char sll_halen; /* Longitud de la direccin */
unsigned char sll_addr[8]; /* Direccin de la capa fsica */
};
.ta
.fi
.RE
.B sll_protocol
es el tipo del protocolo ethernet estndar dado en orden de red definido en
el fichero cabecera
.BR linux/if_ether.h .
.B sll_hatype
es un tipo ARP de los definidos en el fichero cabecera
.BR linux/if_arp.h .
.B sll_pkttype
contiene el tipo del paquete. Los tipos vlidos son
.B PACKET_HOST
para un paquete aplicado al anfitrin (host) local,
.B PACKET_BROADCAST
para un paquete de difusin de la capa fsica,
.B PACKET_MULTICAST
para un paquete enviado a una direccin multidestino de la capa fsica,
.B PACKET_OTHERHOST
para un paquete destinado a otros anfitriones que ha sido capturado por el
manejador del dispositivo en modo promiscuo y
.B PACKET_OUTGOING
para un paquete originado desde el anfitrin local que es devuelto de
regreso a un conector de paquetes.
.B sll_addr
y
.B sll_halen
contienen la direccin de la capa fsica (por ejemplo, IEEE 802.3) y su
longitud. La interpretacin exacta depende del dispositivo.
.SH OPCIONES DE LOS CONECTORES
Los conectores de paquetes slo se pueden usar para configurar el envo
multidestino de la capa fsica y el modo promscuo. Esto funciona llamando a
.BR setsockopt (2)
con SOL_PACKET, para un conector de paquetes, y una de las opciones
.B PACKET_ADD_MEMBERSHIP
para aadir un enlace o
.B PACKET_DROP_MEMBERSHIP
para eliminarlo.
Ambas esperan una estructura
.B packet_mreq
como argumento:
.RS
.nf
.ta 4n 20n 35n
struct packet_mreq
{
int mr_ifindex; /* ndice de la interfaz */
unsigned short mr_type; /* accin */
unsigned short mr_alen; /* longitud de la direccin */
unsigned char mr_address[8]; /* direccin de la capa fsica */
};
.ta
.fi
.RE
.B mr_ifindex
contien el ndice de la interfaz cuyo estado debe cambiarse.
El parmetro
.B mr_type
indica la accin a realizar.
.B PACKET_MR_PROMISC
habilita la recepcin de todos los paquetes sobre un medio compartido
(conocido normalmente como ``modo promiscuo''),
.B PACKET_MR_MULTICAST
enlaza el conector al grupo multidestino de la capa fsica indicado en
.B mr_address
y
.BR mr_alen ,
y
.B PACKET_MR_ALLMULTI
configura el conector para recibir todos los paquetes multidestino que
lleguen a la interfaz.
Adems, se pueden usar las ioctls tradicionales,
.BR SIOCSIFFLAGS ,
.B SIOCADDMULTI
y
.BR SIOCDELMULTI ,
para el mismo propsito.
.SH IOCTLS
.B SIOCGSTAMP
se puede usar para recibir la marca de tiempo del ltimo paquete recibido.
El argumento es una esctructura
.B struct timeval.
Adems, todas las ioctls estndares definidas en
.BR netdevice (7)
y
.BR socket (7)
son vlidas en los conectores de paquetes.
.SH MANEJO DE ERRORES
Los conectores de paquetes no manejan otros errores que los ocurridos al
pasar el paquete al manejador del dispositivo. No poseen el concepto de error
pendiente.
.SH COMPATIBILIDAD
En la versin 2.0 de Linux, la nica forma de obtener un conector de
paquetes era llamando a
.BI "socket(PF_INET, SOCK_PACKET, " protocol )\fR.
Esto todava est soportado pero se desaprueba fuertemente.
La principal diferencia entre los dos mtodos es que
.BR SOCK_PACKET ,
para especificar una interfaz,
usa la antigua
.B struct sockaddr_pkt
que no proporciona independencia de la capa fsica.
.RS
.nf
.ta 4n 20n 35n
struct sockaddr_pkt
{
unsigned short spkt_family;
unsigned char spkt_device[14];
unsigned short spkt_protocol;
};
.ta
.fi
.RE
.B spkt_family
contiene el tipo del dispositivo,
.B spkt_protocol
es el tipo del protocolo IEEE 802.3 de los definidos en
.B <sys/if_ether.h>
y
.B spkt_device
es el nombre del dispositivo dado como una cadena terminada en un nulo, por
ejemplo, eth0.
Esta estructura est obsoleta y no debera usarse en cdigo nuevo.
.SH NOTAS
Se sugiere que los programas transportables usen
.B PF_PACKET
a travs de
.BR pcap (3),
aunque esto slo cubre un subconjunto de las caractersticas de
.BR PF_PACKET .
.SH ERRORES
.TP
.B ENETDOWN
La interfaz no est activa.
.TP
.B ENOTCONN
No se ha pasado una direccin de interfaz.
.TP
.B ENODEV
Nombre de dispositivo o ndice de interfaz, especificados en la direccin de
interfaz, desconocidos.
.TP
.B EMSGSIZE
El paquete es ms grande que la MTU de la interfaz.
.TP
.B ENOBUFS
No hay suficiente memoria para colocar el paquete.
.TP
.B EFAULT
El usuario ha pasado una direccin de memoria invlida.
.TP
.B EINVAL
Argumento invlido.
.TP
.B ENXIO
La direccin de interfaz contiene un ndice de interfaz ilegal.
.TP
.B EPERM
El usuario no tiene privilegios suficientes para llevar a cabo esta
operacin.
.TP
.B EADDRNOTAVAIL
Se ha pasado una direccin desconocida de grupo multidestino.
.TP
.B ENOENT
No se ha recibido ningn paquete.
.SH VERSIONES
.B PF_PACKET
es una nueva caracterstica de la versin 2.2 de Linux. Las primeras
versiones de Linux slo soportaban
.B SOCK_PACKET.
.SH FALLOS
glibc 2.1 no posee una macro "define" para
.B SOL_PACKET.
La solucin sugerida es usar
.RS
.nf
#ifndef SOL_PACKET
#define SOL_PACKET 263
#endif
.fi
.RE
Esto se soluciona en versiones posteriores de glibc. Este problema tampoco
se produce en sistemas libc5.
No se han documentado los filtros de los conectores.
.SH CREDITOS
Esta pgina de manual fue escrita por Andi Kleen con la ayuda de Matthew
Wilcox.
Alexey Kuznetsov implement la caracterstica PF_PACKET de la versin 2.2 de
Linux basndose en el cdigo de Alan Cox y otros.
.SH VASE TAMBIN
.BR ip "(7), " socket "(7), " socket "(2), " raw "(7), " pcap "(3)"
El fichero cabecera
.BR linux/if_ether.h
para los protocolos de la capa fsica.
|