Index: utils/nfqnl_test.c =================================================================== --- utils/nfqnl_test.c (révision 6720) +++ utils/nfqnl_test.c (copie de travail) @@ -2,11 +2,14 @@ #include #include #include +#include #include #include /* for NF_ACCEPT */ #include +/* #define PRINT_INFOS */ + /* returns packet id */ static u_int32_t print_pkt (struct nfq_data *tb) { @@ -16,13 +19,17 @@ int ret; char *data; + id = ntohl(ph->packet_id); ph = nfq_get_msg_packet_hdr(tb); if (ph){ id = ntohl(ph->packet_id); +#ifdef PRINT_INFOS printf("hw_protocol=0x%04x hook=%u id=%u ", ntohs(ph->hw_protocol), ph->hook, id); +#endif } +#ifdef PRINT_INFOS mark = nfq_get_nfmark(tb); if (mark) printf("mark=%u ", mark); @@ -40,7 +47,7 @@ printf("payload_len=%d ", ret); fputc('\n', stdout); - +#endif return id; } @@ -49,7 +56,9 @@ struct nfq_data *nfa, void *data) { u_int32_t id = print_pkt(nfa); +#ifdef PRINT_INFOS printf("entering callback\n"); +#endif return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL); } @@ -96,11 +105,22 @@ nh = nfq_nfnlh(h); fd = nfnl_fd(nh); + while ((rv = recv(fd, buf, sizeof(buf), 0))) { + if (rv<0){ + printf("got error %d during recv\n",errno); + if (errno != ENOBUFS){ + break; + } else { + printf("got error %d restart recv\n",errno); + continue; + } + } +#ifdef PRINT_INFOS + printf("pkt received\n"); +#endif + nfq_handle_packet(h, buf, rv); + } - while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) { - printf("pkt received\n"); - nfq_handle_packet(h, buf, rv); - } printf("unbinding from queue 0\n"); nfq_destroy_queue(qh); Index: include/libnetfilter_queue/linux_nfnetlink_queue.h =================================================================== --- include/libnetfilter_queue/linux_nfnetlink_queue.h (révision 6720) +++ include/libnetfilter_queue/linux_nfnetlink_queue.h (copie de travail) @@ -45,6 +45,10 @@ NFQA_IFINDEX_PHYSOUTDEV, /* u_int32_t ifindex */ NFQA_HWADDR, /* nfqnl_msg_packet_hw */ NFQA_PAYLOAD, /* opaque data payload */ + NFQA_IFNAME_INDEV, /* string name of iface */ + NFQA_IFNAME_OUTDEV, /* string name of iface */ + NFQA_IFNAME_PHYSINDEV, /* string name of iface */ + NFQA_IFNAME_PHYSOUTDEV, /* string name of iface */ __NFQA_MAX }; Index: include/libnetfilter_queue/libnetfilter_queue.h =================================================================== --- include/libnetfilter_queue/libnetfilter_queue.h (révision 6720) +++ include/libnetfilter_queue/libnetfilter_queue.h (copie de travail) @@ -80,6 +80,13 @@ extern u_int32_t nfq_get_outdev(struct nfq_data *nfad); extern u_int32_t nfq_get_physoutdev(struct nfq_data *nfad); +/* return NULL if not set */ +extern char* nfq_get_indev_name(struct nfq_data *nfad); +extern char* nfq_get_physindev_name(struct nfq_data *nfad); +extern char* nfq_get_outdev_name(struct nfq_data *nfad); +extern char* nfq_get_physoutdev_name(struct nfq_data *nfad); + + extern struct nfqnl_msg_packet_hw *nfq_get_packet_hw(struct nfq_data *nfad); /* return -1 if problem, length otherwise */ Index: src/libnetfilter_queue.c =================================================================== --- src/libnetfilter_queue.c (révision 6720) +++ src/libnetfilter_queue.c (copie de travail) @@ -419,6 +419,26 @@ return ntohl(nfnl_get_data(nfad->data, NFQA_IFINDEX_PHYSOUTDEV, u_int32_t)); } +char* nfq_get_indev_name(struct nfq_data *nfad) +{ + return nfnl_get_pointer_to_data(nfad->data, NFQA_IFNAME_INDEV, char); +} + +char* nfq_get_physindev_name(struct nfq_data *nfad) +{ + return nfnl_get_pointer_to_data(nfad->data, NFQA_IFNAME_PHYSINDEV, char); +} + +char* nfq_get_outdev_name(struct nfq_data *nfad) +{ + return nfnl_get_pointer_to_data(nfad->data, NFQA_IFNAME_OUTDEV, char); +} + +char* nfq_get_physoutdev_name(struct nfq_data *nfad) +{ + return nfnl_get_pointer_to_data(nfad->data, NFQA_IFNAME_PHYSOUTDEV, char); +} + struct nfqnl_msg_packet_hw *nfq_get_packet_hw(struct nfq_data *nfad) { return nfnl_get_pointer_to_data(nfad->data, NFQA_HWADDR,