1function install_qat() { 2 if ! hash yasm; then 3 install yasm 4 fi 5 6 install libnl3 libnl3-devel || install libnl-3-200 libnl-3-dev 7 8 in_syms() { 9 local syms 10 if [[ -e /proc/kallsyms ]]; then 11 syms=/proc/kallsyms 12 elif [[ -e /boot/System.map-$kernel_ver ]]; then 13 syms=/boot/System.map-$kernel_ver 14 else 15 return 0 16 fi 17 18 grep -q "$1" "$syms" 19 } 20 21 if [[ -e /sys/module/qat_c62x ]]; then 22 sudo modprobe -r qat_c62x || : 23 fi 24 if [[ -d $GIT_REPOS/QAT ]]; then 25 sudo rm -rf "$GIT_REPOS/QAT" 26 fi 27 28 mkdir "$GIT_REPOS/QAT" 29 30 tar -C "$GIT_REPOS/QAT" -xzof - < <(wget -O- "$DRIVER_LOCATION_QAT") 31 32 if ge "$kernel_ver" 6.7.0; then 33 patch --dir="$GIT_REPOS/QAT" -p1 34 fi < "$rootdir/test/common/config/pkgdep/patches/qat/0001-phys_proc_id.patch" 35 36 if ge "$kernel_ver" 6.8.0; then 37 patch --dir="$GIT_REPOS/QAT" -p1 < \ 38 "$rootdir/test/common/config/pkgdep/patches/qat/0001-strlcpy-to-strscpy.patch" 39 patch --dir="$GIT_REPOS/QAT" -p1 < \ 40 "$rootdir/test/common/config/pkgdep/patches/qat/0001-missing-prototypes.patch" 41 fi 42 43 patch --dir="$GIT_REPOS/QAT" -p1 \ 44 < "$rootdir/test/common/config/pkgdep/patches/qat/0001-no-vmlinux.patch" 45 46 (cd "$GIT_REPOS/QAT" && sudo ./configure --enable-icp-sriov=host && sudo make install) 47 48 if ! sudo service qat_service start; then 49 echo "failed to start the qat service. Something may be wrong with your device or package." 50 fi 51} 52 53function install_rocksdb() { 54 # Rocksdb is installed for use with the blobfs tests. 55 if [ ! -d /usr/src/rocksdb ]; then 56 git clone "${GIT_REPO_ROCKSDB}" "$GIT_REPOS/rocksdb" 57 git -C "$GIT_REPOS/rocksdb" checkout 6.15.fb 58 sudo mv "$GIT_REPOS/rocksdb" /usr/src/ 59 else 60 sudo git -C /usr/src/rocksdb checkout 6.15.fb 61 echo "rocksdb already in /usr/src. Not checking out again" 62 fi 63} 64 65function install_ittapi() { 66 # Install Intel Instrumentation and Trace API 67 local ittapi_version=v3.24.5 ittapi_dir=/usr/src/ittapi 68 69 rm -rf "$ittapi_dir" 70 git clone "${GIT_REPO_ITTAPI}" --branch "$ittapi_version" "$GIT_REPOS/ittapi" 71 make -C "$GIT_REPOS/ittapi/src/ittnotify_refcol" 72 73 mv "$GIT_REPOS/ittapi" "$ittapi_dir" 74 ln -s . "$ittapi_dir/sdk" 75} 76 77function install_fio() { 78 # This version of fio is installed in /usr/src/fio to enable 79 # building the spdk fio plugin. 80 local fio_version="fio-3.35" 81 82 if [ ! -d /usr/src/fio ]; then 83 if [ ! -d fio ]; then 84 git clone "${GIT_REPO_FIO}" "$GIT_REPOS/fio" 85 sudo mv "$GIT_REPOS/fio" /usr/src/ 86 else 87 sudo mv "$GIT_REPOS/fio" /usr/src/ 88 fi 89 ( 90 git -C /usr/src/fio checkout master \ 91 && git -C /usr/src/fio pull \ 92 && git -C /usr/src/fio checkout $fio_version \ 93 && if [ $OSID == 'freebsd' ]; then 94 gmake -C /usr/src/fio -j${jobs} \ 95 && sudo gmake -C /usr/src/fio install 96 else 97 make -C /usr/src/fio -j${jobs} \ 98 && sudo make -C /usr/src/fio install 99 fi 100 ) 101 else 102 echo "fio already in /usr/src/fio. Not installing" 103 fi 104} 105 106function install_flamegraph() { 107 # Flamegraph is used when printing out timing graphs for the tests. 108 if [ ! -d /usr/local/FlameGraph ]; then 109 git clone "${GIT_REPO_FLAMEGRAPH}" "$GIT_REPOS/FlameGraph" 110 mkdir -p /usr/local 111 sudo mv "$GIT_REPOS/FlameGraph" /usr/local/FlameGraph 112 else 113 echo "flamegraph already installed. Skipping" 114 fi 115} 116 117function _install_qemu() { 118 local repo=$1 119 local branch=$2 120 local prefix=${3:-} 121 local name=${4:-} 122 123 mkdir -p "$GIT_REPOS/qemu" 124 125 local repo_dir=$GIT_REPOS/qemu/$branch 126 if [[ -n $prefix ]]; then 127 repo_dir=$GIT_REPOS/qemu/$prefix-$branch 128 fi 129 130 if [[ ! -d $repo_dir ]]; then 131 git clone "$repo" -b "$branch" "$repo_dir" 132 else 133 echo "qemu already checked out. Skipping" 134 fi 135 136 declare -a opt_params=("--prefix=/usr/local/qemu/${repo_dir##*/}") 137 declare -a extra_cflags=() 138 139 opt_params+=("--disable-docs") 140 if ((gcc_version >= 9)); then 141 opt_params+=("--disable-glusterfs") 142 fi 143 144 extra_cflags+=("-Wno-error") 145 146 # Most tsocks proxies rely on a configuration file in /etc/tsocks.conf. 147 # If using tsocks, please make sure to complete this config before trying to build qemu. 148 if [[ $INSTALL_TSOCKS == true && $NO_TSOCKS != true ]]; then 149 if hash tsocks 2> /dev/null; then 150 opt_params+=("--with-git='tsocks git'") 151 fi 152 fi 153 opt_params+=("--extra-cflags=${extra_cflags[*]}") 154 155 if [[ $prefix == vanilla ]]; then 156 # Latest qemu seems to take sysconfdir from the prefix and instead of checking /etc 157 # it looks under /usr/local/qemu/vanilla*/bin/../etc which is a bit peculiar. Fix it. 158 opt_params+=("--sysconfdir=/etc/") 159 fi 160 161 # The qemu configure script places several output files in the CWD. 162 (cd "$repo_dir" && ./configure "${opt_params[@]}" --target-list="x86_64-softmmu" --enable-kvm --enable-linux-aio --enable-numa) 163 164 make -C "$repo_dir" -j${jobs} 165 sudo make -C "$repo_dir" install 166 167 # Add a symlink to point at a latest build - this is useful to easily track QEMU flavors for which 168 # branches change quite often (e.g. vfio-user's). 169 [[ -n $name ]] || return 0 170 [[ -L /usr/local/qemu/$name-latest ]] && sudo rm "/usr/local/qemu/$name-latest" 171 sudo ln -s "/usr/local/qemu/${repo_dir##*/}" "/usr/local/qemu/$name-latest" 172} 173 174function install_qemu() { 175 # Four versions of QEMU are used in the tests, three are installed 176 # directly from the source. Each QEMU is dedicated for different 177 # use-cases: 178 # - Packed QEMU: version provided by given distro. Used to boot VMs 179 # from within vhost tests. 180 # - vfio-user QEMU: A special fork to test libvfio-user components. 181 # - Vanilla QEMU: Used by the CI to boot the testing VMs. 182 183 _install_qemu $GIT_REPO_QEMU_VFIO $VFIO_QEMU_BRANCH "" vfio-user 184 _install_qemu "$GIT_REPO_QEMU" "$VANILLA_QEMU_BRANCH" vanilla vanilla 185} 186 187function install_nvmecli() { 188 # nvme-cli >1.11.1 should be used. 189 rm -rf "$GIT_REPOS/nvme-cli-cuse" 190 git clone "https://github.com/linux-nvme/nvme-cli.git" "$GIT_REPOS/nvme-cli-cuse" 191 git -C "$GIT_REPOS/nvme-cli-cuse" checkout v2.5 192 193 meson setup --force-fallback-for=libnvme \ 194 "$GIT_REPOS/nvme-cli-cuse/.build" \ 195 "$GIT_REPOS/nvme-cli-cuse" 196 meson compile -C "$GIT_REPOS/nvme-cli-cuse/.build" 197 198 rm -rf /usr/local/src/nvme-cli 199 mv "$GIT_REPOS/nvme-cli-cuse" /usr/local/src/nvme-cli 200 201 # Make sure binary is available for the cuse tests 202 if [[ -e /usr/local/src/nvme-cli/.build/nvme ]]; then 203 sudo ln -s .build/nvme /usr/local/src/nvme-cli/ 204 fi 205} 206 207# This function install version of nvme-cli, that support listing spdk nvme 208# devices, should be remove after changes present in nvme-cli upstream. 209function install_nvmecli_plugin() { 210 rm -rf "$GIT_REPOS/nvme-cli-plugin" 211 212 git clone $GIT_REPO_NVME_CLI "$GIT_REPOS/nvme-cli-plugin" 213 git -C "$GIT_REPOS/nvme-cli-plugin" fetch $GIT_REPO_NVME_CLI refs/changes/95/16795/12 214 git -C "$GIT_REPOS/nvme-cli-plugin" checkout FETCH_HEAD 215 216 meson setup --force-fallback-for=libnvme,json-c \ 217 "$GIT_REPOS/nvme-cli-plugin/.build" \ 218 "$GIT_REPOS/nvme-cli-plugin" 219 meson compile -C "$GIT_REPOS/nvme-cli-plugin/.build" 220 221 rm -rf /usr/local/src/nvme-cli-plugin 222 mv "$GIT_REPOS/nvme-cli-plugin" /usr/local/src/nvme-cli-plugin 223 224 # Make sure binary is available for the plugin tests 225 if [[ -e /usr/local/src/nvme-cli-plugin/.build/nvme ]]; then 226 sudo ln -s .build/nvme /usr/local/src/nvme-cli-plugin/ 227 fi 228} 229 230function install_libiscsi() { 231 # We currently don't make any changes to the libiscsi repository for our tests, but it is possible that we will need 232 # to later. Cloning from git is just future proofing the machines. 233 if [[ ! -d $GIT_REPOS/libiscsi ]]; then 234 git clone "${GIT_REPO_LIBISCSI}" "$GIT_REPOS/libiscsi" 235 else 236 echo "libiscsi already checked out. Skipping" 237 fi 238 (cd "$GIT_REPOS/libiscsi" && ./autogen.sh && ./configure --prefix=/usr/local/libiscsi) 239 make -C "$GIT_REPOS/libiscsi" -j${jobs} WARN_CFLAGS= 240 sudo make -C "$GIT_REPOS/libiscsi" install 241} 242 243function install_git() { 244 if type -P git; then 245 if ge "$(git --version | awk '{print $3}')" "$GIT_VERSION"; then 246 return 0 247 fi 248 fi >/dev/null 249 250 install zlib-devel curl-devel 251 tar -C "$GIT_REPOS" -xzof <(wget -qO- "$GIT_REPO_GIT") 252 (cd "$GIT_REPOS/git-$GIT_VERSION" \ 253 && make configure \ 254 && ./configure \ 255 && sudo make -j${jobs} install) 256} 257 258function install_extra_pkgs() { 259 if [[ $INSTALL_QAT == true ]]; then 260 install libudev-devel || install libudev-dev || : 261 fi 262 263 if [[ $INSTALL_QEMU == true ]]; then 264 install qemu-system-x86 qemu-img \ 265 || install qemu-system-x86 qemu-utils \ 266 || install qemu 267 268 # Install extra dependency which was removed from Qemu 7.2 source tree 269 install libslirp-devel \ 270 || install libslirp-dev 271 fi || : 272} 273 274function install_vagrant() { 275 local vagrant_version="2.2.7" 276 local vagrant_installer="vagrant_${vagrant_version}_x86_64.deb" 277 local vagrant_plugins=(vagrant-libvirt vagrant-sshfs vagrant-cachier vagrant-proxyconf) 278 279 if [[ $OSID != ubuntu ]]; then 280 echo "Currently, Vagrant installation is supported only on ubuntu" 281 return 0 282 fi 283 284 # Install vagrant and it's plugins dependencies 285 # function should be defined in pkgdep/$package_manager file 286 install_vagrant_dependencies 287 288 # Download and install vagrant 289 if hash vagrant &> /dev/null; then 290 echo "Vagrant is already installed" 291 else 292 wget "https://releases.hashicorp.com/vagrant/${vagrant_version}/${vagrant_installer}" 293 sudo dpkg -i "${vagrant_installer}" 294 fi 295 vagrant --version 296 297 # Install vagrant plugins 298 local vagrant_plugin_list 299 vagrant_plugin_list=$(vagrant plugin list) 300 301 local plugin 302 for plugin in "${vagrant_plugins[@]}"; do 303 if grep -Fq "$plugin" <<< "$vagrant_plugin_list"; then 304 echo "$plugin already installed" 305 else 306 vagrant plugin install "$plugin" 307 fi 308 done 309} 310 311function install_igb_uio() { 312 git clone "${GIT_REPO_DPDK_KMODS}" "$GIT_REPOS/dpdk-kmods" 313 314 (cd "$GIT_REPOS/dpdk-kmods/linux/igb_uio" && make -j ${jobs}) 315 sudo mkdir -p "/lib/modules/$(uname -r)/extra/dpdk" 316 sudo cp "$GIT_REPOS/dpdk-kmods/linux/igb_uio/igb_uio.ko" "/lib/modules/$(uname -r)/extra/dpdk" 317 sudo depmod 318} 319 320function install_irdma() { 321 local RDMA_CORE_VERSION=46.0 322 local RDMA_CORE=https://github.com/linux-rdma/rdma-core/releases/download/v$RDMA_CORE_VERSION/rdma-core-$RDMA_CORE_VERSION.tar.gz 323 324 if [[ $ID != fedora ]]; then 325 echo "Installation of the irdma can be attempted only on Fedora" 326 return 0 327 fi 328 329 # Install extra dependencies needed by the rdma-core 330 install ninja-build pandoc perl-generators valgrind-devel python-docutils libnl3 libnl3-devel python3-Cython 331 332 rm -rf "$GIT_REPOS/irdma-$IRDMA_VERSION" 333 rm -rf "$GIT_REPOS/rdma-core-$RDMA_CORE_VERSION" 334 335 curl -L -o- "$IRDMA_DRIVER" | tar -C "$GIT_REPOS" -xzf - 336 [[ -e $GIT_REPOS/irdma-$IRDMA_VERSION/build.sh ]] 337 338 if ge "$kernel_ver" 6.5.1; then 339 patch --dir="$GIT_REPOS/irdma-$IRDMA_VERSION" -p1 340 fi < "$rootdir/test/common/config/pkgdep/patches/irdma/0001-irdma-avoid-fortify-string-warning.patch" 341 ( 342 cd "$GIT_REPOS/irdma-$IRDMA_VERSION" 343 sed -i "s/IRDMA_FLUSH_DELAY_MS 1500/IRDMA_FLUSH_DELAY_MS 50/" \ 344 "$GIT_REPOS/irdma-$IRDMA_VERSION/src/irdma/verbs.h" 345 "$GIT_REPOS/irdma-$IRDMA_VERSION/build.sh" 346 ) 347 348 # Fetch and build the rdma-core irdma depends on 349 curl -L -o- "$RDMA_CORE" | tar -C "$GIT_REPOS" -xzf - 350 [[ -e $GIT_REPOS/irdma-$IRDMA_VERSION/libirdma-$RDMA_CORE_VERSION.patch ]] 351 352 patch --dir="$GIT_REPOS/rdma-core-$RDMA_CORE_VERSION" -p2 \ 353 < "$GIT_REPOS/irdma-$IRDMA_VERSION/libirdma-$RDMA_CORE_VERSION.patch" 354 355 # Note that paths and the name of the package are hardcoded into .spec, hence they need to stay like this. 356 [[ -e $GIT_REPOS/rdma-core-$RDMA_CORE_VERSION/redhat/rdma-core.spec ]] 357 mkdir -p "$HOME/rpmbuild/"{SOURCES,SPECS} 358 cp "$GIT_REPOS/rdma-core-$RDMA_CORE_VERSION/redhat/rdma-core.spec" "$HOME/rpmbuild/SPECS" 359 360 # Re-package the source 361 tar -czf "$HOME/rpmbuild/SOURCES/rdma-core-$RDMA_CORE_VERSION.tgz" -C "$GIT_REPOS" "rdma-core-$RDMA_CORE_VERSION" 362 363 # Build the rpms 364 ( 365 cd "$HOME/rpmbuild/SPECS" 366 # Make sure stock ninja-build is used 367 PATH="/usr/bin:$PATH" rpmbuild -ba rdma-core.spec 368 ) 369 370 # Now, don't install the packages since this will, most likely, conflict with packages already installed 371 # in the system. Instead, simply inform user what the next step is and note what potential issues it may 372 # have with the installation. 373 374 shopt -s nullglob 375 local rpms=("$HOME/rpmbuild/RPMS/x86_64/"*.rpm) 376 shopt -u nullglob 377 ((${#rpms[@]} > 0)) 378 379 cat <<-EOF 380 381 INFO: rdma-core-$RDMA_CORE_VERSION was successfully built, following packages are 382 available for installation: 383 384 $(printf ' - %s\n' "${rpms[@]##*/}") 385 386 Note that installing the above packages may raise conflicts with their 387 potentially newer versions already installed on the system. Dependent 388 packages may be uninstalled during the process as well. Please, run the 389 following command to finish the installation: 390 391 $package_manager install [--allowerasing] $HOME/rpmbuild/RPMS/x86_64/*.rpm 392 393 EOF 394} 395 396function install_ice() { 397 rm -rf "$GIT_REPOS/ice-$ICE_VERSION" 398 399 curl -L -o- "$ICE_DRIVER" | tar -C "$GIT_REPOS" -xzf - 400 401 if ge "$kernel_ver" 6.7.0; then 402 patch --dir="$GIT_REPOS/ice-$ICE_VERSION/src" \ 403 < "$rootdir/test/common/config/pkgdep/patches/ice/0001-devlink_fmsg.patch" 404 patch --dir="$GIT_REPOS/ice-$ICE_VERSION/src" \ 405 < "$rootdir/test/common/config/pkgdep/patches/ice/0001-xdp_do_flush_map.patch" 406 fi 407 408 if ge "$kernel_ver" 6.8.0; then 409 patch --dir="$GIT_REPOS/ice-$ICE_VERSION/src" 410 fi < "$rootdir/test/common/config/pkgdep/patches/ice/0001-ethtool-set-get-rxfh-params.patch" 411 412 ( 413 cd "$GIT_REPOS/ice-$ICE_VERSION/src" 414 sudo make -j"$(nproc)" install 415 ) 416} 417 418function install_lcov() { 419 local lcov_version=v1.15 420 421 install perl-IO-Compress || install perl-modules 422 423 rm -rf /usr/src/lcov 424 sudo git clone "$GIT_REPO_LCOV" --branch "$lcov_version" /usr/src/lcov 425 (cd /usr/src/lcov; sudo make install) 426} 427 428function install_bpftrace() { 429 local deps=() bcc_rev 430 431 deps+=(cereal-devel) 432 deps+=(clang-devel) 433 deps+=(cmake) 434 deps+=(dwarves) 435 deps+=(gmock-devel) 436 deps+=(gtest-devel) 437 deps+=(llvm-devel) 438 deps+=(bcc-devel) 439 deps+=(libbpf-devel) 440 441 install "${deps[@]}" 442 443 rm -rf $GIT_REPOS/bpftrace 444 445 git clone "$GIT_REPO_BPFTRACE" "$GIT_REPOS/bpftrace" 446 git -C $GIT_REPOS/bpftrace checkout $BPFTRACE_VERSION 447 448 mkdir -p "$GIT_REPOS/bpftrace/build" 449 cmake \ 450 -DCMAKE_BUILD_TYPE=Release \ 451 -DBUILD_TESTING=OFF \ 452 -B "$GIT_REPOS/bpftrace/build" \ 453 -S "$GIT_REPOS/bpftrace" 454 455 make -C $GIT_REPOS/bpftrace/build -j$(nproc) 456 sudo make -C $GIT_REPOS/bpftrace/build install 457} 458 459function install_sources() { 460 if [[ $ID == centos ]] && (( VERSION_ID == 7 )); then 461 # install proper version of the git first 462 install_git 463 fi 464 465 IFS="," read -ra conf_env <<< "$CONF" 466 for conf in "${conf_env[@]}"; do 467 export "INSTALL_${conf^^}=true" 468 done 469 470 if [[ $OSID == freebsd ]]; then 471 jobs=$(($(sysctl -n hw.ncpu) * 2)) 472 else 473 jobs=$(($(nproc) * 2)) 474 sources+=( 475 install_irdma 476 install_libiscsi 477 install_nvmecli 478 install_nvmecli_plugin 479 install_qat 480 install_rocksdb 481 install_flamegraph 482 install_qemu 483 install_igb_uio 484 install_ice 485 install_lcov 486 install_bpftrace 487 ) 488 install_extra_pkgs 489 fi 490 sources+=(install_fio) 491 sources+=(install_vagrant) 492 sources+=(install_ittapi) 493 494 sudo mkdir -p /usr/{,local}/src 495 sudo mkdir -p "$GIT_REPOS" 496 497 for source in "${sources[@]}"; do 498 source_conf=${source^^} 499 if [[ ${!source_conf} == true ]]; then 500 "$source" 501 fi 502 done 503} 504 505GIT_VERSION=2.25.1 506IRDMA_VERSION=1.13.43 507ICE_VERSION=1.13.7 508 509BPFTRACE_VERSION=${BPFTRACE_VERSION:-db63ddb} 510VFIO_QEMU_BRANCH=${VFIO_QEMU_BRANCH:-vfio-user-p3.0} 511VANILLA_QEMU_BRANCH=${VANILLA_QEMU_BRANCH:-v8.0.0} 512 513: ${GIT_REPO_ROCKSDB=https://review.spdk.io/spdk/rocksdb} 514export GIT_REPO_ROCKSDB 515: ${GIT_REPO_FIO=https://github.com/axboe/fio.git} 516export GIT_REPO_FIO 517: ${GIT_REPO_FLAMEGRAPH=https://github.com/brendangregg/FlameGraph.git} 518export GIT_REPO_FLAMEGRAPH 519: ${GIT_REPO_QEMU=https://github.com/qemu/qemu} 520export GIT_REPO_QEMU 521: ${GIT_REPO_QEMU_VFIO=https://github.com/oracle/qemu} 522export GIT_REPO_QEMU_VFIO 523: ${GIT_REPO_LIBISCSI=https://github.com/sahlberg/libiscsi} 524export GIT_REPO_LIBISCSI 525: ${DRIVER_LOCATION_QAT=https://downloadmirror.intel.com/795697/QAT.L.4.24.0-00005.tar.gz} 526export DRIVER_LOCATION_QAT 527: ${GIT_REPO_GIT=https://github.com/git/git/archive/v${GIT_VERSION}.tar.gz} 528export GIT_REPO_GIT 529: ${GIT_REPO_DPDK_KMODS=http://dpdk.org/git/dpdk-kmods} 530export GIT_REPO_DPDK_KMODS 531: ${IRDMA_DRIVER=https://downloadmirror.intel.com/812530/irdma-$IRDMA_VERSION.tgz} 532export IRDMA_DRIVER 533: ${ICE_DRIVER="https://sourceforge.net/projects/e1000/files/ice%20stable/$ICE_VERSION/ice-$ICE_VERSION.tar.gz"} 534export ICE_DRIVER 535: ${GIT_REPO_LCOV=https://github.com/linux-test-project/lcov} 536export GIT_REPO_LCOV 537: ${GIT_REPO_BCC=https://github.com/iovisor/bcc.git} 538export GIT_REPO_BCC 539: ${GIT_REPO_BPFTRACE=https://github.com/iovisor/bpftrace.git} 540export GIT_REPO_BPFTRACE 541: ${GIT_REPO_NVME_CLI=https://review.spdk.io/gerrit/spdk/nvme-cli} 542export GIT_REPO_NVME_CLI 543: ${GIT_REPO_ITTAPI=https://github.com/intel/ittapi.git} 544export GIT_REPO_ITTAPI 545 546GIT_REPOS=${GIT_REPOS:-$HOME} 547 548gcc_version=$(gcc -dumpversion) gcc_version=${gcc_version%%.*} 549if [[ -e /proc/sys/kernel/osrelease ]]; then 550 kernel_ver=$(< /proc/sys/kernel/osrelease) 551fi 552