From patchwork Fri Mar 20 18:41:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via arch-projects X-Patchwork-Id: 1563 Return-Path: Delivered-To: patchwork@archlinux.org Received: from apollo.archlinux.org (localhost [127.0.0.1]) by apollo.archlinux.org (Postfix) with ESMTP id 9949D17B6A333 for ; Fri, 20 Mar 2020 18:41:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on apollo.archlinux.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1,DKIM_VALID=-0.1,DKIM_VALID_AU=-0.1, LOCAL_FAKEBUSINESS=0.5,MAILING_LIST_MULTI=-1,RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001,T_DMARC_POLICY_NONE=0.01 autolearn=ham autolearn_force=no version=3.4.4 X-Spam-BL-Results: [127.0.9.2] Received: from orion.archlinux.org (orion.archlinux.org [88.198.91.70]) by apollo.archlinux.org (Postfix) with ESMTPS for ; Fri, 20 Mar 2020 18:41:27 +0000 (UTC) Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id 3EA7E1A446D8D2; Fri, 20 Mar 2020 18:41:25 +0000 (UTC) Received: from luna.archlinux.org (luna.archlinux.org [IPv6:2a01:4f8:160:3033::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits)) (No client certificate requested) (Authenticated sender: luna) by orion.archlinux.org (Postfix) with ESMTPSA id 07BA81A446D8CB; Fri, 20 Mar 2020 18:41:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=archlinux.org; s=orion; t=1584729685; bh=wt/jSYeYuXANx8ch0We/f9bhObme3JRsAAUPGl6iWC4=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc; b=HrVa1jAxOmc/0wQSjBEzhpoaC6PU1i5cPkkh7+P8NN13d8Zrn3AUsvMUJHNrQgHc7 ucbsWvRf05bTHQOMYKWEda7ud49ExLqAcxeOghgnZ/J3TE3243pwSZqF7fqdBEgokY G9iM3v7ZACnermMwmbnJ2s8nrvK6/4OPTphz5mSNpouTwb0nv839qJPkg5pQ7DTsFF EECV+JlN0Oy+eCrFJv5VNiv4gEIb88z4mui/01u4QXDDgivUsyLw79/+bX96JIO8J2 kj0j32MGudpSJhlFhP0cuoCuCxNqwN21tMiYaySjOO1GkBS265I3aWxS/xt8o7y3cD +4GU0rMkEIpXcoeExh3MUftsl4KTNZ8XM07aBYd6921/F132axHE1+EV6tgw7SFfkb zaGVodJwnX4e3na56cyjBeYOIknmAo4Ut07+C0uTDcf7zRPaIG3rX7F/upWnAEkJ5Q g1OuQvNtlfZns1+4zLQ5jqm6PQNZ8LKsW2jeuSWxAGH52Rv+EUHvsMV/C0j/dGo4M7 Vs1n9NI8QhQHAbYmkeT/UlRJfHK3SGHUyMb5nV3SOcikfblaEoc4TKZ9THZQML58Y/ Vhpr3hT8kxwTDLaYj9KxYJanF+MrgfMTodrk/AltFy1Xb/VkdM1Y22/VqKuyene+EK /Ss9q7hLuSIkljArlFLxhTwY= Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id EC6B42A8EE; Fri, 20 Mar 2020 18:41:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=archlinux.org; s=luna2; t=1584729684; bh=wt/jSYeYuXANx8ch0We/f9bhObme3JRsAAUPGl6iWC4=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc; b=O0Y0WtgEcAElmonOGkfCj50bLCmwJ9kVSKlxZfSoJRbHZt61m6IlJ73316EcCCSpb qAhc9jiMc1IYBorfnMnQebDGQUJ+Ofucb6JX5jNIU8XNmc4p7Y0mv4AifOhB4eCYsF o7tF168C81RiTpPoCJo4niPbefqHPvBeRpsJTdS2/KK3t6ll4Rp12RI5Z9AOWS4w8J SwQLilEfSjpM2XEjl280mBnRdSy70c2T152j2/k+rXJ4b2RkhiXVTGidfr+b0fM7e6 hoM4OrjqQSjqFAy0Glyi244VhfHc2yb5NcGF0Zcn/JPTZwy0gICtGN9PrCqtwTKbdQ sXMLQ4MQ6p0Y2y6PfYO6TRFkW0qj6UnDh7BeXuUgEnEpqr3P1tJnQdhyt3Mua2Jqh0 70IdLIt7iMXJYTMAO4HqBWjJEVjv73cQWZVemDkaV5oYmHXooKJvkCcDzaQrjw93c8 waBqDBAQDWPuhEOs3tcX5wl7cC4ZONtOnaye96TF0n7hbBNxfmlxg3m69fQRB8KIrb 0g6e1zVoUePYJ74Ro8cdQYcPtT4W8S/Gnbuee9CZnSn3hnIMhcexwg5ZTo7PEFsedl xftwBh3Tbqu5YWkL0KnFClVluEj0woNrghSCjCybxMmEeNIf1F4X0VGBXWb/dYgvNa 3WxwiZzRShe8mbW/uHSgfMAo= Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id AD6252A8E6 for ; Fri, 20 Mar 2020 18:41:21 +0000 (UTC) Received: from orion.archlinux.org (orion.archlinux.org [IPv6:2a01:4f8:160:6087::1]) by luna.archlinux.org (Postfix) with ESMTPS for ; Fri, 20 Mar 2020 18:41:21 +0000 (UTC) Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id BB4511A446D8C1 for ; Fri, 20 Mar 2020 18:41:20 +0000 (UTC) Received: from mail-wr1-x444.google.com (mail-wr1-x444.google.com [IPv6:2a00:1450:4864:20::444]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by orion.archlinux.org (Postfix) with ESMTPS for ; Fri, 20 Mar 2020 18:41:20 +0000 (UTC) Received: by mail-wr1-x444.google.com with SMTP id t7so4067966wrw.12 for ; Fri, 20 Mar 2020 11:41:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-disposition; bh=aXOwFpDD1WfHtiBCzQ6J/iKxTYqsTO4saKiE94biyWw=; b=QBEbF1jnM1zOrjF7tRVmM7ZJBfcAZfS/ZIPFUXy8b1/PZR4U6jwBKJA57XYN1sX/nJ d0jPloiG/Nr9l9i01/TmkKXSZhqoXsG6z9hxULo2c2AC4uULairzeiJJZ4Tz8CIJelqk H5Du6i3oqmph4JPI1FG7n04wA8cIxRCv1LHhwbgu/VcNdPM5UB/ml7YePIOw8jGT0aaY JLILSxqZj1hQ9+MDmSsahSSKcE0WrfNGEZ0km9mN39Ih/D+IFeHqXSzPt0Zz/UGKrI7s V22GmQrubfnerh5zWjTAGx3XcWm51OKISekGctjK1QRFqzFDwitJY2z39wGB0kpQNE2H YLeg== X-Gm-Message-State: ANhLgQ3SIQAS8vIav1v7kiKN3dpEl4JewgkaU3IAlAKwre7Rwyi7hUG5 8ubNqAYZvrp5EjW/BRfyM+ogjteL X-Google-Smtp-Source: ADFU+vtsWqbqhOIe+XyWlOiuBVFX7Qd8GPp/EjxqtHH3Cs9FkX62jNh0/MIDtsJK3WVPdP8f33rlCQ== X-Received: by 2002:adf:f8c9:: with SMTP id f9mr12625791wrq.222.1584729679052; Fri, 20 Mar 2020 11:41:19 -0700 (PDT) Received: from Mindship-03 (81-234-21-31.ftth.glasoperator.nl. [31.21.234.81]) by smtp.gmail.com with ESMTPSA id r9sm9068796wma.47.2020.03.20.11.41.18 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2020 11:41:18 -0700 (PDT) Date: Fri, 20 Mar 2020 19:41:14 +0100 To: arch-projects@archlinux.org Message-ID: <20200320184114.GA3253@Mindship-03> MIME-Version: 1.0 Content-Disposition: inline Subject: [arch-projects] [netctl][PATCH] Support custom MAC address on new interfaces X-BeenThere: arch-projects@archlinux.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Arch Linux projects development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Jouke Witteveen via arch-projects Reply-To: Arch Linux projects development discussion Cc: Jouke Witteveen Errors-To: arch-projects-bounces@archlinux.org Sender: "arch-projects" Connection types bond, bridge, dummy, vlan, and macvlan create their own interface. Previously, only macvlan offered control over the MAC address of the created interface. Now, this functionality is available to all these connection types. --- docs/netctl.profile.5.txt | 9 ++++++--- src/lib/connections/bond | 2 +- src/lib/connections/bridge | 5 ++++- src/lib/connections/dummy | 2 +- src/lib/connections/macvlan | 5 +---- src/lib/connections/vlan | 2 +- src/lib/interface | 12 ++++++++---- 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/docs/netctl.profile.5.txt b/docs/netctl.profile.5.txt index 0662a67..839bb9a 100644 --- a/docs/netctl.profile.5.txt +++ b/docs/netctl.profile.5.txt @@ -83,6 +83,12 @@ GENERAL OPTIONS profile. If this variable is not specified, it defaults to the value of 'Interface='. +'MACAddress=':: + Optional MAC address for newly created interfaces. When set to the + name of an existing interface, the address of that interface is used. + The connection types that create an interface and are able to set a + MAC address are +bond+, +bridge+, +dummy+, +vlan+, and +macvlan+. + 'After=()':: An array of profile names that should be started before this profile is started. This is only an ordering dependency and is not intended @@ -544,9 +550,6 @@ following are understood for connections of the `macvlan' type: Either `bridge', `vepa', `private', or `passthru'. See *ip*(8) for details. -'MACAddress=':: - Optional static MAC address for the `macvlan' type link. - SPECIAL QUOTING RULES --------------------- diff --git a/src/lib/connections/bond b/src/lib/connections/bond index 64b0285..3f7daf4 100644 --- a/src/lib/connections/bond +++ b/src/lib/connections/bond @@ -11,7 +11,7 @@ bond_up() { return 1 fi - interface_add bond "$Interface" "" ${Mode:+mode "$Mode"} + interface_add bond "$Interface" "$MACAddress" "" ${Mode:+mode "$Mode"} bring_interface_up "$Interface" for slave in "${BindsToInterfaces[@]}"; do ip link set dev "$slave" master "$Interface" diff --git a/src/lib/connections/bridge b/src/lib/connections/bridge index 7d05576..7f922fa 100644 --- a/src/lib/connections/bridge +++ b/src/lib/connections/bridge @@ -11,8 +11,11 @@ bridge_up() { report_error "Interface '$Interface' already exists and is not a bridge" return 1 fi + if [[ "$MACAddress" ]]; then + report_error "Setting a MAC address on existing bridge interface '$Interface' is unsupported" + fi else - interface_add bridge "$Interface" + interface_add bridge "$Interface" "$MACAddress" fi for member in "${BindsToInterfaces[@]}"; do diff --git a/src/lib/connections/dummy b/src/lib/connections/dummy index 8726d86..7dd8e88 100644 --- a/src/lib/connections/dummy +++ b/src/lib/connections/dummy @@ -11,7 +11,7 @@ dummy_up() { return 1 fi - interface_add dummy "$Interface" + interface_add dummy "$Interface" "$MACAddress" bring_interface_up "$Interface" ip_set } diff --git a/src/lib/connections/macvlan b/src/lib/connections/macvlan index 25a97fb..eadb477 100644 --- a/src/lib/connections/macvlan +++ b/src/lib/connections/macvlan @@ -15,10 +15,7 @@ macvlan_up() { return 1 else bring_interface_up "$BindsToInterfaces" - interface_add macvlan "$Interface" "$BindsToInterfaces" mode "$Mode" - if [[ $MACAddress ]]; then - ip link set dev "$Interface" address "$MACAddress" || return 1 - fi + interface_add macvlan "$Interface" "$MACAddress" "$BindsToInterfaces" mode "$Mode" || return 1 fi ethernet_up } diff --git a/src/lib/connections/vlan b/src/lib/connections/vlan index 037c971..20251ec 100644 --- a/src/lib/connections/vlan +++ b/src/lib/connections/vlan @@ -15,7 +15,7 @@ vlan_up() { return 1 else bring_interface_up "$BindsToInterfaces" - interface_add vlan "$Interface" "$BindsToInterfaces" id "$VLANID" + interface_add vlan "$Interface" "$MACAddress" "$BindsToInterfaces" id "$VLANID" fi ethernet_up diff --git a/src/lib/interface b/src/lib/interface index 2ebf81e..1a51c07 100644 --- a/src/lib/interface +++ b/src/lib/interface @@ -20,11 +20,15 @@ is_interface() { ## Add an interface # $1: interface type # $2: interface name -# $3: interface link (optional) -# $4...: additional arguments +# $3: interface MAC address (optional) +# $4: interface link (optional) +# $5...: additional type related arguments interface_add() { - local type="$1" name="$2" link="$3" - do_debug ip link add ${link:+link "$link"} name "$name" type "$type" "${@:4}" $LinkOptions || return + local type="$1" name="$2" address="$3" link="$4" + if [[ -e "/sys/class/net/$address/address" ]]; then + address=$(< "/sys/class/net/$address/address") + fi + do_debug ip link add ${link:+link "$link"} name "$name" ${address:+address "$address"} type "$type" "${@:5}" $LinkOptions || return load_interface_config "$name" }