From patchwork Wed Feb 27 03:20:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Cong Wang X-Patchwork-Id: 223487 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 7555A2C0085 for ; Wed, 27 Feb 2013 14:21:19 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755589Ab3B0DVE (ORCPT ); Tue, 26 Feb 2013 22:21:04 -0500 Received: from plane.gmane.org ([80.91.229.3]:60483 "EHLO plane.gmane.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754541Ab3B0DVD (ORCPT ); Tue, 26 Feb 2013 22:21:03 -0500 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1UAXa4-0001eP-N5 for netdev@vger.kernel.org; Wed, 27 Feb 2013 04:21:20 +0100 Received: from 180.129.247.79 ([180.129.247.79]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 27 Feb 2013 04:21:20 +0100 Received: from xiyou.wangcong by 180.129.247.79 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 27 Feb 2013 04:21:20 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: netdev@vger.kernel.org From: Cong Wang Subject: Re: Fw: [Bug 54491] New: UFO (UDP fragmentation offload) does not work if the payload size specified is within the range ( (MTU-28) to (MTU-8) ) Date: Wed, 27 Feb 2013 03:20:40 +0000 (UTC) Lines: 41 Message-ID: References: <20130226074606.4d16ebfb@nehalam.linuxnetplumber.net> Mime-Version: 1.0 X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 180.129.247.79 User-Agent: slrn/0.9.9p1 (Linux) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Tue, 26 Feb 2013 at 15:46 GMT, Stephen Hemminger wrote: > For IPv4/UDP if the payload size specified is within the range ( (MTU-28) > to (MTU-8) ) packet gets segmented in kernel even if the following netdev > features are set: > > NETIF_F_SG > NETIF_F_GEN_CSUM > NETIF_F_UFO > NETIF_F_TSO > NETIF_F_GSO > NETIF_F_GSO_ROBUST > > Analysis: > udp_sendmsg() computes packet length by adding UDP header size to payload size: > “ulen += sizeof(struct udphdr)” > Then the function calls ip_make_skb(), however IP header size is not added to > the packet length. > ip_make_skb() in turn calls __ip_append_data(). The same packet length is used > here. > __ip_append_data() compares the packet length with MTU. The packet length still > does not include IP header size (20 bytes). > In result, when payload size “is within the range ( (MTU-28) to (MTU-8) )” > standard branch is taken rather than ip_ufo_append_data(). Gso_size is not > computed, therefore IP fragmentation is triggered from ip_finish_output(). > I haven't looked into this deeply, it sounds like we need this fix: err = ip_ufo_append_data(sk, queue, getfrag, from,length, --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 5e12dca..3ccb704 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -845,7 +845,7 @@ static int __ip_append_data(struct sock *sk, csummode = CHECKSUM_PARTIAL; cork->length += length; - if (((length > mtu) || (skb &&skb_is_gso(skb))) && + if (((length + fragheaderlen > mtu) || (skb &&skb_is_gso(skb))) && (sk->sk_protocol == IPPROTO_UDP) && (rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len) {