mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
net: add a sysctl to reflect the fwmark on replies
Kernel-originated IP packets that have no user socket associated with them (e.g., ICMP errors and echo replies, TCP RSTs, etc.) are emitted with a mark of zero. Add a sysctl to make them have the same mark as the packet they are replying to. This allows an administrator that wishes to do so to use mark-based routing, firewalling, etc. for these replies by marking the original packets inbound. Tested using user-mode linux: - ICMP/ICMPv6 echo replies and errors. - TCP RST packets (IPv4 and IPv6). Signed-off-by: Lorenzo Colitti <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
87e067cda6
commit
e110861f86
10 changed files with 41 additions and 3 deletions
|
|
@ -400,6 +400,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
|||
int len;
|
||||
int hlimit;
|
||||
int err = 0;
|
||||
u32 mark = IP6_REPLY_MARK(net, skb->mark);
|
||||
|
||||
if ((u8 *)hdr < skb->head ||
|
||||
(skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
|
||||
|
|
@ -466,6 +467,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
|||
fl6.daddr = hdr->saddr;
|
||||
if (saddr)
|
||||
fl6.saddr = *saddr;
|
||||
fl6.flowi6_mark = mark;
|
||||
fl6.flowi6_oif = iif;
|
||||
fl6.fl6_icmp_type = type;
|
||||
fl6.fl6_icmp_code = code;
|
||||
|
|
@ -474,6 +476,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
|
|||
sk = icmpv6_xmit_lock(net);
|
||||
if (sk == NULL)
|
||||
return;
|
||||
sk->sk_mark = mark;
|
||||
np = inet6_sk(sk);
|
||||
|
||||
if (!icmpv6_xrlim_allow(sk, type, &fl6))
|
||||
|
|
@ -551,6 +554,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
|
|||
int err = 0;
|
||||
int hlimit;
|
||||
u8 tclass;
|
||||
u32 mark = IP6_REPLY_MARK(net, skb->mark);
|
||||
|
||||
saddr = &ipv6_hdr(skb)->daddr;
|
||||
|
||||
|
|
@ -569,11 +573,13 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
|
|||
fl6.saddr = *saddr;
|
||||
fl6.flowi6_oif = skb->dev->ifindex;
|
||||
fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
|
||||
fl6.flowi6_mark = mark;
|
||||
security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
|
||||
|
||||
sk = icmpv6_xmit_lock(net);
|
||||
if (sk == NULL)
|
||||
return;
|
||||
sk->sk_mark = mark;
|
||||
np = inet6_sk(sk);
|
||||
|
||||
if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
|
||||
|
|
|
|||
|
|
@ -38,6 +38,13 @@ static struct ctl_table ipv6_table_template[] = {
|
|||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec
|
||||
},
|
||||
{
|
||||
.procname = "fwmark_reflect",
|
||||
.data = &init_net.ipv6.sysctl.fwmark_reflect,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -812,6 +812,7 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
|
|||
fl6.flowi6_oif = inet6_iif(skb);
|
||||
else
|
||||
fl6.flowi6_oif = oif;
|
||||
fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark);
|
||||
fl6.fl6_dport = t1->dest;
|
||||
fl6.fl6_sport = t1->source;
|
||||
security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
|
||||
|
|
|
|||
Loading…
Reference in a new issue