From patchwork Thu Nov 2 19:05:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Flavio Leitner X-Patchwork-Id: 833519 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) 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 3ySZyj5xdNz9sMN for ; Fri, 3 Nov 2017 06:34:05 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 54950E8F; Thu, 2 Nov 2017 19:06:09 +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 D2AE9E84 for ; Thu, 2 Nov 2017 19:06:07 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 2AF2F463 for ; Thu, 2 Nov 2017 19:06:07 +0000 (UTC) Received: by mail-qt0-f194.google.com with SMTP id z28so631608qtz.13 for ; Thu, 02 Nov 2017 12:06:07 -0700 (PDT) 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=psU8SjEtr+57Rdt3NuB0/eKiuvLxHa9JvLOg9n9kXjk=; b=ZIH2UjM3HinTefTMckCHKXCwlccKGg1OWWjZ4cNSEv0ND8hfM6LMVQbFNUYUPJ5cZk QGjqOFuFSLmfUPyiP6pXk7FPX3CZjKKO238IZhhLcZ1dr/YFi98pt6LNeR+rk5a8/ZNj 9fO/FuSuc85+CupU3I4gx/5/+dU+sGrQJtSydqBRKHx495YC2KkRuJftsirhAQ7fMA7r 1IvQ0Ns3j1ou7qyXxr31Ew7ttvL+xNntQrBBzrIOvWtzZqDuOOCuPMNB1P2jw4OzfF/w fGDfmvMr6JDYsaNIKXkzapmxCmpMJ7y1pzfJGny5Qb4nE7XVjmPujxPKK0tk86C59ooZ J9GA== X-Gm-Message-State: AMCzsaVyxH0tKysDX2JaFF3yhrPSnOwD6CaavRdzTU6zseXmeDd9/12Q lfIP5Ej6isNm40kX2Hag47nIOBareXw= X-Google-Smtp-Source: ABhQp+S2ZiHlgL+Y+VsUDIxYR78XacAc3BmIp5VPPcCrOwCDNoUXqsMuppiVzGib19Ubh06sPXzlpg== X-Received: by 10.200.28.42 with SMTP id a39mr6734930qtk.126.1509649566129; Thu, 02 Nov 2017 12:06:06 -0700 (PDT) Received: from localhost ([177.40.123.73]) by smtp.gmail.com with ESMTPSA id u123sm2479274qkh.25.2017.11.02.12.06.05 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 02 Nov 2017 12:06:05 -0700 (PDT) From: Flavio Leitner To: dev@openvswitch.org Date: Thu, 2 Nov 2017 17:05:09 -0200 Message-Id: <20171102190509.2688-9-fbl@redhat.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171102190509.2688-1-fbl@redhat.com> References: <20171102190509.2688-1-fbl@redhat.com> X-Spam-Status: No, score=0.5 required=5.0 tests=RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, T_FILL_THIS_FORM_SHORT autolearn=disabled version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Flavio Leitner , Jiri Benc Subject: [ovs-dev] [PATCH 8/8] netdev-linux: fail ops not supporting remote netns. 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 When the netdev is in another namespace and the operation doesn't support network namespaces, return the correct error. Signed-off-by: Flavio Leitner --- lib/netdev-linux.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 120 insertions(+), 14 deletions(-) diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index b40b7b920..1d948c956 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -1341,6 +1341,11 @@ netdev_linux_send(struct netdev *netdev_, int qid OVS_UNUSED, int sock = 0; if (!is_tap_netdev(netdev_)) { + if (netdev_linux_netns_is_remote(netdev_linux_cast(netdev_))) { + error = EOPNOTSUPP; + goto free_batch; + } + sock = af_packet_sock(); if (sock < 0) { error = -sock; @@ -1400,6 +1405,10 @@ netdev_linux_set_etheraddr(struct netdev *netdev_, const struct eth_addr mac) int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } if (netdev->cache_valid & VALID_ETHERADDR) { error = netdev->ether_addr_error; @@ -1513,6 +1522,11 @@ netdev_linux_set_mtu(struct netdev *netdev_, int mtu) int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + if (netdev->cache_valid & VALID_MTU) { error = netdev->netdev_mtu_error; if (error || netdev->mtu == mtu) { @@ -1542,9 +1556,14 @@ netdev_linux_get_ifindex(const struct netdev *netdev_) int ifindex, error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } error = get_ifindex(netdev_, &ifindex); - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error ? -error : ifindex; } @@ -2085,6 +2104,11 @@ netdev_linux_get_features(const struct netdev *netdev_, int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + netdev_linux_read_features(netdev); if (!netdev->get_features_error) { *current = netdev->current; @@ -2093,8 +2117,9 @@ netdev_linux_get_features(const struct netdev *netdev_, *peer = 0; /* XXX */ } error = netdev->get_features_error; - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2110,6 +2135,12 @@ netdev_linux_set_advertisements(struct netdev *netdev_, ovs_mutex_lock(&netdev->mutex); COVERAGE_INC(netdev_get_ethtool); + + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + memset(&ecmd, 0, sizeof ecmd); error = netdev_linux_do_ethtool(netdev_get_name(netdev_), &ecmd, ETHTOOL_GSET, "ETHTOOL_GSET"); @@ -2187,6 +2218,11 @@ netdev_linux_set_policing(struct netdev *netdev_, : kbits_burst); /* Stick with user-specified value. */ ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto out; + } + if (netdev->cache_valid & VALID_POLICING) { error = netdev->netdev_policing_error; if (error || (netdev->kbits_rate == kbits_rate && @@ -2323,6 +2359,11 @@ netdev_linux_get_qos(const struct netdev *netdev_, int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = tc_query_qdisc(netdev_); if (!error) { *typep = netdev->tc->ops->ovs_name; @@ -2330,8 +2371,9 @@ netdev_linux_get_qos(const struct netdev *netdev_, ? netdev->tc->ops->qdisc_get(netdev_, details) : 0); } - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2353,6 +2395,11 @@ netdev_linux_set_qos(struct netdev *netdev_, } ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = tc_query_qdisc(netdev_); if (error) { goto exit; @@ -2386,6 +2433,11 @@ netdev_linux_get_queue(const struct netdev *netdev_, int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = tc_query_qdisc(netdev_); if (!error) { struct tc_queue *queue = tc_find_queue(netdev_, queue_id); @@ -2393,8 +2445,9 @@ netdev_linux_get_queue(const struct netdev *netdev_, ? netdev->tc->ops->class_get(netdev_, queue, details) : ENOENT); } - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2406,6 +2459,11 @@ netdev_linux_set_queue(struct netdev *netdev_, int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = tc_query_qdisc(netdev_); if (!error) { error = (queue_id < netdev->tc->ops->n_queues @@ -2413,8 +2471,9 @@ netdev_linux_set_queue(struct netdev *netdev_, ? netdev->tc->ops->class_set(netdev_, queue_id, details) : EINVAL); } - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2425,6 +2484,11 @@ netdev_linux_delete_queue(struct netdev *netdev_, unsigned int queue_id) int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = tc_query_qdisc(netdev_); if (!error) { if (netdev->tc->ops->class_delete) { @@ -2436,8 +2500,9 @@ netdev_linux_delete_queue(struct netdev *netdev_, unsigned int queue_id) error = EINVAL; } } - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2450,6 +2515,11 @@ netdev_linux_get_queue_stats(const struct netdev *netdev_, int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = tc_query_qdisc(netdev_); if (!error) { if (netdev->tc->ops->class_get_stats) { @@ -2465,8 +2535,9 @@ netdev_linux_get_queue_stats(const struct netdev *netdev_, error = EOPNOTSUPP; } } - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2509,10 +2580,15 @@ struct netdev_linux_queue_state { static int netdev_linux_queue_dump_start(const struct netdev *netdev_, void **statep) { - const struct netdev_linux *netdev = netdev_linux_cast(netdev_); + struct netdev_linux *netdev = netdev_linux_cast(netdev_); int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = tc_query_qdisc(netdev_); if (!error) { if (netdev->tc->ops->class_get) { @@ -2533,8 +2609,9 @@ netdev_linux_queue_dump_start(const struct netdev *netdev_, void **statep) error = EOPNOTSUPP; } } - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2542,11 +2619,16 @@ static int netdev_linux_queue_dump_next(const struct netdev *netdev_, void *state_, unsigned int *queue_idp, struct smap *details) { - const struct netdev_linux *netdev = netdev_linux_cast(netdev_); + struct netdev_linux *netdev = netdev_linux_cast(netdev_); struct netdev_linux_queue_state *state = state_; int error = EOF; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + while (state->cur_queue < state->n_queues) { unsigned int queue_id = state->queues[state->cur_queue++]; struct tc_queue *queue = tc_find_queue(netdev_, queue_id); @@ -2557,8 +2639,9 @@ netdev_linux_queue_dump_next(const struct netdev *netdev_, void *state_, break; } } - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2581,6 +2664,11 @@ netdev_linux_dump_queue_stats(const struct netdev *netdev_, int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = tc_query_qdisc(netdev_); if (!error) { struct queue_dump_state state; @@ -2607,8 +2695,9 @@ netdev_linux_dump_queue_stats(const struct netdev *netdev_, } } } - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2620,6 +2709,11 @@ netdev_linux_set_in4(struct netdev *netdev_, struct in_addr address, int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = do_set_addr(netdev_, SIOCSIFADDR, "SIOCSIFADDR", address); if (!error) { if (address.s_addr != INADDR_ANY) { @@ -2628,8 +2722,8 @@ netdev_linux_set_in4(struct netdev *netdev_, struct in_addr address, } } +exit: ovs_mutex_unlock(&netdev->mutex); - return error; } @@ -2644,9 +2738,15 @@ netdev_linux_get_addr_list(const struct netdev *netdev_, int error; ovs_mutex_lock(&netdev->mutex); + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } + error = netdev_get_addrs(netdev_get_name(netdev_), addr, mask, n_cnt); - ovs_mutex_unlock(&netdev->mutex); +exit: + ovs_mutex_unlock(&netdev->mutex); return error; } @@ -2887,6 +2987,10 @@ netdev_linux_update_flags(struct netdev *netdev_, enum netdev_flags off, ovs_mutex_lock(&netdev->mutex); if (on || off) { /* Changing flags over netlink isn't support yet. */ + if (netdev_linux_netns_is_remote(netdev)) { + error = EOPNOTSUPP; + goto exit; + } error = update_flags(netdev, off, on, old_flagsp); } else { /* Try reading flags over netlink, or fall back to ioctl. */ @@ -2896,6 +3000,8 @@ netdev_linux_update_flags(struct netdev *netdev_, enum netdev_flags off, error = update_flags(netdev, off, on, old_flagsp); } } + +exit: ovs_mutex_unlock(&netdev->mutex); return error; }