@@ -41,8 +41,11 @@ struct nf_bridge_info {
bool pkt_otherhost;
unsigned long owner;
struct net_device *physindev;
- struct net_device *physoutdev;
- char neigh_header[8];
+
+ union {
+ struct net_device *physoutdev;
+ char neigh_header[8];
+ };
};
struct nf_bridge_info *nf_bridge_find(const struct sk_buff *skb);
@@ -1111,6 +1111,8 @@ static void br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb)
nf_bridge->neigh_header,
ETH_HLEN - ETH_ALEN);
skb->dev = nf_bridge->physindev;
+ nf_bridge->physoutdev = NULL;
+
br_handle_frame_finish(skb);
}
The neigh_header is only needed when we detect DNAT after prerouting and neigh cache didn't have a mac address for us. The output port has not been chosen yet so we can re-use its memory, bringing size of meta data down to 40 bytes on x86_64. Signed-off-by: Florian Westphal <fw@strlen.de> --- include/linux/netfilter_bridge.h | 7 +++++-- net/bridge/br_netfilter.c | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-)