|
@@ -337,6 +337,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
|
|
|
struct sock *sk;
|
|
|
struct inet_sock *inet;
|
|
|
__be32 daddr, saddr;
|
|
|
+ u32 mark = IP4_REPLY_MARK(net, skb->mark);
|
|
|
|
|
|
if (ip_options_echo(&icmp_param->replyopts.opt.opt, skb))
|
|
|
return;
|
|
@@ -349,6 +350,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
|
|
|
icmp_param->data.icmph.checksum = 0;
|
|
|
|
|
|
inet->tos = ip_hdr(skb)->tos;
|
|
|
+ sk->sk_mark = mark;
|
|
|
daddr = ipc.addr = ip_hdr(skb)->saddr;
|
|
|
saddr = fib_compute_spec_dst(skb);
|
|
|
ipc.opt = NULL;
|
|
@@ -364,6 +366,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
|
|
|
memset(&fl4, 0, sizeof(fl4));
|
|
|
fl4.daddr = daddr;
|
|
|
fl4.saddr = saddr;
|
|
|
+ fl4.flowi4_mark = mark;
|
|
|
fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos);
|
|
|
fl4.flowi4_proto = IPPROTO_ICMP;
|
|
|
security_skb_classify_flow(skb, flowi4_to_flowi(&fl4));
|
|
@@ -382,7 +385,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
|
|
|
struct flowi4 *fl4,
|
|
|
struct sk_buff *skb_in,
|
|
|
const struct iphdr *iph,
|
|
|
- __be32 saddr, u8 tos,
|
|
|
+ __be32 saddr, u8 tos, u32 mark,
|
|
|
int type, int code,
|
|
|
struct icmp_bxm *param)
|
|
|
{
|
|
@@ -394,6 +397,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
|
|
|
fl4->daddr = (param->replyopts.opt.opt.srr ?
|
|
|
param->replyopts.opt.opt.faddr : iph->saddr);
|
|
|
fl4->saddr = saddr;
|
|
|
+ fl4->flowi4_mark = mark;
|
|
|
fl4->flowi4_tos = RT_TOS(tos);
|
|
|
fl4->flowi4_proto = IPPROTO_ICMP;
|
|
|
fl4->fl4_icmp_type = type;
|
|
@@ -491,6 +495,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
|
|
struct flowi4 fl4;
|
|
|
__be32 saddr;
|
|
|
u8 tos;
|
|
|
+ u32 mark;
|
|
|
struct net *net;
|
|
|
struct sock *sk;
|
|
|
|
|
@@ -592,6 +597,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
|
|
tos = icmp_pointers[type].error ? ((iph->tos & IPTOS_TOS_MASK) |
|
|
|
IPTOS_PREC_INTERNETCONTROL) :
|
|
|
iph->tos;
|
|
|
+ mark = IP4_REPLY_MARK(net, skb_in->mark);
|
|
|
|
|
|
if (ip_options_echo(&icmp_param->replyopts.opt.opt, skb_in))
|
|
|
goto out_unlock;
|
|
@@ -608,13 +614,14 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
|
|
|
icmp_param->skb = skb_in;
|
|
|
icmp_param->offset = skb_network_offset(skb_in);
|
|
|
inet_sk(sk)->tos = tos;
|
|
|
+ sk->sk_mark = mark;
|
|
|
ipc.addr = iph->saddr;
|
|
|
ipc.opt = &icmp_param->replyopts.opt;
|
|
|
ipc.tx_flags = 0;
|
|
|
ipc.ttl = 0;
|
|
|
ipc.tos = -1;
|
|
|
|
|
|
- rt = icmp_route_lookup(net, &fl4, skb_in, iph, saddr, tos,
|
|
|
+ rt = icmp_route_lookup(net, &fl4, skb_in, iph, saddr, tos, mark,
|
|
|
type, code, icmp_param);
|
|
|
if (IS_ERR(rt))
|
|
|
goto out_unlock;
|