-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
netfilter: nf_tables: add compatibility layer for x_tables
This patch adds the x_tables compatibility layer. This allows you to use existing x_tables matches and targets from nf_tables. This compatibility later allows us to use existing matches/targets for features that are still missing in nf_tables. We can progressively replace them with native nf_tables extensions. It also provides the userspace compatibility software that allows you to express the rule-set using the iptables syntax but using the nf_tables kernel components. In order to get this compatibility layer working, I've done the following things: * add NFNL_SUBSYS_NFT_COMPAT: this new nfnetlink subsystem is used to query the x_tables match/target revision, so we don't need to use the native x_table getsockopt interface. * emulate xt structures: this required extending the struct nft_pktinfo to include the fragment offset, which is already obtained from ip[6]_tables and that is used by some matches/targets. * add support for default policy to base chains, required to emulate x_tables. * add NFTA_CHAIN_USE attribute to obtain the number of references to chains, required by x_tables emulation. * add chain packet/byte counters using per-cpu. * support 32-64 bits compat. For historical reasons, this patch includes the following patches that were posted in the netfilter-devel mailing list. From Pablo Neira Ayuso: * nf_tables: add default policy to base chains * netfilter: nf_tables: add NFTA_CHAIN_USE attribute * nf_tables: nft_compat: private data of target and matches in contiguous area * nf_tables: validate hooks for compat match/target * nf_tables: nft_compat: release cached matches/targets * nf_tables: x_tables support as a compile time option * nf_tables: fix alias for xtables over nftables module * nf_tables: add packet and byte counters per chain * nf_tables: fix per-chain counter stats if no counters are passed * nf_tables: don't bump chain stats * nf_tables: add protocol and flags for xtables over nf_tables * nf_tables: add ip[6]t_entry emulation * nf_tables: move specific layer 3 compat code to nf_tables_ipv[4|6] * nf_tables: support 32bits-64bits x_tables compat * nf_tables: fix compilation if CONFIG_COMPAT is disabled From Patrick McHardy: * nf_tables: move policy to struct nft_base_chain * nf_tables: send notifications for base chain policy changes From Alexander Primak: * nf_tables: remove the duplicate NF_INET_LOCAL_OUT From Nicolas Dichtel: * nf_tables: fix compilation when nf-netlink is a module Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
- Loading branch information
Pablo Neira Ayuso
committed
Oct 14, 2013
1 parent
9370761
commit 0ca743a
Showing
20 changed files
with
1,241 additions
and
78 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
#ifndef _NF_TABLES_IPV4_H_ | ||
#define _NF_TABLES_IPV4_H_ | ||
|
||
#include <net/netfilter/nf_tables.h> | ||
#include <net/ip.h> | ||
|
||
static inline void | ||
nft_set_pktinfo_ipv4(struct nft_pktinfo *pkt, | ||
const struct nf_hook_ops *ops, | ||
struct sk_buff *skb, | ||
const struct net_device *in, | ||
const struct net_device *out) | ||
{ | ||
struct iphdr *ip; | ||
|
||
nft_set_pktinfo(pkt, ops, skb, in, out); | ||
|
||
pkt->xt.thoff = ip_hdrlen(pkt->skb); | ||
ip = ip_hdr(pkt->skb); | ||
pkt->xt.fragoff = ntohs(ip->frag_off) & IP_OFFSET; | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
#ifndef _NF_TABLES_IPV6_H_ | ||
#define _NF_TABLES_IPV6_H_ | ||
|
||
#include <linux/netfilter_ipv6/ip6_tables.h> | ||
#include <net/ipv6.h> | ||
|
||
static inline int | ||
nft_set_pktinfo_ipv6(struct nft_pktinfo *pkt, | ||
const struct nf_hook_ops *ops, | ||
struct sk_buff *skb, | ||
const struct net_device *in, | ||
const struct net_device *out) | ||
{ | ||
int protohdr, thoff = 0; | ||
unsigned short frag_off; | ||
|
||
nft_set_pktinfo(pkt, ops, skb, in, out); | ||
|
||
protohdr = ipv6_find_hdr(pkt->skb, &thoff, -1, &frag_off, NULL); | ||
/* If malformed, drop it */ | ||
if (protohdr < 0) | ||
return -1; | ||
|
||
pkt->xt.thoff = thoff; | ||
pkt->xt.fragoff = frag_off; | ||
|
||
return 0; | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
#ifndef _NFT_COMPAT_NFNETLINK_H_ | ||
#define _NFT_COMPAT_NFNETLINK_H_ | ||
|
||
enum nft_target_attributes { | ||
NFTA_TARGET_UNSPEC, | ||
NFTA_TARGET_NAME, | ||
NFTA_TARGET_REV, | ||
NFTA_TARGET_INFO, | ||
__NFTA_TARGET_MAX | ||
}; | ||
#define NFTA_TARGET_MAX (__NFTA_TARGET_MAX - 1) | ||
|
||
enum nft_match_attributes { | ||
NFTA_MATCH_UNSPEC, | ||
NFTA_MATCH_NAME, | ||
NFTA_MATCH_REV, | ||
NFTA_MATCH_INFO, | ||
__NFTA_MATCH_MAX | ||
}; | ||
#define NFTA_MATCH_MAX (__NFTA_MATCH_MAX - 1) | ||
|
||
#define NFT_COMPAT_NAME_MAX 32 | ||
|
||
enum { | ||
NFNL_MSG_COMPAT_GET, | ||
NFNL_MSG_COMPAT_MAX | ||
}; | ||
|
||
enum { | ||
NFTA_COMPAT_UNSPEC = 0, | ||
NFTA_COMPAT_NAME, | ||
NFTA_COMPAT_REV, | ||
NFTA_COMPAT_TYPE, | ||
__NFTA_COMPAT_MAX, | ||
}; | ||
#define NFTA_COMPAT_MAX (__NFTA_COMPAT_MAX - 1) | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.