Index: include/libnetfilter_queue/linux_nfnetlink_queue.h =================================================================== --- include/libnetfilter_queue/linux_nfnetlink_queue.h (revision 6559) +++ include/libnetfilter_queue/linux_nfnetlink_queue.h (working copy) @@ -45,6 +45,7 @@ NFQA_IFINDEX_PHYSOUTDEV, /* u_int32_t ifindex */ NFQA_HWADDR, /* nfqnl_msg_packet_hw */ NFQA_PAYLOAD, /* opaque data payload */ + NFQA_PRIORITY, /* u_int32_t skb->priority */ __NFQA_MAX }; Index: include/libnetfilter_queue/libnetfilter_queue.h =================================================================== --- include/libnetfilter_queue/libnetfilter_queue.h (revision 6559) +++ include/libnetfilter_queue/libnetfilter_queue.h (working copy) @@ -62,6 +62,21 @@ u_int32_t datalen, unsigned char *buf); +extern int nfq_set_verdict_priority(struct nfq_q_handle *qh, + u_int32_t id, + u_int32_t verdict, + u_int32_t priority, + u_int32_t datalen, + unsigned char *buf); + +extern int nfq_set_verdict_mark_priority(struct nfq_q_handle *qh, + u_int32_t id, + u_int32_t verdict, + u_int32_t mark, + u_int32_t priority, + u_int32_t datalen, + unsigned char *buf); + /* message parsing function */ extern struct nfqnl_msg_packet_hdr * @@ -69,6 +84,8 @@ extern u_int32_t nfq_get_nfmark(struct nfq_data *nfad); +extern u_int32_t nfq_get_priority(struct nfq_data *nfad); + extern int nfq_get_timestamp(struct nfq_data *nfad, struct timeval *tv); /* return 0 if not set */ Index: src/libnetfilter_queue.c =================================================================== --- src/libnetfilter_queue.c (revision 6559) +++ src/libnetfilter_queue.c (working copy) @@ -290,11 +290,13 @@ static int __set_verdict(struct nfq_q_handle *qh, u_int32_t id, u_int32_t verdict, u_int32_t mark, int set_mark, + u_int32_t priority, int set_priority, u_int32_t data_len, unsigned char *data) { struct nfqnl_msg_verdict_hdr vh; char buf[NFNL_HEADER_LEN +NFA_LENGTH(sizeof(mark)) + +NFA_LENGTH(sizeof(priority)) +NFA_LENGTH(sizeof(vh))]; struct nlmsghdr *nmh = (struct nlmsghdr *) buf; @@ -319,6 +321,9 @@ if (set_mark) nfnl_addattr32(nmh, sizeof(buf), NFQA_MARK, mark); + if (set_priority) + nfnl_addattr32(nmh, sizeof(buf), NFQA_PRIORITY, priority); + iov[0].iov_base = nmh; iov[0].iov_len = NLMSG_TAIL(nmh) - (void *)nmh; nvecs = 1; @@ -341,16 +346,30 @@ u_int32_t verdict, u_int32_t data_len, unsigned char *buf) { - return __set_verdict(qh, id, verdict, 0, 0, data_len, buf); + return __set_verdict(qh, id, verdict, 0, 0, 0, 0, data_len, buf); } int nfq_set_verdict_mark(struct nfq_q_handle *qh, u_int32_t id, u_int32_t verdict, u_int32_t mark, u_int32_t datalen, unsigned char *buf) { - return __set_verdict(qh, id, verdict, mark, 1, datalen, buf); + return __set_verdict(qh, id, verdict, mark, 1, 0, 0, datalen, buf); } +int nfq_set_verdict_priority(struct nfq_q_handle *qh, u_int32_t id, + u_int32_t verdict, u_int32_t priority, + u_int32_t datalen, unsigned char *buf) +{ + return __set_verdict(qh, id, verdict, 0, 0, priority, 1, datalen, buf); +} + +int nfq_set_verdict_mark_priority(struct nfq_q_handle *qh, u_int32_t id, + u_int32_t verdict, u_int32_t mark, u_int32_t priority, + u_int32_t datalen, unsigned char *buf) +{ + return __set_verdict(qh, id, verdict, mark, 1, priority, 1, datalen, buf); +} + /************************************************************* * Message parsing functions *************************************************************/ @@ -366,6 +385,11 @@ return ntohl(nfnl_get_data(nfad->data, NFQA_MARK, u_int32_t)); } +u_int32_t nfq_get_priority(struct nfq_data *nfad) +{ + return ntohl(nfnl_get_data(nfad->data, NFQA_PRIORITY, u_int32_t)); +} + int nfq_get_timestamp(struct nfq_data *nfad, struct timeval *tv) { struct nfqnl_msg_packet_timestamp *qpt;