topotests: fix bmp_collector handling of empty as-path

When configuring the bgp_bmp test with an additional
peer that sends empty AS-PATH, the bmp collector is stopping:

> [2024-10-28 17:41:51] Finished dissecting data from ('192.0.2.1', 33922)
> [2024-10-28 17:41:52] Data received from ('192.0.2.1', 33922): length 195
> [2024-10-28 17:41:52] Got message type: <class 'bmp.BMPRouteMonitoring'>
> [2024-10-28 17:41:52] unpack_from requires a buffer of at least 2 bytes for unpacking 2 bytes at offset 0 (actual buffer size is 0)
> [2024-10-28 17:41:52] TCP session closed with ('192.0.2.1', 33922)
> [2024-10-28 17:41:52] Server shutting down on 192.0.2.10:1789

The parser attempts to read an empty AS-path and considers the length
value as a length in bytes, whereas RFC mentions this value as
definining the number of AS-PAths. Fix this in the parser.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
Philippe Guibert 2024-10-28 18:20:13 +01:00
parent 0af653eaf7
commit 2dc693e808

View File

@ -72,6 +72,12 @@ class PathAttribute:
if path_attr_cls == cls.UNKNOWN_ATTR:
return data[offset + attr_len :], None
# RFC1771, 4.3 UPDATE Message Format
# The path segment length is a 1-octet long field containing
# the number of ASs in the path segment value field.
if type_code == PATH_ATTR_TYPE_AS_PATH and attr_len == 0:
return data[offset:], path_attr_cls.dissect(data[offset : offset + 2])
return data[offset + attr_len :], path_attr_cls.dissect(
data[offset : offset + attr_len]
)