mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-26 18:43:33 -05:00
ipv6: icmp: add a force_saddr param to icmp6_send()
SIT or GRE tunnels might want to translate an IPV4 address into a v4mapped one when translating ICMP to ICMPv6. This patch adds the parameter to icmp6_send() but does not change icmpv6_send() signature. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
adc01582e3
commit
b1cadc1a09
3 changed files with 8 additions and 4 deletions
|
@ -14,7 +14,8 @@ static inline struct icmp6hdr *icmp6_hdr(const struct sk_buff *skb)
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
extern void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info);
|
extern void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info);
|
||||||
|
|
||||||
typedef void ip6_icmp_send_t(struct sk_buff *skb, u8 type, u8 code, __u32 info);
|
typedef void ip6_icmp_send_t(struct sk_buff *skb, u8 type, u8 code, __u32 info,
|
||||||
|
const struct in6_addr *force_saddr);
|
||||||
extern int inet6_register_icmp_sender(ip6_icmp_send_t *fn);
|
extern int inet6_register_icmp_sender(ip6_icmp_send_t *fn);
|
||||||
extern int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn);
|
extern int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn);
|
||||||
|
|
||||||
|
|
|
@ -388,7 +388,8 @@ relookup_failed:
|
||||||
/*
|
/*
|
||||||
* Send an ICMP message in response to a packet in error
|
* Send an ICMP message in response to a packet in error
|
||||||
*/
|
*/
|
||||||
static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
|
||||||
|
const struct in6_addr *force_saddr)
|
||||||
{
|
{
|
||||||
struct net *net = dev_net(skb->dev);
|
struct net *net = dev_net(skb->dev);
|
||||||
struct inet6_dev *idev = NULL;
|
struct inet6_dev *idev = NULL;
|
||||||
|
@ -475,6 +476,8 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
||||||
memset(&fl6, 0, sizeof(fl6));
|
memset(&fl6, 0, sizeof(fl6));
|
||||||
fl6.flowi6_proto = IPPROTO_ICMPV6;
|
fl6.flowi6_proto = IPPROTO_ICMPV6;
|
||||||
fl6.daddr = hdr->saddr;
|
fl6.daddr = hdr->saddr;
|
||||||
|
if (force_saddr)
|
||||||
|
saddr = force_saddr;
|
||||||
if (saddr)
|
if (saddr)
|
||||||
fl6.saddr = *saddr;
|
fl6.saddr = *saddr;
|
||||||
fl6.flowi6_mark = mark;
|
fl6.flowi6_mark = mark;
|
||||||
|
@ -551,7 +554,7 @@ out:
|
||||||
*/
|
*/
|
||||||
void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
|
void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
|
||||||
{
|
{
|
||||||
icmp6_send(skb, ICMPV6_PARAMPROB, code, pos);
|
icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL);
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
||||||
|
|
||||||
if (!send)
|
if (!send)
|
||||||
goto out;
|
goto out;
|
||||||
send(skb, type, code, info);
|
send(skb, type, code, info, NULL);
|
||||||
out:
|
out:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue