[NETFILTER]: bridge: fix double POST_ROUTING invocation
authorPatrick McHardy <kaber@trash.net>
Sat, 12 Jan 2008 02:02:18 +0000 (18:02 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 12 Jan 2008 02:02:18 +0000 (18:02 -0800)
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>

No differences found