blob: d47e3b97512d70f9f317cb5e890812258a4fd016 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
#!/bin/bash
#set -x
source _common.sh
SCRIPT_DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
IAVF_DRIVER_VERSION="${IAVF_DRIVER_VERSION:-4.0.2}"
IAVF_DRIVER_DOWNLOAD_URL_DEFAULT="https://downloadmirror.intel.com/30305/eng/iavf-${IAVF_DRIVER_VERSION}.tar.gz"
IAVF_DRIVER_DOWNLOAD_URL="${IAVF_DRIVER_DOWNLOAD_URL:-$IAVF_DRIVER_DOWNLOAD_URL_DEFAULT}"
IAVF_DRIVER_ARCHIVE="$(basename "${IAVF_DRIVER_DOWNLOAD_URL}")"
IAVF_INSTALL_DIR_HOST="${IAVF_INSTALL_DIR_HOST:-/opt/iavf}"
IAVF_INSTALL_DIR_CONTAINER="${IAVF_INSTALL_DIR_CONTAINER:-/usr/local/iavf}"
CACHE_FILE="${IAVF_INSTALL_DIR_CONTAINER}/.cache"
check_adapter() {
local -r nic_models="X710 XL710 X722"
if [[ $(lspci | grep -c "Ethernet .* \(${nic_models// /\\|}\)") != "0" ]]; then
info "Found adapter"
else
error "Missing adapter"
exit "${RETCODE_ERROR}"
fi
}
download_iavf_src() {
info "Downloading IAVF source ... "
mkdir -p "${IAVF_INSTALL_DIR_CONTAINER}"
pushd "${IAVF_INSTALL_DIR_CONTAINER}" > /dev/null
curl -L -sS "${IAVF_DRIVER_DOWNLOAD_URL}" -o "${IAVF_DRIVER_ARCHIVE}"
tar xf "${IAVF_DRIVER_ARCHIVE}" --strip-components=1
info "Patching IAVF source ... "
# Ubuntu 18.04 added the skb_frag_off definitions to the kernel
# headers beginning with 4.15.0-159
patch -p1 < "${SCRIPT_DIR}/skb-frag-off.patch"
popd > /dev/null
}
build_iavf_src() {
info "Building IAVF source ... "
pushd "${IAVF_INSTALL_DIR_CONTAINER}/src" > /dev/null
KSRC=${KERNEL_SRC_DIR} SYSTEM_MAP_FILE="${ROOT_MOUNT_DIR}/boot/System.map-$(uname -r)" INSTALL_MOD_PATH="${ROOT_MOUNT_DIR}" make install
# TODO Unable to update initramfs. You may need to do this manaully.
popd > /dev/null
}
install_iavf() {
check_adapter
download_iavf_src
build_iavf_src
}
uninstall_iavf() {
if [[ $(lsmod | grep -c "iavf") != "0" ]]; then
rmmod iavf
fi
if [[ $(lsmod | grep -c "i40evf") != "0" ]]; then
rmmod i40evf
fi
if [[ -d "${IAVF_INSTALL_DIR_CONTAINER}/src" ]]; then
pushd "${IAVF_INSTALL_DIR_CONTAINER}/src" > /dev/null
KSRC=${KERNEL_SRC_DIR} SYSTEM_MAP_FILE="${ROOT_MOUNT_DIR}/boot/System.map-$(uname -r)" INSTALL_MOD_PATH="${ROOT_MOUNT_DIR}" make uninstall
popd > /dev/null
fi
# This is a workaround for missing INSTALL_MOD_PATH prefix in the Makefile:
rm -f "${ROOT_MOUNT_DIR}/etc/modprobe.d/iavf.conf"
}
check_cached_version() {
info "Checking cached version"
if [[ ! -f "${CACHE_FILE}" ]]; then
info "Cache file ${CACHE_FILE} not found"
return "${RETCODE_ERROR}"
fi
# Source the cache file and check if the cached driver matches
# currently running kernel and driver versions.
. "${CACHE_FILE}"
if [[ "$(uname -r)" == "${CACHE_KERNEL_VERSION}" ]]; then
if [[ "${IAVF_DRIVER_VERSION}" == "${CACHE_IAVF_DRIVER_VERSION}" ]]; then
info "Found existing driver installation for kernel version $(uname -r) and driver version ${IAVF_DRIVER_VERSION}"
return "${RETCODE_SUCCESS}"
fi
fi
return "${RETCODE_ERROR}"
}
update_cached_version() {
cat >"${CACHE_FILE}"<<__EOF__
CACHE_KERNEL_VERSION=$(uname -r)
CACHE_IAVF_DRIVER_VERSION=${IAVF_DRIVER_VERSION}
__EOF__
info "Updated cached version as:"
cat "${CACHE_FILE}"
}
upgrade_driver() {
uninstall_iavf
install_iavf
}
check_driver_started() {
if [[ $(lsmod | grep -c "iavf") == "0" ]]; then
return "${RETCODE_ERROR}"
fi
return 0
}
start_driver() {
modprobe -d "${ROOT_MOUNT_DIR}" -C "${ROOT_MOUNT_DIR}/etc/modprobe.d" iavf
if ! check_driver_started; then
error "Driver not started"
fi
}
uninstall_driver() {
uninstall_iavf
rm -f "${CACHE_FILE}"
}
main() {
load_etc_os_release
local -r cmd="${1:-install}"
case $cmd in
install)
if ! check_cached_version; then
upgrade_driver
update_cached_version
fi
if ! check_driver_started; then
start_driver
fi
;;
uninstall)
uninstall_driver
;;
esac
}
main "$@"
|