summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org </C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org>2005-07-25 17:16:55 +0000
committer/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org </C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org>2005-07-25 17:16:55 +0000
commit5bf8bfa0a0f3846ad981e14cb585e583ef4ac251 (patch)
tree5cd7bc95f15cd6ee78ed3005f30e510050b79a1b
parentc776a4a0d9364dfacc7903e38c53b448ad1e4b11 (diff)
- 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
-rw-r--r--libnfnetlink.c47
-rw-r--r--libnfnetlink.h10
2 files changed, 50 insertions, 7 deletions
diff --git a/libnfnetlink.c b/libnfnetlink.c
index 0bcc950..fb2895a 100644
--- a/libnfnetlink.c
+++ b/libnfnetlink.c
@@ -121,15 +121,31 @@ int nfnl_close(struct nfnl_handle *nfnlh)
*/
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);
}
/**
@@ -494,3 +510,22 @@ int nfnl_parse_attr(struct nfattr *tb[], int max, struct nfattr *nfa, int len)
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);
+}
diff --git a/libnfnetlink.h b/libnfnetlink.h
index ebf61f2..d4c895d 100644
--- a/libnfnetlink.h
+++ b/libnfnetlink.h
@@ -28,7 +28,11 @@ struct nfnl_handle {
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,
@@ -58,5 +62,9 @@ extern int nfnl_parse_attr(struct nfattr **, int, struct nfattr *, int);
#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 */