---
# System prepended metadata

title: Virtual Function Installation Guide
tags: [CHT Technical Document, ORAN]

---

# Virtual Function Installation Guide
###### tags: `ORAN`
* [Reference - Configuration of System](https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-phy/en/latest/Setup-Configuration_fh.html#a-3-configuration-of-system)
---

###### tags: `CHT Technical Document`
:::success
**Outline:**
[TOC]
:::

## Background
:::info
- This is the library needed if you want to use L1app with Radio mode (O-DU Low + RU)
- This guide will cover on how to update the required driver for the NIC and also create VF needed for FHI connection
- If you only need O-DU Low & High integration on radio mode you can skip this guide and go to the next step
:::

## Prerequisites
:::warning
Please follow the notes to do the setting first
- RT Host Installation
  - [Install CentOS-7.7](https://hackmd.io/@ChiehChun/HyNXWdATI/https%3A%2F%2Fhackmd.io%2FfGrhOVHnR0as43FcYIWrvQ%3Fview)
  - [Bios Configuration](https://hackmd.io/@ChiehChun/HyNXWdATI/https%3A%2F%2Fhackmd.io%2FmT3fzBDMTtqyYSQ9Zzo-5A%3Fview)
  - [OS Configuration](https://hackmd.io/@ChiehChun/HyNXWdATI/https%3A%2F%2Fhackmd.io%2FOsPSqoVDRQS0hbrCjL85CQ%3Fview)
- Others Prerequisites
  - [ICC](https://hackmd.io/@ChiehChun/HyNXWdATI/https%3A%2F%2Fhackmd.io%2F%40nadhifmr%2FBkmuLwxLo%2Fhttps%253A%252F%252Fhackmd.io%252FpHC0zUaSSeu42yNNjk9rqA)
  - [DPDK](https://hackmd.io/@ChiehChun/HyNXWdATI/https%3A%2F%2Fhackmd.io%2F%40nadhifmr%2FSy24dwgUj%2Fhttps%253A%252F%252Fhackmd.io%252FhUgJAojCT3qpBMKKggieFQ%253Fview)
  - [Google test](https://hackmd.io/@ChiehChun/HyNXWdATI/https%3A%2F%2Fhackmd.io%2FXCDUl21LTKaCKZ-UeYxObw%3Fview)
:::

:::danger
If your NIC is E810, please check [this note](https://hackmd.io/9xkPG7niTaapaGRgecBWMw?view) for the update.
:::

## 1. Update i40e driver
:::warning
The recommended version is 2.10.19.82, but for all the version over than x2.9.21 should also work
:::
- Download file from [here](https://www.intel.com/content/www/us/en/download/18026/29658/intel-network-adapter-driver-for-pcie-40-gigabit-ethernet-network-connections-under-linux.html)
:::info
you can try
```shell=
wget https://downloadmirror.intel.com/29658/eng/i40e-2.10.19.82.tar.gz
```
:::
```shell=
[oai@ee705-7-ip120 ~]$ tar -zxvf i40e-2.10.19.82.tar.gz

[oai@ee705-7-ip120 ~]$ cd i40e-2.10.19.82/src/

### install the driver
[oai@ee705-7-ip120 src]$ sudo make install
### see the drvier info
[oai@ee705-7-ip120 src]$ modinfo i40e
### remove the older i40e driver
[oai@ee705-7-ip120 src]$ sudo rmmod i40e
### load the driver
[oai@ee705-7-ip120 src]$ sudo modprobe i40e
### check the driver
[oai@ee705-7-ip120 src]$ ethtool -i enp134s0f0
```
![](https://i.imgur.com/7kr6nnF.png)
### Update X710 Firmware
We try to use version 8.3 of X710 network adapter
- Download file from [here](https://www.intel.com/content/www/us/en/download/18190/30600/non-volatile-memory-nvm-update-utility-for-intel-ethernet-network-adapter-700-series.html)
![](https://i.imgur.com/GO1UZV2.png)

```shell=
wget https://downloadmirror.intel.com/30600/eng/nvmupdatepackage_700_series_v8_30.zip
```

```shell=
# unzip file
[oai@ee705-7-ip120 ~]$ unzip nvmupdatepackage_700_series_v8_30.zip
[oai@ee705-7-ip120 ~]$ tar zxvf 700Series_NVMUpdatePackage_v8_30_Linux.tar.gz
[oai@ee705-7-ip120 ~]$ cd 700Series/Linux_x64
[oai@ee705-7-ip120 Linux_x64]$ chmod 755 nvmupdate64e
[oai@ee705-7-ip120 Linux_x64]$ sudo ./nvmupdate64e
```
![](https://i.imgur.com/TTMD8dj.png)

- Choose the interface you want to update (in my case I choose `4`)
- For the `Would you like to back up the NVM images ?` -> type `n`
- After update, reboot the server
```shell=
[oai@ee705-7-ip120 Linux_x64]$ sudo reboot
```

Check the firmware version
```shell=
[oai@ee705-7-ip120 ~]$ ethtool -i enp134s0f0
```
![](https://i.imgur.com/7kr6nnF.png)

## 2. Enable virtual functions (VF) on the device
You can get the ethernet interface and the corresponding bus info by using this command: 
`sudo lshw -c network -businfo`
:::info
- Shell file will create Virtual Function on your chosen NIC with echo command (echo 1 mean it will create 1 VF)
- ip link set will set the vlan number to the created VF
:::
```shell=
sudo su
# run shell file content is below
source setupvf.sh 
exit
```

:::spoiler setupvf.sh
```
#!/bin/bash

echo 0 > /sys/bus/pci/devices/0000\:3b\:00.0/sriov_numvfs
echo 0 > /sys/bus/pci/devices/0000\:3b\:01.0/sriov_numvfs

modprobe -r iavf
modprobe iavf

echo 1 > /sys/bus/pci/devices/0000\:3b\:00.0/sriov_numvfs
echo 1 > /sys/bus/pci/devices/0000\:3b\:01.0/sriov_numvfs

a=8

if [ -z "$1" ]
then
b=0
elif [ $1 -lt $a ]
then
b=$1
else
echo " Usage $0 qos with 0<= qos <= 7 with 0 as a default if no qos is provided"
exit 1
fi

#O-DU
ip link set p1p1 vf 0 mac 00:11:22:33:44:66 vlan 3 qos $b
ip link set p1p2 vf 0 mac 00:11:22:33:44:55 vlan 3 qos $b
```
:::

:::info
- Bind created VF to DPDK
- Check created VF bus number first with **--status** command and change them accordingly
:::
```shell=
cd
sudo modprobe vfio-pci
cd DPDK/dpdk-stable-20.11.3
sudo ./usertools/dpdk-devbind.py --status
sudo ./usertools/dpdk-devbind.py --bind=vfio-pci 0000:3b:02.0 0000:3b:0a.0 
```

:::danger
If DPDK cannot bind your virtual function
Check again your BIOS if you have added iommu=pt and intel_iommu=on on the OS configuration
Check the IO virtualization too in BIOS setting, turn it to on so that your server could use SR-IOV 
:::

:::success
The virtual function port must be in the DPDK-compatible driver
![](https://i.imgur.com/2zP3tur.png)
:::