|
@@ -1060,6 +1060,9 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,
|
|
|
rt->dst.dev->mtu : dst_mtu(&rt->dst);
|
|
|
cork->dst = &rt->dst;
|
|
|
cork->length = 0;
|
|
|
+ cork->ttl = ipc->ttl;
|
|
|
+ cork->tos = ipc->tos;
|
|
|
+ cork->priority = ipc->priority;
|
|
|
cork->tx_flags = ipc->tx_flags;
|
|
|
|
|
|
return 0;
|
|
@@ -1311,7 +1314,9 @@ struct sk_buff *__ip_make_skb(struct sock *sk,
|
|
|
if (cork->flags & IPCORK_OPT)
|
|
|
opt = cork->opt;
|
|
|
|
|
|
- if (rt->rt_type == RTN_MULTICAST)
|
|
|
+ if (cork->ttl != 0)
|
|
|
+ ttl = cork->ttl;
|
|
|
+ else if (rt->rt_type == RTN_MULTICAST)
|
|
|
ttl = inet->mc_ttl;
|
|
|
else
|
|
|
ttl = ip_select_ttl(inet, &rt->dst);
|
|
@@ -1319,7 +1324,7 @@ struct sk_buff *__ip_make_skb(struct sock *sk,
|
|
|
iph = ip_hdr(skb);
|
|
|
iph->version = 4;
|
|
|
iph->ihl = 5;
|
|
|
- iph->tos = inet->tos;
|
|
|
+ iph->tos = (cork->tos != -1) ? cork->tos : inet->tos;
|
|
|
iph->frag_off = df;
|
|
|
iph->ttl = ttl;
|
|
|
iph->protocol = sk->sk_protocol;
|
|
@@ -1331,7 +1336,7 @@ struct sk_buff *__ip_make_skb(struct sock *sk,
|
|
|
ip_options_build(skb, opt, cork->addr, rt, 0);
|
|
|
}
|
|
|
|
|
|
- skb->priority = sk->sk_priority;
|
|
|
+ skb->priority = (cork->tos != -1) ? cork->priority: sk->sk_priority;
|
|
|
skb->mark = sk->sk_mark;
|
|
|
/*
|
|
|
* Steal rt from cork.dst to avoid a pair of atomic_inc/atomic_dec
|
|
@@ -1481,6 +1486,8 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
|
|
ipc.addr = daddr;
|
|
|
ipc.opt = NULL;
|
|
|
ipc.tx_flags = 0;
|
|
|
+ ipc.ttl = 0;
|
|
|
+ ipc.tos = -1;
|
|
|
|
|
|
if (replyopts.opt.opt.optlen) {
|
|
|
ipc.opt = &replyopts.opt;
|