netfilter_queue
1、nfq_set_verdict
int nfq_set_verdict(struct nfq_q_handle *qh, uint32_t id,
uint32_t verdict, uint32_t data_len,
const unsigned char *buf)
- 函数功能:
对一个数据包发表裁决。 - 函数参数:
qh:通过调用nfq_create_queue()获得的Netfilter队列句柄。
id:由netfilter分配给数据包的ID
verdict:决定返回到netfilter
data_len: buf缓冲区的字节数
buf:包含数据包数据的缓冲区 - 函数返回值:
出错返回-1,否则返回值大于等于0。
向netfilter通知给定数据包的用户空间判定。 每个排队的数据包_must_都有一个由用户空间指定的结论,可以通过调用此函数,nfq_set_verdict2()函数或这些函数的_batch版本来指定。
2、nfq_get_payload
int nfq_get_payload(struct nfq_data *nfad, unsigned char **data)
- 函数功能:
获取payload(有效载荷) - 函数参数:
nfad:Netlink数据包数据句柄传递给回调函数
data:指向有效负载的指针的指针 - 函数返回值:
出错返回-1,否则大于0。
检索队列中数据包的有效负载。 此函数检索的实际数据量和类型取决于nfq_set_mode() 函数设置的模式。
3、nfq_get_indev
uint32_t nfq_get_indev(struct nfq_data *nfad)
- 函数功能:获取接收数据包的接口
- 函数参数:Netlink数据包数据句柄传递给回调函数
- 函数返回值:
排队的数据包通过其接收的设备的索引。 如果返回的索引为0,则说明该数据包是在本地生成的,或者输入接口未知(即POSTROUTING?)。
所有nfq_get_dev()函数,如果未设置,则返回0,因为linux 仅允许ifindex> = 1。
4、nfqnl_msg_packet_hdr
struct nfqnl_msg_packet_hdr *nfq_get_msg_packet_hdr(struct nfq_data *nfad)
- 函数功能:返回包装数据包的元头
- 函数参数:
nfad:Netlink数据包数据句柄传递给回调函数 - 函数返回值:
给定nfq_data参数的netfilter队列netlink数据包头。 通常,nfq_data值作为第三个参数传递给通过调用nfq_create_queue()设置的回调函数。
5、iphdr
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix "
#endif
__u8 tos;
__be16 -tot_len;
__be16 -id;
__be16 -frag_off;
__u8 ttl;
__u8 protocol;
__be16 -check;
__be32 -saddr;
__be32 -daddr;
};
6、udphdr
struct udphdr {
__u16 source;
__u16 dest;
__u16 len;
__u16 check;
};
7、struct ifreq
struct ifreq
{
#define IFHWADDRLEN 6
union
{
char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */
} ifr_ifrn;
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
short ifru_flags;
int ifru_ivalue;
int ifru_mtu;
struct ifmap ifru_map;
char ifru_slave[IFNAMSIZ]; /* Just fits the size */
char ifru_newname[IFNAMSIZ];
void __user * ifru_data;
struct if_settings ifru_settings;
} ifr_ifru;
};
8、ifconf
struct ifconf
{
int ifc_len; /* size of buffer */
union
{
char __user *ifcu_buf;
struct ifreq __user *ifcu_req;
} ifc_ifcu;
};