From patchwork Mon Jun 6 10:03:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans Dedecker X-Patchwork-Id: 630775 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rNVhp50X3z9t64 for ; Mon, 6 Jun 2016 20:06:18 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=OQvmivI1; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1b9rOY-00007P-PA; Mon, 06 Jun 2016 10:04:30 +0000 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1b9rOU-0008WN-GX for lede-dev@lists.infradead.org; Mon, 06 Jun 2016 10:04:27 +0000 Received: by mail-wm0-x241.google.com with SMTP id m124so14035972wme.3 for ; Mon, 06 Jun 2016 03:04:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=a22X8ATUQHv6n0vQ9O4mM6jY5mkQc9UxB+1jcck4tf4=; b=OQvmivI1xcEjuoBgwQ2d0P8/qU+ui72Pck781mCAcr5lcoV5Idgjk2YgF3jPJCBO8t 5Smajdxb23L5DxhxJr5fmpYNt45Jp85k+G64XKkQxEaeRRoGVDciSgFF9GD2Q+VOXPiQ WxXCEuOPXvH/XOtX6qdJBi9bFjEfkNTMdvQ8hzAW+2xqqZGpDI66Gr5GW15ipI/OWnpb Kki9L0iKI9yljghTU8Ef1YyFPuS0M8um7gVqjYIwYkWlI+NIRKsEvcTjm2IeZw+fpOS9 od+iBdgyseqfKNzmbMBGD2f95GkH1rGk1oFS0EgsRXjHNtxb1N+0ekwBDjvDGCA681mq upyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=a22X8ATUQHv6n0vQ9O4mM6jY5mkQc9UxB+1jcck4tf4=; b=HeSvc04iP+7aLURTOFbnI/u07bj4UDdVf2RzJ8uDA6hk4CoQeLnXTX3ZLp+N1EZTHl xCanGzGhovt+112uKRi5WfQsDSNxotAfeQJilDG8lXvWSSzNGwAcqtehLG11SRj5TYPo ChmS8GPuRYKEO/bDjk5b+pHHbi+zQnBG77PZKnX5j8zELxMk6cEeKVNrHhFpAbraMwFu 8fd1e1eO2/WW3445OUixGzi87/o1IKZ1pvnlUkhcPdxy20gSvcPVKqsykIZUP8Dw/DLH VrmLOdaD5RITCDnYKBYBexpLeqcjrpUyvVPCQCz90RFGBLPwxgAVIUPjCE6je1lCzRTD jiqw== X-Gm-Message-State: ALyK8tLAIVaEkp50g9u4uSqiwGzoDv8ZsNjKS3Do6vIFIHmbfgfceZCT7AHrqZtkRKV3lQ== X-Received: by 10.194.103.105 with SMTP id fv9mr14747376wjb.162.1465207444604; Mon, 06 Jun 2016 03:04:04 -0700 (PDT) Received: from cplx43.eu.thmulti.com ([141.11.62.7]) by smtp.gmail.com with ESMTPSA id a199sm379839wma.2.2016.06.06.03.04.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 06 Jun 2016 03:04:04 -0700 (PDT) From: Hans Dedecker To: lede-dev@lists.infradead.org, openwrt-devel@lists.openwrt.org Date: Mon, 6 Jun 2016 12:03:41 +0200 Message-Id: <1465207423-20413-1-git-send-email-dedeckeh@gmail.com> X-Mailer: git-send-email 1.9.1 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160606_030426_751954_CBE8BBD5 X-CRM114-Status: GOOD ( 14.94 ) X-Spam-Score: -2.7 (--) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-2.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [2a00:1450:400c:c09:0:0:0:241 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dedeckeh[at]gmail.com) -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid Subject: [LEDE-DEV] [PATCH netifd 1/3] device: Fix device find failure in avl list due to device name change X-BeenThere: lede-dev@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hans Dedecker , jo@mein.io, steven@midlink.org, nbd@nbd.name MIME-Version: 1.0 Sender: "Lede-dev" Errors-To: lede-dev-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org As device name is used as key in avl list a device name change will break the avl find logic. Function device_set_ifname offers api to set the device name and re-inserts the avl node in the list when the avl key value is changed. Signed-off-by: Hans Dedecker --- alias.c | 9 +++------ device.c | 27 ++++++++++++++++++++++++--- device.h | 1 + vlan.c | 11 +++++++---- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/alias.c b/alias.c index e4bb700..6b938ca 100644 --- a/alias.c +++ b/alias.c @@ -59,13 +59,10 @@ static void alias_set_device(struct alias_device *alias, struct device *dev) alias->dev.hidden = !dev; if (dev) { device_set_ifindex(&alias->dev, dev->ifindex); - strcpy(alias->dev.ifname, dev->ifname); - device_broadcast_event(&alias->dev, DEV_EVENT_UPDATE_IFNAME); + device_set_ifname(&alias->dev, dev->ifname); device_add_user(&alias->dep, dev); - } else { - alias->dev.ifname[0] = 0; - device_broadcast_event(&alias->dev, DEV_EVENT_UPDATE_IFNAME); - } + } else + device_set_ifname(&alias->dev, ""); } static int diff --git a/device.c b/device.c index 06c4820..7149d86 100644 --- a/device.c +++ b/device.c @@ -422,14 +422,14 @@ void device_init_virtual(struct device *dev, const struct device_type *type, con assert(dev); assert(type); - if (name) - strncpy(dev->ifname, name, IFNAMSIZ); - D(DEVICE, "Initialize device '%s'\n", dev->ifname); INIT_SAFE_LIST(&dev->users); INIT_SAFE_LIST(&dev->aliases); dev->type = type; + if (name) + device_set_ifname(dev, name); + if (!dev->set_state) dev->set_state = set_device_state; } @@ -582,6 +582,27 @@ void device_set_ifindex(struct device *dev, int ifindex) device_broadcast_event(dev, DEV_EVENT_UPDATE_IFINDEX); } +int device_set_ifname(struct device *dev, const char *name) +{ + int ret = 0; + + if (!strcmp(dev->ifname, name)) + return 0; + + if (dev->avl.key) + avl_delete(&devices, &dev->avl); + + strncpy(dev->ifname, name, IFNAMSIZ); + + if (dev->avl.key) + ret = avl_insert(&devices, &dev->avl); + + if (ret == 0) + device_broadcast_event(dev, DEV_EVENT_UPDATE_IFNAME); + + return ret; +} + static int device_refcount(struct device *dev) { struct list_head *list; diff --git a/device.h b/device.h index 77a2fef..b069a2b 100644 --- a/device.h +++ b/device.h @@ -250,6 +250,7 @@ void device_broadcast_event(struct device *dev, enum device_event ev); void device_set_present(struct device *dev, bool state); void device_set_link(struct device *dev, bool state); void device_set_ifindex(struct device *dev, int ifindex); +int device_set_ifname(struct device *dev, const char *name); void device_refresh_present(struct device *dev); int device_claim(struct device_user *dep); void device_release(struct device_user *dep); diff --git a/vlan.c b/vlan.c index ac434ce..7f8697b 100644 --- a/vlan.c +++ b/vlan.c @@ -63,8 +63,11 @@ static int vlan_set_device_state(struct device *dev, bool up) static void vlan_dev_set_name(struct vlan_device *vldev, struct device *dev) { + char name[IFNAMSIZ]; + vldev->dev.hidden = dev->hidden; - snprintf(vldev->dev.ifname, IFNAMSIZ, "%s.%d", dev->ifname, vldev->id); + snprintf(name, IFNAMSIZ, "%s.%d", dev->ifname, vldev->id); + device_set_ifname(&vldev->dev, name); } static void vlan_dev_cb(struct device_user *dep, enum device_event ev) @@ -81,7 +84,6 @@ static void vlan_dev_cb(struct device_user *dep, enum device_event ev) break; case DEV_EVENT_UPDATE_IFNAME: vlan_dev_set_name(vldev, dep->dev); - device_broadcast_event(&vldev->dev, ev); break; case DEV_EVENT_TOPO_CHANGE: /* Propagate topo changes */ @@ -124,9 +126,10 @@ static struct device *get_vlan_device(struct device *dev, int id, bool create) return NULL; vldev->id = id; - vlan_dev_set_name(vldev, dev); - device_init(&vldev->dev, &vlan_type, vldev->dev.ifname); + device_init(&vldev->dev, &vlan_type, NULL); + + vlan_dev_set_name(vldev, dev); vldev->dev.default_config = true; vldev->set_state = vldev->dev.set_state;