libnfnetlink updates, take 2
Pablo Neira
maintainerPATCH 1/1 libnfnetlink updates, take 2
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
libnfnetlink/libnfnetlink.h +31 -1
@@ -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 */
libnfnetlink.c +9 -4
@@ -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 <[email protected]>: +* 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 ;
Quoted 3 lines · Pablo Neira
Hi Harald,
This patch includes the following changes:
Pablo, this patch didn't even apply to the latest libnfnetlink. Please make sure that patches apply before submitting them.
I've now manually merged your changes.
Signature · 5 lines
- Harald Welte <[email protected]> http://netfilter.org/ ============================================================================ "Fragmentation is like classful addressing -- an interesting early architectural error that shows how much experimentation was going on while IP was being designed." -- Paul Vixie