Skip to content

Commit f282c18

Browse files
Fix BGP peer discovery for Huawei VRP (librenms#20023)
* Fix Huawei VRP BGP peer discovery * Add Huawei VRP BGP discovery test data
1 parent 09d8131 commit f282c18

3 files changed

Lines changed: 449 additions & 0 deletions

File tree

includes/discovery/bgp-peers/vrp.inc.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@
5555
$bgpPeersDesc = snmpwalk_cache_oid($device, 'hwBgpPeerSessionExtDescription', [], 'HUAWEI-BGP-VPN-MIB');
5656

5757
foreach ($bgpPeersCache as $key => $value) {
58+
// Huawei reports some AFI/SAFI rows, such as VPLS, only in prefix-counter columns with no peer AS.
59+
// Drop them before the IP-only keying below overwrites the real peer entry.
60+
if (! isset($value['hwBgpPeerRemoteAs'])) {
61+
continue;
62+
}
63+
5864
$oid = explode('.', (string) $key);
5965
$vrfInstance = $value['hwBgpPeerVrfName'];
6066
if ($oid[0] == 0) {

tests/data/vrp_ne05e.json

Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
{
2+
"bgp-peers": {
3+
"discovery": {
4+
"bgpPeers": [
5+
{
6+
"astext": "AS65000-MOCK-TEXT",
7+
"bgpPeerIdentifier": "192.0.2.2",
8+
"bgpPeerRemoteAs": 65000,
9+
"bgpPeerState": "established",
10+
"bgpPeerAdminStatus": "start",
11+
"bgpPeerLastErrorCode": null,
12+
"bgpPeerLastErrorSubCode": null,
13+
"bgpPeerLastErrorText": null,
14+
"bgpPeerIface": null,
15+
"bgpLocalAddr": "0.0.0.0",
16+
"bgpPeerRemoteAddr": "192.0.2.2",
17+
"bgpPeerDescr": "",
18+
"bgpPeerInUpdates": 0,
19+
"bgpPeerOutUpdates": 0,
20+
"bgpPeerInTotalMessages": 0,
21+
"bgpPeerOutTotalMessages": 0,
22+
"bgpPeerFsmEstablishedTime": 613583,
23+
"bgpPeerInUpdateElapsedTime": 0,
24+
"context_name": null,
25+
"bgpLocalAs": 65000,
26+
"vrfLocalAs": null
27+
},
28+
{
29+
"astext": "AS65000-MOCK-TEXT",
30+
"bgpPeerIdentifier": "192.0.2.4",
31+
"bgpPeerRemoteAs": 65000,
32+
"bgpPeerState": "established",
33+
"bgpPeerAdminStatus": "start",
34+
"bgpPeerLastErrorCode": null,
35+
"bgpPeerLastErrorSubCode": null,
36+
"bgpPeerLastErrorText": null,
37+
"bgpPeerIface": null,
38+
"bgpLocalAddr": "0.0.0.0",
39+
"bgpPeerRemoteAddr": "192.0.2.4",
40+
"bgpPeerDescr": "",
41+
"bgpPeerInUpdates": 0,
42+
"bgpPeerOutUpdates": 0,
43+
"bgpPeerInTotalMessages": 0,
44+
"bgpPeerOutTotalMessages": 0,
45+
"bgpPeerFsmEstablishedTime": 613583,
46+
"bgpPeerInUpdateElapsedTime": 0,
47+
"context_name": null,
48+
"bgpLocalAs": 65000,
49+
"vrfLocalAs": null
50+
},
51+
{
52+
"astext": "AS65000-MOCK-TEXT",
53+
"bgpPeerIdentifier": "192.0.2.2",
54+
"bgpPeerRemoteAs": 65000,
55+
"bgpPeerState": "idle",
56+
"bgpPeerAdminStatus": "stop",
57+
"bgpPeerLastErrorCode": null,
58+
"bgpPeerLastErrorSubCode": null,
59+
"bgpPeerLastErrorText": null,
60+
"bgpPeerIface": null,
61+
"bgpLocalAddr": "0.0.0.0",
62+
"bgpPeerRemoteAddr": "0.0.0.0",
63+
"bgpPeerDescr": "",
64+
"bgpPeerInUpdates": 0,
65+
"bgpPeerOutUpdates": 0,
66+
"bgpPeerInTotalMessages": 0,
67+
"bgpPeerOutTotalMessages": 0,
68+
"bgpPeerFsmEstablishedTime": 0,
69+
"bgpPeerInUpdateElapsedTime": 0,
70+
"context_name": "",
71+
"bgpLocalAs": 65000,
72+
"vrfLocalAs": null
73+
},
74+
{
75+
"astext": "AS65000-MOCK-TEXT",
76+
"bgpPeerIdentifier": "192.0.2.4",
77+
"bgpPeerRemoteAs": 65000,
78+
"bgpPeerState": "idle",
79+
"bgpPeerAdminStatus": "stop",
80+
"bgpPeerLastErrorCode": null,
81+
"bgpPeerLastErrorSubCode": null,
82+
"bgpPeerLastErrorText": null,
83+
"bgpPeerIface": null,
84+
"bgpLocalAddr": "0.0.0.0",
85+
"bgpPeerRemoteAddr": "0.0.0.0",
86+
"bgpPeerDescr": "",
87+
"bgpPeerInUpdates": 0,
88+
"bgpPeerOutUpdates": 0,
89+
"bgpPeerInTotalMessages": 0,
90+
"bgpPeerOutTotalMessages": 0,
91+
"bgpPeerFsmEstablishedTime": 0,
92+
"bgpPeerInUpdateElapsedTime": 0,
93+
"context_name": "",
94+
"bgpLocalAs": 65000,
95+
"vrfLocalAs": null
96+
}
97+
],
98+
"bgpPeers_cbgp": [
99+
{
100+
"bgpPeerIdentifier": "192.0.2.2",
101+
"afi": "ipv6",
102+
"safi": "vpn",
103+
"AcceptedPrefixes": 0,
104+
"DeniedPrefixes": 0,
105+
"PrefixAdminLimit": 0,
106+
"PrefixThreshold": 0,
107+
"PrefixClearThreshold": 0,
108+
"AdvertisedPrefixes": 0,
109+
"SuppressedPrefixes": 0,
110+
"WithdrawnPrefixes": 0,
111+
"AcceptedPrefixes_delta": 0,
112+
"AcceptedPrefixes_prev": 0,
113+
"DeniedPrefixes_delta": 0,
114+
"DeniedPrefixes_prev": 0,
115+
"AdvertisedPrefixes_delta": 0,
116+
"AdvertisedPrefixes_prev": 0,
117+
"SuppressedPrefixes_delta": 0,
118+
"SuppressedPrefixes_prev": 0,
119+
"WithdrawnPrefixes_delta": 0,
120+
"WithdrawnPrefixes_prev": 0,
121+
"context_name": null
122+
},
123+
{
124+
"bgpPeerIdentifier": "192.0.2.4",
125+
"afi": "ipv6",
126+
"safi": "vpn",
127+
"AcceptedPrefixes": 0,
128+
"DeniedPrefixes": 0,
129+
"PrefixAdminLimit": 0,
130+
"PrefixThreshold": 0,
131+
"PrefixClearThreshold": 0,
132+
"AdvertisedPrefixes": 0,
133+
"SuppressedPrefixes": 0,
134+
"WithdrawnPrefixes": 0,
135+
"AcceptedPrefixes_delta": 0,
136+
"AcceptedPrefixes_prev": 0,
137+
"DeniedPrefixes_delta": 0,
138+
"DeniedPrefixes_prev": 0,
139+
"AdvertisedPrefixes_delta": 0,
140+
"AdvertisedPrefixes_prev": 0,
141+
"SuppressedPrefixes_delta": 0,
142+
"SuppressedPrefixes_prev": 0,
143+
"WithdrawnPrefixes_delta": 0,
144+
"WithdrawnPrefixes_prev": 0,
145+
"context_name": null
146+
}
147+
]
148+
},
149+
"poller": {
150+
"bgpPeers": [
151+
{
152+
"astext": "AS65000-MOCK-TEXT",
153+
"bgpPeerIdentifier": "192.0.2.2",
154+
"bgpPeerRemoteAs": 65000,
155+
"bgpPeerState": "established",
156+
"bgpPeerAdminStatus": "start",
157+
"bgpPeerLastErrorCode": 6,
158+
"bgpPeerLastErrorSubCode": 9,
159+
"bgpPeerLastErrorText": null,
160+
"bgpPeerIface": null,
161+
"bgpLocalAddr": "0.0.0.0",
162+
"bgpPeerRemoteAddr": "192.0.2.2",
163+
"bgpPeerDescr": "",
164+
"bgpPeerInUpdates": 19337,
165+
"bgpPeerOutUpdates": 38,
166+
"bgpPeerInTotalMessages": 31074,
167+
"bgpPeerOutTotalMessages": 11806,
168+
"bgpPeerFsmEstablishedTime": 613583,
169+
"bgpPeerInUpdateElapsedTime": 0,
170+
"context_name": null,
171+
"bgpLocalAs": 65000,
172+
"vrfLocalAs": null
173+
},
174+
{
175+
"astext": "AS65000-MOCK-TEXT",
176+
"bgpPeerIdentifier": "192.0.2.4",
177+
"bgpPeerRemoteAs": 65000,
178+
"bgpPeerState": "established",
179+
"bgpPeerAdminStatus": "start",
180+
"bgpPeerLastErrorCode": 6,
181+
"bgpPeerLastErrorSubCode": 9,
182+
"bgpPeerLastErrorText": null,
183+
"bgpPeerIface": null,
184+
"bgpLocalAddr": "0.0.0.0",
185+
"bgpPeerRemoteAddr": "192.0.2.4",
186+
"bgpPeerDescr": "",
187+
"bgpPeerInUpdates": 19175,
188+
"bgpPeerOutUpdates": 38,
189+
"bgpPeerInTotalMessages": 30986,
190+
"bgpPeerOutTotalMessages": 11787,
191+
"bgpPeerFsmEstablishedTime": 613583,
192+
"bgpPeerInUpdateElapsedTime": 0,
193+
"context_name": null,
194+
"bgpLocalAs": 65000,
195+
"vrfLocalAs": null
196+
},
197+
{
198+
"astext": "AS65000-MOCK-TEXT",
199+
"bgpPeerIdentifier": "192.0.2.2",
200+
"bgpPeerRemoteAs": 65000,
201+
"bgpPeerState": "established",
202+
"bgpPeerAdminStatus": "start",
203+
"bgpPeerLastErrorCode": 6,
204+
"bgpPeerLastErrorSubCode": 9,
205+
"bgpPeerLastErrorText": null,
206+
"bgpPeerIface": null,
207+
"bgpLocalAddr": "0.0.0.0",
208+
"bgpPeerRemoteAddr": "0.0.0.0",
209+
"bgpPeerDescr": "",
210+
"bgpPeerInUpdates": 19337,
211+
"bgpPeerOutUpdates": 38,
212+
"bgpPeerInTotalMessages": 31074,
213+
"bgpPeerOutTotalMessages": 11806,
214+
"bgpPeerFsmEstablishedTime": 613583,
215+
"bgpPeerInUpdateElapsedTime": 0,
216+
"context_name": "",
217+
"bgpLocalAs": 65000,
218+
"vrfLocalAs": null
219+
},
220+
{
221+
"astext": "AS65000-MOCK-TEXT",
222+
"bgpPeerIdentifier": "192.0.2.4",
223+
"bgpPeerRemoteAs": 65000,
224+
"bgpPeerState": "established",
225+
"bgpPeerAdminStatus": "start",
226+
"bgpPeerLastErrorCode": 6,
227+
"bgpPeerLastErrorSubCode": 9,
228+
"bgpPeerLastErrorText": null,
229+
"bgpPeerIface": null,
230+
"bgpLocalAddr": "0.0.0.0",
231+
"bgpPeerRemoteAddr": "0.0.0.0",
232+
"bgpPeerDescr": "",
233+
"bgpPeerInUpdates": 19175,
234+
"bgpPeerOutUpdates": 38,
235+
"bgpPeerInTotalMessages": 30986,
236+
"bgpPeerOutTotalMessages": 11787,
237+
"bgpPeerFsmEstablishedTime": 613583,
238+
"bgpPeerInUpdateElapsedTime": 0,
239+
"context_name": "",
240+
"bgpLocalAs": 65000,
241+
"vrfLocalAs": null
242+
}
243+
],
244+
"bgpPeers_cbgp": [
245+
{
246+
"bgpPeerIdentifier": "192.0.2.2",
247+
"afi": "ipv6",
248+
"safi": "vpn",
249+
"AcceptedPrefixes": 11,
250+
"DeniedPrefixes": 0,
251+
"PrefixAdminLimit": 0,
252+
"PrefixThreshold": 0,
253+
"PrefixClearThreshold": 0,
254+
"AdvertisedPrefixes": 0,
255+
"SuppressedPrefixes": 0,
256+
"WithdrawnPrefixes": 0,
257+
"AcceptedPrefixes_delta": 0,
258+
"AcceptedPrefixes_prev": 11,
259+
"DeniedPrefixes_delta": 0,
260+
"DeniedPrefixes_prev": 0,
261+
"AdvertisedPrefixes_delta": 0,
262+
"AdvertisedPrefixes_prev": 0,
263+
"SuppressedPrefixes_delta": 0,
264+
"SuppressedPrefixes_prev": 0,
265+
"WithdrawnPrefixes_delta": 0,
266+
"WithdrawnPrefixes_prev": 0,
267+
"context_name": null
268+
},
269+
{
270+
"bgpPeerIdentifier": "192.0.2.4",
271+
"afi": "ipv6",
272+
"safi": "vpn",
273+
"AcceptedPrefixes": 11,
274+
"DeniedPrefixes": 0,
275+
"PrefixAdminLimit": 0,
276+
"PrefixThreshold": 0,
277+
"PrefixClearThreshold": 0,
278+
"AdvertisedPrefixes": 0,
279+
"SuppressedPrefixes": 0,
280+
"WithdrawnPrefixes": 0,
281+
"AcceptedPrefixes_delta": 0,
282+
"AcceptedPrefixes_prev": 11,
283+
"DeniedPrefixes_delta": 0,
284+
"DeniedPrefixes_prev": 0,
285+
"AdvertisedPrefixes_delta": 0,
286+
"AdvertisedPrefixes_prev": 0,
287+
"SuppressedPrefixes_delta": 0,
288+
"SuppressedPrefixes_prev": 0,
289+
"WithdrawnPrefixes_delta": 0,
290+
"WithdrawnPrefixes_prev": 0,
291+
"context_name": null
292+
}
293+
]
294+
}
295+
}
296+
}

0 commit comments

Comments
 (0)