@@ -15,6 +15,8 @@ use config::internal::status::{
1515 BgpNeighborStatus , BgpStatus , BgpVrfStatus , DataplaneStatus ,
1616} ;
1717
18+ use tracing:: debug;
19+
1820/// Update `DataplaneStatus` from a single BMP message.
1921pub fn handle_bmp_message ( status : & mut DataplaneStatus , msg : & BmpMessage ) {
2022 match msg {
@@ -60,15 +62,22 @@ fn set_neighbor_session_state(n: &mut BgpNeighborStatus, st: BgpNeighborSessionS
6062fn ensure_bgp ( status : & mut DataplaneStatus ) -> & mut BgpStatus {
6163 if status. bgp . is_none ( ) {
6264 status. bgp = Some ( BgpStatus :: default ( ) ) ;
65+ debug ! ( "BMP: initialized DataplaneStatus.bgp" ) ;
6366 }
6467 status. bgp . as_mut ( ) . unwrap ( )
6568}
6669
6770fn ensure_vrf < ' a > ( bgp : & ' a mut BgpStatus , vrf : & str ) -> & ' a mut BgpVrfStatus {
71+ if !bgp. vrfs . contains_key ( vrf) {
72+ debug ! ( "BMP: creating VRF status entry: vrf={vrf}" ) ;
73+ }
6874 bgp. vrfs . entry ( vrf. to_string ( ) ) . or_default ( )
6975}
7076
7177fn ensure_neighbor < ' a > ( vrf : & ' a mut BgpVrfStatus , neigh_key : & str ) -> & ' a mut BgpNeighborStatus {
78+ if !vrf. neighbors . contains_key ( neigh_key) {
79+ debug ! ( "BMP: creating neighbor status entry: key={neigh_key}" ) ;
80+ }
7281 vrf. neighbors
7382 . entry ( neigh_key. to_string ( ) )
7483 . or_insert_with ( || BgpNeighborStatus {
@@ -95,14 +104,25 @@ fn on_peer_up(status: &mut DataplaneStatus, pu: &PeerUpNotificationMessage) {
95104 let vrf = get_vrf_from_peer_header ( peer) ;
96105 let key = key_from_peer_header ( peer) ;
97106
107+ let peer_as = peer. peer_as ( ) ;
108+ let bgp_id = peer. bgp_id ( ) . to_string ( ) ;
109+ let peer_addr = peer. address ( ) . map ( |a| a. to_string ( ) ) . unwrap_or_else ( || "none" . to_string ( ) ) ;
110+ let peer_port = pu. remote_port ( ) . unwrap_or_default ( ) as u32 ;
111+
98112 let bgp = ensure_bgp ( status) ;
99113 let vrf_s = ensure_vrf ( bgp, & vrf) ;
100114 let neigh = ensure_neighbor ( vrf_s, & key) ;
101115
116+ let prev_state = neigh. session_state ;
117+ let prev_peer_as = neigh. peer_as ;
118+ let prev_remote_id = neigh. remote_router_id . clone ( ) ;
119+ let prev_peer_port = neigh. peer_port ;
120+ let prev_local_as = neigh. local_as ;
121+
102122 // Update some basic fields we know now
103- neigh. peer_as = peer . peer_as ( ) ;
104- neigh. remote_router_id = peer . bgp_id ( ) . to_string ( ) ;
105- neigh. peer_port = pu . remote_port ( ) . unwrap_or_default ( ) as u32 ;
123+ neigh. peer_as = peer_as;
124+ neigh. remote_router_id = bgp_id. clone ( ) ;
125+ neigh. peer_port = peer_port ;
106126 set_neighbor_session_state ( neigh, BgpNeighborSessionState :: Established ) ;
107127 if let BgpMessage :: Open ( open) = pu. sent_message ( ) {
108128 neigh. local_as = open. my_as ( ) as u32 ;
@@ -113,7 +133,28 @@ fn on_peer_up(status: &mut DataplaneStatus, pu: &PeerUpNotificationMessage) {
113133 received : Some ( BgpMessageCounters :: new ( ) ) ,
114134 sent : Some ( BgpMessageCounters :: new ( ) ) ,
115135 } ) ;
136+ debug ! (
137+ "BMP: dp_status push: created message counters (peer-up) vrf={} key={}" ,
138+ vrf, key
139+ ) ;
116140 }
141+
142+ debug ! (
143+ "BMP: dp_status push (peer-up) vrf={} key={} peer_addr={} prev_state={:?} new_state={:?} prev_peer_as={} new_peer_as={} prev_remote_id={} new_remote_id={} prev_peer_port={} new_peer_port={} prev_local_as={} new_local_as={}" ,
144+ vrf,
145+ key,
146+ peer_addr,
147+ prev_state,
148+ neigh. session_state,
149+ prev_peer_as,
150+ neigh. peer_as,
151+ prev_remote_id,
152+ neigh. remote_router_id,
153+ prev_peer_port,
154+ neigh. peer_port,
155+ prev_local_as,
156+ neigh. local_as,
157+ ) ;
117158}
118159
119160fn on_peer_down ( status : & mut DataplaneStatus , pd : & PeerDownNotificationMessage ) {
@@ -124,10 +165,29 @@ fn on_peer_down(status: &mut DataplaneStatus, pd: &PeerDownNotificationMessage)
124165 if let Some ( bgp) = status. bgp . as_mut ( ) {
125166 if let Some ( vrf_s) = bgp. vrfs . get_mut ( & vrf) {
126167 if let Some ( neigh) = vrf_s. neighbors . get_mut ( & key) {
168+ let prev_state = neigh. session_state ;
169+ let prev_dropped = neigh. connections_dropped ;
170+
127171 set_neighbor_session_state ( neigh, BgpNeighborSessionState :: Idle ) ;
128172 neigh. connections_dropped = neigh. connections_dropped . saturating_add ( 1 ) ;
173+
174+ debug ! (
175+ "BMP: dp_status push (peer-down) vrf={} key={} prev_state={:?} new_state={:?} prev_connections_dropped={} new_connections_dropped={}" ,
176+ vrf,
177+ key,
178+ prev_state,
179+ neigh. session_state,
180+ prev_dropped,
181+ neigh. connections_dropped
182+ ) ;
183+ } else {
184+ debug ! ( "BMP: peer-down for unknown neighbor: vrf={} key={}" , vrf, key) ;
129185 }
186+ } else {
187+ debug ! ( "BMP: peer-down for unknown vrf: vrf={} key={}" , vrf, key) ;
130188 }
189+ } else {
190+ debug ! ( "BMP: peer-down but DataplaneStatus.bgp is None (vrf={} key={})" , vrf, key) ;
131191 }
132192}
133193
@@ -136,29 +196,46 @@ fn on_route_monitoring(status: &mut DataplaneStatus, rm: &RouteMonitoringMessage
136196 let vrf = get_vrf_from_peer_header ( peer) ;
137197 let key = key_from_peer_header ( peer) ;
138198
199+ let post = post_policy_from_peer_type ( peer. peer_type ( ) ) ;
200+
139201 let bgp = ensure_bgp ( status) ;
140202 let vrf_s = ensure_vrf ( bgp, & vrf) ;
141203 let neigh = ensure_neighbor ( vrf_s, & key) ;
142204
143205 // Ensure message counters exist
144- let msgs = neigh. messages . get_or_insert_with ( || BgpMessages {
145- received : Some ( BgpMessageCounters :: new ( ) ) ,
146- sent : Some ( BgpMessageCounters :: new ( ) ) ,
206+ let msgs = neigh. messages . get_or_insert_with ( || {
207+ debug ! (
208+ "BMP: dp_status push: created message counters (route-monitoring) vrf={} key={}" ,
209+ vrf, key
210+ ) ;
211+ BgpMessages {
212+ received : Some ( BgpMessageCounters :: new ( ) ) ,
213+ sent : Some ( BgpMessageCounters :: new ( ) ) ,
214+ }
147215 } ) ;
148216
149217 // Count UPDATE messages received
218+ let mut bumped_update = false ;
219+ let mut prev_update = None ;
220+ let mut new_update = None ;
221+
150222 if let BgpMessage :: Update ( _) = rm. update_message ( ) {
151223 if let Some ( rcv) = msgs. received . as_mut ( ) {
224+ prev_update = Some ( rcv. update ) ;
152225 rcv. update = rcv. update . saturating_add ( 1 ) ;
226+ new_update = Some ( rcv. update ) ;
227+ bumped_update = true ;
153228 }
154229 }
155230
156231 // Very rough pre/post-policy NLRI accounting example
157- let post = post_policy_from_peer_type ( peer. peer_type ( ) ) ;
158232 let pref = neigh
159233 . ipv4_unicast_prefixes
160234 . get_or_insert_with ( BgpNeighborPrefixes :: default) ;
161235
236+ let prev_received = pref. received ;
237+ let prev_received_pre = pref. received_pre_policy ;
238+
162239 // We don't parse NLRI depth here; increment by 1 as a placeholder per RM message
163240 if post {
164241 pref. received_pre_policy = pref. received_pre_policy . saturating_add ( 0 ) ; // post-policy => don't bump pre
@@ -167,6 +244,20 @@ fn on_route_monitoring(status: &mut DataplaneStatus, rm: &RouteMonitoringMessage
167244 pref. received_pre_policy = pref. received_pre_policy . saturating_add ( 1 ) ;
168245 pref. received = pref. received . saturating_add ( 1 ) ;
169246 }
247+
248+ debug ! (
249+ "BMP: dp_status push (route-monitoring) vrf={} key={} post_policy={} update_bumped={} update_prev={:?} update_new={:?} ipv4_received_prev={} ipv4_received_new={} ipv4_received_pre_prev={} ipv4_received_pre_new={}" ,
250+ vrf,
251+ key,
252+ post,
253+ bumped_update,
254+ prev_update,
255+ new_update,
256+ prev_received,
257+ pref. received,
258+ prev_received_pre,
259+ pref. received_pre_policy
260+ ) ;
170261}
171262
172263fn on_statistics ( status : & mut DataplaneStatus , sr : & StatisticsReportMessage ) {
@@ -179,10 +270,21 @@ fn on_statistics(status: &mut DataplaneStatus, sr: &StatisticsReportMessage) {
179270 let neigh = ensure_neighbor ( vrf_s, & key) ;
180271
181272 // Make sure we have message counters present
182- let _ = neigh. messages . get_or_insert_with ( || BgpMessages {
183- received : Some ( BgpMessageCounters :: new ( ) ) ,
184- sent : Some ( BgpMessageCounters :: new ( ) ) ,
273+ let _ = neigh. messages . get_or_insert_with ( || {
274+ debug ! (
275+ "BMP: dp_status push: created message counters (statistics-report) vrf={} key={}" ,
276+ vrf, key
277+ ) ;
278+ BgpMessages {
279+ received : Some ( BgpMessageCounters :: new ( ) ) ,
280+ sent : Some ( BgpMessageCounters :: new ( ) ) ,
281+ }
185282 } ) ;
186283
284+ debug ! (
285+ "BMP: dp_status push (statistics-report) vrf={} key={} (TODO: decode stats later)" ,
286+ vrf, key
287+ ) ;
288+
187289 //TODO: smatov: add more later
188290}
0 commit comments