-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
BMP Peer Distinguisher support #17555
BMP Peer Distinguisher support #17555
Conversation
fa2694e
to
496e2f9
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks good
ci:rerun some tests other than bmp failed.. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
25d3798
to
383f993
Compare
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
383f993
to
98792d5
Compare
When running the bgp_bmp test, peer_up message from the loc-rib are received with a wrong peer type. > {"peer_type": "global instance", "policy": "pre-policy", "ipv6": false, "peer_ip": "0.0.0.0", > "peer_distinguisher": "0:0", "peer_asn": 0, "peer_bgp_id": "0.0.0.0", > "timestamp": "2024-10-16 21:59:53.111963", "bmp_log_type": "peer up", "local_ip": "0.0.0.0", > "local_port": 0, "remote_port": 0, "seq": 1} RFC9069 mentions in 5.1 that peer address must be set to 0.0.0.0, and the peer_type value must be set to 3. Today, the value set is 0 (global instance). This is wrong. Fix this by modifying the BMP client, update the peer type value to loc-rib on peer up messages. Modify the current BMP test, by checking the peer up messages for the 0.0.0.0 IP address (which is the value used for loc-rib). > {"peer_type": "loc-rib instance", "is_filtered": false, "policy": "loc-rib", > "peer_distinguisher": "0:0", "peer_asn": 65501, "peer_bgp_id": "192.168.0.1", > "timestamp": "2024-10-16 21:59:53.111963", "bmp_log_type": "peer up", "local_ip": "0.0.0.0", > "local_port": 0, "remote_port": 0, "seq": 1} Signed-off-by: Philippe Guibert <[email protected]>
The BMP implementation currently only supports global and loc-rib instance types. When loc-rib is selected, the peer_distinguisher is set to the route distinguisher of the L3VRF where the BGP instance is. This functionality has not been tested until now, because the peer distinguisher value had been explicitly omitted in the bmp messages. Expose the peer distinguisher value in all BMP messages received. This change requires to modify the expected output for loc-rib when the BGP instance is in a L3VRF. The handling of peer distinguisher value for RD instances will follow in the next commits. Link: https://www.rfc-editor.org/rfc/rfc7854.html#section-4.2 Signed-off-by: Philippe Guibert <[email protected]>
If a given L3VRF instance requests a peer distinguisher for a peer up/down message, the AFI_UNSPEC afi parameter will be used; no RD is chosen for this AFI. Fix this by priorizing the AFI_IP value before the AFI_IP6 value. For instance, a router with both RD set for each address-family, peer up/down messages will be sent with the RD set to the one for AFI_IP. Signed-off-by: Philippe Guibert <[email protected]>
All BMP peer up/down messages send a 0:0 peer distinguisher. This will not be ok when adding RD instance type. Add code to get the peer distinguisher value. - modify the API to pass the BGP instance instead of BMP. - implement error cases with an unknown vrf identifier or a peer type with local type value. - handle the error return of the API; consequently, handle the bmp_peerstate() error return in the calling functions. There is no functional change, as the peer type value is either loc-rib or global, both cases are already handled. The next commit will handle the RD instance case. Signed-off-by: Philippe Guibert <[email protected]>
When running the bgp_bmp_2 vrf test, peer route messages from the pre and post policy are received with a wrong peer type value > {"peer_type": "global instance", "policy": "pre-policy", "ipv6": false, > "peer_ip": "192.168.0.2", "peer_distinguisher": "0:0", "peer_asn": 65502, > "peer_bgp_id": "192.168.0.2", "timestamp": "2024-10-31 08:19:58.111963", > "bmp_log_type": "update", "origin": "IGP", "as_path": "65501 65502", > "bgp_nexthop": "192.168.0.2", "ip_prefix": "172.31.0.15/32", "seq": 15} In addition to global instance peers, RFC7854 defines RD instance peers. This value can be used for peers which are on a BGP VRF instance, for example with an L3VPN setup. When configuring a BGP VRF instance, the peer type should be seen as an RD instance peer. Fix this by modifying the BMP client: - update the peer type for vrf mirror and monitoring messages - modify bgp_bmp_2 vrf test to control the peer_type value > {"peer_type": "route distinguisher instance", "policy": "pre-policy", "ipv6": false, > "peer_ip": "192.168.0.2", "peer_distinguisher": "0:0", "peer_asn": 65502, > "peer_bgp_id": "192.168.0.2", "timestamp": "2024-10-31 08:19:58.111963", > "bmp_log_type": "update", "origin": "IGP", "as_path": "65501 65502", > "bgp_nexthop": "192.168.0.2", "ip_prefix": "172.31.0.15/32", "seq": 15} Signed-off-by: Philippe Guibert <[email protected]>
When running the bgp_bmp_2 vrf test, peer route messages from the pre and post policy are received with a wrong peer distinguisher value. > {"peer_type": "route distinguisher instance", "policy": "pre-policy", "ipv6": false, > "peer_ip": "192.168.0.2", "peer_distinguisher": "0:0", "peer_asn": 65502, > "peer_bgp_id": "192.168.0.2", "timestamp": "2024-10-31 08:19:58.111963", > "bmp_log_type": "update", "origin": "IGP", "as_path": "65501 65502", > "bgp_nexthop": "192.168.0.2", "ip_prefix": "172.31.0.15/32", "seq": 15} RFC7854 mentions in 4.2 that if the peer is a "RD Instance Peer", it is set to the route distinguisher of the particular instance the peer belongs to. Fix this by modifying the BMP client: - update the peer distinguisher value by unlocking the filling of the peer distinguisher in the function. This change impacts monitoring messages. - add the peer distinguisher computation for mirror messages - modify the bgp_bmp_2 vrf test, update the peer_distinguisher value > {"peer_type": "route distinguisher instance", "policy": "pre-policy", "ipv6": false, > "peer_ip": "192.168.0.2", "peer_distinguisher": "444:1", "peer_asn": 65502, > "peer_bgp_id": "192.168.0.2", "timestamp": "2024-10-31 08:19:58.111963", > "bmp_log_type": "update", "origin": "IGP", "as_path": "65501 65502", > "bgp_nexthop": "192.168.0.2", "ip_prefix": "172.31.0.15/32", "seq": 15} Signed-off-by: Philippe Guibert <[email protected]>
When running the bgp_bmp_2 vrf test, peer up/down events from the pre and post policy are received with a wrong peer type value > {"peer_type": "global instance", "policy": "pre-policy", "ipv6": false, > "peer_ip": "192.168.0.2", "peer_distinguisher": "0:0", "peer_asn": 65502, > "peer_bgp_id": "192.168.0.2", "timestamp": "2024-10-16 21:59:53.111962", > "bmp_log_type": "peer up", "local_ip": "192.168.0.1", "local_port": 179, > "remote_port": 50710, "seq": 4} RFC7854 defines RD instance peer type, and later in 4.2 requests that the peer distinguisher value be set to non zero value when the peer type is not global. This is the case for peer vrf instances. Fix this by modifying the BMP client, update the peer type value by updating the peer type value when sending peer up/down messages. Add a check in the bgp_bmp_2 test to ensure that peer type is correctly set. > {"peer_type": "route distinguisher instance", "policy": "pre-policy", > "ipv6": true, "peer_ip": "192:168::2", "peer_distinguisher": "0:0", > "peer_asn": 65502, "peer_bgp_id": "192.168.0.2", "timestamp": > "2024-10-16 21:59:53.111962", "bmp_log_type": "peer up", "local_ip": > "192:168::1", "local_port": 179, "remote_port": 50836, "seq": 5} Signed-off-by: Philippe Guibert <[email protected]>
… up/down When running the bgp_bmp_2 vrf test, peer vrf up/down events from the pre and post policy are received with a wrong peer distinguisher value. > {"peer_type": "route distinguisher instance", "policy": "pre-policy", > "ipv6": true, "peer_ip": "192:168::2", "peer_distinguisher": "0:0", > "peer_asn": 65502, "peer_bgp_id": "192.168.0.2", "timestamp": > "2024-10-16 21:59:53.111962", "bmp_log_type": "peer up", "local_ip": > "192:168::1", "local_port": 179, "remote_port": 50836, "seq": 5} RFC7854 mentions in 4.2 that if the peer is a "RD Instance Peer", it is set to the route distinguisher of the particular instance the peer belongs to. Fix this by modifying the BMP client, update the peer distinguisher value by filling the peer distinguisher in the bmp_peerstate function. > {"peer_type": "route distinguisher instance", "policy": "pre-policy", > "ipv6": true, "peer_ip": "192:168::2", "peer_distinguisher": "444:1", > "peer_asn": 65502, "peer_bgp_id": "192.168.0.2", "timestamp": > "2024-10-16 21:59:53.111962", "bmp_log_type": "peer up", "local_ip": > "192:168::1", "local_port": 179, "remote_port": 50836, "seq": 5} Add a test to check that peer_distinguisher value is not 0:0 when an RD instance is set. Signed-off-by: Philippe Guibert <[email protected]>
Signed-off-by: Philippe Guibert <[email protected]>
98792d5
to
3031c3f
Compare
Today, only global instance per peer header messages are used.
This set of commits makes possible to send per peer header on a VRF instance, and send RD instance messages instead with its proper peer distinguisher value.