tof_control/switch_control/
switch_port.rs1use 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 }
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}