Date created: Wednesday, March 29, 2017 8:06:56 PM. Last modified: Tuesday, April 18, 2017 8:56:35 PM
EtherateMT Notes
Packet MMAP Notes:
/*
PACKET_MMAP buffer size calculator
------------------------------------
Definitions:
: is the maximum size of allocable with kmalloc (see /proc/slabinfo)
: depends on the architecture -- sizeof(void *)
: depends on the architecture -- PAGE_SIZE or getpagesize (2)
: is the value defined with MAX_ORDER
: it's an upper bound of frame's capture size (more on this later)
= 8096 bytes from /proc/slabinfo
= 8 bytes
= 4096 bytes from /usr/include/x86_64-linux-gnu/sys/user.h
= 11
= 1514 bytes
= 8096/8 = 1012 blocks
= 4096 << 11 = 8 MiB.
128 blocks * 8 MBs == 1024MBs
*/
psock_tpacket.c:
struct block_desc {
uint32_t version;
uint32_t offset_to_priv;
struct tpacket_hdr_v1 h1;
};
// if_packet.h:
struct tpacket_hdr_v1 {
__u32 block_status;
__u32 num_pkts;
__u32 offset_to_first_pkt;
__u32 blk_len;
__aligned_u64 seq_num;
struct tpacket_bd_ts ts_first_pkt, ts_last_pkt;
};
// if_packet.h:
struct tpacket_hdr {
unsigned long tp_status;
unsigned int tp_len;
unsigned int tp_snaplen;
unsigned short tp_mac;
unsigned short tp_net;
unsigned int tp_sec;
unsigned int tp_usec;
};
// if_packet.h:
struct tpacket2_hdr {
__u32 tp_status;
__u32 tp_len;
__u32 tp_snaplen;
__u16 tp_mac;
__u16 tp_net;
__u32 tp_sec;
__u32 tp_nsec;
__u16 tp_vlan_tci;
__u16 tp_vlan_tpid;
__u8 tp_padding[4];
};
// if_packet.h:
struct tpacket3_hdr {
__u32 tp_next_offset;
__u32 tp_sec;
__u32 tp_nsec;
__u32 tp_snaplen;
__u32 tp_len;
__u32 tp_status;
__u16 tp_mac;
__u16 tp_net;
// pkt_hdr variants
union {
struct tpacket_hdr_variant1 hv1;
};
__u8 tp_padding[8];
};
// if_packet.h:
struct tpacket_req {
unsigned int tp_block_size; /* Minimal size of contiguous block */
unsigned int tp_block_nr; /* Number of blocks */
unsigned int tp_frame_size; /* Size of frame */
unsigned int tp_frame_nr; /* Total number of frames */
};
// if_packet.h:
struct tpacket_req3 {
unsigned int tp_block_size; /* Minimal size of contiguous block */
unsigned int tp_block_nr; /* Number of blocks */
unsigned int tp_frame_size; /* Size of frame */
unsigned int tp_frame_nr; /* Total number of frames */
unsigned int tp_retire_blk_tov; /* timeout in msecs */
unsigned int tp_sizeof_priv; /* offset to private data area */
unsigned int tp_feature_req_word;
};
Previous page: Etherate Notes
Next page: Example 32bit Stack Buffer Overflow Exploit