|
@@ -652,6 +652,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
|
|
arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0;
|
|
|
|
|
|
net = dev_net(skb_dst(skb)->dev);
|
|
|
+ arg.tos = ip_hdr(skb)->tos;
|
|
|
ip_send_reply(net->ipv4.tcp_sock, skb, ip_hdr(skb)->saddr,
|
|
|
&arg, arg.iov[0].iov_len);
|
|
|
|
|
@@ -666,7 +667,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
|
|
static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,
|
|
|
u32 win, u32 ts, int oif,
|
|
|
struct tcp_md5sig_key *key,
|
|
|
- int reply_flags)
|
|
|
+ int reply_flags, u8 tos)
|
|
|
{
|
|
|
const struct tcphdr *th = tcp_hdr(skb);
|
|
|
struct {
|
|
@@ -726,7 +727,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,
|
|
|
arg.csumoffset = offsetof(struct tcphdr, check) / 2;
|
|
|
if (oif)
|
|
|
arg.bound_dev_if = oif;
|
|
|
-
|
|
|
+ arg.tos = tos;
|
|
|
ip_send_reply(net->ipv4.tcp_sock, skb, ip_hdr(skb)->saddr,
|
|
|
&arg, arg.iov[0].iov_len);
|
|
|
|
|
@@ -743,7 +744,8 @@ static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
|
|
tcptw->tw_ts_recent,
|
|
|
tw->tw_bound_dev_if,
|
|
|
tcp_twsk_md5_key(tcptw),
|
|
|
- tw->tw_transparent ? IP_REPLY_ARG_NOSRCCHECK : 0
|
|
|
+ tw->tw_transparent ? IP_REPLY_ARG_NOSRCCHECK : 0,
|
|
|
+ tw->tw_tos
|
|
|
);
|
|
|
|
|
|
inet_twsk_put(tw);
|
|
@@ -757,7 +759,8 @@ static void tcp_v4_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
|
|
|
req->ts_recent,
|
|
|
0,
|
|
|
tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->daddr),
|
|
|
- inet_rsk(req)->no_srccheck ? IP_REPLY_ARG_NOSRCCHECK : 0);
|
|
|
+ inet_rsk(req)->no_srccheck ? IP_REPLY_ARG_NOSRCCHECK : 0,
|
|
|
+ ip_hdr(skb)->tos);
|
|
|
}
|
|
|
|
|
|
/*
|