1use abol_core::packet::Packet;
2pub const ERROR_CAUSE_TYPE: u8 = 101u8;
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4#[repr(u32)]
5pub enum ErrorCause {
6 ResidualContextRemoved,
7 InvalidEapPacket,
8 UnsupportedAttribute,
9 MissingAttribute,
10 NasIdentificationMismatch,
11 InvalidRequest,
12 UnsupportedService,
13 UnsupportedExtension,
14 AdministrativelyProhibited,
15 ProxyRequestNotRoutable,
16 SessionContextNotFound,
17 SessionContextNotRemovable,
18 ProxyProcessingError,
19 ResourcesUnavailable,
20 RequestInitiated,
21 Unknown(u32),
22}
23impl From<u32> for ErrorCause {
24 fn from(v: u32) -> Self {
25 match v {
26 201u32 => Self::ResidualContextRemoved,
27 202u32 => Self::InvalidEapPacket,
28 401u32 => Self::UnsupportedAttribute,
29 402u32 => Self::MissingAttribute,
30 403u32 => Self::NasIdentificationMismatch,
31 404u32 => Self::InvalidRequest,
32 405u32 => Self::UnsupportedService,
33 406u32 => Self::UnsupportedExtension,
34 501u32 => Self::AdministrativelyProhibited,
35 502u32 => Self::ProxyRequestNotRoutable,
36 503u32 => Self::SessionContextNotFound,
37 504u32 => Self::SessionContextNotRemovable,
38 505u32 => Self::ProxyProcessingError,
39 506u32 => Self::ResourcesUnavailable,
40 507u32 => Self::RequestInitiated,
41 other => Self::Unknown(other),
42 }
43 }
44}
45impl From<ErrorCause> for u32 {
46 fn from(e: ErrorCause) -> Self {
47 match e {
48 ErrorCause::ResidualContextRemoved => 201u32,
49 ErrorCause::InvalidEapPacket => 202u32,
50 ErrorCause::UnsupportedAttribute => 401u32,
51 ErrorCause::MissingAttribute => 402u32,
52 ErrorCause::NasIdentificationMismatch => 403u32,
53 ErrorCause::InvalidRequest => 404u32,
54 ErrorCause::UnsupportedService => 405u32,
55 ErrorCause::UnsupportedExtension => 406u32,
56 ErrorCause::AdministrativelyProhibited => 501u32,
57 ErrorCause::ProxyRequestNotRoutable => 502u32,
58 ErrorCause::SessionContextNotFound => 503u32,
59 ErrorCause::SessionContextNotRemovable => 504u32,
60 ErrorCause::ProxyProcessingError => 505u32,
61 ErrorCause::ResourcesUnavailable => 506u32,
62 ErrorCause::RequestInitiated => 507u32,
63 ErrorCause::Unknown(v) => v,
64 }
65 }
66}
67pub trait Rfc3576Ext {
68 fn get_error_cause(&self) -> Option<ErrorCause>;
69 fn set_error_cause(&mut self, value: ErrorCause);
70}
71impl Rfc3576Ext for Packet {
72 fn get_error_cause(&self) -> Option<ErrorCause> {
73 self.get_attribute_as::<u32>(ERROR_CAUSE_TYPE)
74 .map(ErrorCause::from)
75 }
76 fn set_error_cause(&mut self, value: ErrorCause) {
77 let wire_val: u32 = value.into();
78 self.set_attribute_as::<u32>(ERROR_CAUSE_TYPE, wire_val);
79 }
80}