linux/net/bridge
Patrick McHardy 2948d2ebbb [NETFILTER]: bridge: fix double POST_ROUTING invocation
The bridge code incorrectly causes two POST_ROUTING hook invocations
for DNATed packets that end up on the same bridge device. This
happens because packets with a changed destination address are passed
to dst_output() to make them go through the neighbour output function
again to build a new destination MAC address, before they will continue
through the IP hooks simulated by bridge netfilter.

The resulting hook order is:
 PREROUTING	(bridge netfilter)
 POSTROUTING	(dst_output -> ip_output)
 FORWARD	(bridge netfilter)
 POSTROUTING	(bridge netfilter)

The deferred hooks used to abort the first POST_ROUTING invocation,
but since the only thing bridge netfilter actually really wants is
a new MAC address, we can avoid going through the IP stack completely
by simply calling the neighbour output function directly.

Tested, reported and lots of data provided by: Damien Thebault <damien.thebault@gmail.com>

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-01-11 18:02:18 -08:00
..
netfilter [BRIDGE]: Properly dereference the br_should_route_hook 2007-11-29 23:58:58 +11:00
br_device.c [BRIDGE]: Assign random address. 2007-12-16 13:35:51 -08:00
br_fdb.c [BRIDGE]: Section fix. 2007-12-07 01:05:53 -08:00
br_forward.c
br_if.c
br_input.c [BRIDGE]: Properly dereference the br_should_route_hook 2007-11-29 23:58:58 +11:00
br_ioctl.c
br_netfilter.c [NETFILTER]: bridge: fix double POST_ROUTING invocation 2008-01-11 18:02:18 -08:00
br_netlink.c
br_notify.c
br_private_stp.h
br_private.h
br_stp_bpdu.c
br_stp_if.c
br_stp_timer.c
br_stp.c
br_sysfs_br.c
br_sysfs_if.c
br.c [BRIDGE]: Lost call to br_fdb_fini() in br_init() error path 2007-11-29 23:41:43 +11:00
Kconfig
Makefile