summaryrefslogtreecommitdiff
path: root/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh
blob: 93d48710125382407eabeda8933e38ba8ed89832 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#!/bin/sh

# Copyright (c) 2018 Nicira/VMware, Inc.
#
# 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:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This script is intended to be used on the following kernels.
#   - 3.10.0 major revision 327  (RHEL 7.2)
#   - 3.10.0 major revision 693  (RHEL 7.4)
#   - 3.10.0 major revision 957  (RHEL 7.6)
#   - 3.10.0 major revision 1062 (RHEL 7.7)
#   - 3.10.0 major revision 1101 (RHEL 7.8 Beta)
#   - 3.10.0 major revision 1127 (RHEL 7.8 GA)
#   - 4.4.x,  x >= 73           (SLES 12 SP3)
#   - 4.12.x, x >= 14           (SLES 12 SP4).
# It is packaged in the openvswitch kmod RPM and run in the post-install
# scripts.
#
# For kernel 3.10.0-957,
# due to some backward incompatible changes introduced in minor revision 12.1,
# kernel modules built against kernels newer than 12.1 cannot be loaded on
# system running kernels older than 12.1, vice versa.
#
# For kernel 3.10.0-693,
# due to some backward incompatible changes introduced in minor revision 17.1,
# kernel modules built against kernels newer than 17.1 cannot be loaded on
# system running kernels older than 17.1, vice versa.
#
# For kernel 3.10.0-327,
# due to some backward incompatible changes introduced in minor revision 41.3,
# kernel modules built against kernels newer than 41.3 cannot be loaded on
# system running kernels older than 41.3, vice versa.
#
# For kernel >= 4.4.73,
# kernel modules built with 4.4.73 can run on systems with kernel versions from
# 4.4.73 to 4.4.114; modules built against 4.4.120 can run on systems from
# 4.4.120 onwards.
#
# For kernel 4.12.x, x>=14,
# kernel modules built with the oldest compatible kernel 4.12.14-94.41.1 can
# run on all versions onwards.
#
# This script checks the current running kernel version, and update symlinks
# for the openvswitch kernel modules in the appropriate kernel directory,
# provided the kmod RPM has installed kernel modules files built from both
# minor revisions.
#
# In case of a kernel minor revision change after the openvswitch kmod package
# is installed, this script shall be run manually after system reboots and
# switches to a different kernel
if [ -n "$(rpm -qa kmod-openvswitch)" ]; then
    rpmname="kmod-openvswitch"
elif [ -n "$(rpm -qa openvswitch-kmod)" ]; then
    rpmname="openvswitch-kmod"
else
    echo "openvswitch kmod package not installed, existing"
    exit 1
fi
#echo $rpmname
script_name=$(basename -- "$0")
current_kernel=$(uname -r)
echo current kernel is $current_kernel

IFS='.\|-' read mainline_major mainline_minor mainline_patch major_rev \
    minor_rev _extra <<<"${current_kernel}"
# echo mainline_major=$mainline_major mainline_minor=$mainline_minor \
# mainline_patch=$mainline_patch major_rev=$major_rev minor_rev=$minor_rev

expected_rhel_base_minor="el7"
if [ "$mainline_major" = "3" ] && [ "$mainline_minor" = "10" ]; then
    if [ "$major_rev" = "327" ]; then
#        echo "rhel72"
        comp_ver=36
        ver_offset=4
        installed_ver="$minor_rev"
    elif [ "$major_rev" = "514" ]; then
#        echo "rhel73"
        comp_ver=26
        ver_offset=4
        installed_ver="$minor_rev"
    elif [ "$major_rev" = "693" ]; then
#        echo "rhel74"
        comp_ver=11
        ver_offset=4
        installed_ver="$minor_rev"
    elif [ "$major_rev" = "862" ]; then
#        echo "rhel75"
        comp_ver=20
        ver_offset=4
        installed_ver="$minor_rev"
    elif [ "$major_rev" = "957" ]; then
#        echo "rhel76"
        comp_ver=10
        ver_offset=4
        installed_ver="$minor_rev"
    elif [ "$major_rev" = "1062" ]; then
#        echo "rhel77"
        comp_ver=10
        ver_offset=4
        installed_ver="$minor_rev"
    elif [ "$major_rev" = "1101" ]; then
#        echo "rhel78"
        comp_ver=10
        ver_offset=4
        installed_ver="$minor_rev"
    fi
    elif [ "$major_rev" = "1127" ]; then
#        echo "rhel78"
        comp_ver=10
        ver_offset=4
        installed_ver="$minor_rev"
    fi
elif [ "$mainline_major" = "4" ] && [ "$mainline_minor" = "4" ]; then
    if [ "$mainline_patch" -ge "73" ]; then
#        echo "sles12sp3"
        comp_ver=114
        ver_offset=2
        installed_ver="$mainline_patch"
    fi
elif [ "$mainline_major" = "4" ] && [ "$mainline_minor" = "12" ]; then
    if [ "$mainline_patch" -ge "14" ]; then
#        echo "sles12sp4"
        comp_ver=1
        ver_offset=2
        installed_ver="$mainline_patch"
    fi
fi

if [ X"$ver_offset" = X ]; then
    echo "This script is not intended to run on kernel $(uname -r)"
    exit 1
fi

#IFS='.\|-' read -r -a version_nums <<<"${current_kernel}"
#echo ver_offset=$ver_offset
#echo installed_ver="$installed_ver"
#echo installed_ver="${version_nums[$ver_offset]}"

kmod_versions=()
kversion=$(rpm -ql ${rpmname} | grep '\.ko$' | \
           sed -n -e 's/^\/lib\/modules\/\(.*\)\/extra\/.*$/\1/p' | \
           sort | uniq)
for kv in $kversion; do
    IFS='.\|-' read -r -a kv_nums <<<"${kv}"
    kmod_versions+=(${kv_nums[$ver_offset]})
done
sorted_kmod_vers=$(printf "%s\n" "${kmod_versions[@]}" | \
                       sort -n)
#echo "$sorted_kmod_vers"

if [ ! -n "$sorted_kmod_vers" ]; then
    echo "No kernel modules found from package $rpmname, exiting"
    exit 1
else
    # first line for kmod_low_ver, last for kmod_high_ver
    kmod_low_ver=$(echo "$sorted_kmod_vers" | head -1)
    kmod_high_ver=$(echo "$sorted_kmod_vers" | tail -1)
fi
#echo "Installing KMOD with minor revisions $kmod_low_ver and \
#$kmod_high_ver"

found_match=false
for kname in $kversion;
do
    IFS='.\|-' read -r -a pkg_ver_nums <<<"${kname}"
    pkg_ver=${pkg_ver_nums[$ver_offset]}
    if [ "$installed_ver" = "$expected_rhel_base_minor" ] ||
       [ "$installed_ver" -le "$comp_ver" ]; then
        if [ "$pkg_ver" = "$kmod_low_ver" ]; then
            requested_kernel=$kname
            found_match="true"
            echo "Installing Openvswitch KMOD from kernel $kname"
            break
        fi
    else
        if [ "$pkg_ver" = "$kmod_high_ver" ]; then
            requested_kernel=$kname
            found_match="true"
            echo "Installing Openvswitch KMOD from kernel $kname"
            break
        fi
    fi
done

if [ "$found_match" = "false" ]; then
    echo $script_name: Failed
    exit 1
fi

if [ "$requested_kernel" != "$current_kernel" ]; then
    if [ ! -d /lib/modules/$current_kernel/weak-updates/openvswitch ]; then
        mkdir -p /lib/modules/$current_kernel/weak-updates
        mkdir -p /lib/modules/$current_kernel/weak-updates/openvswitch
    fi
    for m in openvswitch vport-gre vport-stt vport-geneve \
        vport-lisp vport-vxlan; do
        ln -f -s /lib/modules/$requested_kernel/extra/openvswitch/$m.ko \
            /lib/modules/$current_kernel/weak-updates/openvswitch/$m.ko
    done
else
    echo Proper OVS kernel modules already configured
fi
# Always run depmod
/sbin/depmod -a