[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1430772888-5682-6-git-send-email-fw@strlen.de>
Date: Mon, 4 May 2015 22:54:48 +0200
From: Florian Westphal <fw@...len.de>
To: <netdev@...r.kernel.org>
Cc: hannes@...essinduktion.org, jesse@...ira.com,
Florian Westphal <fw@...len.de>
Subject: [PATCH RFC 5/5] net: set DF bit on fragment list skbs if DF was set earlier
This extends the previous change to also set the DF bit in the
fragment list skb, i.e. if the original fragments had DF set,
then also set it when 'replaying' the fraglist skbs.
Signed-off-by: Florian Westphal <fw@...len.de>
---
net/ipv4/ip_output.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 26847e4..3a41844 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -543,6 +543,7 @@ int ip_fragment(struct sock *sk, struct sk_buff *skb,
if (skb_has_frag_list(skb)) {
struct sk_buff *frag, *frag2;
int first_len = skb_pagelen(skb);
+ bool is_df_skb;
if (first_len - hlen > mtu ||
((first_len - hlen) & 7) ||
@@ -579,6 +580,9 @@ int ip_fragment(struct sock *sk, struct sk_buff *skb,
skb->len = first_len;
iph->tot_len = htons(first_len);
iph->frag_off = htons(IP_MF);
+ is_df_skb = IPCB(skb)->flags & IPSKB_FRAG_PMTU;
+ if (is_df_skb)
+ iph->frag_off |= htons(IP_DF);
ip_send_check(iph);
for (;;) {
@@ -599,6 +603,8 @@ int ip_fragment(struct sock *sk, struct sk_buff *skb,
iph->frag_off = htons(offset>>3);
if (frag->next)
iph->frag_off |= htons(IP_MF);
+ if (is_df_skb)
+ iph->frag_off |= htons(IP_DF);
/* Ready, complete checksum */
ip_send_check(iph);
}
--
2.0.5
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists