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