huyc

导航

ipq_message_type,ipq_get_packet,ipq_getmsgerr

IPQ_MESSAGE_TYPE(3) 2001-10-16

NAME
ipq_message_type, ipq_get_packet, ipq_getmsgerr —— 查询排队消息

SYNOPSIS

#include <linux/netfilter.h>
#include <libipq.h>

int ipq_message_type(const unsigned char *buf);
ipq_packet_msg_t *ipq_get_packet(const unsigned char *buf);
int ipq_get_msgerr(const unsigned char *buf);

DESCRIPTION
函数ipq_message_type返回通过ipq_read读到用户空间的排队消息的类型。

ipq_message_type应该总是在ipq_read成功返回后调用,以确定返回的消息是一个包消息还是一个错误消息。buf参数指向的数据应该与之前调用ipq_read的是同一个。

ipq_message_type将返回下列值之一:

NLMSG_ERROR
Netlink传输过来的错误消息。

IPQM_PACKET
包含数据包元信息和可选包负载数据的数据包消息。

函数ipq_get_packet应该在ipq_message_type返回IPQM_PACKET时调用,buf参数指向的数据应该与调用ipq_message_type的是同一块。ipq_get_packet返回的指针指向一个数据包消息,它的声明如下:

typedef struct ipq_packet_msg {
unsigned long packet_id; /* ID of queued packet */
unsigned long mark; /* Netfilter mark value */
long timestamp_sec; /* Packet arrival time (seconds) */
long timestamp_usec; /* Packet arrvial time (+useconds) */
unsigned int hook; /* Netfilter hook we rode in on */
char indev_name[IFNAMSIZ]; /* Name of incoming interface */
char outdev_name[IFNAMSIZ]; /* Name of outgoing interface */
unsigned short hw_protocol; /* Hardware protocol (network order) */
unsigned short hw_type; /* Hardware type */
unsigned char hw_addrlen; /* Hardware address length */
unsigned char hw_addr[8]; /* Hardware address */
size_t data_len; /* Length of packet data */
unsigned char payload[0]; /* Optional packet data */
} ipq_packet_msg_t;

每个值都是可以被应用读取的。如果排队模式是IPQ_COPY_PACKET,且data_len的值大于0,则数据包的负载内容可以在ipq_packet_msg_t结构后面的内存中访问到,长度为data_len。

字段packet_id是一个调用ipq_set_verdict时用到的数据包标识符。

函数ipq_get_msgerr应该在ipq_message_type返回NLMSG_ERROR时调用。buf参数指向的数据应该与调用ipq_message_type的是同一块。ipq_get_msgerr的返回值是高层内核代码设置的,与标准errno值相关。

BUGS
None known.

AUTHOR
James Morris <jmorris@intercode.com.au>

COPYRIGHT
Copyright (c) 2000-2001 Netfilter Core Team.

Distributed under the GNU General Public License.

SEE ALSO
iptables(8), libipq(3).




posted on 2011-11-03 19:47  huyc  阅读(938)  评论(0编辑  收藏  举报