From patchwork Tue Nov 21 20:14:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Matyukevich X-Patchwork-Id: 840169 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=65.50.211.133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ajO4kyhe"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=quantenna.com header.i=@quantenna.com header.b="BLJo1woG"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yhH116jr5z9ryv for ; Wed, 22 Nov 2017 07:16:37 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To :From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=JsTbUgGldpxdxahpE4YAgPtbL3wAq/vUYbz9CeCITPA=; b=ajO4kyhe2HROWX f2jlj0T5bWBxSmUoN54qczjqfUMQtD1qGPVSb+nZtxcx1RSRePRixSCb7PVMLi6AMzcPDvtRj27BO 1ePib/RIEHeJjo4BlVFjuSLaOwte/hXNMWQOFxoldr05DS4aPw2jg6iZkGBDZfvCE6+KYPdhCf4ji aw5vsQFe24Hmc8KOWF4ooZREbeuFFAl8n3XEZniY76EHt1VM4x75APGDfMls747SL7nBljF9Ih4mO Bc1VnAMLYSIb4bAWuuulM5ggeGBWQVr7Rf/of/xH8uSoItG7GaWPV0Zgw76KDeO6OUU9MXl2Zdw+M Vidr44d5MLlVpN1X1isg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1eHExc-00007n-RX; Tue, 21 Nov 2017 20:16:00 +0000 Received: from mail-sn1nam02on0603.outbound.protection.outlook.com ([2a01:111:f400:fe44::603] helo=NAM02-SN1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1eHExD-00006t-7e for hostap@lists.infradead.org; Tue, 21 Nov 2017 20:15:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantenna.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=hZ3ApAuTZ/JeL9nrPIHE6vdM06AJx43nWeTSwxyTjbQ=; b=BLJo1woGh0ib9XbJhU9Rz5Ndsb3kfaLti+shPJrOOWFxzwWZjKJPJ31JojCumJcecpQezJisg5fts7O8Zx4lCmOZpwBVNflmgrJl5pnB25PVr5oDA2GSwsWhuMDn3u8Jhm34X+xOROAWDYBrEI71xlTN+1dTuKbE9U2U+dweyzw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=sergey.matyukevich.os@quantenna.com; Received: from bars.quantenna.com (195.182.157.78) by BY2PR05MB1926.namprd05.prod.outlook.com (10.163.32.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.260.2; Tue, 21 Nov 2017 20:15:07 +0000 From: Sergey Matyukevich To: hostap@lists.infradead.org Subject: [RFC] vlan: use new bridge ioctl's Date: Tue, 21 Nov 2017 23:14:45 +0300 Message-Id: <20171121201445.4253-1-sergey.matyukevich.os@quantenna.com> X-Mailer: git-send-email 2.11.0 MIME-Version: 1.0 X-Originating-IP: [195.182.157.78] X-ClientProxiedBy: HE1P191CA0012.EURP191.PROD.OUTLOOK.COM (10.172.132.150) To BY2PR05MB1926.namprd05.prod.outlook.com (10.163.32.140) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 13bd8a80-92c0-4536-645d-08d5311c8fd6 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603199); SRVR:BY2PR05MB1926; X-Microsoft-Exchange-Diagnostics: 1; BY2PR05MB1926; 3:B9kwneJkUEmtr1cMOwAQXz/yxZoXZAL9598tgI+BfcqQfat2pQBLWwi3EWKjQXhEb4IZUb2RCyF4eJwFHhOVF1VcNlEeekKKVs3IqmXnp3ZQh+IpumgSETjfXRyh/nIwtXZozpVX79nHK1PIoCWS2K0MUPPnKUjUZw8gS8QvJlOqUbXO5ViyRYQDSHjuncpPUc+964LgL9cuqexaQeQJfOk7W7wanHJ/ZJSvVLzHCjC0MsDrj2ReCGK/sgSOnhpg; 25:xNQlNmyrHMJyohyBNYyFsUs+MELapwknPz4b1F2TvfYd5RYRsC/HNIgdPFo/fhjOEVTseEtuQKbalp6EfNz9e11uD3mVJsbBrwmVjqceRBIh36dgM1f/aAdP9GVpTL53p2EwIax60mm1csKiJ/Lc1Op5cueiJLRBb4Fn/8CeuHj3h9Q9hU9RKbFhRQaUwGwu89m1NCvxWjkmgOkixBKNuOdArv2v32tQEEX+9V6hDN2xxGDt32C+2vAwalUBzCl90Jag4IdJ+B1wjE89RKl5SzB7j6KunR/BDvvhU65KzDzh+ZlCMX03iQVbfLSHh24fyYOmSbBZ/vDBfUuhzso4NA==; 31:FC8kuMVuiB+5ljPZw73f/gNEdnoxtoTlKyq+Ok0oIgjzmSJa+O3HjxJtyc5GAp7CsKx8n3VaHY2tBwQb2MLwD2A+xF/fcT3sLzRy9Nolvni2JLxr07MZ3K8gf2AabTiICx3CSl37wHz3oNPcX+7MTg+G2iZ5uUWDrYmfmWI6Dmapv5J8xeeuRQrvUlwKknrbZxWYNQWv7D5ipXXFB7fJSVvOh+FPobpDFCvWRnQ36e0= X-MS-TrafficTypeDiagnostic: BY2PR05MB1926: X-Microsoft-Exchange-Diagnostics: 1; BY2PR05MB1926; 20:47Gh0bH5Gzp3/ObdhS9epqyirmwex0kXugswAdU6V+P40xeuL4iObeNK2/64TWwnw4uBDMP6xR5R7RQ3xs0cHevaRfrLw4Gq/bwMIOWjMyMMrRVQzx2vt/1vC9mUh6VrRd/mQFiiRorZ/WSYkdwtx+R6UshXJRrRWVQn1/zvH+lq83ijTnhLWGo57R+9hZ0v3rCGcuAB0sqrBZcHavo7tXCv108CzsSBAlqJap40wim2OiOTaQI+bdi41NzaXYXdRDp2FBATsSGSlawkM9euyg/ft+vewPEIkFxw2qH71xV0haP/vwPByQPcaH+gXI9mcd63P21kxOhGiLI7HFGd1og08gV3Rbo7XJ1fF0YU75dEY92KZYwGfZA4zK2VEN8y1bMU5ivWT1lJGkN2IS78Ot2zUFHFt+qPBA5zSS5yjDIrUdEZ7rc90WqSDzEqk+xsYZklX4xY242W3NGH4gnntMZXZvhH5Drq0H+Q+k0TFQOlblUpXSQYQb0HAn6+EAlq; 4:1NR2lf91XZq7VomwAWvKyXPc96DakwniMwIaDYCMbcMp1cYIOLaVZDrExjlycwYO4OYxnOD1Q5rxCgLP4McAT+H9cBSb2N15hhy/ncujL47YYXXVpRiE3ggbjOZ9Q6Uv9a0T/h0IxswnvRXqK1k+4C9trWspeKnzasIe3/Our/Ym7go20VNV8BFhbxhRPuHyeR64EjxwR5b/k6JCMncaV+vPv2PgihG3Nb8PaXsK75jIJQSb+MIFVUt3dbm7Z0Rz7T0tkVn2P6paegoiafPhOg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(3002001)(3231022)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(6041248)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123560025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:BY2PR05MB1926; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BY2PR05MB1926; X-Forefront-PRVS: 049897979A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(39830400002)(376002)(346002)(199003)(189002)(81156014)(81166006)(8936002)(8676002)(316002)(5660300001)(16526018)(50226002)(103116003)(33646002)(54906003)(97736004)(16586007)(5003940100001)(69596002)(53416004)(53936002)(189998001)(478600001)(50986999)(2906002)(86362001)(6486002)(2351001)(6916009)(2361001)(106356001)(101416001)(25786009)(6666003)(6116002)(36756003)(48376002)(3846002)(47776003)(50466002)(105586002)(107886003)(1076002)(305945005)(4326008)(68736007)(7736002)(66066001); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR05MB1926; H:bars.quantenna.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: quantenna.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR05MB1926; 23:c63jXpLydvdS/mHys+CD7W+qxvEsg1HMfj721pWVt?= tog4fgOoLwVskxHzf1z5MYfQf6UvLgCz5dIGa9/NF0o3RKHDGMiY2F3AORawaMFdJpSH7lt1dj30XwVcNK7d2BWdAFVDTlzDaw1ix6ZHZf0Me1K4/x1olaT3t0Z9mNzKDOK06FmbzFF3AWDLXB0kNhd91pS2DcjOsJQvExDAOcQo8qjRaVnfgMy5azkLGCwCBONQCUtUMZkbwc5UUq+6SxKqV1+WU3obgZoaCSOSFZ/m+/IknCzq6AxIsP+dC7H1booo/qbr3JXx59TLbE4WXs/Cb0f8PueyJR+m2DqRmYVfYgTj+Z2N25C44FIUIikXWwUvzKDPZb38/JPwTkoFWBH0be3iR8R6xvMcjhKO/s/y9OuRDrzFpXDc6pQjC+L2yaBvdjFTmM6XYefiD3NPxk8wDP8QbpyqVCON8x3BESzMYqMdb5jeXJ7i4wgAc1ttmMgkZMTruiqGEt2rek/yr5CWvZyLktLkS6DyZKRdzq+IlA6ZsxrV4YQeymXaBxgiQdlJNYwwHxsyFaRIBr4hzOP9nDJLoc47jcaLKQGTzWCTmgIbHpIMFAJKDnS/Lm7a9iqr3ya+KUc3lrfFlWBq9XD6U9EU/X+GcxpMwOXS9wT3toDTNFtGdco4UJtAusR8C0Fwvgjzv1deX1yjvylq7xZwJqzNOrlGdpO10CAKoKJghyQEY9EOJHb0F/LVgghp1PdIm2ZFHI3r2jBc19ideqigOXHxoWDUgmRdreuAAVGCO5h0JqSykNDktWulbdBsaDzHOCya5AkRM3gNkGFDg+yIO1qKYveaX8Pyn+c5XWxdUoBrsNvfx/we8VfALm4wvHXzw5r/hjgxrvkmQS3OnB52O5WYrH+PfyYJexbgG/44QfJ6fq7ZJgSloOJvgr41nHux3LkHL581FZsG4Wy+gXutknaPoGv4niFWzXa4DizswC+jD/lFHSdqGM2MlPa+Lt/2Z/OqizQAOUpTbnkx392WSpRn9H4wBd7ffIl4VZs7ObXJ0oLrOw1hqaXTOgrHUIeYBuuKtdIYuJ/8DGKKPpEuCEMOR6nRruBsYiK914vRWYahBR0HAPnwruH4szkmwonDSDI86hfDc8ZyYrkwUp1q4WK9CWJ4sKrWaRGQZ3Zpg== X-Microsoft-Exchange-Diagnostics: 1; BY2PR05MB1926; 6:pi+pM05pque+xE2i2xVfS2gzWpcVwMUaq+mX184ixBpiLvqQQEkomjj0nC24H2c2z6h2mv+p2C1jKJR1hvgu/INbJ3sms610hb/yF8XCBqQLG7k+LAQn7FH2MGZ/VTA2ATsuysNaqaY0HoBmokvA15y6ewDyskQSCrf5ZvcokdiLoPXSew8WuzgC1dB9aVy3AZ1scz7YPaPgejBLOpJqw4PcOxpNlFrXaMpUfab4nbsZiLbU0VEYJ+Q7dJTQ8VP/pHN5yFim4IdKJV0hbgus/exgteJ80VVMAznLmeeC1LajDzcj4C+y0ybUXmR8r3juiKg/kDY0k9+a+NOGU6+6vkI6DxXkNhAl9UF+WvYy3cc=; 5:kztQugKap9A04FGSJuUa9DsTYcVGqCtJqXeREZu1xzz6KmVhlDXPNbdj+hJswCuX7zelYb6F0AzA69R9kFVxhQ1xLM+v6rMawR8wHrLikfkMuUTjdovcwO5IZ2BsMglaa//dUxCGLsu7lCuJk/tRZUh/vEozBjUiH5y9SN3x3a0=; 24:oDR0m9GaI6WI9uUWypu7wJ6LRkyRE2I40gg5ogN7YF5MPw66a9Dfh+1f6MPXb/gHjW9fElJwCvY6dkn3BDXiNUgidudzxoxXfeuPjqBdx10=; 7:7vHh/oR+KwKCtJ8eprlZn13RHe9wQ6a9/Zfh6lc+N/OJYXBZfMHPvYrUFdQNUqQtbC3CoHBrSRF5nX6mgO3hPipEfH0R8TotlVWWooYxGzrQJEJk2Qsmc/4g6yZYxwujk4k35Ctkc06toHjlAkMq4xRJsf+FRMYGqtWDbo0fy8sZEG0hY43GIbBdmEBKuJohx7j1duAmfJFLOg7iyadiP/LgWxdj/0fmM23HTKG8N/sjGrTiheYaJUTZIJuN6F1i SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: quantenna.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Nov 2017 20:15:07.2017 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 13bd8a80-92c0-4536-645d-08d5311c8fd6 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a355dbce-62b4-4789-9446-c1d5582180ff X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR05MB1926 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171121_121535_680003_90CECE3A X-CRM114-Status: GOOD ( 11.64 ) X-Spam-Score: -2.0 (--) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-2.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -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_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Igor Mitsyanko , Sergey Matyukevich Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Legacy ioctl's through SIOCDEVPRIVATE are deprecated. Follow the approach taken by bridge-utils and make use of new bridge ioctl's whenever possible. For example, using legacy ioctl's breaks dynamic VLAN mode on 32-bit Linux systems running 64-bit kernels. Signed-off-by: Sergey Matyukevich --- src/ap/vlan_full.c | 110 +++++++++++++++++++++++++++++----------------- src/common/linux_bridge.h | 15 +++++++ 2 files changed, 85 insertions(+), 40 deletions(-) diff --git a/src/ap/vlan_full.c b/src/ap/vlan_full.c index aa42335b9..b797f4b60 100644 --- a/src/ap/vlan_full.c +++ b/src/ap/vlan_full.c @@ -135,6 +135,7 @@ static int br_delif(const char *br_name, const char *if_name) struct ifreq ifr; unsigned long args[2]; int if_index; + int ret; wpa_printf(MSG_DEBUG, "VLAN: br_delif(%s, %s)", br_name, if_name); if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { @@ -153,19 +154,23 @@ static int br_delif(const char *br_name, const char *if_name) return -1; } - args[0] = BRCTL_DEL_IF; - args[1] = if_index; - os_strlcpy(ifr.ifr_name, br_name, sizeof(ifr.ifr_name)); - ifr.ifr_data = (void *) args; - if (ioctl(fd, SIOCDEVPRIVATE, &ifr) < 0 && errno != EINVAL) { - /* No error if interface already removed. */ - wpa_printf(MSG_ERROR, "VLAN: %s: ioctl[SIOCDEVPRIVATE," - "BRCTL_DEL_IF] failed for br_name=%s if_name=%s: " - "%s", __func__, br_name, if_name, strerror(errno)); - close(fd); - return -1; + ifr.ifr_ifindex = if_index; + ret = ioctl(fd, SIOCBRDELIF, &ifr); + if (ret < 0) { + args[0] = BRCTL_DEL_IF; + args[1] = if_index; + + ifr.ifr_data = (void *) args; + if (ioctl(fd, SIOCDEVPRIVATE, &ifr) < 0 && errno != EINVAL) { + /* No error if interface already removed. */ + wpa_printf(MSG_ERROR, "VLAN: %s: ioctl[SIOCDEVPRIVATE," + "BRCTL_DEL_IF] failed for br_name=%s if_name=%s: " + "%s", __func__, br_name, if_name, strerror(errno)); + close(fd); + return -1; + } } close(fd); @@ -186,6 +191,7 @@ static int br_addif(const char *br_name, const char *if_name) struct ifreq ifr; unsigned long args[2]; int if_index; + int ret; wpa_printf(MSG_DEBUG, "VLAN: br_addif(%s, %s)", br_name, if_name); if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { @@ -204,24 +210,34 @@ static int br_addif(const char *br_name, const char *if_name) return -1; } - args[0] = BRCTL_ADD_IF; - args[1] = if_index; - os_strlcpy(ifr.ifr_name, br_name, sizeof(ifr.ifr_name)); - ifr.ifr_data = (void *) args; - if (ioctl(fd, SIOCDEVPRIVATE, &ifr) < 0) { + ifr.ifr_ifindex = if_index; + ret = ioctl(fd, SIOCBRADDIF, &ifr); + if (ret < 0) { if (errno == EBUSY) { /* The interface is already added. */ close(fd); return 1; } - wpa_printf(MSG_ERROR, "VLAN: %s: ioctl[SIOCDEVPRIVATE," - "BRCTL_ADD_IF] failed for br_name=%s if_name=%s: " - "%s", __func__, br_name, if_name, strerror(errno)); - close(fd); - return -1; + args[0] = BRCTL_ADD_IF; + args[1] = if_index; + + ifr.ifr_data = (void *) args; + if (ioctl(fd, SIOCDEVPRIVATE, &ifr) < 0) { + if (errno == EBUSY) { + /* The interface is already added. */ + close(fd); + return 1; + } + + wpa_printf(MSG_ERROR, "VLAN: %s: ioctl[SIOCDEVPRIVATE," + "BRCTL_ADD_IF] failed for br_name=%s if_name=%s: " + "%s", __func__, br_name, if_name, strerror(errno)); + close(fd); + return -1; + } } close(fd); @@ -233,6 +249,7 @@ static int br_delbr(const char *br_name) { int fd; unsigned long arg[2]; + int ret; wpa_printf(MSG_DEBUG, "VLAN: br_delbr(%s)", br_name); if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { @@ -241,15 +258,18 @@ static int br_delbr(const char *br_name) return -1; } - arg[0] = BRCTL_DEL_BRIDGE; - arg[1] = (unsigned long) br_name; + ret = ioctl(fd, SIOCBRDELBR, br_name); + if (ret < 0) { + arg[0] = BRCTL_DEL_BRIDGE; + arg[1] = (unsigned long) br_name; - if (ioctl(fd, SIOCGIFBR, arg) < 0 && errno != ENXIO) { - /* No error if bridge already removed. */ - wpa_printf(MSG_ERROR, "VLAN: %s: BRCTL_DEL_BRIDGE failed for " - "%s: %s", __func__, br_name, strerror(errno)); - close(fd); - return -1; + if (ioctl(fd, SIOCGIFBR, arg) < 0 && errno != ENXIO) { + /* No error if bridge already removed. */ + wpa_printf(MSG_ERROR, "VLAN: %s: BRCTL_DEL_BRIDGE failed for " + "%s: %s", __func__, br_name, strerror(errno)); + close(fd); + return -1; + } } close(fd); @@ -269,6 +289,7 @@ static int br_addbr(const char *br_name) int fd; unsigned long arg[4]; struct ifreq ifr; + int ret; wpa_printf(MSG_DEBUG, "VLAN: br_addbr(%s)", br_name); if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { @@ -277,20 +298,29 @@ static int br_addbr(const char *br_name) return -1; } - arg[0] = BRCTL_ADD_BRIDGE; - arg[1] = (unsigned long) br_name; - - if (ioctl(fd, SIOCGIFBR, arg) < 0) { - if (errno == EEXIST) { + ret = ioctl(fd, SIOCBRADDBR, br_name); + if (ret < 0) { + if (errno == EEXIST) { /* The bridge is already added. */ close(fd); return 1; - } else { - wpa_printf(MSG_ERROR, "VLAN: %s: BRCTL_ADD_BRIDGE " - "failed for %s: %s", - __func__, br_name, strerror(errno)); - close(fd); - return -1; + } + + arg[0] = BRCTL_ADD_BRIDGE; + arg[1] = (unsigned long) br_name; + + if (ioctl(fd, SIOCGIFBR, arg) < 0) { + if (errno == EEXIST) { + /* The bridge is already added. */ + close(fd); + return 1; + } else { + wpa_printf(MSG_ERROR, "VLAN: %s: BRCTL_ADD_BRIDGE " + "failed for %s: %s", + __func__, br_name, strerror(errno)); + close(fd); + return -1; + } } } diff --git a/src/common/linux_bridge.h b/src/common/linux_bridge.h index 7b768464f..84386e60f 100644 --- a/src/common/linux_bridge.h +++ b/src/common/linux_bridge.h @@ -9,6 +9,21 @@ #ifndef LINUX_BRIDGE_H #define LINUX_BRIDGE_H +/* This ioctl is defined in linux/sockios.h */ + +#ifndef SIOCBRADDBR +#define SIOCBRADDBR 0x89a0 +#endif +#ifndef SIOCBRDELBR +#define SIOCBRDELBR 0x89a1 +#endif +#ifndef SIOCBRADDIF +#define SIOCBRADDIF 0x89a2 +#endif +#ifndef SIOCBRDELIF +#define SIOCBRDELIF 0x89a3 +#endif + /* This interface is defined in linux/if_bridge.h */ #define BRCTL_GET_VERSION 0