Skip to content

Commit

Permalink
Added change to add 'peerType' as element in NEIGH_STATE_TABLE. (soni…
Browse files Browse the repository at this point in the history
…c-net#15265)

What I did:
Added change to add 'peerType' as element in NEIGH_STATE_TABLE.
'peerType' can be i-BGP vs e-BGP determined based on local and remote AS number.

Why I did:
This is useful to filter neighbors in SONiC as internal vs external in chassis use-case (example: telemetry)

Verification:

Manual Verification
127.0.0.1:6379[6]> hgetall "NEIGH_STATE_TABLE|10.0.0.5"
1) "state"
2) "Established"
3) "peerType"
4) "e-BGP"
127.0.0.1:6379[6]> hgetall  "NEIGH_STATE_TABLE|2603:10e2:400::4"
1) "state"
2) "Established"
3) "peerType"
4) "i-BGP"

Also sonic-mgmt test case test_bgp_fact.py is enhanced:  Enhanced bgp_fact to validate NEIGH_STATE_TABLE element 'peerType' sonic-mgmt#8462
  • Loading branch information
abdosi authored and mssonicbld committed Jun 7, 2023
1 parent 5f4b54a commit 57c7679
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions src/sonic-bgpcfgd/bgpmon/bgpmon.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
Initial creation of this daemon is to assist SNMP agent in obtaining the
BGP related information for its MIB support. The MIB that this daemon is
assisting is for the CiscoBgp4MIB (Neighbor state only). If there are other
assisting is for the CiscoBgp4MIB (Neighbor state only). Also for chassis use-case
it identify if the given BGP neighbors as i-BGP vs e-BGP. If there are other
BGP related items that needs to be updated in a periodic manner in the
future, then more can be added into this process.
Expand Down Expand Up @@ -68,7 +69,9 @@ def update_new_peer_states(self, peer_dict):
peer_l = peer_dict["peers"].keys()
self.new_peer_l.update(peer_l)
for peer in peer_l:
self.new_peer_state[peer] = peer_dict["peers"][peer]["state"]
self.new_peer_state[peer] = (peer_dict["peers"][peer]["state"],
peer_dict["peers"][peer]["remoteAs"],
peer_dict["peers"][peer]["localAs"])

# Get a new snapshot of BGP neighbors and store them in the "new" location
def get_all_neigh_states(self):
Expand Down Expand Up @@ -123,17 +126,19 @@ def update_neigh_states(self):
key = "NEIGH_STATE_TABLE|%s" % peer
if peer in self.peer_l:
# only update the entry if state changed
if self.peer_state[peer] != self.new_peer_state[peer]:
if self.peer_state[peer] != self.new_peer_state[peer][0]:
# state changed. Update state DB for this entry
state = self.new_peer_state[peer]
data[key] = {'state':state}
state = self.new_peer_state[peer][0]
peerType = "i-BGP" if self.new_peer_state[peer][1] == self.new_peer_state[peer][2] else "e-BGP"
data[key] = {'state':state, 'peerType':peerType}
self.peer_state[peer] = state
# remove this neighbor from old set since it is accounted for
self.peer_l.remove(peer)
else:
# New neighbor found case. Add to dictionary and state DB
state = self.new_peer_state[peer]
data[key] = {'state':state}
state = self.new_peer_state[peer][0]
peerType = "i-BGP" if self.new_peer_state[peer][1] == self.new_peer_state[peer][2] else "e-BGP"
data[key] = {'state':state, 'peerType':peerType}
self.peer_state[peer] = state
if len(data) > PIPE_BATCH_MAX_COUNT:
self.flush_pipe(data)
Expand Down

0 comments on commit 57c7679

Please sign in to comment.