summaryrefslogtreecommitdiffstats
path: root/libnfnetlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnfnetlink.c')
-rw-r--r--libnfnetlink.c47
1 files changed, 41 insertions, 6 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);
+}