Update example file to use the pkt_buff structure to store the payload. Signed-off-by: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx> --- examples/nf-queue.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/examples/nf-queue.c b/examples/nf-queue.c index 3da2c249da23..f0d4c2ee7276 100644 --- a/examples/nf-queue.c +++ b/examples/nf-queue.c @@ -14,6 +14,7 @@ #include <linux/netfilter/nfnetlink_queue.h> #include <libnetfilter_queue/libnetfilter_queue.h> +#include <libnetfilter_queue/pktbuff.h> /* only for NFQA_CT, not needed otherwise: */ #include <linux/netfilter/nfnetlink_conntrack.h> @@ -50,9 +51,12 @@ static int queue_cb(const struct nlmsghdr *nlh, void *data) { struct nfqnl_msg_packet_hdr *ph = NULL; struct nlattr *attr[NFQA_MAX+1] = {}; + struct pkt_buff *pktb = data; uint32_t id = 0, skbinfo; struct nfgenmsg *nfg; + uint8_t *payload; uint16_t plen; + int i; if (nfq_nlmsg_parse(nlh, attr) < 0) { perror("problems parsing"); @@ -69,7 +73,8 @@ static int queue_cb(const struct nlmsghdr *nlh, void *data) ph = mnl_attr_get_payload(attr[NFQA_PACKET_HDR]); plen = mnl_attr_get_payload_len(attr[NFQA_PAYLOAD]); - /* void *payload = mnl_attr_get_payload(attr[NFQA_PAYLOAD]); */ + + pktb_build_data(pktb, mnl_attr_get_payload(attr[NFQA_PAYLOAD]), plen); skbinfo = attr[NFQA_SKB_INFO] ? ntohl(mnl_attr_get_u32(attr[NFQA_SKB_INFO])) : 0; @@ -97,6 +102,14 @@ static int queue_cb(const struct nlmsghdr *nlh, void *data) printf(", checksum not ready"); puts(")"); + printf("payload (len=%d) [", plen); + payload = pktb_data(pktb); + + for (i = 0; i < pktb_len(pktb); i++) + printf("%x", payload[i] & 0xff); + + printf("]\n"); + nfq_send_verdict(ntohs(nfg->res_id), id); return MNL_CB_OK; @@ -107,6 +120,7 @@ int main(int argc, char *argv[]) char *buf; /* largest possible packet payload, plus netlink data overhead: */ size_t sizeof_buf = 0xffff + (MNL_SOCKET_BUFFER_SIZE/2); + struct pkt_buff *pktb; struct nlmsghdr *nlh; int ret; unsigned int portid, queue_num; @@ -161,6 +175,12 @@ int main(int argc, char *argv[]) ret = 1; mnl_socket_setsockopt(nl, NETLINK_NO_ENOBUFS, &ret, sizeof(int)); + pktb = pktb_alloc_head(); + if (!pktb) { + perror("pktb_alloc"); + exit(EXIT_FAILURE); + } + for (;;) { ret = mnl_socket_recvfrom(nl, buf, sizeof_buf); if (ret == -1) { @@ -168,13 +188,14 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - ret = mnl_cb_run(buf, ret, 0, portid, queue_cb, NULL); + ret = mnl_cb_run(buf, ret, 0, portid, queue_cb, pktb); if (ret < 0){ perror("mnl_cb_run"); exit(EXIT_FAILURE); } } + pktb_free(pktb); mnl_socket_close(nl); return 0; -- 2.20.1