flowscope/radius/
types.rs1use std::net::Ipv4Addr;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[non_exhaustive]
9pub struct RadiusMessage {
10 pub code: RadiusCodeKind,
12 pub identifier: u8,
15 pub authenticator_len: usize,
18 pub username: Option<String>,
20 pub calling_station_id: Option<String>,
24 pub called_station_id: Option<String>,
27 pub nas_ip_address: Option<Ipv4Addr>,
30 pub framed_ip_address: Option<Ipv4Addr>,
33 pub has_user_password: bool,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
44#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
45#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
46#[non_exhaustive]
47pub enum RadiusCodeKind {
48 AccessRequest,
49 AccessAccept,
50 AccessReject,
51 AccessChallenge,
52 AccountingRequest,
53 AccountingResponse,
54 StatusServer,
55 StatusClient,
56 Other(u8),
57}
58
59impl RadiusCodeKind {
60 pub(crate) fn from_raw(code: u8) -> Self {
61 match code {
62 1 => Self::AccessRequest,
63 2 => Self::AccessAccept,
64 3 => Self::AccessReject,
65 4 => Self::AccountingRequest,
66 5 => Self::AccountingResponse,
67 11 => Self::AccessChallenge,
68 12 => Self::StatusServer,
69 13 => Self::StatusClient,
70 n => Self::Other(n),
71 }
72 }
73
74 pub fn as_str(&self) -> &'static str {
76 match self {
77 Self::AccessRequest => "access_request",
78 Self::AccessAccept => "access_accept",
79 Self::AccessReject => "access_reject",
80 Self::AccessChallenge => "access_challenge",
81 Self::AccountingRequest => "accounting_request",
82 Self::AccountingResponse => "accounting_response",
83 Self::StatusServer => "status_server",
84 Self::StatusClient => "status_client",
85 Self::Other(_) => "other",
86 }
87 }
88}