Current File : //proc/self/root/usr/lib/modules/6.8.0-60-generic/build/tools/testing/selftests/net/ioam6.sh
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
#
# Author: Justin Iurman <justin.iurman@uliege.be>
#
# This script evaluates the IOAM insertion for IPv6 by checking the IOAM data
# consistency directly inside packets on the receiver side. Tests are divided
# into three categories: OUTPUT (evaluates the IOAM processing by the sender),
# INPUT (evaluates the IOAM processing by a receiver) and GLOBAL (evaluates
# wider use cases that do not fall into the other two categories). Both OUTPUT
# and INPUT tests only use a two-node topology (alpha and beta), while GLOBAL
# tests use the entire three-node topology (alpha, beta, gamma). Each test is
# documented inside its own handler in the code below.
#
# An IOAM domain is configured from Alpha to Gamma but not on the reverse path.
# When either Beta or Gamma is the destination (depending on the test category),
# Alpha adds an IOAM option (Pre-allocated Trace) inside a Hop-by-hop.
#
#
#            +-------------------+            +-------------------+
#            |                   |            |                   |
#            |    Alpha netns    |            |    Gamma netns    |
#            |                   |            |                   |
#            |  +-------------+  |            |  +-------------+  |
#            |  |    veth0    |  |            |  |    veth0    |  |
#            |  |  db01::2/64 |  |            |  |  db02::2/64 |  |
#            |  +-------------+  |            |  +-------------+  |
#            |         .         |            |         .         |
#            +-------------------+            +-------------------+
#                      .                                .
#                      .                                .
#                      .                                .
#            +----------------------------------------------------+
#            |         .                                .         |
#            |  +-------------+                  +-------------+  |
#            |  |    veth0    |                  |    veth1    |  |
#            |  |  db01::1/64 | ................ |  db02::1/64 |  |
#            |  +-------------+                  +-------------+  |
#            |                                                    |
#            |                      Beta netns                    |
#            |                                                    |
#            +----------------------------------------------------+
#
#
#
#        =============================================================
#        |                Alpha - IOAM configuration                 |
#        +===========================================================+
#        | Node ID             | 1                                   |
#        +-----------------------------------------------------------+
#        | Node Wide ID        | 11111111                            |
#        +-----------------------------------------------------------+
#        | Ingress ID          | 0xffff (default value)              |
#        +-----------------------------------------------------------+
#        | Ingress Wide ID     | 0xffffffff (default value)          |
#        +-----------------------------------------------------------+
#        | Egress ID           | 101                                 |
#        +-----------------------------------------------------------+
#        | Egress Wide ID      | 101101                              |
#        +-----------------------------------------------------------+
#        | Namespace Data      | 0xdeadbee0                          |
#        +-----------------------------------------------------------+
#        | Namespace Wide Data | 0xcafec0caf00dc0de                  |
#        +-----------------------------------------------------------+
#        | Schema ID           | 777                                 |
#        +-----------------------------------------------------------+
#        | Schema Data         | something that will be 4n-aligned   |
#        +-----------------------------------------------------------+
#
#
#        =============================================================
#        |                 Beta - IOAM configuration                 |
#        +===========================================================+
#        | Node ID             | 2                                   |
#        +-----------------------------------------------------------+
#        | Node Wide ID        | 22222222                            |
#        +-----------------------------------------------------------+
#        | Ingress ID          | 201                                 |
#        +-----------------------------------------------------------+
#        | Ingress Wide ID     | 201201                              |
#        +-----------------------------------------------------------+
#        | Egress ID           | 202                                 |
#        +-----------------------------------------------------------+
#        | Egress Wide ID      | 202202                              |
#        +-----------------------------------------------------------+
#        | Namespace Data      | 0xdeadbee1                          |
#        +-----------------------------------------------------------+
#        | Namespace Wide Data | 0xcafec0caf11dc0de                  |
#        +-----------------------------------------------------------+
#        | Schema ID           | 666                                 |
#        +-----------------------------------------------------------+
#        | Schema Data         | Hello there -Obi                    |
#        +-----------------------------------------------------------+
#
#
#        =============================================================
#        |                Gamma - IOAM configuration                 |
#        +===========================================================+
#        | Node ID             | 3                                   |
#        +-----------------------------------------------------------+
#        | Node Wide ID        | 33333333                            |
#        +-----------------------------------------------------------+
#        | Ingress ID          | 301                                 |
#        +-----------------------------------------------------------+
#        | Ingress Wide ID     | 301301                              |
#        +-----------------------------------------------------------+
#        | Egress ID           | 0xffff (default value)              |
#        +-----------------------------------------------------------+
#        | Egress Wide ID      | 0xffffffff (default value)          |
#        +-----------------------------------------------------------+
#        | Namespace Data      | 0xdeadbee2                          |
#        +-----------------------------------------------------------+
#        | Namespace Wide Data | 0xcafec0caf22dc0de                  |
#        +-----------------------------------------------------------+
#        | Schema ID           | 0xffffff (= None)                   |
#        +-----------------------------------------------------------+
#        | Schema Data         |                                     |
#        +-----------------------------------------------------------+

source lib.sh

################################################################################
#                                                                              #
# WARNING: Be careful if you modify the block below - it MUST be kept          #
#          synchronized with configurations inside ioam6_parser.c and always   #
#          reflect the same.                                                   #
#                                                                              #
################################################################################

ALPHA=(
	1					# ID
	11111111				# Wide ID
	0xffff					# Ingress ID
	0xffffffff				# Ingress Wide ID
	101					# Egress ID
	101101					# Egress Wide ID
	0xdeadbee0				# Namespace Data
	0xcafec0caf00dc0de			# Namespace Wide Data
	777					# Schema ID (0xffffff = None)
	"something that will be 4n-aligned"	# Schema Data
)

BETA=(
	2
	22222222
	201
	201201
	202
	202202
	0xdeadbee1
	0xcafec0caf11dc0de
	666
	"Hello there -Obi"
)

GAMMA=(
	3
	33333333
	301
	301301
	0xffff
	0xffffffff
	0xdeadbee2
	0xcafec0caf22dc0de
	0xffffff
	""
)

TESTS_OUTPUT="
	out_undef_ns
	out_no_room
	out_bits
	out_full_supp_trace
"

TESTS_INPUT="
	in_undef_ns
	in_no_room
	in_oflag
	in_bits
	in_full_supp_trace
"

TESTS_GLOBAL="
	fwd_full_supp_trace
"


################################################################################
#                                                                              #
#                                   LIBRARY                                    #
#                                                                              #
################################################################################

check_kernel_compatibility()
{
  setup_ns ioam_tmp_node
  ip link add name veth0 netns $ioam_tmp_node type veth \
         peer name veth1 netns $ioam_tmp_node

  ip -netns $ioam_tmp_node link set veth0 up
  ip -netns $ioam_tmp_node link set veth1 up

  ip -netns $ioam_tmp_node ioam namespace add 0
  ns_ad=$?

  ip -netns $ioam_tmp_node ioam namespace show | grep -q "namespace 0"
  ns_sh=$?

  if [[ $ns_ad != 0 || $ns_sh != 0 ]]
  then
    echo "SKIP: kernel version probably too old, missing ioam support"
    ip link del veth0 2>/dev/null || true
    cleanup_ns $ioam_tmp_node || true
    exit $ksft_skip
  fi

  ip -netns $ioam_tmp_node route add db02::/64 encap ioam6 mode inline \
         trace prealloc type 0x800000 ns 0 size 4 dev veth0
  tr_ad=$?

  ip -netns $ioam_tmp_node -6 route | grep -q "encap ioam6"
  tr_sh=$?

  if [[ $tr_ad != 0 || $tr_sh != 0 ]]
  then
    echo "SKIP: cannot attach an ioam trace to a route, did you compile" \
         "without CONFIG_IPV6_IOAM6_LWTUNNEL?"
    ip link del veth0 2>/dev/null || true
    cleanup_ns $ioam_tmp_node || true
    exit $ksft_skip
  fi

  ip link del veth0 2>/dev/null || true
  cleanup_ns $ioam_tmp_node || true

  lsmod | grep -q "ip6_tunnel"
  ip6tnl_loaded=$?

  if [ $ip6tnl_loaded = 0 ]
  then
    encap_tests=0
  else
    modprobe ip6_tunnel &>/dev/null
    lsmod | grep -q "ip6_tunnel"
    encap_tests=$?

    if [ $encap_tests != 0 ]
    then
      ip a | grep -q "ip6tnl0"
      encap_tests=$?

      if [ $encap_tests != 0 ]
      then
        echo "Note: ip6_tunnel not found neither as a module nor inside the" \
             "kernel, tests that require it (encap mode) will be omitted"
      fi
    fi
  fi
}

cleanup()
{
  ip link del ioam-veth-alpha 2>/dev/null || true
  ip link del ioam-veth-gamma 2>/dev/null || true

  cleanup_ns $ioam_node_alpha $ioam_node_beta $ioam_node_gamma || true

  if [ $ip6tnl_loaded != 0 ]
  then
    modprobe -r ip6_tunnel 2>/dev/null || true
  fi
}

setup()
{
  setup_ns ioam_node_alpha ioam_node_beta ioam_node_gamma

  ip link add name ioam-veth-alpha netns $ioam_node_alpha type veth \
         peer name ioam-veth-betaL netns $ioam_node_beta
  ip link add name ioam-veth-betaR netns $ioam_node_beta type veth \
         peer name ioam-veth-gamma netns $ioam_node_gamma

  ip -netns $ioam_node_alpha link set ioam-veth-alpha name veth0
  ip -netns $ioam_node_beta link set ioam-veth-betaL name veth0
  ip -netns $ioam_node_beta link set ioam-veth-betaR name veth1
  ip -netns $ioam_node_gamma link set ioam-veth-gamma name veth0

  ip -netns $ioam_node_alpha addr add db01::2/64 dev veth0
  ip -netns $ioam_node_alpha link set veth0 up
  ip -netns $ioam_node_alpha link set lo up
  ip -netns $ioam_node_alpha route add db02::/64 via db01::1 dev veth0
  ip -netns $ioam_node_alpha route del db01::/64
  ip -netns $ioam_node_alpha route add db01::/64 dev veth0

  ip -netns $ioam_node_beta addr add db01::1/64 dev veth0
  ip -netns $ioam_node_beta addr add db02::1/64 dev veth1
  ip -netns $ioam_node_beta link set veth0 up
  ip -netns $ioam_node_beta link set veth1 up
  ip -netns $ioam_node_beta link set lo up

  ip -netns $ioam_node_gamma addr add db02::2/64 dev veth0
  ip -netns $ioam_node_gamma link set veth0 up
  ip -netns $ioam_node_gamma link set lo up
  ip -netns $ioam_node_gamma route add db01::/64 via db02::1 dev veth0

  # - IOAM config -
  ip netns exec $ioam_node_alpha sysctl -wq net.ipv6.ioam6_id=${ALPHA[0]}
  ip netns exec $ioam_node_alpha sysctl -wq net.ipv6.ioam6_id_wide=${ALPHA[1]}
  ip netns exec $ioam_node_alpha sysctl -wq net.ipv6.conf.veth0.ioam6_id=${ALPHA[4]}
  ip netns exec $ioam_node_alpha sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${ALPHA[5]}
  ip -netns $ioam_node_alpha ioam namespace add 123 data ${ALPHA[6]} wide ${ALPHA[7]}
  ip -netns $ioam_node_alpha ioam schema add ${ALPHA[8]} "${ALPHA[9]}"
  ip -netns $ioam_node_alpha ioam namespace set 123 schema ${ALPHA[8]}

  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.all.forwarding=1
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.ioam6_id=${BETA[0]}
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.ioam6_id_wide=${BETA[1]}
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_id=${BETA[2]}
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${BETA[3]}
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth1.ioam6_id=${BETA[4]}
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth1.ioam6_id_wide=${BETA[5]}
  ip -netns $ioam_node_beta ioam namespace add 123 data ${BETA[6]} wide ${BETA[7]}
  ip -netns $ioam_node_beta ioam schema add ${BETA[8]} "${BETA[9]}"
  ip -netns $ioam_node_beta ioam namespace set 123 schema ${BETA[8]}

  ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.ioam6_id=${GAMMA[0]}
  ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.ioam6_id_wide=${GAMMA[1]}
  ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1
  ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.conf.veth0.ioam6_id=${GAMMA[2]}
  ip netns exec $ioam_node_gamma sysctl -wq net.ipv6.conf.veth0.ioam6_id_wide=${GAMMA[3]}
  ip -netns $ioam_node_gamma ioam namespace add 123 data ${GAMMA[6]} wide ${GAMMA[7]}

  sleep 1

  ip netns exec $ioam_node_alpha ping6 -c 5 -W 1 db02::2 &>/dev/null
  if [ $? != 0 ]
  then
    echo "Setup FAILED"
    cleanup &>/dev/null
    exit 0
  fi
}

log_test_passed()
{
  local desc=$1
  printf "TEST: %-60s  [ OK ]\n" "${desc}"
}

log_test_failed()
{
  local desc=$1
  printf "TEST: %-60s  [FAIL]\n" "${desc}"
}

log_results()
{
  echo "- Tests passed: ${npassed}"
  echo "- Tests failed: ${nfailed}"
}

run_test()
{
  local name=$1
  local desc=$2
  local node_src=$3
  local node_dst=$4
  local ip6_dst=$5
  local trace_type=$6
  local ioam_ns=$7
  local type=$8

  ip netns exec $node_dst ./ioam6_parser $name $trace_type $ioam_ns $type &
  local spid=$!
  sleep 0.1

  ip netns exec $node_src ping6 -t 64 -c 1 -W 1 $ip6_dst &>/dev/null
  if [ $? != 0 ]
  then
    nfailed=$((nfailed+1))
    log_test_failed "${desc}"
    kill -2 $spid &>/dev/null
  else
    wait $spid
    if [ $? = 0 ]
    then
      npassed=$((npassed+1))
      log_test_passed "${desc}"
    else
      nfailed=$((nfailed+1))
      log_test_failed "${desc}"
    fi
  fi
}

run()
{
  echo
  printf "%0.s-" {1..74}
  echo
  echo "OUTPUT tests"
  printf "%0.s-" {1..74}
  echo

  # set OUTPUT settings
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=0

  for t in $TESTS_OUTPUT
  do
    $t "inline"
    [ $encap_tests = 0 ] && $t "encap"
  done

  # clean OUTPUT settings
  ip netns exec $ioam_node_beta sysctl -wq net.ipv6.conf.veth0.ioam6_enabled=1
  ip -netns $ioam_node_alpha route change db01::/64 dev veth0


  echo
  printf "%0.s-" {1..74}
  echo
  echo "INPUT tests"
  printf "%0.s-" {1..74}
  echo

  # set INPUT settings
  ip -netns $ioam_node_alpha ioam namespace del 123

  for t in $TESTS_INPUT
  do
    $t "inline"
    [ $encap_tests = 0 ] && $t "encap"
  done

  # clean INPUT settings
  ip -netns $ioam_node_alpha ioam namespace add 123 \
         data ${ALPHA[6]} wide ${ALPHA[7]}
  ip -netns $ioam_node_alpha ioam namespace set 123 schema ${ALPHA[8]}
  ip -netns $ioam_node_alpha route change db01::/64 dev veth0

  echo
  printf "%0.s-" {1..74}
  echo
  echo "GLOBAL tests"
  printf "%0.s-" {1..74}
  echo

  for t in $TESTS_GLOBAL
  do
    $t "inline"
    [ $encap_tests = 0 ] && $t "encap"
  done

  echo
  log_results
}

bit2type=(
  0x800000 0x400000 0x200000 0x100000 0x080000 0x040000 0x020000 0x010000
  0x008000 0x004000 0x002000 0x001000 0x000800 0x000400 0x000200 0x000100
  0x000080 0x000040 0x000020 0x000010 0x000008 0x000004 0x000002
)
bit2size=( 4 4 4 4 4 4 4 4 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 )


################################################################################
#                                                                              #
#                              OUTPUT tests                                    #
#                                                                              #
#   Two nodes (sender/receiver), IOAM disabled on ingress for the receiver.    #
################################################################################

out_undef_ns()
{
  ##############################################################################
  # Make sure that the encap node won't fill the trace if the chosen IOAM      #
  # namespace is not configured locally.                                       #
  ##############################################################################
  local desc="Unknown IOAM namespace"

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
         trace prealloc type 0x800000 ns 0 size 4 dev veth0

  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
         db01::1 0x800000 0 $1

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
}

out_no_room()
{
  ##############################################################################
  # Make sure that the encap node won't fill the trace and will set the        #
  # Overflow flag since there is no room enough for its data.                  #
  ##############################################################################
  local desc="Missing trace room"

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
         trace prealloc type 0xc00000 ns 123 size 4 dev veth0

  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
         db01::1 0xc00000 123 $1

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
}

out_bits()
{
  ##############################################################################
  # Make sure that, for each trace type bit, the encap node will either:       #
  #  (i)  fill the trace with its data when it is a supported bit              #
  #  (ii) not fill the trace with its data when it is an unsupported bit       #
  ##############################################################################
  local desc="Trace type with bit <n> only"

  local tmp=${bit2size[22]}
  bit2size[22]=$(( $tmp + ${#ALPHA[9]} + ((4 - (${#ALPHA[9]} % 4)) % 4) ))

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  for i in {0..22}
  do
    ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
           trace prealloc type ${bit2type[$i]} ns 123 size ${bit2size[$i]} \
           dev veth0 &>/dev/null

    local cmd_res=$?
    local descr="${desc/<n>/$i}"

    if [[ $i -ge 12 && $i -le 21 ]]
    then
      if [ $cmd_res != 0 ]
      then
        npassed=$((npassed+1))
        log_test_passed "$descr ($1 mode)"
      else
        nfailed=$((nfailed+1))
        log_test_failed "$descr ($1 mode)"
      fi
    else
	run_test "out_bit$i" "$descr ($1 mode)" $ioam_node_alpha \
           $ioam_node_beta db01::1 ${bit2type[$i]} 123 $1
    fi
  done

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down

  bit2size[22]=$tmp
}

out_full_supp_trace()
{
  ##############################################################################
  # Make sure that the encap node will correctly fill a full trace. Be careful,#
  # "full trace" here does NOT mean all bits (only supported ones).            #
  ##############################################################################
  local desc="Full supported trace"

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
         trace prealloc type 0xfff002 ns 123 size 100 dev veth0

  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
         db01::1 0xfff002 123 $1

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
}


################################################################################
#                                                                              #
#                               INPUT tests                                    #
#                                                                              #
#     Two nodes (sender/receiver), the sender MUST NOT fill the trace upon     #
#     insertion -> the IOAM namespace configured on the sender is removed      #
#     and is used in the inserted trace to force the sender not to fill it.    #
################################################################################

in_undef_ns()
{
  ##############################################################################
  # Make sure that the receiving node won't fill the trace if the related IOAM #
  # namespace is not configured locally.                                       #
  ##############################################################################
  local desc="Unknown IOAM namespace"

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
         trace prealloc type 0x800000 ns 0 size 4 dev veth0

  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
         db01::1 0x800000 0 $1

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
}

in_no_room()
{
  ##############################################################################
  # Make sure that the receiving node won't fill the trace and will set the    #
  # Overflow flag if there is no room enough for its data.                     #
  ##############################################################################
  local desc="Missing trace room"

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
         trace prealloc type 0xc00000 ns 123 size 4 dev veth0

  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
         db01::1 0xc00000 123 $1

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
}

in_bits()
{
  ##############################################################################
  # Make sure that, for each trace type bit, the receiving node will either:   #
  #  (i)  fill the trace with its data when it is a supported bit              #
  #  (ii) not fill the trace with its data when it is an unsupported bit       #
  ##############################################################################
  local desc="Trace type with bit <n> only"

  local tmp=${bit2size[22]}
  bit2size[22]=$(( $tmp + ${#BETA[9]} + ((4 - (${#BETA[9]} % 4)) % 4) ))

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  for i in {0..11} {22..22}
  do
    ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
           trace prealloc type ${bit2type[$i]} ns 123 size ${bit2size[$i]} \
           dev veth0

    run_test "in_bit$i" "${desc/<n>/$i} ($1 mode)" $ioam_node_alpha \
           $ioam_node_beta db01::1 ${bit2type[$i]} 123 $1
  done

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down

  bit2size[22]=$tmp
}

in_oflag()
{
  ##############################################################################
  # Make sure that the receiving node won't fill the trace since the Overflow  #
  # flag is set.                                                               #
  ##############################################################################
  local desc="Overflow flag is set"

  # Exception:
  #   Here, we need the sender to set the Overflow flag. For that, we will add
  #   back the IOAM namespace that was previously configured on the sender.
  ip -netns $ioam_node_alpha ioam namespace add 123

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
         trace prealloc type 0xc00000 ns 123 size 4 dev veth0

  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
         db01::1 0xc00000 123 $1

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down

  # And we clean the exception for this test to get things back to normal for
  # other INPUT tests
  ip -netns $ioam_node_alpha ioam namespace del 123
}

in_full_supp_trace()
{
  ##############################################################################
  # Make sure that the receiving node will correctly fill a full trace. Be     #
  # careful, "full trace" here does NOT mean all bits (only supported ones).   #
  ##############################################################################
  local desc="Full supported trace"

  [ "$1" = "encap" ] && mode="$1 tundst db01::1" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 up

  ip -netns $ioam_node_alpha route change db01::/64 encap ioam6 mode $mode \
         trace prealloc type 0xfff002 ns 123 size 80 dev veth0

  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_beta \
         db01::1 0xfff002 123 $1

  [ "$1" = "encap" ] && ip -netns $ioam_node_beta link set ip6tnl0 down
}


################################################################################
#                                                                              #
#                              GLOBAL tests                                    #
#                                                                              #
#   Three nodes (sender/router/receiver), IOAM fully enabled on every node.    #
################################################################################

fwd_full_supp_trace()
{
  ##############################################################################
  # Make sure that all three nodes correctly filled the full supported trace   #
  # by checking that the trace data is consistent with the predefined config.  #
  ##############################################################################
  local desc="Forward - Full supported trace"

  [ "$1" = "encap" ] && mode="$1 tundst db02::2" || mode="$1"
  [ "$1" = "encap" ] && ip -netns $ioam_node_gamma link set ip6tnl0 up

  ip -netns $ioam_node_alpha route change db02::/64 encap ioam6 mode $mode \
         trace prealloc type 0xfff002 ns 123 size 244 via db01::1 dev veth0

  run_test ${FUNCNAME[0]} "${desc} ($1 mode)" $ioam_node_alpha $ioam_node_gamma \
         db02::2 0xfff002 123 $1

  [ "$1" = "encap" ] && ip -netns $ioam_node_gamma link set ip6tnl0 down
}


################################################################################
#                                                                              #
#                                     MAIN                                     #
#                                                                              #
################################################################################

npassed=0
nfailed=0

if [ "$(id -u)" -ne 0 ]
then
  echo "SKIP: Need root privileges"
  exit $ksft_skip
fi

if [ ! -x "$(command -v ip)" ]
then
  echo "SKIP: Could not run test without ip tool"
  exit $ksft_skip
fi

ip ioam &>/dev/null
if [ $? = 1 ]
then
  echo "SKIP: iproute2 too old, missing ioam command"
  exit $ksft_skip
fi

check_kernel_compatibility

cleanup &>/dev/null
setup
run
cleanup &>/dev/null
¿Qué es la limpieza dental de perros? - Clínica veterinaria


Es la eliminación del sarro y la placa adherida a la superficie de los dientes mediante un equipo de ultrasonidos que garantiza la integridad de las piezas dentales a la vez que elimina en profundidad cualquier resto de suciedad.

A continuación se procede al pulido de los dientes mediante una fresa especial que elimina la placa bacteriana y devuelve a los dientes el aspecto sano que deben tener.

Una vez terminado todo el proceso, se mantiene al perro en observación hasta que se despierta de la anestesia, bajo la atenta supervisión de un veterinario.

¿Cada cuánto tiempo tengo que hacerle una limpieza dental a mi perro?

A partir de cierta edad, los perros pueden necesitar una limpieza dental anual o bianual. Depende de cada caso. En líneas generales, puede decirse que los perros de razas pequeñas suelen acumular más sarro y suelen necesitar una atención mayor en cuanto a higiene dental.


Riesgos de una mala higiene


Los riesgos más evidentes de una mala higiene dental en los perros son los siguientes:

  • Cuando la acumulación de sarro no se trata, se puede producir una inflamación y retracción de las encías que puede descalzar el diente y provocar caídas.
  • Mal aliento (halitosis).
  • Sarro perros
  • Puede ir a más
  • Las bacterias de la placa pueden trasladarse a través del torrente circulatorio a órganos vitales como el corazón ocasionando problemas de endocarditis en las válvulas. Las bacterias pueden incluso acantonarse en huesos (La osteomielitis es la infección ósea, tanto cortical como medular) provocando mucho dolor y una artritis séptica).

¿Cómo se forma el sarro?

El sarro es la calcificación de la placa dental. Los restos de alimentos, junto con las bacterias presentes en la boca, van a formar la placa bacteriana o placa dental. Si la placa no se retira, al mezclarse con la saliva y los minerales presentes en ella, reaccionará formando una costra. La placa se calcifica y se forma el sarro.

El sarro, cuando se forma, es de color blanquecino pero a medida que pasa el tiempo se va poniendo amarillo y luego marrón.

Síntomas de una pobre higiene dental
La señal más obvia de una mala salud dental canina es el mal aliento.

Sin embargo, a veces no es tan fácil de detectar
Y hay perros que no se dejan abrir la boca por su dueño. Por ejemplo…

Recientemente nos trajeron a la clínica a un perro que parpadeaba de un ojo y decía su dueño que le picaba un lado de la cara. Tenía molestias y dificultad para comer, lo que había llevado a sus dueños a comprarle comida blanda (que suele ser un poco más cara y llevar más contenido en grasa) durante medio año. Después de una exploración oftalmológica, nos dimos cuenta de que el ojo tenía una úlcera en la córnea probablemente de rascarse . Además, el canto lateral del ojo estaba inflamado. Tenía lo que en humanos llamamos flemón pero como era un perro de pelo largo, no se le notaba a simple vista. Al abrirle la boca nos llamó la atención el ver una muela llena de sarro. Le realizamos una radiografía y encontramos una fístula que llegaba hasta la parte inferior del ojo.

Le tuvimos que extraer la muela. Tras esto, el ojo se curó completamente con unos colirios y una lentilla protectora de úlcera. Afortunadamente, la úlcera no profundizó y no perforó el ojo. Ahora el perro come perfectamente a pesar de haber perdido una muela.

¿Cómo mantener la higiene dental de tu perro?
Hay varias maneras de prevenir problemas derivados de la salud dental de tu perro.

Limpiezas de dientes en casa
Es recomendable limpiar los dientes de tu perro semanal o diariamente si se puede. Existe una gran variedad de productos que se pueden utilizar:

Pastas de dientes.
Cepillos de dientes o dedales para el dedo índice, que hacen más fácil la limpieza.
Colutorios para echar en agua de bebida o directamente sobre el diente en líquido o en spray.

En la Clínica Tus Veterinarios enseñamos a nuestros clientes a tomar el hábito de limpiar los dientes de sus perros desde que son cachorros. Esto responde a nuestro compromiso con la prevención de enfermedades caninas.

Hoy en día tenemos muchos clientes que limpian los dientes todos los días a su mascota, y como resultado, se ahorran el dinero de hacer limpiezas dentales profesionales y consiguen una mejor salud de su perro.


Limpiezas dentales profesionales de perros y gatos

Recomendamos hacer una limpieza dental especializada anualmente. La realizamos con un aparato de ultrasonidos que utiliza agua para quitar el sarro. Después, procedemos a pulir los dientes con un cepillo de alta velocidad y una pasta especial. Hacemos esto para proteger el esmalte.

La frecuencia de limpiezas dentales necesaria varía mucho entre razas. En general, las razas grandes tienen buena calidad de esmalte, por lo que no necesitan hacerlo tan a menudo e incluso pueden pasarse la vida sin requerir una limpieza. Sin embargo, razas pequeñas como el Yorkshire o el Maltés, deben hacérselas todos los años desde cachorros si se quiere conservar sus piezas dentales.

Otro factor fundamental es la calidad del pienso. Algunas marcas han diseñado croquetas que limpian la superficie del diente y de la muela al masticarse.

Ultrasonido para perros

¿Se necesita anestesia para las limpiezas dentales de perros y gatos?

La limpieza dental en perros no es una técnica que pueda practicarse sin anestesia general , aunque hay veces que los propietarios no quieren anestesiar y si tiene poco sarro y el perro es muy bueno se puede intentar…… , pero no se va a poder pulir ni acceder a todas la zona de la boca …. Además los limpiadores dentales van a irrigar agua y hay riesgo de aspiración a vías respiratorias si no se realiza una anestesia correcta con intubación traqueal . En resumen , sin anestesia no se va hacer una correcta limpieza dental.

Tampoco sirve la sedación ya que necesitamos que el animal esté totalmente quieto, y el veterinario tenga un acceso completo a todas sus piezas dentales y encías.

Alimentos para la limpieza dental

Hay que tener cierto cuidado a la hora de comprar determinados alimentos porque no todos son saludables. Algunos tienen demasiado contenido graso, que en exceso puede causar problemas cardiovasculares y obesidad.

Los mejores alimentos para los dientes son aquellos que están elaborados por empresas farmacéuticas y llevan componentes químicos con tratamientos específicos para el diente del perro. Esto implica no solo limpieza a través de la acción mecánica de morder sino también un tratamiento antibacteriano para prevenir el sarro.

Conclusión

Si eres como la mayoría de dueños, por falta de tiempo , es probable que no estés prestando la suficiente atención a la limpieza dental de tu perro. Por eso te animamos a que comiences a limpiar los dientes de tu perro y consideres atender a su higiene bucal con frecuencia.

Estas simples medidas pueden conllevar a que tu perro tenga una vida más larga y mucho más saludable.

Si te resulta imposible introducir un cepillo de dientes a tu perro en la boca, pásate con él por clínica Tus Veterinarios y te explicamos cómo hacerlo.

Necesitas hacer una limpieza dental profesional a tu mascota?
Llámanos al 622575274 o contacta con nosotros

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¡Hola!