From patchwork Mon Aug 7 15:44:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 798747 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="mMuiJ4SK"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xR20K1VxCz9s4q for ; Tue, 8 Aug 2017 01:44:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752123AbdHGPoq (ORCPT ); Mon, 7 Aug 2017 11:44:46 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:36756 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752121AbdHGPon (ORCPT ); Mon, 7 Aug 2017 11:44:43 -0400 Received: by mail-pf0-f194.google.com with SMTP id t83so737166pfj.3 for ; Mon, 07 Aug 2017 08:44:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gKU2xKWD6LZcbdo8V87hvdqpZuOw6ni9SkeTMYfojic=; b=mMuiJ4SKD4Lyj6bw/Gumfz2s3VBoUFoztvj0lT74/zxieTWZVHGEeWjCdB1uMZiLvM zhZF6QoAx2Y2csPs732YSjNYkqOagLcCGj4ZFGzVIC8gi95kZZfCfd3IpJp0z5S4AlGu Quyrzm0LUMRuKySL+9Fv0qPYki12SRbAPb/pcRnMBbG9hCA6s+6xH+lkmm+uXdvtsqok wC1zwwA7jCl8a97OTdknrcffIhRW5lFp3B5lpPq7dFyMLXV0R00HGXTbfV0Kg+oLz+vl WIEc/lKLbCcEfJvi6BJyQlSAqSIMBmC+uBDkXewlQAuvP1ImR5zacYc/SaD3L42icBQv G53A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=gKU2xKWD6LZcbdo8V87hvdqpZuOw6ni9SkeTMYfojic=; b=OCzrqyUmEvE8sw1GNolxzczMifxjrcsaW9oGr0y8vR4SkKzRx9BTMtdch9fLkrqaDQ WGVzh6bI/X9NRLWu/BzrrCKZdzf7P/IuDT5tK7EjaS3VPotxwzD6ARZhcse73wPL+JIq o7/1nnUG0gP0Yut1KQOxYvTEA4l4AVLidbJ/oAGrVmRKtu2hC3RgPBSjUYNXgqZrUrou IIl857WltAfM+LpRLmIu7QzVyxvR8Q3m8g8AmFKIearalMRn8pR5Nn36IibwofJ0IboQ 6OCh75dE273GentYFPKEtKqlez16yk2ajTm7JANeK9M6cnQA6imtR30efa5DfldyH+l/ QFDw== X-Gm-Message-State: AHYfb5jEF3O7mLGqhOcA69dGpMJtFmkF78elNzbU+wOSEni4TzJnQd7S xCsRN62BpPlIPZHP X-Received: by 10.99.1.2 with SMTP id 2mr927826pgb.213.1502120682639; Mon, 07 Aug 2017 08:44:42 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id z9sm15293652pfl.125.2017.08.07.08.44.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 07 Aug 2017 08:44:42 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: David Ahern Subject: [PATCH v3 net-next 7/7] net: ipv6: add second dif to raw socket lookups Date: Mon, 7 Aug 2017 08:44:22 -0700 Message-Id: <1502120662-1430-8-git-send-email-dsahern@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1502120662-1430-1-git-send-email-dsahern@gmail.com> References: <1502120662-1430-1-git-send-email-dsahern@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add a second device index, sdif, to raw socket lookups. sdif is the index for ingress devices enslaved to an l3mdev. It allows the lookups to consider the enslaved device as well as the L3 domain when searching for a socket. Signed-off-by: David Ahern --- include/net/rawv6.h | 2 +- net/ipv4/raw_diag.c | 2 +- net/ipv6/raw.c | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/include/net/rawv6.h b/include/net/rawv6.h index cbe4e9de1894..4addc5c988e0 100644 --- a/include/net/rawv6.h +++ b/include/net/rawv6.h @@ -6,7 +6,7 @@ extern struct raw_hashinfo raw_v6_hashinfo; struct sock *__raw_v6_lookup(struct net *net, struct sock *sk, unsigned short num, const struct in6_addr *loc_addr, - const struct in6_addr *rmt_addr, int dif); + const struct in6_addr *rmt_addr, int dif, int sdif); int raw_abort(struct sock *sk, int err); diff --git a/net/ipv4/raw_diag.c b/net/ipv4/raw_diag.c index c600d3c71d4d..c200065ef9a5 100644 --- a/net/ipv4/raw_diag.c +++ b/net/ipv4/raw_diag.c @@ -52,7 +52,7 @@ static struct sock *raw_lookup(struct net *net, struct sock *from, sk = __raw_v6_lookup(net, from, r->sdiag_raw_protocol, (const struct in6_addr *)r->id.idiag_src, (const struct in6_addr *)r->id.idiag_dst, - r->id.idiag_if); + r->id.idiag_if, 0); #endif return sk; } diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 60be012fe708..e4462b0ff801 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -72,7 +72,7 @@ EXPORT_SYMBOL_GPL(raw_v6_hashinfo); struct sock *__raw_v6_lookup(struct net *net, struct sock *sk, unsigned short num, const struct in6_addr *loc_addr, - const struct in6_addr *rmt_addr, int dif) + const struct in6_addr *rmt_addr, int dif, int sdif) { bool is_multicast = ipv6_addr_is_multicast(loc_addr); @@ -86,7 +86,9 @@ struct sock *__raw_v6_lookup(struct net *net, struct sock *sk, !ipv6_addr_equal(&sk->sk_v6_daddr, rmt_addr)) continue; - if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif) + if (sk->sk_bound_dev_if && + sk->sk_bound_dev_if != dif && + sk->sk_bound_dev_if != sdif) continue; if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr)) { @@ -178,7 +180,8 @@ static bool ipv6_raw_deliver(struct sk_buff *skb, int nexthdr) goto out; net = dev_net(skb->dev); - sk = __raw_v6_lookup(net, sk, nexthdr, daddr, saddr, inet6_iif(skb)); + sk = __raw_v6_lookup(net, sk, nexthdr, daddr, saddr, + inet6_iif(skb), inet6_sdif(skb)); while (sk) { int filtered; @@ -222,7 +225,7 @@ static bool ipv6_raw_deliver(struct sk_buff *skb, int nexthdr) } } sk = __raw_v6_lookup(net, sk_next(sk), nexthdr, daddr, saddr, - inet6_iif(skb)); + inet6_iif(skb), inet6_sdif(skb)); } out: read_unlock(&raw_v6_hashinfo.lock); @@ -378,7 +381,7 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr, net = dev_net(skb->dev); while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr, - inet6_iif(skb)))) { + inet6_iif(skb), inet6_iif(skb)))) { rawv6_err(sk, skb, NULL, type, code, inner_offset, info); sk = sk_next(sk);