From patchwork Mon Oct 26 21:01:45 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "John W. Linville" X-Patchwork-Id: 536239 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 F05CB141352 for ; Tue, 27 Oct 2015 08:15:22 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752282AbbJZVPS (ORCPT ); Mon, 26 Oct 2015 17:15:18 -0400 Received: from charlotte.tuxdriver.com ([70.61.120.58]:59260 "EHLO smtp.tuxdriver.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751404AbbJZVPQ (ORCPT ); Mon, 26 Oct 2015 17:15:16 -0400 Received: from uucp by smtp.tuxdriver.com with local-rmail (Exim 4.63) (envelope-from ) id 1Zqp6j-0001XR-KE; Mon, 26 Oct 2015 17:15:09 -0400 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by localhost.localdomain (8.15.2/8.14.6) with ESMTP id t9QLAMY5031346; Mon, 26 Oct 2015 17:10:22 -0400 Received: (from linville@localhost) by localhost.localdomain (8.15.2/8.15.2/Submit) id t9QLAMnn031345; Mon, 26 Oct 2015 17:10:22 -0400 From: "John W. Linville" To: netdev@vger.kernel.org Cc: Dave Miller , Pravin B Shelar , Jesse Gross , Jiri Benc , =?UTF-8?q?YOSHIFUJI=20Hideaki/=E5=90=89=E8=97=A4=E8=8B=B1=E6=98=8E?= , "John W. Linville" Subject: [PATCH v7 2/3] geneve: handle ipv6 priority like ipv4 tos Date: Mon, 26 Oct 2015 17:01:45 -0400 Message-Id: <1445893306-31225-2-git-send-email-linville@tuxdriver.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1445893306-31225-1-git-send-email-linville@tuxdriver.com> References: <1445611225-27095-1-git-send-email-linville@tuxdriver.com> <1445893306-31225-1-git-send-email-linville@tuxdriver.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Other callers of udp_tunnel6_xmit_skb just pass 0 for the prio argument. Jesse Gross suggested that prio is really the same as IPv4's tos and should be handled the same, so this is my interpretation of that suggestion. Signed-off-by: John W. Linville Reported-by: Jesse Gross Reviewed-by: Jesse Gross --- v7 -- same as previous revisions drivers/net/geneve.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 393b0bddf7cf..44e724508c55 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -763,6 +763,7 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb, struct geneve_dev *geneve = netdev_priv(dev); struct geneve_sock *gs6 = geneve->sock6; struct dst_entry *dst = NULL; + __u8 prio; memset(fl6, 0, sizeof(*fl6)); fl6->flowi6_mark = skb->mark; @@ -771,7 +772,16 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb, if (info) { fl6->daddr = info->key.u.ipv6.dst; fl6->saddr = info->key.u.ipv6.src; + fl6->flowi6_tos = RT_TOS(info->key.tos); } else { + prio = geneve->tos; + if (prio == 1) { + const struct iphdr *iip = ip_hdr(skb); + + prio = ip_tunnel_get_dsfield(iip, skb); + } + + fl6->flowi6_tos = RT_TOS(prio); fl6->daddr = geneve->remote.sin6.sin6_addr; } @@ -897,9 +907,10 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, struct geneve_dev *geneve = netdev_priv(dev); struct geneve_sock *gs6 = geneve->sock6; struct dst_entry *dst = NULL; + const struct iphdr *iip; /* interior IP header */ int err = -EINVAL; struct flowi6 fl6; - __u8 ttl; + __u8 prio, ttl; __be16 sport; bool udp_csum; bool xnet = !net_eq(geneve->net, dev_net(geneve->dev)); @@ -920,6 +931,8 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); skb_reset_mac_header(skb); + iip = ip_hdr(skb); + if (info) { const struct ip_tunnel_key *key = &info->key; u8 *opts = NULL; @@ -936,6 +949,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, if (unlikely(err)) goto err; + prio = ip_tunnel_ecn_encap(key->tos, iip, skb); ttl = key->ttl; } else { udp_csum = false; @@ -944,13 +958,14 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, if (unlikely(err)) goto err; + prio = ip_tunnel_ecn_encap(fl6.flowi6_tos, iip, skb); ttl = geneve->ttl; if (!ttl && ipv6_addr_is_multicast(&fl6.daddr)) ttl = 1; ttl = ttl ? : ip6_dst_hoplimit(dst); } err = udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev, - &fl6.saddr, &fl6.daddr, 0, ttl, + &fl6.saddr, &fl6.daddr, prio, ttl, sport, geneve->dst_port, !udp_csum); iptunnel_xmit_stats(err, &dev->stats, dev->tstats);