1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//! MRT BGP4MP structs
use std::net::IpAddr;
use serde::Serialize;
use crate::bgp::BgpMessage;
use crate::network::{Afi, Asn};

/// BGP states enum.
#[derive(Debug, Primitive, Copy, Clone, Serialize, PartialEq, Eq)]
pub enum BgpState {
    Idle = 1,
    Connect = 2,
    Active = 3,
    OpenSent = 4,
    OpenConfirm = 5,
    Established = 6,
}

/// BGP4MP message types.
#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub enum Bgp4Mp {
    Bgp4MpStateChange(Bgp4MpStateChange),
    Bgp4MpStateChangeAs4(Bgp4MpStateChange),
    Bgp4MpMessage(Bgp4MpMessage),
    Bgp4MpMessageLocal(Bgp4MpMessage),
    Bgp4MpMessageAs4(Bgp4MpMessage),
    Bgp4MpMessageAs4Local(Bgp4MpMessage),
}

/// BGP4MP message subtypes.
#[derive(Debug, Primitive, Copy, Clone, Serialize, PartialEq, Eq)]
pub enum Bgp4MpType {
    Bgp4MpStateChange = 0,
    Bgp4MpMessage = 1,
    Bgp4MpMessageAs4 = 4,
    Bgp4MpStateChangeAs4 = 5,
    Bgp4MpMessageLocal = 6,
    Bgp4MpMessageAs4Local = 7,
    Bgp4MpMessageAddpath = 8,
    Bgp4MpMessageAs4Addpath = 9,
    Bgp4MpMessageLocalAddpath = 10,
    Bgp4MpMessageLocalAs4Addpath = 11,
}

/// BGP4MP state change message.
#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub struct Bgp4MpStateChange {
    pub msg_type: Bgp4MpType,
    pub peer_asn: Asn,
    pub local_asn: Asn,
    pub interface_index: u16,
    pub address_family: Afi,
    pub peer_addr: IpAddr,
    pub local_addr: IpAddr,
    pub old_state: BgpState,
    pub new_state: BgpState,
}

/// BGP4MP message.
#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub struct Bgp4MpMessage {
    pub msg_type: Bgp4MpType,
    pub peer_asn: Asn,
    pub local_asn: Asn,
    pub interface_index: u16,
    pub afi: Afi,
    pub peer_ip: IpAddr,
    pub local_ip: IpAddr,
    pub bgp_message: BgpMessage
}