Skip to content

Commit

Permalink
Fix FdbUpdater crash when SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID attribute…
Browse files Browse the repository at this point in the history
… missing. (#286)

Fix FdbUpdater crash when SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID attribute missing.

#### Work item tracking
Microsoft ADO (number only): 16189251

**- What I did**
Fix FdbUpdater crash when SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID attribute missing.

**- How I did it**
Add try-catch block in rfc3463 FdbUpdater

**- How to verify it**
Manually test.
Pass all UT

**- Description for the changelog**
Fix FdbUpdater crash when SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID attribute missing.
  • Loading branch information
liuh-80 authored and qiluo-msft committed Sep 4, 2023
1 parent 551898e commit b292c01
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
14 changes: 13 additions & 1 deletion src/sonic_ax_impl/mibs/ietf/rfc4363.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def __init__(self):
self.vlanmac_ifindex_list = []
self.if_bpid_map = {}
self.bvid_vlan_map = {}
self.broken_fdbs = []

def fdb_vlanmac(self, fdb):
if 'vlan' in fdb:
Expand Down Expand Up @@ -60,6 +61,7 @@ def reinit_data(self):

self.if_bpid_map = Namespace.dbs_get_bridge_port_map(self.db_conn, mibs.ASIC_DB)
self.bvid_vlan_map.clear()
self.broken_fdbs.clear()

def update_data(self):
"""
Expand All @@ -85,8 +87,18 @@ def update_data(self):
if not ent:
continue

bridge_port_id_attr = ""
try:
bridge_port_id_attr = ent["SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID"]
except KeyError as e:
# Only write warning log once
if fdb_str not in self.broken_fdbs:
mibs.logger.warn("SyncD 'ASIC_DB' includes invalid FDB_ENTRY '{}': failed to get bridge_port_id, exception: {}".format(fdb_str, e))
self.broken_fdbs.append(fdb_str)
continue

# Example output: oid:0x3a000000000608
bridge_port_id = ent["SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID"][6:]
bridge_port_id = bridge_port_id_attr[6:]
if bridge_port_id not in self.if_bpid_map:
continue
port_id = self.if_bpid_map[bridge_port_id]
Expand Down
28 changes: 28 additions & 0 deletions tests/test_rfc4363.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import os
import sys
from unittest import TestCase

if sys.version_info.major == 3:
from unittest import mock
else:
import mock

modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(modules_path, 'src'))

from sonic_ax_impl.mibs.ietf.rfc4363 import FdbUpdater

class TestFdbUpdater(TestCase):

@mock.patch('sonic_ax_impl.mibs.Namespace.dbs_keys', mock.MagicMock(return_value=(['ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{"bvid":"oid:0x26000000000b6c","mac":"60:45:BD:98:6F:48","switch_id":"oid:0x21000000000000"}'])))
@mock.patch('sonic_ax_impl.mibs.Namespace.dbs_get_all', mock.MagicMock(return_value=({"nexthop": "10.0.0.1,10.0.0.3", "ifname": "Ethernet0,Ethernet4"})))
def test_FdbUpdater_ent_bridge_port_id_attr_missing(self):
updater = FdbUpdater()

with mock.patch('sonic_ax_impl.mibs.logger.warn') as mocked_warn:
updater.update_data()

# check warning
mocked_warn.assert_called()

self.assertTrue(len(updater.vlanmac_ifindex_list) == 0)

0 comments on commit b292c01

Please sign in to comment.