|
|||||||
|
|
PACKETSection: Manual del Porgramador de Linux (7)Updated: 29 abril 1999 Index Return to Main Contents NOMBREpacket, PF_PACKET - Interfaz de paquetes a nivel de dispositivo.SINOPSIS#include <sys/socket.h> DESCRIPCIÓNLos conectores de paquetes (packet sockets) se usan para recibir o enviarpaquetes directos (raw) en el nivel del manejador de dispositivo (Nivel 2 de OSI). Permiten al usuario implementar módulos de protocolo en el espacio de usuario por encima de la capa física.
socket_type
es o bien
SOCK_RAW
para paquetes directos incluyendo la cabecera del nivel de enlace o bien
SOCK_DGRAM
para paquetes preparados con la cabecera del nivel de enlace eliminada. La
información de la cabecera del nivel de enlace está disponible en un formato
común en una estructura
sockaddr_ll.
protocol
es el protocolo IEEE 802.3 con los bytes en orden de red. Vea el fichero
cabecera
<linux/if_ether.h>
para una lista de los protocolos permitidos. Cuando se asigna a
protocol
el valor
htons(ETH_P_ALL),
se reciben todos los protocolos.
Todos los paquetes de entrada con el tipo de protocolo indicado se pasarán
al conector de paquetes antes de que sean pasados a los protocolos
implementados dentro del núcleo.
Los paquetes SOCK_RAW se pasan a y desde el manejador de dispositivo sin ningún cambio en los datos del paquete. Cuando se recibe un paquete, la dirección todavía se analiza y se pasa en una estructura de dirección sockaddr_ll estándar. Cuando se transmite un paquete, el buffer proporcionado por el usuario debería contener la cabecera de la capa física. A continuación, ese paquete se encola sin modificar en la tarjeta de red de la interfaz definida por la dirección de destino. Algunos manejadores (`drivers') de dispositivo siempre añaden otras cabeceras. SOCK_RAW es similar pero no compatible con el obsoleto SOCK_PACKET de la versión 2.0 de Linux. SOCK_DGRAM opera en un nivel ligeramente superior. Se elimina la cabecera física antes de que el paquete se pase al usuario. Los paquetes enviados a través de un conector de paquetes SOCK_DGRAM obtienen una cabecera adecuada de la capa física según la información de la dirección de destino 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 sólo los paquetes de una interfaz específica, use bind(2) especificando una dirección en una estructura struct sockaddr_ll para enlazar el conector de paquetes a una interfaz. Sólo se usan para propósitos de enlace los campos de dirección sll_protocol y sll_ifindex. La operación connect(2) no está soportada en conectores de paquetes. TIPOS DE DIRECCIONESsockaddr_ll es una dirección de la capa física independiente del dispositivo.
sll_protocol es el tipo del protocolo ethernet estándar dado en orden de red definido en el fichero cabecera linux/if_ether.h. sll_ifindex es el índice de la interfaz (vea netdevice(2)). Un 0 concuerda con cualquier interfaz (sólo legal para enlazar). sll_hatype es un tipo ARP de los definidos en el fichero cabecera linux/if_arp.h. sll_pkttype contiene el tipo del paquete. Los tipos válidos son PACKET_HOST para un paquete aplicado al anfitrión (host) local, PACKET_BROADCAST para un paquete de difusión de la capa física, PACKET_MULTICAST para un paquete enviado a una dirección multidestino de la capa física, PACKET_OTHERHOST para un paquete destinado a otros anfitriones que ha sido capturado por el manejador del dispositivo en modo promiscuo y PACKET_OUTGOING para un paquete originado desde el anfitrión local que es devuelto de regreso a un conector de paquetes. Estos tipos sólo tienen sentido para recibir. sll_addr y sll_halen contienen la dirección de la capa física (por ejemplo, IEEE 802.3) y su longitud. La interpretación exacta depende del dispositivo. OPCIONES DE LOS CONECTORESLos conectores de paquetes sólo se pueden usar para configurar el envío multidestino de la capa física y el modo promíscuo. Esto funciona llamando a setsockopt(2) con SOL_PACKET, para un conector de paquetes, y una de las opciones PACKET_ADD_MEMBERSHIP para añadir un enlace o PACKET_DROP_MEMBERSHIP para eliminarlo. Ambas esperan una estructura packet_mreq como argumento:
mr_ifindex contien el índice de la interfaz cuyo estado debe cambiarse. El parámetro mr_type indica la acción a realizar. PACKET_MR_PROMISC habilita la recepción de todos los paquetes sobre un medio compartido (conocido normalmente como ``modo promiscuo''), PACKET_MR_MULTICAST enlaza el conector al grupo multidestino de la capa física indicado en mr_address y mr_alen, y PACKET_MR_ALLMULTI configura el conector para recibir todos los paquetes multidestino que lleguen a la interfaz. Además, se pueden usar las ioctls tradicionales, SIOCSIFFLAGS, SIOCADDMULTI y SIOCDELMULTI, para el mismo propósito.
IOCTLSSIOCGSTAMP se puede usar para recibir la marca de tiempo del último paquete recibido. El argumento es una esctructura struct timeval.Además, todas las ioctls estándares definidas en netdevice(7) y socket(7) son válidas en los conectores de paquetes. MANEJO DE ERRORESLos 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.COMPATIBILIDADEn la versión 2.0 de Linux, la única forma de obtener un conector de paquetes era llamando a socket(PF_INET, SOCK_PACKET, protocol). Esto todavía está soportado pero se desaprueba fuertemente. La principal diferencia entre los dos métodos es que SOCK_PACKET, para especificar una interfaz, usa la antigua struct sockaddr_pkt que no proporciona independencia de la capa física.
spkt_family contiene el tipo del dispositivo, spkt_protocol es el tipo del protocolo IEEE 802.3 de los definidos en <sys/if_ether.h> y spkt_device es el nombre del dispositivo dado como una cadena terminada en un nulo, por ejemplo, eth0. Esta estructura está obsoleta y no debería usarse en código nuevo. NOTASSe sugiere que los programas transportables usen PF_PACKET a través de pcap(3), aunque esto sólo cubre un subconjunto de las características de PF_PACKET.Los conectores de paquetes SOCK_DGRAM no intentan crear o analizar la cabecera LLC IEEE 802.2 para una trama IEEE 802.3. Cuando se especifica ETH_P_802_3 como protocolo para enviar, el núcleo crea la trama 802.3 y rellena el campo de longitud. El usuario tiene que proporcionar la cabecera LLC para obtener un paquete totalmente conforme. Los paquetes 802.3 de entrada no son multiplexados en los campos DSAP/SSAP del protocolo. En su lugar, se entregan al usuario como protocolo ETH_P_802_2 con la cabecera LLC añadida. Por tanto, es imposible enlazar con ETH_P_802_3. Enlace en su lugar con ETH_P_802_2 y haga usted mismo la multiplexación del protocolo. Para enviar por omisión se utiliza la encapsulación estándar Ethernet DIX con el dato del protocolo lleno. Los conectores de paquetes no están sujetos a las cadenas de entrada ni de salida del cortafuegos. ERRORES
VERSIONESPF_PACKET es una nueva característica de la versión 2.2 de Linux. Las primeras versiones de Linux sólo soportaban SOCK_PACKET.FALLOSglibc 2.1 no posee una macro "define" para SOL_PACKET. La solución sugerida es usar
El tratamiento del IEEE 802.2/803.3 LLC se podría considerar un fallo. No se han documentado los filtros de los conectores. CREDITOSEsta página de manual fue escrita por Andi Kleen con la ayuda de Matthew Wilcox.Alexey Kuznetsov implementó la característica PF_PACKET de la versión 2.2 de Linux basándose en el código de Alan Cox y otros. VÉASE TAMBIÉNip(7), socket(7), socket(2), raw(7), pcap(3).RFC 894 for the standard IP Ethernet encapsulation. RFC 1700 for the IEEE 802.3 IP encapsulation. El fichero cabecera linux/if_ether.h para los protocolos de la capa física.
Index
| ||||||
|
|
|
Home :: Copyright :: Privacy :: Credits :: Get a free Linuxinfor Email Account Document on this page is part of "Linuxinfor Man Pages in HTML Format: man7". See Index Page for more info about Authorship and Copyright. 1999-2008 Linuxinfor.com. No rights reserved. |