From patchwork Wed Oct 17 01:04:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 46925 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id ADC7C5B16; Wed, 17 Oct 2018 03:04:46 +0200 (CEST) Received: from mail-qk1-f195.google.com (mail-qk1-f195.google.com [209.85.222.195]) by dpdk.org (Postfix) with ESMTP id 6F0A258FE for ; Wed, 17 Oct 2018 03:04:44 +0200 (CEST) Received: by mail-qk1-f195.google.com with SMTP id v68-v6so15445245qka.2 for ; Tue, 16 Oct 2018 18:04:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2UELdy0yPdq1PAyRC8o+AggKNGplVW0JzBg4affyT1Q=; b=Kr+T7o7PqJx3Emf8GieLU68vAu16yT46bC/YisB4OOxNCfcA7zXy2T54lgdTD5BPuY M1uMv10db92NXr3mDCb6VVUiY3sdcVhmjNK565+oYmx/RzKz+aQi3wCBXxomFgf7xbD9 9iIXK8DAmIdYoNfQIvbBpVOeUKL/HRbp7ZxSWYCn1g74vSqwM3N2ZZrGoJEZA/GN8vVm MhkTiS8T9o5hnhQegYM4Yvnj0b6BDfG3ybLKY8wQ5meBmhwPDHGd3Bb22Ebk4w7TLqKF SKYJ6S9Ooan7ad2N4/9EfL2OgoapsY8O76C6IiqqkzrlOJfkM85PP3LIcmiTWUCVlo5S UMRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=2UELdy0yPdq1PAyRC8o+AggKNGplVW0JzBg4affyT1Q=; b=AYRgeyzb0dG47TtWOfEgmgbgl+Nc+EEDqHQy5ogz+VwQS1evuP9AQava4+Z6eibVXV B79GeCpy/Ls5JOxFrTQ2M8vZ8JniAJ1Dyz4eDHcgHBF1/KLFtHWsw2FWBHbtIuzXvrm+ w6MvbGybg7C7lsBnOmOZ6HE+FjGaKLKUEth3WtmASprETyqLc5Vya0EhPCyk4GgqmNtN 26+XcCfRdvIWvGj1RVcAAnvUckP4JEOQRUYfqarh6Hzbd5AiJW/UAHtk6HHuZuTpDU/b K3zr9t05sDUcdMNuEpuTYFf0opqsNlmZ0bkEqctkLI7dAJ98IDS/E+lFI7g9sZ9Vn31m 2Kyg== X-Gm-Message-State: ABuFfohnisgepgBd1vH1QNTSl8LRqFNKY6GG3nMkmehE+n/GhGAp3oiJ lJxTXs98J8ZFuSwWoztDBLLu/DHfG+0= X-Google-Smtp-Source: ACcGV62YrZhTpUOfwOQzzAV73D9NO7uJ1YmzQEyVES/w3BYUn2+/Cm51T326gGcOj89b6T8FrLAF1w== X-Received: by 2002:a37:a512:: with SMTP id o18-v6mr21643861qke.232.1539738283508; Tue, 16 Oct 2018 18:04:43 -0700 (PDT) Received: from snappy.local.lan ([187.74.142.5]) by smtp.gmail.com with ESMTPSA id v54-v6sm19547508qtc.81.2018.10.16.18.04.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 16 Oct 2018 18:04:42 -0700 (PDT) From: Dan Gora To: dev@dpdk.org Cc: Igor Ryzhov , Stephen Hemminger , Ferruh Yigit , Dan Gora Date: Tue, 16 Oct 2018 22:04:10 -0300 Message-Id: <20181017010412.23141-4-dg@adax.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180911232906.18352-1-dg@adax.com> References: <20180911232906.18352-1-dg@adax.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v4 3/6] kni: set default carrier state of interface X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add module parameter 'carrier='on|off' to set the default carrier state for linux network interfaces created by the KNI module. The default carrier state is 'off'. For KNI interfaces which need to reflect the carrier state of a physical Ethernet port controlled by the DPDK application, the default carrier state should be left set to 'off'. The application can set the carrier state of the KNI interface to reflect the state of the physical Ethernet port using rte_kni_update_link(). For KNI interfaces which are purely virtual, the default carrier state can be set to 'on'. This enables the KNI interface to be used without having to explicity set the carrier state to 'on' using rte_kni_update_link(). Signed-off-by: Dan Gora --- kernel/linux/kni/kni_dev.h | 3 +++ kernel/linux/kni/kni_misc.c | 40 +++++++++++++++++++++++++++++++++++++ kernel/linux/kni/kni_net.c | 5 +++++ 3 files changed, 48 insertions(+) diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h index 6275ef27f..688f574a4 100644 --- a/kernel/linux/kni/kni_dev.h +++ b/kernel/linux/kni/kni_dev.h @@ -29,6 +29,9 @@ #define MBUF_BURST_SZ 32 +/* Default carrier state for created KNI network interfaces */ +extern uint32_t dflt_carrier; + /** * A structure describing the private information for a kni device. */ diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c index fa69f8e63..a5e7af2a6 100644 --- a/kernel/linux/kni/kni_misc.c +++ b/kernel/linux/kni/kni_misc.c @@ -39,6 +39,10 @@ static char *lo_mode; static char *kthread_mode; static uint32_t multiple_kthread_on; +/* Default carrier state for created KNI network interfaces */ +static char *carrier; +uint32_t dflt_carrier; + #define KNI_DEV_IN_USE_BIT_NUM 0 /* Bit number for device in use */ static int kni_net_id; @@ -466,6 +470,8 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num, return -ENODEV; } + netif_carrier_off(net_dev); + ret = kni_run_thread(knet, kni, dev_info.force_bind); if (ret != 0) return ret; @@ -590,6 +596,22 @@ kni_parse_kthread_mode(void) return 0; } +static int __init +kni_parse_carrier_state(void) +{ + if (!carrier) + dflt_carrier = 0; + + if (strcmp(carrier, "off") == 0) + dflt_carrier = 0; + else if (strcmp(carrier, "on") == 0) + dflt_carrier = 1; + else + return -1; + + return 0; +} + static int __init kni_init(void) { @@ -605,6 +627,16 @@ kni_init(void) else pr_debug("Multiple kernel thread mode enabled\n"); + if (kni_parse_carrier_state() < 0) { + pr_err("Invalid parameter for carrier\n"); + return -EINVAL; + } + + if (dflt_carrier == 0) + pr_debug("Default carrier state set to off.\n"); + else + pr_debug("Default carrier state set to on.\n"); + #ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS rc = register_pernet_subsys(&kni_net_ops); #else @@ -663,3 +695,11 @@ MODULE_PARM_DESC(kthread_mode, " multiple Multiple kernel thread mode enabled.\n" "\n" ); + +module_param(carrier, charp, S_IRUGO); +MODULE_PARM_DESC(carrier, +"Defaul carrier state for KNI interface (default=off):\n" +" off Interfaces will be created with carrier state set to off.\n" +" on Interfaces will be created with carrier state set to on.\n" +"\n" +); diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c index 3a542d737..7371b6d58 100644 --- a/kernel/linux/kni/kni_net.c +++ b/kernel/linux/kni/kni_net.c @@ -133,6 +133,10 @@ kni_net_open(struct net_device *dev) struct kni_dev *kni = netdev_priv(dev); netif_start_queue(dev); + if (dflt_carrier == 1) + netif_carrier_on(dev); + else + netif_carrier_off(dev); memset(&req, 0, sizeof(req)); req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF; @@ -152,6 +156,7 @@ kni_net_release(struct net_device *dev) struct kni_dev *kni = netdev_priv(dev); netif_stop_queue(dev); /* can't transmit any more */ + netif_carrier_off(dev); memset(&req, 0, sizeof(req)); req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;