tof_control/switch_control/
switch_port.rs

1use snmp::SyncSession;
2use std::time::Duration;
3
4use crate::helper::switch_type::{SwitchPort, SwitchError};
5use crate::switch_control::switch_util::{snmp_getbulk_integer, snmp_getbulk_counter64, snmp_set_integer};
6
7impl SwitchPort {
8    pub fn new(ip_addr: &str) -> Self {
9        match Self::read_port(ip_addr) {
10            Ok(switch_port) => {
11                switch_port
12            }
13            Err(_) => {
14                Self {
15                    link: [u8::MAX; 16],
16                    speed: [u8::MAX; 16],
17                    full_duplex: [u8::MAX; 16],
18                    rx_bytes: [u64::MAX; 16],
19                    rx_pkts: [u64::MAX; 16],
20                    rx_drop_evts: [u64::MAX; 16],
21                    rx_broadcast_pkts: [u64::MAX; 16],
22                    rx_multicast_pkts: [u64::MAX; 16],
23                    rx_crc_align_err_pkts: [u64::MAX; 16],
24                    tx_bytes: [u64::MAX; 16],
25                    tx_pkts: [u64::MAX; 16],
26                    tx_drop_evts: [u64::MAX; 16],
27                    tx_broadcast_pkts: [u64::MAX; 16],
28                    tx_multicast_pkts: [u64::MAX; 16],
29                }
30            }
31        }
32    }
33    pub fn read_port(ip_addr: &str) -> Result<SwitchPort, SwitchError> {
34        let mut snmp_session = SyncSession::new(ip_addr, b"public", Some(Duration::from_secs(1)), 0)?;
35
36        let link = Self::read_link(&mut snmp_session)?;
37        let speed = Self::read_speed(&mut snmp_session)?;
38        let full_duplex = Self::read_full_duplex(&mut snmp_session)?;
39        let rx_bytes = Self::read_rx_bytes(&mut snmp_session)?;
40        let rx_pkts = Self::read_rx_pkts(&mut snmp_session)?;
41        let rx_drop_evts = Self::read_rx_drop_evts(&mut snmp_session)?;
42        let rx_broadcast_pkts = Self::read_rx_broadcast_pkts(&mut snmp_session)?;
43        let rx_multicast_pkts = Self::read_rx_multicast_pkts(&mut snmp_session)?;
44        let rx_crc_align_err_pkts = Self::read_rx_crc_align_err_pkts(&mut snmp_session)?;
45        let tx_bytes = Self::read_tx_bytes(&mut snmp_session)?;
46        let tx_pkts = Self::read_tx_pkts(&mut snmp_session)?;
47        let tx_drop_evts = Self::read_tx_drop_evts(&mut snmp_session)?;
48        let tx_broadcast_pkts = Self::read_tx_broadcast_pkts(&mut snmp_session)?;
49        let tx_multicast_pkts = Self::read_tx_multicast_pkts(&mut snmp_session)?;
50
51        Ok(
52            SwitchPort {
53                link,
54                speed,
55                full_duplex,
56                rx_bytes,
57                rx_pkts,
58                rx_drop_evts,
59                rx_broadcast_pkts,
60                rx_multicast_pkts,
61                rx_crc_align_err_pkts,
62                tx_bytes,
63                tx_pkts,
64                tx_drop_evts,
65                tx_broadcast_pkts,
66                tx_multicast_pkts,
67            }
68        )
69    }
70    pub fn read_link(session: &mut SyncSession) -> Result<[u8; 16], SwitchError> {
71        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.3.1.1.2";
72        let link = snmp_getbulk_integer(oid, session)?;
73
74        Ok(link)
75    }
76    pub fn read_speed(session: &mut SyncSession) -> Result<[u8; 16], SwitchError> {
77        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.3.1.1.5";
78        let speed = snmp_getbulk_integer(oid, session)?;
79
80        Ok(speed)
81    }
82    pub fn read_full_duplex(session: &mut SyncSession) -> Result<[u8; 16], SwitchError> {
83        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.3.1.1.3";
84        let fdx = snmp_getbulk_integer(oid, session)?;
85
86        Ok(fdx)
87    }
88    pub fn read_rx_bytes(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
89        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.3";
90        let rx_bytes = snmp_getbulk_counter64(oid, session)?;
91
92        Ok(rx_bytes)
93    }
94    pub fn read_rx_pkts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
95        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.4";
96        let rx_pkts = snmp_getbulk_counter64(oid, session)?;
97
98        Ok(rx_pkts)
99    }
100    pub fn read_rx_drop_evts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
101        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.2";
102        let rx_drop_evts = snmp_getbulk_counter64(oid, session)?;
103
104        Ok(rx_drop_evts)
105    }
106    pub fn read_rx_broadcast_pkts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
107        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.5";
108        let rx_broadcast_pkts = snmp_getbulk_counter64(oid, session)?;
109
110        Ok(rx_broadcast_pkts)
111    }
112    pub fn read_rx_multicast_pkts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
113        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.6";
114        let rx_multicast_pkts = snmp_getbulk_counter64(oid, session)?;
115
116        Ok(rx_multicast_pkts)
117    }
118    pub fn read_rx_crc_align_err_pkts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
119        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.7";
120        let rx_crc_align_err_pkts = snmp_getbulk_counter64(oid, session)?;
121
122        Ok(rx_crc_align_err_pkts)
123    }
124    pub fn read_tx_bytes(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
125        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.20";
126        let tx_bytes = snmp_getbulk_counter64(oid, session)?;
127
128        Ok(tx_bytes)
129    }
130    pub fn read_tx_pkts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
131        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.21";
132        let tx_pkts = snmp_getbulk_counter64(oid, session)?;
133
134        Ok(tx_pkts)
135    }
136    pub fn read_tx_drop_evts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
137        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.19";
138        let tx_drop_evts = snmp_getbulk_counter64(oid, session)?;
139
140        Ok(tx_drop_evts)
141    }
142    pub fn read_tx_broadcast_pkts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
143        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.22";
144        let tx_broadcast_pkts = snmp_getbulk_counter64(oid, session)?;
145
146        Ok(tx_broadcast_pkts)
147    }
148    pub fn read_tx_multicast_pkts(session: &mut SyncSession) -> Result<[u64; 16], SwitchError> {
149        let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.5.1.1.23";
150        let tx_multicast_pkts = snmp_getbulk_counter64(oid, session)?;
151
152        Ok(tx_multicast_pkts)
153    }
154
155    // pub fn print_switch_port(ip_addr: &str) {
156    //     let switch_port = Self::new(ip_addr);
157
158    //     println!("Switch Port");
159    //     println!("\tLink:           {:?}", switch_port.link);
160    //     println!("\tSpeed:          {:?}", switch_port.speed);
161    //     println!("\tFull Duplex:    {:?}", switch_port.full_duplex);
162    // }
163}
164
165pub fn clear_port_statistics(ip_addr: &str) -> Result<(), SwitchError> {
166    let mut snmp_session = SyncSession::new(ip_addr, b"private", Some(Duration::from_secs(1)), 0)?;
167    let oid = ".1.3.6.1.4.1.38477.1.50.1.11.1.4.1.1.1.2";
168    for i in 1..=16 {
169        let sub_oid = (1000000 + i).to_string();
170        let oid_port = oid.to_string() + "." + &sub_oid;
171        snmp_set_integer(&oid_port, 1, &mut snmp_session)?;
172    }
173
174    Ok(())
175}