Home | History | Annotate | Download | only in linux
      1 #ifndef __LINUX_IF_PACKET_H
      2 #define __LINUX_IF_PACKET_H
      3 
      4 struct sockaddr_pkt
      5 {
      6 	unsigned short spkt_family;
      7 	unsigned char spkt_device[14];
      8 	unsigned short spkt_protocol;
      9 };
     10 
     11 struct sockaddr_ll
     12 {
     13 	unsigned short	sll_family;
     14 	unsigned short	sll_protocol;
     15 	int		sll_ifindex;
     16 	unsigned short	sll_hatype;
     17 	unsigned char	sll_pkttype;
     18 	unsigned char	sll_halen;
     19 	unsigned char	sll_addr[8];
     20 };
     21 
     22 /* Packet types */
     23 
     24 #define PACKET_HOST		0		/* To us		*/
     25 #define PACKET_BROADCAST	1		/* To all		*/
     26 #define PACKET_MULTICAST	2		/* To group		*/
     27 #define PACKET_OTHERHOST	3		/* To someone else 	*/
     28 #define PACKET_OUTGOING		4		/* Outgoing of any type */
     29 /* These ones are invisible by user level */
     30 #define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */
     31 #define PACKET_FASTROUTE	6		/* Fastrouted frame	*/
     32 
     33 /* Packet socket options */
     34 
     35 #define PACKET_ADD_MEMBERSHIP		1
     36 #define PACKET_DROP_MEMBERSHIP		2
     37 #define PACKET_RECV_OUTPUT		3
     38 /* Value 4 is still used by obsolete turbo-packet. */
     39 #define PACKET_RX_RING			5
     40 #define PACKET_STATISTICS		6
     41 #define PACKET_COPY_THRESH		7
     42 
     43 struct tpacket_stats
     44 {
     45 	unsigned int	tp_packets;
     46 	unsigned int	tp_drops;
     47 };
     48 
     49 struct tpacket_hdr
     50 {
     51 	unsigned long	tp_status;
     52 #define TP_STATUS_KERNEL	0
     53 #define TP_STATUS_USER		1
     54 #define TP_STATUS_COPY		2
     55 #define TP_STATUS_LOSING	4
     56 #define TP_STATUS_CSUMNOTREADY	8
     57 	unsigned int	tp_len;
     58 	unsigned int	tp_snaplen;
     59 	unsigned short	tp_mac;
     60 	unsigned short	tp_net;
     61 	unsigned int	tp_sec;
     62 	unsigned int	tp_usec;
     63 };
     64 
     65 #define TPACKET_ALIGNMENT	16
     66 #define TPACKET_ALIGN(x)	(((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1))
     67 #define TPACKET_HDRLEN		(TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))
     68 
     69 /*
     70    Frame structure:
     71 
     72    - Start. Frame must be aligned to TPACKET_ALIGNMENT=16
     73    - struct tpacket_hdr
     74    - pad to TPACKET_ALIGNMENT=16
     75    - struct sockaddr_ll
     76    - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16
     77    - Start+tp_mac: [ Optional MAC header ]
     78    - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16.
     79    - Pad to align to TPACKET_ALIGNMENT=16
     80  */
     81 
     82 struct tpacket_req
     83 {
     84 	unsigned int	tp_block_size;	/* Minimal size of contiguous block */
     85 	unsigned int	tp_block_nr;	/* Number of blocks */
     86 	unsigned int	tp_frame_size;	/* Size of frame */
     87 	unsigned int	tp_frame_nr;	/* Total number of frames */
     88 };
     89 
     90 struct packet_mreq
     91 {
     92 	int		mr_ifindex;
     93 	unsigned short	mr_type;
     94 	unsigned short	mr_alen;
     95 	unsigned char	mr_address[8];
     96 };
     97 
     98 #define PACKET_MR_MULTICAST	0
     99 #define PACKET_MR_PROMISC	1
    100 #define PACKET_MR_ALLMULTI	2
    101 
    102 #endif
    103