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;
};
原文地址:https://www.cnblogs.com/lasnitch/p/12764106.html