From mboxrd@z Thu Jan 1 00:00:00 1970 From: Roopa Prabhu Subject: [PATCH net-next 4/5] ipv6: support sport, dport and ip protocol in RTM_GETROUTE Date: Mon, 16 Apr 2018 13:41:37 -0700 Message-ID: <1523911298-8965-5-git-send-email-roopa@cumulusnetworks.com> References: <1523911298-8965-1-git-send-email-roopa@cumulusnetworks.com> Cc: netdev@vger.kernel.org, dsa@cumulusnetworks.com To: davem@davemloft.net Return-path: Received: from mail-pl0-f66.google.com ([209.85.160.66]:45437 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750989AbeDPUls (ORCPT ); Mon, 16 Apr 2018 16:41:48 -0400 Received: by mail-pl0-f66.google.com with SMTP id k9-v6so5908173pll.12 for ; Mon, 16 Apr 2018 13:41:48 -0700 (PDT) In-Reply-To: <1523911298-8965-1-git-send-email-roopa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org List-ID: From: Roopa Prabhu This is a followup to fib6 rules sport, dport and ip proto match support. Having them supported in getroute makes it easier to test fib6 rule lookups. Used by fib6 rule self tests. Signed-off-by: Roopa Prabhu --- net/ipv6/route.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 49b954d..5086a80 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -3986,6 +3986,9 @@ static const struct nla_policy rtm_ipv6_policy[RTA_MAX+1] = { [RTA_EXPIRES] = { .type = NLA_U32 }, [RTA_UID] = { .type = NLA_U32 }, [RTA_MARK] = { .type = NLA_U32 }, + [RTA_IP_PROTO] = { .type = NLA_U8 }, + [RTA_SPORT] = { .type = NLA_U16 }, + [RTA_DPORT] = { .type = NLA_U16 }, }; static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh, @@ -4658,6 +4661,17 @@ int rt6_dump_route(struct rt6_info *rt, void *p_arg) NLM_F_MULTI); } +static int nla_get_port(struct nlattr *attr, __be16 *port) +{ + int p = nla_get_u16(attr); + + if (p <= 0 || p >= 0xffff) + return -EINVAL; + + *port = htons(p); + return 0; +} + static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, struct netlink_ext_ack *extack) { @@ -4711,6 +4725,21 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, else fl6.flowi6_uid = iif ? INVALID_UID : current_uid(); + if (tb[RTA_SPORT]) { + err = nla_get_port(tb[RTA_SPORT], &fl6.fl6_sport); + if (err) + goto errout; + } + + if (tb[RTA_DPORT]) { + err = nla_get_port(tb[RTA_DPORT], &fl6.fl6_dport); + if (err) + goto errout; + } + + if (tb[RTA_IP_PROTO]) + fl6.flowi6_proto = nla_get_u8(tb[RTA_IP_PROTO]); + if (iif) { struct net_device *dev; int flags = 0; -- 2.1.4