From nobody Fri Nov 22 18:30:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=solinno.co.uk ARC-Seal: i=1; a=rsa-sha256; t=1715954734; cv=none; d=zohomail.com; s=zohoarc; b=RJIIVLYAXdba0r5TYdYifrxPh6a+5fcBpUMbFuD2vim0lmZUGEh7MuErZhW+J6GCrt9u5fd71XkWvNsVbwp8PSHgyXSHS0yvw51W9GtsfvUCVOPm70XbiJJH6JKxnnLI5R9+ajLRI7ychkQx0i+sZXBWvazL0hfyK7XFT479LQc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1715954734; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lB9ov5QtT71mcDm+Dz5SwyF4+76TM8X0cGvOls4Bzy4=; b=BkIsAq3q1agm8j4S0ovRVPnMjg0fRciW3LVPO/dpJTDob/pdLm4JPfhMChoGvPC7HzFTd74E1HGZexr+5iNEKUmiJTbxRBt+9BKRbrQHwivw3WCeWNylJl2RJlwkHMgIRzrv2S/qdWc9B+cMLn8s4Fypt4gbBpXmHBfRf3ysM7c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1715954734615811.3896937573628; Fri, 17 May 2024 07:05:34 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.724259.1129533 (Exim 4.92) (envelope-from ) id 1s7yCz-0005OY-GF; Fri, 17 May 2024 14:05:17 +0000 Received: by outflank-mailman (output) from mailman id 724259.1129533; Fri, 17 May 2024 14:05:17 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1s7yCz-0005OQ-Cl; Fri, 17 May 2024 14:05:17 +0000 Received: by outflank-mailman (input) for mailman id 724259; Fri, 17 May 2024 14:05:15 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1s7yCx-0005Nn-FJ for xen-devel@lists.xenproject.org; Fri, 17 May 2024 14:05:15 +0000 Received: from doppler.solinno.uk (doppler.solinno.uk [81.2.106.178]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 7a6930c2-1456-11ef-b4bb-af5377834399; Fri, 17 May 2024 16:05:12 +0200 (CEST) Received: from folly.solinno.co.uk (folly.dyn.solinno.co.uk [192.168.2.135]) by doppler.solinno.uk (Postfix) with ESMTPSA id 6AB3A80078; Fri, 17 May 2024 15:05:12 +0100 (BST) Received: by folly.solinno.co.uk (Postfix, from userid 1000) id 486B02016C; Fri, 17 May 2024 15:05:12 +0100 (BST) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 7a6930c2-1456-11ef-b4bb-af5377834399 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=solinno.co.uk; s=mail; t=1715954712; bh=zsHXVKI9xcbrElKiMA1O6RG7/JYFBSB09X+Lmvdpy1w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XWu3UlR9zsIzuiqzQzVaaCSR31zaHU66zWlTZ1DhWb3jDwdDHgAOEQfRtDAnr9aZM 5mf4vodeDhiFaIe7uX2sXfnj/BVYEZZm8//l7Nu/F4/xl1EDFqtWslHdxmFdfW0URg Px2nsaF0X1rXeVpQrqACojeZCwAeTdZri6WEKRdg= From: Leigh Brown To: xen-devel@lists.xenproject.org Cc: Andrew Cooper , Anthony Perard , Jason Andryuk , Leigh Brown Subject: [PATCH v4 1/2] tools/hotplug/Linux: Add bridge VLAN support Date: Fri, 17 May 2024 15:05:05 +0100 Message-Id: <20240517140506.8460-2-leigh@solinno.co.uk> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240517140506.8460-1-leigh@solinno.co.uk> References: <20240517140506.8460-1-leigh@solinno.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @solinno.co.uk) X-ZM-MESSAGEID: 1715954735490100003 Content-Type: text/plain; charset="utf-8" Update add_to_bridge shell function to read the vlan parameter from xenstore and set the bridge VLAN configuration for the VID. Add additional helper functions to parse the vlan specification, which consists of one or more of the following: a) single VLAN (e.g. 10). b) contiguous range of VLANs (e.g. 10-15). c) discontiguous range with base, increment and count (e.g. 100+10x9 which gives VLAN IDs 100, 110, ... 190). A single VLAN can be suffixed with "p" to indicate the PVID, or "u" to indicate untagged. A range of VLANs can be suffixed with "u" to indicate untagged. A complex example would be: vlan=3D1p/10-15/20-25u This capability requires the iproute2 bridge command to be installed. An error will be generated if the vlan parameter is set and the bridge command is not available. Signed-off-by: Leigh Brown Reviewed-by: Jason Andryuk --- tools/hotplug/Linux/xen-network-common.sh | 109 ++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/tools/hotplug/Linux/xen-network-common.sh b/tools/hotplug/Linu= x/xen-network-common.sh index 42fa704e8d..31d359b83c 100644 --- a/tools/hotplug/Linux/xen-network-common.sh +++ b/tools/hotplug/Linux/xen-network-common.sh @@ -121,10 +121,111 @@ create_bridge () { fi } =20 +_vif_vlan_add() { + # References vlans and pvid variables from the calling function + local -i vid=3D$1 + local flag=3D${2:-} + + if (( vid < 1 || vid > 4094 )) ;then + fatal "vlan id $vid not between 1 and 4094" + fi + if [[ -n "${vlans[$vid]}" ]] ;then + fatal "vlan id $vid specified more than once" + fi + case $flag in + p) if (( pvid !=3D 0 )) ;then + fatal "more than one pvid specified ($vid and $pvid)" + fi + pvid=3D$vid + vlans[$vid]=3Dp ;; + u) vlans[$vid]=3Du ;; + *) vlans[$vid]=3Dt ;; + esac +} + +_vif_vlan_parse_term() { + local vid incr last term=3D${1:-} + + if [[ $term =3D~ ^([0-9]+)([pu])?$ ]] ;then + _vif_vlan_add ${BASH_REMATCH[1]} ${BASH_REMATCH[2]} + elif [[ $term =3D~ ^([0-9]+)-([0-9]+)(u)?$ ]] ;then + vid=3D${BASH_REMATCH[1]} + last=3D${BASH_REMATCH[2]} + if (( last >=3D vid )) ;then + for (( ; vid<=3Dlast; vid++ )) ;do + _vif_vlan_add $vid ${BASH_REMATCH[3]} + done + else + fatal "invalid vlan id range: $term" + fi + elif [[ $term =3D~ ^([0-9]+)\+([0-9]+)x([0-9]+)(u)?$ ]] ;then + vid=3D${BASH_REMATCH[1]} + incr=3D${BASH_REMATCH[2]} + for (( j=3D${BASH_REMATCH[3]}; j>0; --j, vid+=3Dincr )) + do + _vif_vlan_add $vid ${BASH_REMATCH[4]} + done + else + fatal "invalid vlan specification: $term" + fi +} + +_vif_vlan_validate_pvid() { + # References vlans and pvid variables from the calling function + if (( pvid =3D=3D 0 )) ;then + if (( ${#vlans[@]} =3D=3D 1 )) ;then + vlans[${!vlans[*]}]=3Dp + else + fatal "pvid required when using multiple vlan ids" + fi + fi +} + +_vif_vlan_setup() { + # References vlans and dev variable from the calling function + local -i vid + local -a args + + # Remove the default vlan id automatically added to the vif + bridge vlan del dev $dev vid 1 + + # Add the required vlans + for vid in ${!vlans[@]} ;do + case ${vlans[$vid]} in + p) args=3D(pvid untagged) ;; + u) args=3D(untagged) ;; + t) args=3D() ;; + esac + bridge vlan add dev $dev vid $vid ${args[@]} + done +} + +_vif_vlan_membership() { + # The vlans, pvid and dev variables are used by sub-functions + local -A vlans=3D() + local -a terms=3D() + local -i i pvid=3D0 + local dev=3D$1 term + + # Split the vlan specification string into its terms, removing the new= line + # that readarray adds to the last element + readarray -d / -t terms <<<$2 + terms[-1]=3D${terms[-1]%%[[:space:]]} + + for term in ${terms[@]} ;do + _vif_vlan_parse_term $term + done + + _vif_vlan_validate_pvid + _vif_vlan_setup + return 0 +} + # Usage: add_to_bridge bridge dev add_to_bridge () { local bridge=3D$1 local dev=3D$2 + local vlan=3D$(xenstore_read_default "$XENBUS_PATH/vlan" "") =20 # Don't add $dev to $bridge if it's already on the bridge. if [ ! -e "/sys/class/net/${bridge}/brif/${dev}" ]; then @@ -134,6 +235,14 @@ add_to_bridge () { else ip link set ${dev} master ${bridge} fi + if [ -n "${vlan}" ] ;then + log debug "configuring vlans for ${dev} on ${bridge}" + if which bridge >&/dev/null; then + _vif_vlan_membership "${dev}" "${vlan}" + else + fatal "vlan configuration failed: bridge command not found" + fi + fi else log debug "$dev already on bridge $bridge" fi --=20 2.39.2