From: Pablo Neira <pablo@netfilter.org>
To: Harald Welte <laforge@netfilter.org>
Cc: Netfilter Development Mailinglist <netfilter-devel@lists.netfilter.org>
Subject: [PATCH] libnfnetlink updates, take 2
Date: Mon, 17 Oct 2005 17:57:41 +0200 [thread overview]
Message-ID: <4353C9F5.6070603@netfilter.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 399 bytes --]
Hi Harald,
This patch includes the following changes:
- define structure nfnlhdr in libnfnetlink.h
- fix a problem with the attributes types. We have to use NFA_TYPE
instead of reading from nfa->nfa_type now that your patch to see the
highest bit of nfa_type has been pushed forward.
- Implement __be_to_cpu64. I haven't found any implementation available
at the moment.
Please apply.
--
Pablo
[-- Attachment #2: x --]
[-- Type: text/plain, Size: 3115 bytes --]
Index: include/libnfnetlink/libnfnetlink.h
===================================================================
--- include/libnfnetlink/libnfnetlink.h (revision 4297)
+++ include/libnfnetlink/libnfnetlink.h (working copy)
@@ -23,6 +23,11 @@
#define NFNL_BUFFSIZE 8192
+struct nfnlhdr {
+ struct nlmsghdr nlh;
+ struct nfgenmsg nfmsg;
+};
+
struct nfnl_callback {
int (*call)(struct nlmsghdr *nlh, struct nfattr *nfa[], void *data);
void *data;
@@ -113,7 +118,7 @@
nfnl_parse_attr((tb), (max), NFA_DATA((nfa)), NFA_PAYLOAD((nfa)))
#define nfnl_nest(nlh, bufsize, type) \
({ struct nfattr *__start = NLMSG_TAIL(nlh); \
- nfnl_addattr_l(nlh, bufsize, type, NULL, 0); \
+ nfnl_addattr_l(nlh, bufsize, (NFNL_NFA_NEST | type), NULL, 0); \
__start; })
#define nfnl_nest_end(nlh, tail) \
({ (tail)->nfa_len = (void *) NLMSG_TAIL(nlh) - (void *) tail; })
@@ -125,4 +130,29 @@
extern void nfnl_dump_packet(struct nlmsghdr *, int, char *);
+
+/* Pablo: What is the equivalence of be64_to_cpu in userspace?
+ *
+ * Harald: Good question. I don't think there's a standard way [yet?],
+ * so I'd suggest manually implementing it by "#if little endian" bitshift
+ * operations in C (at least for now).
+ *
+ * All the payload of any nfattr will always be in network byte order.
+ * This would allow easy transport over a real network in the future
+ * (e.g. jamal's netlink2).
+ *
+ * Pablo: I've called it __be64_to_cpu instead of be64_to_cpu, since maybe
+ * there will one in the userspace headers someday. We don't want to
+ * pollute POSIX space naming,
+ */
+
+#include <byteswap.h>
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define __be64_to_cpu(x) (x)
+# else
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __be64_to_cpu(x) __bswap_64(x)
+# endif
+#endif
+
#endif /* __LIBNFNETLINK_H */
Index: src/libnfnetlink.c
===================================================================
--- src/libnfnetlink.c (revision 4297)
+++ src/libnfnetlink.c (working copy)
@@ -7,6 +7,11 @@
*
* this software may be used and distributed according to the terms
* of the gnu general public license, incorporated herein by reference.
+ *
+ * 2005-09-14 Pablo Neira Ayuso <pablo@netfilter.org>:
+ * Define structure nfnlhdr
+ * Added __be64_to_cpu function
+ * Use NFA_TYPE macro to get the attribute type
*/
#include <stdlib.h>
@@ -50,7 +55,7 @@
while (NFA_OK(nfa, len)) {
printf(" nfa@%p: nfa_type=%u, nfa_len=%u\n",
- nfa, nfa->nfa_type, nfa->nfa_len);
+ nfa, NFA_TYPE(nfa), nfa->nfa_len);
nfa = NFA_NEXT(nfa,len);
}
}
@@ -584,8 +589,8 @@
memset(tb, 0, sizeof(struct nfattr *) * max);
while (NFA_OK(nfa, len)) {
- if (nfa->nfa_type <= max)
- tb[nfa->nfa_type-1] = nfa;
+ if (NFA_TYPE(nfa) <= max)
+ tb[NFA_TYPE(nfa)-1] = nfa;
nfa = NFA_NEXT(nfa,len);
}
if (len)
@@ -732,7 +737,7 @@
int attrlen = nlh->nlmsg_len - NLMSG_ALIGN(min_len);
while (NFA_OK(attr, attrlen)) {
- unsigned int flavor = attr->nfa_type;
+ unsigned int flavor = NFA_TYPE(attr);
if (flavor) {
if (flavor > cb->attr_count)
return -EINVAL;
next reply other threads:[~2005-10-17 15:57 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-10-17 15:57 Pablo Neira [this message]
2005-10-19 11:45 ` [PATCH] libnfnetlink updates, take 2 Harald Welte
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4353C9F5.6070603@netfilter.org \
--to=pablo@netfilter.org \
--cc=laforge@netfilter.org \
--cc=netfilter-devel@lists.netfilter.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.