Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next
Pablo Neira Ayuso says: ==================== Netfilter updates for net-next The following patchset contains Netfilter updates for net-next. Basically, more incremental updates for br_netfilter from Florian Westphal, small nf_tables updates (including one fix for rb-tree locking) and small two-liner to add extra validation for the REJECT6 target. More specifically, they are: 1) Use the conntrack status flags from br_netfilter to know that DNAT is happening. Patch for Florian Westphal. 2) nf_bridge->physoutdev == NULL already indicates that the traffic is bridged, so let's get rid of the BRNF_BRIDGED flag. Also from Florian. 3) Another patch to prepare voidization of seq_printf/seq_puts/seq_putc, from Joe Perches. 4) Consolidation of nf_tables_newtable() error path. 5) Kill nf_bridge_pad used by br_netfilter from ip_fragment(), from Florian Westphal. 6) Access rb-tree root node inside the lock and remove unnecessary locking from the get path (we already hold nfnl_lock there), from Patrick McHardy. 7) You cannot use a NFT_SET_ELEM_INTERVAL_END when the set doesn't support interval, also from Patrick. 8) Enforce IP6T_F_PROTO from ip6t_REJECT to make sure the core is actually restricting matches to TCP. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
40451fd013
11 changed files with 77 additions and 68 deletions
|
@ -37,17 +37,16 @@
|
|||
#include <net/route.h>
|
||||
#include <net/netfilter/br_netfilter.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
#endif
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include "br_private.h"
|
||||
#ifdef CONFIG_SYSCTL
|
||||
#include <linux/sysctl.h>
|
||||
#endif
|
||||
|
||||
#define skb_origaddr(skb) (((struct bridge_skb_cb *) \
|
||||
(skb->nf_bridge->data))->daddr.ipv4)
|
||||
#define store_orig_dstaddr(skb) (skb_origaddr(skb) = ip_hdr(skb)->daddr)
|
||||
#define dnat_took_place(skb) (skb_origaddr(skb) != ip_hdr(skb)->daddr)
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static struct ctl_table_header *brnf_sysctl_header;
|
||||
static int brnf_call_iptables __read_mostly = 1;
|
||||
|
@ -154,6 +153,18 @@ static inline struct nf_bridge_info *nf_bridge_unshare(struct sk_buff *skb)
|
|||
return nf_bridge;
|
||||
}
|
||||
|
||||
static unsigned int nf_bridge_encap_header_len(const struct sk_buff *skb)
|
||||
{
|
||||
switch (skb->protocol) {
|
||||
case __cpu_to_be16(ETH_P_8021Q):
|
||||
return VLAN_HLEN;
|
||||
case __cpu_to_be16(ETH_P_PPP_SES):
|
||||
return PPPOE_SES_HLEN;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void nf_bridge_push_encap_header(struct sk_buff *skb)
|
||||
{
|
||||
unsigned int len = nf_bridge_encap_header_len(skb);
|
||||
|
@ -322,6 +333,22 @@ free_skb:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool dnat_took_place(const struct sk_buff *skb)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
enum ip_conntrack_info ctinfo;
|
||||
struct nf_conn *ct;
|
||||
|
||||
ct = nf_ct_get(skb, &ctinfo);
|
||||
if (!ct || nf_ct_is_untracked(ct))
|
||||
return false;
|
||||
|
||||
return test_bit(IPS_DST_NAT_BIT, &ct->status);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* This requires some explaining. If DNAT has taken place,
|
||||
* we will need to fix up the destination Ethernet address.
|
||||
*
|
||||
|
@ -625,7 +652,7 @@ static unsigned int br_nf_pre_routing(const struct nf_hook_ops *ops,
|
|||
return NF_DROP;
|
||||
if (!setup_pre_routing(skb))
|
||||
return NF_DROP;
|
||||
store_orig_dstaddr(skb);
|
||||
|
||||
skb->protocol = htons(ETH_P_IP);
|
||||
|
||||
NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
|
||||
|
@ -721,8 +748,6 @@ static unsigned int br_nf_forward_ip(const struct nf_hook_ops *ops,
|
|||
if (pf == NFPROTO_IPV4 && br_parse_ip_options(skb))
|
||||
return NF_DROP;
|
||||
|
||||
/* The physdev module checks on this */
|
||||
nf_bridge->mask |= BRNF_BRIDGED;
|
||||
nf_bridge->physoutdev = skb->dev;
|
||||
if (pf == NFPROTO_IPV4)
|
||||
skb->protocol = htons(ETH_P_IP);
|
||||
|
@ -842,7 +867,12 @@ static unsigned int br_nf_post_routing(const struct nf_hook_ops *ops,
|
|||
struct net_device *realoutdev = bridge_parent(skb->dev);
|
||||
u_int8_t pf;
|
||||
|
||||
if (!nf_bridge || !(nf_bridge->mask & BRNF_BRIDGED))
|
||||
/* if nf_bridge is set, but ->physoutdev is NULL, this packet came in
|
||||
* on a bridge, but was delivered locally and is now being routed:
|
||||
*
|
||||
* POST_ROUTING was already invoked from the ip stack.
|
||||
*/
|
||||
if (!nf_bridge || !nf_bridge->physoutdev)
|
||||
return NF_ACCEPT;
|
||||
|
||||
if (!realoutdev)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue