Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Mar 2021 00:00:32 +0200
From:      Michael Pounov <misho@elwix.org>
To:        churchers@gmail.com
Cc:        ports@freebsd.org
Subject:   vm-bhyve vale support
Message-ID:  <20210310000032.88cee39c2f148ad990297c92@elwix.org>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.

--Multipart=_Wed__10_Mar_2021_00_00_32_+0200_CrcZznn8j.3h7ic8
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

Hi Matt Churchyard

I made usable and working vale switch support in vm-bhyve project from FreeBSD 12 and above.

Now vale switches are near the same behaviour and view as standard and other supported types of switches.

If you thinking my contributed code is ok to be part of yours project is free to merge, modify and using these patches to the vm-bhyve project.

Best Regards
Michael Pounov

elwix.org

--Multipart=_Wed__10_Mar_2021_00_00_32_+0200_CrcZznn8j.3h7ic8
Content-Type: text/x-diff;
 name="vm-switch.patch"
Content-Disposition: attachment;
 filename="vm-switch.patch"
Content-Transfer-Encoding: 7bit

--- /usr/local/lib/vm-bhyve/vm-switch	2020-01-14 12:15:58.000000000 +0200
+++ vm-switch	2021-03-09 23:43:17.880167000 +0200
@@ -49,7 +49,7 @@
             case "${_type}" in
                 vxlan)  switch::vxlan::init "${_switch}" ;;
                 manual) switch::manual::init "${_switch}" ;;
-                vale)   ;;
+                vale)   switch::vale::init "${_switch}" ;;
                 *)      switch::standard::init "${_switch}" ;;
             esac
         done

--Multipart=_Wed__10_Mar_2021_00_00_32_+0200_CrcZznn8j.3h7ic8
Content-Type: text/x-diff;
 name="vm-switch-vale.patch"
Content-Disposition: attachment;
 filename="vm-switch-vale.patch"
Content-Transfer-Encoding: 7bit

--- /usr/local/lib/vm-bhyve/vm-switch-vale	2020-01-14 12:15:58.000000000 +0200
+++ vm-switch-vale	2021-03-09 23:43:17.886736000 +0200
@@ -32,26 +32,79 @@
 switch::vale::show(){
     local _name="$1"
     local _format="$2"
-    local _id
+    local _id _mtu
 
+    config::core::get "_ports" "ports_${_name}"
+    config::core::get "_bridge" "bridge_${_name}"
+
+    [ -n "${_ports}" ] && _mtu=$(ifconfig ${_ports} | awk '($(NF - 1) == "mtu") { printf("%u", $NF); exit }')
+
     switch::vale::id "_id" "${_name}"
-    printf "${_format}" "${_name}" "vale" "${_id}" "n/a" "n/a" "n/a" "n/a" "n/a"
+    printf "${_format}" "${_name}" "vale" "${_id}" "${_bridge:--}" "n/a" "${_mtu:--}" "n/a" "${_ports:--}"
 }
 
+switch::vale::init(){
+    local _name="$1"
+
+    config::core::get "_ports" "ports_${_name}"
+    config::core::get "_bridge" "bridge_${_name}"
+
+    switch::vale::id "_vale" "${_name}"
+
+    if [ -n "${_ports}" ]; then
+	    valectl -a ${_vale}:${_ports}
+    fi
+
+    valectl -n ${_bridge}
+    valectl -a ${_vale}:${_bridge}
+}
+
 # create a vale switch
 #
 # @param string _switch the name of the switch
 #
 switch::vale::create(){
+    local _br="${_bridge}"
 
+    switch::vale::id _vale ${_switch}
+
+    if [ -n "${_if}" ]; then
+	    valectl -a ${_vale}:${_if} || util::err "cannot create vale switch with interface ${_if}"
+	    
+	    [ -z "${_br}" ] && switch::vale::bridge _br ${_switch}
+    fi
+
+    if [ -z "${_br}" ]; then
+	    valectl -d ${_vale}:${_if}
+	    util::err "cannot create vale switch without name for bridge"
+    fi
+
+    valectl -n ${_br} || util::err "cannot create vale switch bridge interface ${_br}"
+    valectl -a ${_vale}:${_br} || util::err "cannot create vale switch with bridge ${_br}"
+
     config::core::set "switch_list" "${_switch}" "1"
     config::core::set "type_${_switch}" "vale"
+
+    config::core::set "bridge_${_switch}" "${_br}"
+    [ -n "${_if}" ] && config::core::set "ports_${_switch}" "${_if}"
 }
 
 # remove a vale switch
 #
-switch::vale::remove(){ }
+switch::vale::remove(){
+    config::core::get "_if" "ports_${_switch}"
+    config::core::get "_br" "bridge_${_switch}"
 
+    switch::vale::id _vale ${_switch}
+
+    valectl -d ${_vale}:${_br}
+    valectl -r ${_br}
+
+    [ -n "${_if}" ] && valectl -d ${_vale}:${_if}
+
+    return 0
+}
+
 # add a new interface to this switch
 # at the moment we require the user to manually
 # set up any vale switches
@@ -60,7 +113,14 @@
 # @param string _if the interface to add
 #
 switch::vale::add_member(){
-    util::err "physical interfaces must be added to the vale switch manually"
+    config::core::get "_chkif" "ports_${_switch}"
+    [ -n "${_chkif}" ] && util::err "we already have physical interface attached to the vale switch"
+
+    switch::vale::id _vale ${_switch}
+
+    valectl -a ${_vale}:${_if} || util::err "physical interfaces must be added to the vale switch manually"
+
+    config::core::set "ports_${_switch}" "${_if}"
 }
 
 # remove an interface
@@ -69,7 +129,14 @@
 # @param string _if the interface to remove
 #
 switch::vale::remove_member(){
-    util::err "physical interfaces must be removed from the vale switch manually"
+    config::core::get "_chkif" "ports_${_switch}"
+    [ "${_chkif}" != "${_if}" ] && util::err "we have not such physical interface attached to the vale switch"
+
+    switch::vale::id _vale ${_switch}
+
+    valectl -d ${_vale}:${_if} || util::err "physical interfaces must be removed from the vale switch manually"
+
+    config::core::remove "ports_${_switch}"
 }
 
 # set vlan id
@@ -106,4 +173,18 @@
     else
         setvar "${_var}" "vale${_id_s}"
     fi
+}
+
+switch::vale::bridge(){
+    local _var="$1"
+    local _switch="$2"
+    local _br_s
+
+    switch::vale::id _vale ${_switch}
+
+    # get a switch bridge
+    _br_s=$(valectl 2>&1 | 
+	    awk -vvs=${_vale} '($NF ~ vs":" && $4 ~ "bridge:") { split($4, br, ":"); printf("vi%s\n", br[2]); exit; }')
+
+    setvar "${_var}" "${_br_s}"
 }

--Multipart=_Wed__10_Mar_2021_00_00_32_+0200_CrcZznn8j.3h7ic8--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20210310000032.88cee39c2f148ad990297c92>