[netfilter-cvslog] r4462 - in trunk/libnetfilter_log: include/libnetfilter_log src utils

laforge at netfilter.org laforge at netfilter.org
Sat Nov 5 14:05:54 CET 2005


Author: laforge at netfilter.org
Date: 2005-11-05 14:05:54 +0100 (Sat, 05 Nov 2005)
New Revision: 4462

Modified:
   trunk/libnetfilter_log/include/libnetfilter_log/libnetfilter_log.h
   trunk/libnetfilter_log/src/libnetfilter_log.c
   trunk/libnetfilter_log/utils/nfulnl_test.c
Log:
implement accessor functions similar to libnetfilter_queue


Modified: trunk/libnetfilter_log/include/libnetfilter_log/libnetfilter_log.h
===================================================================
--- trunk/libnetfilter_log/include/libnetfilter_log/libnetfilter_log.h	2005-11-05 12:56:38 UTC (rev 4461)
+++ trunk/libnetfilter_log/include/libnetfilter_log/libnetfilter_log.h	2005-11-05 13:05:54 UTC (rev 4462)
@@ -14,6 +14,7 @@
 
 struct nflog_handle;
 struct nflog_g_handle;
+struct nflog_data;
 
 extern int nflog_errno;
 
@@ -21,7 +22,7 @@
 extern int nflog_fd(struct nflog_handle *h);
 
 typedef int nflog_callback(struct nflog_g_handle *gh, struct nfgenmsg *nfmsg,
-			    struct nfattr *nfa[], void *data);
+			    struct nflog_data *nfd, void *data);
 
 
 extern struct nflog_handle *nflog_open(void);
@@ -44,4 +45,17 @@
 				    nflog_callback *cb, void *data);
 extern int nflog_handle_packet(struct nflog_handle *h, char *buf, int len);
 
+
+extern struct nfulnl_msg_packet_hdr *nflog_get_msg_packet_hdr(struct nflog_data *nfad);
+extern u_int32_t nflog_get_nfmark(struct nflog_data *nfad);
+extern struct nfulnl_msg_packet_timestamp *nflog_get_timestamp(struct nflog_data *nfad);
+extern u_int32_t nflog_get_indev(struct nflog_data *nfad);
+extern u_int32_t nflog_get_physindev(struct nflog_data *nfad);
+extern u_int32_t nflog_get_outdev(struct nflog_data *nfad);
+extern u_int32_t nflog_get_physoutdev(struct nflog_data *nfad);
+extern struct nfulnl_msg_packet_hw *nflog_get_packet_hw(struct nflog_data *nfad);
+extern int nflog_get_payload(struct nflog_data *nfad, char **data);
+extern char *nflog_get_prefix(struct nflog_data *nfad);
+extern int nflog_get_uid(struct nflog_data *nfad, u_int32_t *uid);
+
 #endif	/* __LIBNETFILTER_LOG_H */

Modified: trunk/libnetfilter_log/src/libnetfilter_log.c
===================================================================
--- trunk/libnetfilter_log/src/libnetfilter_log.c	2005-11-05 12:56:38 UTC (rev 4461)
+++ trunk/libnetfilter_log/src/libnetfilter_log.c	2005-11-05 13:05:54 UTC (rev 4462)
@@ -44,6 +44,11 @@
 	void *data;
 };
 
+struct nflog_data
+{
+	struct nfattr **nfa;
+};
+
 int nflog_errno;
 
 /***********************************************************************
@@ -118,6 +123,7 @@
 	struct nflog_handle *h = data;
 	u_int16_t group = ntohs(nfmsg->res_id);
 	struct nflog_g_handle *gh = find_gh(h, group);
+	struct nflog_data nfldata;
 
 	if (!gh)
 		return -ENODEV;
@@ -125,7 +131,8 @@
 	if (!gh->cb)
 		return -ENODEV;
 
-	return gh->cb(gh, nfmsg, nfa, gh->data);
+	nfldata.nfa = nfa;
+	return gh->cb(gh, nfmsg, &nfldata, gh->data);
 }
 
 static struct nfnl_callback cmd_cb = {
@@ -321,3 +328,71 @@
 
 	return status;
 }
+
+
+struct nfulnl_msg_packet_hdr *nflog_get_msg_packet_hdr(struct nflog_data *nfad)
+{
+	return nfnl_get_pointer_to_data(nfad->nfa, NFULA_PACKET_HDR,
+					 struct nfulnl_msg_packet_hdr);
+}
+
+u_int32_t nflog_get_nfmark(struct nflog_data *nfad)
+{
+	return ntohl(nfnl_get_data(nfad->nfa, NFULA_MARK, u_int32_t));
+}
+
+struct nfulnl_msg_packet_timestamp *nflog_get_timestamp(struct nflog_data *nfad)
+{
+	return nfnl_get_pointer_to_data(nfad->nfa, NFULA_TIMESTAMP,
+					struct nfulnl_msg_packet_timestamp);
+}
+
+u_int32_t nflog_get_indev(struct nflog_data *nfad)
+{
+	return ntohl(nfnl_get_data(nfad->nfa, NFULA_IFINDEX_INDEV, u_int32_t));
+}
+
+u_int32_t nflog_get_physindev(struct nflog_data *nfad)
+{
+	return ntohl(nfnl_get_data(nfad->nfa, NFULA_IFINDEX_PHYSINDEV, u_int32_t));
+}
+
+u_int32_t nflog_get_outdev(struct nflog_data *nfad)
+{
+	return ntohl(nfnl_get_data(nfad->nfa, NFULA_IFINDEX_OUTDEV, u_int32_t));
+}
+
+u_int32_t nflog_get_physoutdev(struct nflog_data *nfad)
+{
+	return ntohl(nfnl_get_data(nfad->nfa, NFULA_IFINDEX_PHYSOUTDEV, u_int32_t));
+}
+
+struct nfulnl_msg_packet_hw *nflog_get_packet_hw(struct nflog_data *nfad)
+{
+	return nfnl_get_pointer_to_data(nfad->nfa, NFULA_HWADDR,
+					struct nfulnl_msg_packet_hw);
+}
+
+int nflog_get_payload(struct nflog_data *nfad, char **data)
+{
+	*data = nfnl_get_pointer_to_data(nfad->nfa, NFULA_PAYLOAD, char);
+	if (*data)
+		return NFA_PAYLOAD(nfad->nfa[NFULA_PAYLOAD-1]);
+
+	return -1;
+}
+
+char *nflog_get_prefix(struct nflog_data *nfad)
+{
+	return nfnl_get_pointer_to_data(nfad->nfa, NFULA_PREFIX, char);
+}
+
+int nflog_get_uid(struct nflog_data *nfad, u_int32_t *uid)
+{
+	if (!nfnl_attr_present(nfad->nfa, NFULA_UID))
+		return -1;
+
+	*uid = ntohl(nfnl_get_data(nfad->nfa, NFULA_UID, u_int32_t));
+	return 0;
+}
+

Modified: trunk/libnetfilter_log/utils/nfulnl_test.c
===================================================================
--- trunk/libnetfilter_log/utils/nfulnl_test.c	2005-11-05 12:56:38 UTC (rev 4461)
+++ trunk/libnetfilter_log/utils/nfulnl_test.c	2005-11-05 13:05:54 UTC (rev 4462)
@@ -6,53 +6,42 @@
 
 #include <libnetfilter_log/libnetfilter_log.h>
 
-static int print_pkt(struct nfattr *tb[])
+static int print_pkt(struct nflog_data *ldata)
 {
-	if (tb[NFULA_PACKET_HDR-1]) {
-		struct nfulnl_msg_packet_hdr *ph =
-					NFA_DATA(tb[NFULA_PACKET_HDR-1]);
+	struct nfulnl_msg_packet_hdr *ph = nflog_get_msg_packet_hdr(ldata);
+	u_int32_t mark = nflog_get_nfmark(ldata);
+	u_int32_t indev = nflog_get_indev(ldata);
+	u_int32_t outdev = nflog_get_outdev(ldata);
+	char *prefix = nflog_get_prefix(ldata);
+	void *payload;
+	int payload_len = nflog_get_payload(ldata, payload);
+	
+	if (ph) {
 		printf("hw_protocol=0x%04x hook=%u ", 
 			ntohs(ph->hw_protocol), ph->hook);
 	}
 
-	if (tb[NFULA_MARK-1]) {
-		u_int32_t mark = 
-			ntohl(*(u_int32_t *)NFA_DATA(tb[NFULA_MARK-1]));
-		printf("mark=%u ", mark);
-	}
+	printf("mark=%u ", mark);
 
-	if (tb[NFULA_IFINDEX_INDEV-1]) {
-		u_int32_t ifi = ntohl(*(u_int32_t *)NFA_DATA(tb[NFULA_IFINDEX_INDEV-1]));
-		printf("indev=%u ", ifi);
-	}
-	if (tb[NFULA_IFINDEX_OUTDEV-1]) {
-		u_int32_t ifi = ntohl(*(u_int32_t *)NFA_DATA(tb[NFULA_IFINDEX_OUTDEV-1]));
-		printf("outdev=%u ", ifi);
-	}
-#if 0
-	if (tb[NFULA_IFINDEX_PHYSINDEV-1]) {
-		u_int32_t ifi = ntohl(*(u_int32_t *)NFA_DATA(tb[NFULA_IFINDEX_PHYSINDEV-1]));
-		printf("physindev=%u ", ifi);
-	}
-	if (tb[NFULA_IFINDEX_PHYSOUTDEV-1]) {
-		u_int32_t ifi = ntohl(*(u_int32_t *)NFA_DATA(tb[NFULA_IFINDEX_PHYSOUTDEV-1]));
-		printf("physoutdev=%u ", ifi);
-	}
-#endif
-	if (tb[NFULA_PREFIX-1]) {
-		char *prefix = NFA_DATA(tb[NFULA_PREFIX-1]);
+	if (indev > 0)
+		printf("indev=%u ", indev);
+
+	if (outdev > 0)
+		printf("outdev=%u ", outdev);
+
+
+	if (prefix) {
 		printf("prefix=\"%s\" ", prefix);
 	}
-	if (tb[NFULA_PAYLOAD-1]) {
-		printf("payload_len=%d ", NFA_PAYLOAD(tb[NFULA_PAYLOAD-1]));
-	}
+	if (payload_len >= 0)
+		printf("payload_len=%d ", payload_len);
 
 	fputc('\n', stdout);
 	return 0;
 }
 
 static int cb(struct nflog_g_handle *gh, struct nfgenmsg *nfmsg,
-		struct nfattr *nfa[], void *data)
+		struct nflog_data *nfa, void *data)
 {
 	print_pkt(nfa);
 }




More information about the netfilter-cvslog mailing list