130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _NFNETLINK_COMPAT_H 230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _NFNETLINK_COMPAT_H 330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/types.h> 530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef __KERNEL__ 730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Old nfnetlink macros for userspace */ 830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* nfnetlink groups: Up to 32 maximum */ 1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NF_NETLINK_CONNTRACK_NEW 0x00000001 1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NF_NETLINK_CONNTRACK_UPDATE 0x00000002 1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NF_NETLINK_CONNTRACK_DESTROY 0x00000004 1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NF_NETLINK_CONNTRACK_EXP_NEW 0x00000008 1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NF_NETLINK_CONNTRACK_EXP_UPDATE 0x00000010 1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NF_NETLINK_CONNTRACK_EXP_DESTROY 0x00000020 1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Generic structure for encapsulation optional netfilter information. 1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * It is reminiscent of sockaddr, but with sa_family replaced 1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * with attribute type. 2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ! This should someday be put somewhere generic as now rtnetlink and 2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ! nfnetlink use the same attributes methods. - J. Schulist. 2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 2430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct nfattr { 2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng __u16 nfa_len; 2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng __u16 nfa_type; /* we use 15 bits for the type, and the highest 2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * bit to indicate whether the payload is nested */ 2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng}; 2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* FIXME: Apart from NFNL_NFA_NESTED shamelessly copy and pasted from 3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * rtnetlink.h, it's time to put this in a generic file */ 3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFNL_NFA_NEST 0x8000 3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_TYPE(attr) ((attr)->nfa_type & 0x7fff) 3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_ALIGNTO 4 3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_ALIGN(len) (((len) + NFA_ALIGNTO - 1) & ~(NFA_ALIGNTO - 1)) 3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_OK(nfa,len) ((len) > 0 && (nfa)->nfa_len >= sizeof(struct nfattr) \ 3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng && (nfa)->nfa_len <= (len)) 4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_NEXT(nfa,attrlen) ((attrlen) -= NFA_ALIGN((nfa)->nfa_len), \ 4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng (struct nfattr *)(((char *)(nfa)) + NFA_ALIGN((nfa)->nfa_len))) 4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_LENGTH(len) (NFA_ALIGN(sizeof(struct nfattr)) + (len)) 4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_SPACE(len) NFA_ALIGN(NFA_LENGTH(len)) 4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_DATA(nfa) ((void *)(((char *)(nfa)) + NFA_LENGTH(0))) 4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_PAYLOAD(nfa) ((int)((nfa)->nfa_len) - NFA_LENGTH(0)) 4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_NEST(skb, type) \ 4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng({ struct nfattr *__start = (struct nfattr *)skb_tail_pointer(skb); \ 4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng NFA_PUT(skb, (NFNL_NFA_NEST | type), 0, NULL); \ 4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng __start; }) 5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_NEST_END(skb, start) \ 5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng({ (start)->nfa_len = skb_tail_pointer(skb) - (unsigned char *)(start); \ 5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng (skb)->len; }) 5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFA_NEST_CANCEL(skb, start) \ 5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng({ if (start) \ 5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng skb_trim(skb, (unsigned char *) (start) - (skb)->data); \ 5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng -1; }) 5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFM_NFA(n) ((struct nfattr *)(((char *)(n)) \ 5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng + NLMSG_ALIGN(sizeof(struct nfgenmsg)))) 6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define NFM_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct nfgenmsg)) 6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* ! __KERNEL__ */ 6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* _NFNETLINK_COMPAT_H */ 64