bgpkit_parser/parser/mrt/messages/table_dump_v2/
mod.rs

1mod peer_index_table;
2mod rib_afi_entries;
3
4use crate::error::ParserError;
5use crate::messages::table_dump_v2::peer_index_table::parse_peer_index_table;
6use crate::messages::table_dump_v2::rib_afi_entries::parse_rib_afi_entries;
7use crate::models::*;
8use bytes::Bytes;
9use std::convert::TryFrom;
10
11/// Parse TABLE_DUMP V2 format MRT message.
12///
13/// RFC: <https://www.rfc-editor.org/rfc/rfc6396#section-4.3>
14///
15/// Subtypes include
16/// 1. PEER_INDEX_TABLE
17/// 2. RIB_IPV4_UNICAST
18/// 3. RIB_IPV4_MULTICAST
19/// 4. RIB_IPV6_UNICAST
20/// 5. RIB_IPV6_MULTICAST
21/// 6. RIB_GENERIC
22///
23pub fn parse_table_dump_v2_message(
24    sub_type: u16,
25    mut input: Bytes,
26) -> Result<TableDumpV2Message, ParserError> {
27    let v2_type: TableDumpV2Type = TableDumpV2Type::try_from(sub_type)?;
28
29    let msg: TableDumpV2Message = match v2_type {
30        TableDumpV2Type::PeerIndexTable => {
31            // peer index table type
32            TableDumpV2Message::PeerIndexTable(parse_peer_index_table(&mut input)?)
33        }
34        TableDumpV2Type::RibIpv4Unicast
35        | TableDumpV2Type::RibIpv4Multicast
36        | TableDumpV2Type::RibIpv6Unicast
37        | TableDumpV2Type::RibIpv6Multicast
38        | TableDumpV2Type::RibIpv4UnicastAddPath
39        | TableDumpV2Type::RibIpv4MulticastAddPath
40        | TableDumpV2Type::RibIpv6UnicastAddPath
41        | TableDumpV2Type::RibIpv6MulticastAddPath => {
42            TableDumpV2Message::RibAfi(parse_rib_afi_entries(&mut input, v2_type)?)
43        }
44        TableDumpV2Type::RibGeneric
45        | TableDumpV2Type::RibGenericAddPath
46        | TableDumpV2Type::GeoPeerTable => {
47            return Err(ParserError::Unsupported(
48                "TableDumpV2 RibGeneric and GeoPeerTable is not currently supported".to_string(),
49            ))
50        }
51    };
52
53    Ok(msg)
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    #[test]
61    fn test_unsupported_type() {
62        let msg = parse_table_dump_v2_message(7, Bytes::new());
63        assert!(msg.is_err());
64    }
65}