78f249be38
Changing the default config knob value to be True for killing radv, due to the reasons below: Killing RADV is to prevent sending the "cease to be advertising interface" protocol packet. RFC 4861 says this ceasing packet as "should" instead of "must", considering that it's fatal to not do this. In active-active scenario, host side might have difficulty distinguish if the "cease to be advertising interface" is for the last interface leaving. 6.2.5. Ceasing To Be an Advertising Interface shutting down the system. In such cases, the router SHOULD transmit one or more (but not more than MAX_FINAL_RTR_ADVERTISEMENTS) final multicast Router Advertisements on the interface with a Router Lifetime field of zero. In the case of a router becoming a host, the system SHOULD also depart from the all-routers IP multicast group on all interfaces on which the router supports IP multicast (whether or not they had been advertising interfaces). In addition, the host MUST ensure that subsequent Neighbor Advertisement messages sent from the interface have the Router flag set to zero. sign-off: Jing Zhang zhangjing@microsoft.com
107 lines
2.7 KiB
Bash
Executable File
107 lines
2.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
function debug()
|
|
{
|
|
/usr/bin/logger $1
|
|
/bin/echo `date` "- $1" >> ${DEBUGLOG}
|
|
}
|
|
|
|
function check_warm_boot()
|
|
{
|
|
SYSTEM_WARM_START=`$SONIC_DB_CLI STATE_DB hget "WARM_RESTART_ENABLE_TABLE|system" enable`
|
|
SERVICE_WARM_START=`$SONIC_DB_CLI STATE_DB hget "WARM_RESTART_ENABLE_TABLE|${SERVICE}" enable`
|
|
if [[ x"$SYSTEM_WARM_START" == x"true" ]] || [[ x"$SERVICE_WARM_START" == x"true" ]]; then
|
|
WARM_BOOT="true"
|
|
else
|
|
WARM_BOOT="false"
|
|
fi
|
|
}
|
|
|
|
function check_fast_boot ()
|
|
{
|
|
if [[ $($SONIC_DB_CLI STATE_DB GET "FAST_REBOOT|system") == "1" ]]; then
|
|
FAST_BOOT="true"
|
|
else
|
|
FAST_BOOT="false"
|
|
fi
|
|
}
|
|
|
|
function check_redundant_type()
|
|
{
|
|
DEVICE_SUBTYPE=`$SONIC_DB_CLI CONFIG_DB hget "DEVICE_METADATA|localhost" subtype`
|
|
if [[ x"$DEVICE_SUBTYPE" == x"DualToR" ]]; then
|
|
MUX_CONFIG=`show muxcable config`
|
|
if [[ $MUX_CONFIG =~ .*active-active.* ]]; then
|
|
ACTIVE_ACTIVE="true"
|
|
else
|
|
ACTIVE_ACTIVE="false"
|
|
fi
|
|
else
|
|
ACTIVE_ACTIVE="false"
|
|
fi
|
|
CONFIG_KNOB=`$SONIC_DB_CLI CONFIG_DB hget "MUX_LINKMGR|SERVICE_MGMT" kill_radv`
|
|
if [[ x"$CONFIG_KNOB" == x"False" ]]; then
|
|
ACTIVE_ACTIVE='false'
|
|
fi
|
|
debug "DEVICE_SUBTYPE: ${DEVICE_SUBTYPE}, CONFIG_KNOB: ${CONFIG_KNOB}"
|
|
}
|
|
|
|
start() {
|
|
debug "Starting ${SERVICE}$DEV service..."
|
|
|
|
# start service docker
|
|
/usr/bin/${SERVICE}.sh start $DEV
|
|
debug "Started ${SERVICE}$DEV service..."
|
|
}
|
|
|
|
wait() {
|
|
/usr/bin/${SERVICE}.sh wait $DEV
|
|
}
|
|
|
|
stop() {
|
|
debug "Stopping ${SERVICE}$DEV service..."
|
|
|
|
check_warm_boot
|
|
check_fast_boot
|
|
check_redundant_type
|
|
debug "Warm boot flag: ${SERVICE}$DEV ${WARM_BOOT}."
|
|
debug "Fast boot flag: ${SERVICE}$DEV ${FAST_BOOT}."
|
|
|
|
# For WARM/FAST boot do not perform service stop
|
|
if [[ x"$WARM_BOOT" != x"true" ]] && [[ x"$FAST_BOOT" != x"true" ]]; then
|
|
if [[ x"$SERVICE" == x"radv" ]] && [[ x"$ACTIVE_ACTIVE" == x"true" ]]; then
|
|
debug "Killing Docker ${SERVICE}${DEV} for active-active dualtor device..."
|
|
/usr/bin/${SERVICE}.sh kill $DEV
|
|
else
|
|
/usr/bin/${SERVICE}.sh stop $DEV
|
|
debug "Stopped ${SERVICE}$DEV service..."
|
|
fi
|
|
else
|
|
debug "Killing Docker ${SERVICE}${DEV}..."
|
|
/usr/bin/${SERVICE}.sh kill $DEV
|
|
fi
|
|
}
|
|
|
|
DEV=$2
|
|
|
|
SCRIPT_NAME=$(basename -- "$0")
|
|
SERVICE="${SCRIPT_NAME%.*}"
|
|
DEBUGLOG="/tmp/$SERVICE-debug$DEV.log"
|
|
NAMESPACE_PREFIX="asic"
|
|
if [ "$DEV" ]; then
|
|
NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace
|
|
SONIC_DB_CLI="sonic-db-cli -n $NET_NS"
|
|
else
|
|
SONIC_DB_CLI="sonic-db-cli"
|
|
fi
|
|
|
|
case "$1" in
|
|
start|wait|stop)
|
|
$1
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {start|wait|stop}"
|
|
exit 1
|
|
;;
|
|
esac
|