From patchwork Fri May 19 20:27:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Stringer X-Patchwork-Id: 764849 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wV05S0Stwz9s2Q for ; Sat, 20 May 2017 06:29:16 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id E06E2BC9; Fri, 19 May 2017 20:27:52 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 41670BAD for ; Fri, 19 May 2017 20:27:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net [217.70.183.200]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 1AE571A5 for ; Fri, 19 May 2017 20:27:48 +0000 (UTC) Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) by relay7-d.mail.gandi.net (Postfix) with ESMTPS id EB8C0D0E; Fri, 19 May 2017 22:27:46 +0200 (CEST) Received: from mfilter17-d.gandi.net (mfilter17-d.gandi.net [217.70.178.145]) by relay3-d.mail.gandi.net (Postfix) with ESMTP id DA00CA80D2; Fri, 19 May 2017 22:27:46 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mfilter17-d.gandi.net Received: from relay3-d.mail.gandi.net ([IPv6:::ffff:217.70.183.195]) by mfilter17-d.gandi.net (mfilter17-d.gandi.net [::ffff:10.0.15.180]) (amavisd-new, port 10024) with ESMTP id 6uYUfB38tuaO; Fri, 19 May 2017 22:27:45 +0200 (CEST) X-Originating-IP: 208.91.1.34 Received: from carno.eng.vmware.com (unknown [208.91.1.34]) (Authenticated sender: joe@ovn.org) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 8789DA80BE; Fri, 19 May 2017 22:27:44 +0200 (CEST) From: Joe Stringer To: dev@openvswitch.org Date: Fri, 19 May 2017 13:27:35 -0700 Message-Id: <20170519202736.5685-3-joe@ovn.org> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20170519202736.5685-1-joe@ovn.org> References: <20170519202736.5685-1-joe@ovn.org> X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: e@erig.me Subject: [ovs-dev] [PATCH 2/3] dpif-netlink-rtnl: Use getlink() in common verify path. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org The calls here were duplicated across each tunnel protocol. Signed-off-by: Joe Stringer Acked-by: Greg Rose Acked-by: Eric Garver --- lib/dpif-netlink-rtnl.c | 100 +++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 57 deletions(-) diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c index 0ca6529e9d82..76ab0fe3fdec 100644 --- a/lib/dpif-netlink-rtnl.c +++ b/lib/dpif-netlink-rtnl.c @@ -160,34 +160,23 @@ rtnl_policy_parse(const char *kind, struct ofpbuf *reply, static int dpif_netlink_rtnl_vxlan_verify(const struct netdev_tunnel_config *tnl_cfg, - const char *name, const char *kind) + const char *kind, struct ofpbuf *reply) { - struct ofpbuf *reply; + struct nlattr *vxlan[ARRAY_SIZE(vxlan_policy)]; int err; - err = dpif_netlink_rtnl_getlink(name, &reply); - + err = rtnl_policy_parse(kind, reply, vxlan_policy, vxlan, + ARRAY_SIZE(vxlan_policy)); if (!err) { - struct nlattr *vxlan[ARRAY_SIZE(vxlan_policy)]; - - err = rtnl_policy_parse(kind, reply, vxlan_policy, vxlan, - ARRAY_SIZE(vxlan_policy)); - if (!err) { - if (0 != nl_attr_get_u8(vxlan[IFLA_VXLAN_LEARNING]) - || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_COLLECT_METADATA]) - || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) - || (tnl_cfg->dst_port - != nl_attr_get_be16(vxlan[IFLA_VXLAN_PORT]))) { - err = EINVAL; - } - } - if (!err) { - if (tnl_cfg->exts & (1 << OVS_VXLAN_EXT_GBP) - && !nl_attr_get_flag(vxlan[IFLA_VXLAN_GBP])) { - err = EINVAL; - } + if (0 != nl_attr_get_u8(vxlan[IFLA_VXLAN_LEARNING]) + || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_COLLECT_METADATA]) + || 1 != nl_attr_get_u8(vxlan[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) + || (tnl_cfg->dst_port + != nl_attr_get_be16(vxlan[IFLA_VXLAN_PORT])) + || (tnl_cfg->exts & (1 << OVS_VXLAN_EXT_GBP) + && !nl_attr_get_flag(vxlan[IFLA_VXLAN_GBP]))) { + err = EINVAL; } - ofpbuf_delete(reply); } return err; @@ -195,24 +184,17 @@ dpif_netlink_rtnl_vxlan_verify(const struct netdev_tunnel_config *tnl_cfg, static int dpif_netlink_rtnl_gre_verify(const struct netdev_tunnel_config OVS_UNUSED *tnl, - const char *name, const char *kind) + const char *kind, struct ofpbuf *reply) { - struct ofpbuf *reply; + struct nlattr *gre[ARRAY_SIZE(gre_policy)]; int err; - err = dpif_netlink_rtnl_getlink(name, &reply); - + err = rtnl_policy_parse(kind, reply, gre_policy, gre, + ARRAY_SIZE(gre_policy)); if (!err) { - struct nlattr *gre[ARRAY_SIZE(gre_policy)]; - - err = rtnl_policy_parse(kind, reply, gre_policy, gre, - ARRAY_SIZE(gre_policy)); - if (!err) { - if (!nl_attr_get_flag(gre[IFLA_GRE_COLLECT_METADATA])) { - err = EINVAL; - } + if (!nl_attr_get_flag(gre[IFLA_GRE_COLLECT_METADATA])) { + err = EINVAL; } - ofpbuf_delete(reply); } return err; @@ -220,27 +202,20 @@ dpif_netlink_rtnl_gre_verify(const struct netdev_tunnel_config OVS_UNUSED *tnl, static int dpif_netlink_rtnl_geneve_verify(const struct netdev_tunnel_config *tnl_cfg, - const char *name, const char *kind) + const char *kind, struct ofpbuf *reply) { - struct ofpbuf *reply; + struct nlattr *geneve[ARRAY_SIZE(geneve_policy)]; int err; - err = dpif_netlink_rtnl_getlink(name, &reply); - + err = rtnl_policy_parse(kind, reply, geneve_policy, geneve, + ARRAY_SIZE(geneve_policy)); if (!err) { - struct nlattr *geneve[ARRAY_SIZE(geneve_policy)]; - - err = rtnl_policy_parse(kind, reply, geneve_policy, geneve, - ARRAY_SIZE(geneve_policy)); - if (!err) { - if (!nl_attr_get_flag(geneve[IFLA_GENEVE_COLLECT_METADATA]) - || 1 != nl_attr_get_u8(geneve[IFLA_GENEVE_UDP_ZERO_CSUM6_RX]) - || (tnl_cfg->dst_port - != nl_attr_get_be16(geneve[IFLA_GENEVE_PORT]))) { - err = EINVAL; - } + if (!nl_attr_get_flag(geneve[IFLA_GENEVE_COLLECT_METADATA]) + || 1 != nl_attr_get_u8(geneve[IFLA_GENEVE_UDP_ZERO_CSUM6_RX]) + || (tnl_cfg->dst_port + != nl_attr_get_be16(geneve[IFLA_GENEVE_PORT]))) { + err = EINVAL; } - ofpbuf_delete(reply); } return err; @@ -250,20 +225,30 @@ static int dpif_netlink_rtnl_verify(const struct netdev_tunnel_config *tnl_cfg, enum ovs_vport_type type, const char *name) { + struct ofpbuf *reply; const char *kind; + int err; kind = vport_type_to_kind(type); if (!kind) { return EOPNOTSUPP; } + err = dpif_netlink_rtnl_getlink(name, &reply); + if (err) { + return err; + } + switch (type) { case OVS_VPORT_TYPE_VXLAN: - return dpif_netlink_rtnl_vxlan_verify(tnl_cfg, name, kind); + err = dpif_netlink_rtnl_vxlan_verify(tnl_cfg, kind, reply); + break; case OVS_VPORT_TYPE_GRE: - return dpif_netlink_rtnl_gre_verify(tnl_cfg, name, kind); + err = dpif_netlink_rtnl_gre_verify(tnl_cfg, kind, reply); + break; case OVS_VPORT_TYPE_GENEVE: - return dpif_netlink_rtnl_geneve_verify(tnl_cfg, name, kind); + err = dpif_netlink_rtnl_geneve_verify(tnl_cfg, kind, reply); + break; case OVS_VPORT_TYPE_NETDEV: case OVS_VPORT_TYPE_INTERNAL: case OVS_VPORT_TYPE_LISP: @@ -271,10 +256,11 @@ dpif_netlink_rtnl_verify(const struct netdev_tunnel_config *tnl_cfg, case OVS_VPORT_TYPE_UNSPEC: case __OVS_VPORT_TYPE_MAX: default: - return EOPNOTSUPP; + err = EOPNOTSUPP; } - return 0; + ofpbuf_delete(reply); + return err; } static int