vpp_device: fix vpp device kernel driver binding
[csit.git] / resources / libraries / bash / function / device.sh
index 5d33af3..729a837 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2019 Cisco and/or its affiliates.
+# Copyright (c) 2020 Cisco and/or its affiliates.
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at:
@@ -98,15 +98,11 @@ function bind_interfaces_to_driver () {
 
     pci_path="/sys/bus/pci/devices/${ADDR}"
     drv_path="/sys/bus/pci/drivers/${DRIVER}"
-    vd=$(cat ${pci_path}/vendor ${pci_path}/device) || {
-        die "Failed to retrieve interface details!"
-    }
-    set +e
-    echo ${vd} | sudo tee ${drv_path}/new_id
-    set -e
-    echo ${ADDR} | sudo tee ${pci_path}/driver/unbind || {
-        die "Failed to unbind interface ${ADDR}!"
-    }
+    if [ -d "${pci_path}/driver" ]; then
+        echo ${ADDR} | sudo tee ${pci_path}/driver/unbind || {
+            die "Failed to unbind interface ${ADDR}!"
+        }
+    fi
     echo ${ADDR} | sudo tee ${drv_path}/bind || {
         die "Failed to bind interface ${ADDR}!"
     }
@@ -276,23 +272,19 @@ function get_available_interfaces () {
             pci_id="0x154c"
             tg_netdev=(enp5s2 enp5s3 enp5s4 enp5s5
                        enp5s6 enp5s7 enp5s8 enp5s9)
-            tg_netdev+=(enp8s2 enp8s3 enp8s4 enp8s5
-                        enp8s6 enp8s7 enp8s8 enp8s9)
-            tg_netdev+=(enp8s10 enp8s11 enp8s12 enp8s13
-                        enp8s14 enp8s15 enp8s16 enp8s17)
-            dut1_netdev=(enp133s2 enp133s3 enp133s4 enp133s5
-                         enp133s6 enp133s7 enp133s8 enp133s9)
-            dut1_netdev+=(enp133s10 enp133s11 enp133s12 enp133s13
-                          enp133s14 enp133s15 enp133s16 enp133s17)
-            dut1_netdev+=(enp5s10 enp5s11 enp5s12 enp5s13
-                          enp5s14 enp5s15 enp5s16 enp5s17)
+            tg_netdev+=(enp5s10 enp5s11 enp5s12 enp5s13
+                        enp5s14 enp5s15 enp5s16 enp5s17)
+            dut1_netdev=(enp145s2 enp145s3 enp145s4 enp145s5
+                         enp145s6 enp145s7 enp145s8 enp145s9)
+            dut1_netdev+=(enp145s10 enp145s11 enp145s12 enp145s13
+                          enp145s14 enp145s15 enp145s16 enp145s17)
             ;;
        "1n_vbox")
             # Add Intel Corporation 82545EM Gigabit Ethernet Controller to the
             # whitelist.
             pci_id="0x100f"
-            tg_netdev=(enpTGa enpTGb)
-            dut1_netdev=(enpSUTa enpSUTb)
+            tg_netdev=(enp0s8 enp0s9)
+            dut1_netdev=(enp0s16 enp0s17)
             ;;
         *)
             die "Unknown specification: ${case_text}!"
@@ -305,11 +297,13 @@ function get_available_interfaces () {
     TG_PCIDEVS=()
     TG_NETMACS=()
     TG_DRIVERS=()
+    TG_VLANS=()
     # DUT1 side of connections.
     DUT1_NETDEVS=()
     DUT1_PCIDEVS=()
     DUT1_NETMACS=()
     DUT1_DRIVERS=()
+    DUT1_VLANS=()
 
     # Find the first ${device_count} number of available TG Linux network
     # VF device names. Only allowed VF PCI IDs are filtered.
@@ -350,17 +344,21 @@ function get_available_interfaces () {
         get_pci_addr
         get_mac_addr
         get_krn_driver
+        get_vlan_filter
         TG_PCIDEVS+=(${PCI_ADDR})
         TG_NETMACS+=(${MAC_ADDR})
         TG_DRIVERS+=(${KRN_DRIVER})
+        TG_VLANS+=(${VLAN_ID})
     done
     for NETDEV in "${DUT1_NETDEVS[@]}"; do
         get_pci_addr
         get_mac_addr
         get_krn_driver
+        get_vlan_filter
         DUT1_PCIDEVS+=(${PCI_ADDR})
         DUT1_NETMACS+=(${MAC_ADDR})
         DUT1_DRIVERS+=(${KRN_DRIVER})
+        DUT1_VLANS+=(${VLAN_ID})
     done
 
     # We need at least two interfaces for TG/DUT1 for building topology.
@@ -433,6 +431,24 @@ function get_pci_addr () {
 }
 
 
+function get_vlan_filter () {
+
+    # Get VLAN stripping filter from PF searched by mac adress.
+    #
+    # Variables read:
+    # - MAC_ADDR - MAC address of VF.
+    # Variables set:
+    # - VLAN_ID - VLAN ids.
+
+    set -exuo pipefail
+
+    # Sed regular expression pattern.
+    exp="s/^.*vlan ([[:digit:]]+).*$/\1/"
+    VLAN_ID=$(ip link | grep vlan | grep ${MAC_ADDR} | sed -re "${exp}") || true
+    VLAN_ID="${VLAN_ID:-0}"
+}
+
+
 function installed () {
 
     # Check if the given utility is installed. Fail if not installed.
@@ -481,12 +497,16 @@ function read_env_variables () {
     DCR_UUIDS+=([dut1]="${CSIT_DUT1_UUID}")
     TG_PCIDEVS=("${CSIT_TG_INTERFACES_PORT1_PCI}")
     TG_DRIVERS=("${CSIT_TG_INTERFACES_PORT1_DRV}")
+    TG_VLANS+=("${CSIT_TG_INTERFACES_PORT1_VLAN}")
     TG_PCIDEVS+=("${CSIT_TG_INTERFACES_PORT2_PCI}")
     TG_DRIVERS+=("${CSIT_TG_INTERFACES_PORT2_DRV}")
+    TG_VLANS+=("${CSIT_TG_INTERFACES_PORT2_VLAN}")
     DUT1_PCIDEVS=("${CSIT_DUT1_INTERFACES_PORT1_PCI}")
     DUT1_DRIVERS=("${CSIT_DUT1_INTERFACES_PORT1_DRV}")
+    DUT1_VLANS+=("${CSIT_DUT1_INTERFACES_PORT1_VLAN}")
     DUT1_PCIDEVS+=("${CSIT_DUT1_INTERFACES_PORT2_PCI}")
     DUT1_DRIVERS+=("${CSIT_DUT1_INTERFACES_PORT2_DRV}")
+    DUT1_VLANS+=("${CSIT_DUT1_INTERFACES_PORT2_VLAN}")
 }
 
 
@@ -527,15 +547,19 @@ function set_env_variables () {
     CSIT_TG_INTERFACES_PORT1_MAC="${TG_NETMACS[0]}"
     CSIT_TG_INTERFACES_PORT1_PCI="${TG_PCIDEVS[0]}"
     CSIT_TG_INTERFACES_PORT1_DRV="${TG_DRIVERS[0]}"
+    CSIT_TG_INTERFACES_PORT1_VLAN="${TG_VLANS[0]}"
     CSIT_TG_INTERFACES_PORT2_MAC="${TG_NETMACS[1]}"
     CSIT_TG_INTERFACES_PORT2_PCI="${TG_PCIDEVS[1]}"
     CSIT_TG_INTERFACES_PORT2_DRV="${TG_DRIVERS[1]}"
+    CSIT_TG_INTERFACES_PORT2_VLAN="${TG_VLANS[1]}"
     CSIT_DUT1_INTERFACES_PORT1_MAC="${DUT1_NETMACS[0]}"
     CSIT_DUT1_INTERFACES_PORT1_PCI="${DUT1_PCIDEVS[0]}"
     CSIT_DUT1_INTERFACES_PORT1_DRV="${DUT1_DRIVERS[0]}"
+    CSIT_DUT1_INTERFACES_PORT1_VLAN="${DUT1_VLANS[0]}"
     CSIT_DUT1_INTERFACES_PORT2_MAC="${DUT1_NETMACS[1]}"
     CSIT_DUT1_INTERFACES_PORT2_PCI="${DUT1_PCIDEVS[1]}"
     CSIT_DUT1_INTERFACES_PORT2_DRV="${DUT1_DRIVERS[1]}"
+    CSIT_DUT1_INTERFACES_PORT2_VLAN="${DUT1_VLANS[1]}"
     set +a
 }
 
@@ -574,13 +598,18 @@ function start_topology_containers () {
     # Override access to PCI bus by attaching a filesystem mount to the
     # container.
     dcr_stc_params+="--mount type=tmpfs,destination=/sys/bus/pci/devices "
-    # Mount vfio to be able to bind to see binded interfaces. We cannot use
-    # --device=/dev/vfio as this does not see newly binded interfaces.
+    # Mount vfio to be able to bind to see bound interfaces. We cannot use
+    # --device=/dev/vfio as this does not see newly bound interfaces.
     dcr_stc_params+="--volume /dev/vfio:/dev/vfio "
-    # Mount nested_vm image to be able to run VM tests.
-    dcr_stc_params+="--volume /var/lib/vm/vhost-nested.img:/var/lib/vm/vhost-nested.img "
     # Mount docker.sock to be able to use docker deamon of the host.
     dcr_stc_params+="--volume /var/run/docker.sock:/var/run/docker.sock "
+    # Mount /opt/boot/ where VM kernel and initrd are located.
+    dcr_stc_params+="--volume /opt/boot/:/opt/boot/ "
+    # Mount host hugepages for VMs.
+    dcr_stc_params+="--volume /dev/hugepages/:/dev/hugepages/ "
+    # Disable IPv6.
+    dcr_stc_params+="--sysctl net.ipv6.conf.all.disable_ipv6=1 "
+    dcr_stc_params+="--sysctl net.ipv6.conf.default.disable_ipv6=1 "
 
     # Docker Container UUIDs.
     declare -gA DCR_UUIDS