[netfilter-cvslog] r4150 - trunk/libnfnetlink

laforge at netfilter.org laforge at netfilter.org
Mon Jul 25 19:16:56 CEST 2005


Author: laforge at netfilter.org
Date: 2005-07-25 19:16:55 +0200 (Mon, 25 Jul 2005)
New Revision: 4150

Modified:
   trunk/libnfnetlink/libnfnetlink.c
   trunk/libnfnetlink/libnfnetlink.h
Log:
- use peer address of handle when sending message in nfnl_send()
- add new nfnl_sendmsg() and nfnl_sendiov() send variants
- add new nfnl_build_nfa_iovec() function


Modified: trunk/libnfnetlink/libnfnetlink.c
===================================================================
--- trunk/libnfnetlink/libnfnetlink.c	2005-07-25 01:05:48 UTC (rev 4149)
+++ trunk/libnfnetlink/libnfnetlink.c	2005-07-25 17:16:55 UTC (rev 4150)
@@ -121,17 +121,33 @@
  */
 int nfnl_send(struct nfnl_handle *nfnlh, struct nlmsghdr *n)
 {
-	struct sockaddr_nl nladdr;
-
-	memset(&nladdr, 0, sizeof(nladdr));
-	nladdr.nl_family = AF_NETLINK;
-
 	nfnl_debug_dump_packet(n, n->nlmsg_len+sizeof(*n), "nfnl_send");
 
 	return sendto(nfnlh->fd, n, n->nlmsg_len, 0, 
-		      (struct sockaddr *)&nladdr, sizeof(nladdr));
+		      (struct sockaddr *)&nfnlh->peer, sizeof(nfnlh->peer));
 }
 
+int nfnl_sendmsg(const struct nfnl_handle *nfnlh, const struct msghdr *msg,
+		 unsigned int flags)
+{
+	return sendmsg(nfnlh->fd, msg, flags);
+}
+
+int nfnl_sendiov(const struct nfnl_handle *nfnlh, const struct iovec *iov,
+		 unsigned int num, unsigned int flags)
+{
+	struct msghdr msg;
+
+	msg.msg_name = (struct sockaddr *) &nfnlh->peer;
+	msg.msg_namelen = sizeof(nfnlh->peer);
+	msg.msg_iov = (struct iovec *) iov;
+	msg.msg_control = NULL;
+	msg.msg_controllen = 0;
+	msg.msg_flags = 0;
+
+	return nfnl_sendmsg(nfnlh, &msg, flags);
+}
+
 /**
  * nfnl_fill_hdr - fill in netlink and nfnetlink header
  *
@@ -494,3 +510,22 @@
 
 	return 0;
 }
+
+/**
+ * nfnl_build_nfa_iovec - Build two iovec's from tag, length and value
+ *
+ * iov: pointer to array of two 'struct iovec' (caller-allocated)
+ * nfa: pointer to 'struct nfattr' (caller-allocated)
+ * type: type (tag) of attribute
+ * len: length of value
+ * val: pointer to buffer containing 'value'
+ *
+ */ 
+void nfnl_build_nfa_iovec(struct iovec *iov, struct nfattr *nfa, 
+			  u_int16_t type, u_int32_t len, unsigned char *val)
+{
+	iov[0].iov_base = nfa;
+	iov[0].iov_len = sizeof(*nfa);
+	iov[1].iov_base = val;
+	iov[1].iov_len = NFA_ALIGN(len);
+}

Modified: trunk/libnfnetlink/libnfnetlink.h
===================================================================
--- trunk/libnfnetlink/libnfnetlink.h	2005-07-25 01:05:48 UTC (rev 4149)
+++ trunk/libnfnetlink/libnfnetlink.h	2005-07-25 17:16:55 UTC (rev 4150)
@@ -28,8 +28,12 @@
 extern int nfnl_open(struct nfnl_handle *, u_int8_t, unsigned int);
 extern int nfnl_close(struct nfnl_handle *);
 extern int nfnl_send(struct nfnl_handle *, struct nlmsghdr *);
+extern int nfnl_sendmsg(const struct nfnl_handle *, const struct msghdr *msg,
+			unsigned int flags);
+extern int nfnl_sendiov(const struct nfnl_handle *nfnlh,
+			const struct iovec *iov, unsigned int num,
+			unsigned int flags);
 
-
 extern void nfnl_fill_hdr(struct nfnl_handle *, struct nlmsghdr *,
 			  unsigned int, u_int8_t, u_int16_t, u_int16_t,
 			  u_int16_t);
@@ -58,5 +62,9 @@
 #define nfnl_nest_end(nlh, tail) 				\
 ({	(tail)->nfa_len = (void *) NLMSG_TAIL(nlh) - (void *) tail; })
 
+extern void nfnl_build_nfa_iovec(struct iovec *iov, struct nfattr *nfa, 
+				 u_int16_t type, u_int32_t len,
+				 unsigned char *val);
+
 extern void nfnl_dump_packet(struct nlmsghdr *, int, char *);
 #endif /* __LIBNFNETLINK_H */




More information about the netfilter-cvslog mailing list