async_snmp/message/
mod.rs1mod community;
11mod v3;
12
13pub use community::{CommunityMessage, CommunityPdu};
14pub use v3::{
15 MsgFlags, MsgGlobalData, ScopedPdu, SecurityLevel, SecurityModel, V3Message, V3MessageData,
16};
17
18use crate::ber::Decoder;
19use crate::error::internal::DecodeErrorKind;
20use crate::error::{Error, Result, UNKNOWN_TARGET};
21use crate::pdu::Pdu;
22use crate::version::Version;
23use bytes::Bytes;
24
25#[derive(Debug)]
30pub enum Message {
31 Community(CommunityMessage),
33 V3(V3Message),
35}
36
37impl Message {
38 pub fn pdu(&self) -> Option<&Pdu> {
42 match self {
43 Message::Community(m) => m.pdu.standard(),
44 Message::V3(m) => m.pdu(),
45 }
46 }
47
48 pub fn into_pdu(self) -> Option<Pdu> {
52 match self {
53 Message::Community(m) => match m.pdu {
54 CommunityPdu::Standard(p) => Some(p),
55 CommunityPdu::TrapV1(_) => None,
56 },
57 Message::V3(m) => m.into_pdu(),
58 }
59 }
60
61 pub fn version(&self) -> Version {
63 match self {
64 Message::Community(m) => m.version,
65 Message::V3(_) => Version::V3,
66 }
67 }
68
69 pub fn decode(data: Bytes) -> Result<Self> {
73 let mut decoder = Decoder::new(data);
74 let mut seq = decoder.read_sequence()?;
75
76 let version_num = seq.read_integer()?;
78 let version = Version::from_i32(version_num).ok_or_else(|| {
79 tracing::debug!(target: "async_snmp::ber", { offset = seq.offset(), kind = %DecodeErrorKind::UnknownVersion(version_num) }, "decode error");
80 Error::MalformedResponse {
81 target: UNKNOWN_TARGET,
82 }
83 .boxed()
84 })?;
85
86 match version {
88 Version::V1 | Version::V2c => {
89 let msg = CommunityMessage::decode_from_sequence(&mut seq, version)?;
90 Ok(Message::Community(msg))
91 }
92 Version::V3 => {
93 let msg = V3Message::decode_from_sequence(&mut seq)?;
94 Ok(Message::V3(msg))
95 }
96 }
97 }
98}
99
100impl From<CommunityMessage> for Message {
102 fn from(msg: CommunityMessage) -> Self {
103 Message::Community(msg)
104 }
105}
106
107impl From<V3Message> for Message {
108 fn from(msg: V3Message) -> Self {
109 Message::V3(msg)
110 }
111}