From patchwork Thu Oct 11 02:07:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hoang Huu Le X-Patchwork-Id: 982173 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=dektech.com.au Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=dektech.com.au header.i=@dektech.com.au header.b="mRryAUS2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42VvVh0bdXz9s8F for ; Thu, 11 Oct 2018 13:07:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727214AbeJKJcU (ORCPT ); Thu, 11 Oct 2018 05:32:20 -0400 Received: from f0-dek.dektech.com.au ([210.10.221.142]:52929 "EHLO mail.dektech.com.au" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727182AbeJKJcU (ORCPT ); Thu, 11 Oct 2018 05:32:20 -0400 Received: from localhost (localhost [127.0.0.1]) by mail.dektech.com.au (Postfix) with ESMTP id 4C761F5E37; Thu, 11 Oct 2018 13:07:17 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=dektech.com.au; h=x-mailer:message-id:date:date:subject:subject:from:from :received:received:received; s=mail_dkim; t=1539223637; bh=Zo2Zb Jp0+Axc6OS3wkJGjlgthBsJLbvC4a9kmNGuh+o=; b=mRryAUS2WdTSCaB1MKMQL lVTArnyxNfHnMJlXQ/GdMbcxPkJjBhQgLpWlrl/qPSoYfkUP2j1/myc9m9S2JB73 g07quydbPK5sqqaAlDuOgR+4ZKi+XazdicVZ5atny0mhhVeVnahgTztljjTxl4iz UYMOimi3UyO4m88pmR/qGM= X-Virus-Scanned: amavisd-new at dektech.com.au Received: from mail.dektech.com.au ([127.0.0.1]) by localhost (mail2.dektech.com.au [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id hcsMFLKeN5Ba; Thu, 11 Oct 2018 13:07:17 +1100 (AEDT) Received: from mail.dektech.com.au (localhost [127.0.0.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.dektech.com.au (Postfix) with ESMTPS id 22EA6F5E39; Thu, 11 Oct 2018 13:07:16 +1100 (AEDT) Received: from build.dek-tpc.internal (unknown [14.161.14.188]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.dektech.com.au (Postfix) with ESMTPSA id 53D75F5E37; Thu, 11 Oct 2018 13:07:15 +1100 (AEDT) From: Hoang Le To: jon.maloy@ericsson.com, maloy@donjonn.com, ying.xue@windriver.com, netdev@vger.kernel.org, tipc-discussion@lists.sourceforge.net Subject: [iproute2-next] tipc: support interface name when activating UDP bearer Date: Thu, 11 Oct 2018 09:07:08 +0700 Message-Id: <20181011020708.7585-1-hoang.h.le@dektech.com.au> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Support for indicating interface name has an ip address in parallel with specifying ip address when activating UDP bearer. This liberates the user from keeping track of the current ip address for each device. Old command syntax: $tipc bearer enable media udp name NAME localip IP New command syntax: $tipc bearer enable media udp name NAME [localip IP|dev DEVICE] Acked-by: Ying Xue Signed-off-by: Hoang Le --- tipc/bearer.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/tipc/bearer.c b/tipc/bearer.c index 05dc84aa8ded..118a664370e7 100644 --- a/tipc/bearer.c +++ b/tipc/bearer.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include #include @@ -68,7 +70,7 @@ static void cmd_bearer_enable_l2_help(struct cmdl *cmdl, char *media) static void cmd_bearer_enable_udp_help(struct cmdl *cmdl, char *media) { fprintf(stderr, - "Usage: %s bearer enable [OPTIONS] media %s name NAME localip IP [UDP OPTIONS]\n\n", + "Usage: %s bearer enable [OPTIONS] media %s name NAME [localip IP|device DEVICE] [UDP OPTIONS]\n\n", cmdl->argv[0], media); fprintf(stderr, "OPTIONS\n" @@ -121,6 +123,47 @@ static int generate_multicast(short af, char *buf, int bufsize) return 0; } +static int cmd_bearer_validate_and_get_addr(const char *name, char *straddr) +{ + struct ifreq ifc; + struct sockaddr_in *ip4addr; + struct sockaddr_in6 *ip6addr; + int fd = 0; + + if (!name || !straddr) + return 0; + + fd = socket(PF_INET, SOCK_DGRAM, 0); + if (fd <= 0) { + fprintf(stderr, "Failed to create socket\n"); + return 0; + } + + ifc.ifr_name[0] = 0; + memcpy(ifc.ifr_name, name, strlen(name)); + ifc.ifr_name[strlen(name)] = 0; + + if (ioctl(fd, SIOCGIFADDR, &ifc) < 0) { + fprintf(stderr, "ioctl failed: %s\n", strerror(errno)); + close(fd); + return 0; + } + + ip4addr = (struct sockaddr_in *)&ifc.ifr_addr; + if (inet_ntop(AF_INET, &ip4addr->sin_addr, straddr, + INET_ADDRSTRLEN) == NULL) { + ip6addr = (struct sockaddr_in6 *)&ifc.ifr_addr; + if (inet_ntop(AF_INET6, &ip6addr->sin6_addr, straddr, + INET6_ADDRSTRLEN) == NULL) { + fprintf(stderr, "UDP local address error\n"); + close(fd); + return -EINVAL; + } + } + close(fd); + return 1; +} + static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, struct opt *opts, struct cmdl *cmdl) { @@ -138,13 +181,25 @@ static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, struct opt *opts, .ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM }; + char addr[INET6_ADDRSTRLEN] = {0}; - if (!(opt = get_opt(opts, "localip"))) { - fprintf(stderr, "error, udp bearer localip missing\n"); - cmd_bearer_enable_udp_help(cmdl, "udp"); + opt = get_opt(opts, "device"); + if (opt && !cmd_bearer_validate_and_get_addr(opt->val, addr)) { + fprintf(stderr, "error, no device name available\n"); return -EINVAL; } - locip = opt->val; + + if (strlen(addr) > 0) { + locip = addr; + } else { + opt = get_opt(opts, "localip"); + if (!opt) { + fprintf(stderr, "error, udp bearer localip/device missing\n"); + cmd_bearer_enable_udp_help(cmdl, "udp"); + return -EINVAL; + } + locip = opt->val; + } if ((opt = get_opt(opts, "remoteip"))) remip = opt->val;