From 5bf8bfa0a0f3846ad981e14cb585e583ef4ac251 Mon Sep 17 00:00:00 2001 From: "/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org" Date: Mon, 25 Jul 2005 17:16:55 +0000 Subject: - 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 --- libnfnetlink.c | 47 +++++++++++++++++++++++++++++++++++++++++------ libnfnetlink.h | 10 +++++++++- 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 */ -- cgit v1.2.3