9
9
10
10
ARP_UPDATE_VARS_FILE=" /usr/share/sonic/templates/arp_update_vars.j2"
11
11
12
+ # Overload `logger` command to include arp_update tag
13
+ logger () {
14
+ command logger -t " arp_update" " $@ "
15
+ }
16
+
12
17
while /bin/true; do
13
18
# find L3 interfaces which are UP, send ipv6 multicast pings
14
19
ARP_UPDATE_VARS=$( sonic-cfggen -d -t ${ARP_UPDATE_VARS_FILE} )
@@ -19,7 +24,7 @@ while /bin/true; do
19
24
STATIC_ROUTE_IFNAMES=($( echo $ARP_UPDATE_VARS | jq -r ' .static_route_ifnames' ) )
20
25
# on supervisor/rp exit the script gracefully
21
26
if [[ -z " $STATIC_ROUTE_NEXTHOPS " ]] || [[ -z " $STATIC_ROUTE_IFNAMES " ]]; then
22
- logger " arp_update: exiting as no static route in packet based chassis"
27
+ logger " exiting as no static route in packet based chassis"
23
28
exit 0
24
29
fi
25
30
for i in ${! STATIC_ROUTE_NEXTHOPS[@]} ; do
@@ -38,7 +43,7 @@ while /bin/true; do
38
43
interface=" ${STATIC_ROUTE_IFNAMES[i]} "
39
44
if [[ -z " $interface " ]]; then
40
45
# should never be here, handling just in case
41
- logger " ERR: arp_update: missing interface entry for static route $nexthop "
46
+ logger -p error " missing interface entry for static route $nexthop "
42
47
continue
43
48
fi
44
49
intf_up=$( ip link show $interface | grep " state UP" )
@@ -47,7 +52,7 @@ while /bin/true; do
47
52
eval $pingcmd
48
53
# STALE entries may appear more often, not logging to prevent periodic syslogs
49
54
if [[ -z $( echo ${neigh_state} | grep ' STALE' ) ]]; then
50
- logger " arp_update: static route nexthop not resolved ($neigh_state ), pinging $nexthop on $interface "
55
+ logger " static route nexthop not resolved ($neigh_state ), pinging $nexthop on $interface "
51
56
fi
52
57
fi
53
58
fi
@@ -70,6 +75,30 @@ while /bin/true; do
70
75
fi
71
76
done
72
77
78
+ # find neighbor entries with aged MAC and flush/relearn them
79
+ STALE_NEIGHS=$( ip neigh show | grep -v " fe80" | grep " STALE" | awk ' {print $1 "," $5}' | tr [:lower:] [:upper:])
80
+ for neigh in $STALE_NEIGHS ; do
81
+ ip=" $( cut -d ' ,' -f 1 <<< " $neigh" ) "
82
+ mac=" $( cut -d ' ,' -f 2 <<< " $neigh" ) "
83
+ if [[ -z $( sonic-db-cli ASIC_DB keys " ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY*${mac} *" ) ]]; then
84
+ timeout 0.2 ping -c1 -w1 $ip > /dev/null
85
+ fi
86
+ done
87
+
88
+ # Flush neighbor entries with MAC mismatch between kernel and APPL_DB
89
+ KERNEL_NEIGH=$( ip neigh show | grep -v " fe80" | grep -v " FAILED\|INCOMPLETE" | cut -d ' ' -f 1,3,5 --output-delimiter=' ,' | tr -d ' ' )
90
+ for neigh in $KERNEL_NEIGH ; do
91
+ ip=" $( cut -d ' ,' -f 1 <<< " $neigh" ) "
92
+ intf=" $( cut -d ' ,' -f 2 <<< " $neigh" ) "
93
+ kernel_mac=" $( cut -d ' ,' -f 3 <<< " $neigh" ) "
94
+ appl_db_mac=" $( sonic-db-cli APPL_DB hget NEIGH_TABLE:$intf :$ip neigh) "
95
+ if [[ $kernel_mac != $appl_db_mac ]]; then
96
+ logger -p warning " MAC mismatch for ${ip} on ${intf} - kernel: ${kernel_mac} , APPL_DB: ${appl_db_mac} "
97
+ ip neigh flush $ip
98
+ timeout 0.2 ping -c1 -w1 $ip > /dev/null
99
+ fi
100
+ done
101
+
73
102
VLAN=$( echo $ARP_UPDATE_VARS | jq -r ' .vlan' )
74
103
SUBTYPE=$( sonic-db-cli CONFIG_DB hget ' DEVICE_METADATA|localhost' ' subtype' | tr ' [:upper:]' ' [:lower:]' )
75
104
for vlan in $VLAN ; do
@@ -158,11 +187,11 @@ while /bin/true; do
158
187
if [[ $ip == * " ." * ]] && [[ ! $KERNEIGH4 =~ " ${ip} ,${intf} " ]]; then
159
188
pingcmd=" timeout 0.2 ping -I $intf -n -q -i 0 -c 1 -W 1 $ip >/dev/null"
160
189
eval $pingcmd
161
- logger " arp_update: mismatch arp entry, pinging ${ip} on ${intf} "
190
+ logger " mismatch arp entry, pinging ${ip} on ${intf} "
162
191
elif [[ $ip == * " :" * ]] && [[ ! $KERNEIGH6 =~ " ${ip} ,${intf} " ]]; then
163
192
ping6cmd=" timeout 0.2 ping6 -I $intf -n -q -i 0 -c 1 -W 1 $ip >/dev/null"
164
193
eval $ping6cmd
165
- logger " arp_update: mismatch v6 nbr entry, pinging ${ip} on ${intf} "
194
+ logger " mismatch v6 nbr entry, pinging ${ip} on ${intf} "
166
195
fi
167
196
fi
168
197
done
0 commit comments