diff options
author | Jiri Benc <jbenc@redhat.com> | 2015-09-22 18:12:11 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-09-24 14:31:36 -0700 |
commit | 63d008a4e9ee86614ca5671b7f3ba447df007190 (patch) | |
tree | 3122aaf73744bc976113cffb2367b4e770b901f8 /include/net/ip_tunnels.h | |
parent | d5b8d6404395641987db76e28334cae4cef771ae (diff) | |
download | linux-stable-63d008a4e9ee86614ca5671b7f3ba447df007190.tar.gz linux-stable-63d008a4e9ee86614ca5671b7f3ba447df007190.tar.bz2 linux-stable-63d008a4e9ee86614ca5671b7f3ba447df007190.zip |
ipv4: send arp replies to the correct tunnel
When using ip lwtunnels, the additional data for xmit (basically, the actual
tunnel to use) are carried in ip_tunnel_info either in dst->lwtstate or in
metadata dst. When replying to ARP requests, we need to send the reply to
the same tunnel the request came from. This means we need to construct
proper metadata dst for ARP replies.
We could perform another route lookup to get a dst entry with the correct
lwtstate. However, this won't always ensure that the outgoing tunnel is the
same as the incoming one, and it won't work anyway for IPv4 duplicate
address detection.
The only thing to do is to "reverse" the ip_tunnel_info.
Signed-off-by: Jiri Benc <jbenc@redhat.com>
Acked-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/ip_tunnels.h')
-rw-r--r-- | include/net/ip_tunnels.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index 9a6a3ba888e8..f6dafec9102c 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h @@ -276,6 +276,8 @@ int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto); int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, __be32 src, __be32 dst, u8 proto, u8 tos, u8 ttl, __be16 df, bool xnet); +struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, + gfp_t flags); struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum, int gso_type_mask); |