From 2b6b80a83ed1d05948438cdc37833f9cd1e75038 Mon Sep 17 00:00:00 2001 From: moznion Date: Sun, 6 Dec 2020 16:09:03 +0900 Subject: [PATCH] Support the following RFC dictionaries - RFC4603 - RFC4675 - RFC4818 - RFC4849 - RFC5176 - RFC6911 - RFC7055 - RFC7155 --- README.md | 16 +++--- dicts/dictionary.rfc4603 | 19 +++++++ dicts/dictionary.rfc4675 | 31 ++++++++++++ dicts/dictionary.rfc4818 | 14 +++++ dicts/dictionary.rfc4849 | 11 ++++ dicts/dictionary.rfc5176 | 12 +++++ dicts/dictionary.rfc6911 | 14 +++++ dicts/dictionary.rfc7055 | 13 +++++ dicts/dictionary.rfc7155 | 13 +++++ radius/src/lib.rs | 8 +++ radius/src/rfc4603.rs | 8 +++ radius/src/rfc4675.rs | 86 +++++++++++++++++++++++++++++++ radius/src/rfc4818.rs | 25 +++++++++ radius/src/rfc4849.rs | 24 +++++++++ radius/src/rfc5176.rs | 5 ++ radius/src/rfc6911.rs | 107 +++++++++++++++++++++++++++++++++++++++ radius/src/rfc7055.rs | 84 ++++++++++++++++++++++++++++++ radius/src/rfc7155.rs | 28 ++++++++++ scripts/generate-code.sh | 10 +++- 19 files changed, 518 insertions(+), 10 deletions(-) create mode 100644 dicts/dictionary.rfc4603 create mode 100644 dicts/dictionary.rfc4675 create mode 100644 dicts/dictionary.rfc4818 create mode 100644 dicts/dictionary.rfc4849 create mode 100644 dicts/dictionary.rfc5176 create mode 100644 dicts/dictionary.rfc6911 create mode 100644 dicts/dictionary.rfc7055 create mode 100644 dicts/dictionary.rfc7155 create mode 100644 radius/src/rfc4603.rs create mode 100644 radius/src/rfc4675.rs create mode 100644 radius/src/rfc4818.rs create mode 100644 radius/src/rfc4849.rs create mode 100644 radius/src/rfc5176.rs create mode 100644 radius/src/rfc6911.rs create mode 100644 radius/src/rfc7055.rs create mode 100644 radius/src/rfc7155.rs diff --git a/README.md b/README.md index cc935c2..3384475 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,18 @@ This supports the following RFC dictionaries at the moment: - [RFC3580](https://tools.ietf.org/html/rfc3580) - [RFC4072](https://tools.ietf.org/html/rfc4072) - [RFC4372](https://tools.ietf.org/html/rfc4372) +- [RFC4603](https://tools.ietf.org/html/rfc4603) +- [RFC4675](https://tools.ietf.org/html/rfc4675) +- [RFC4818](https://tools.ietf.org/html/rfc4818) +- [RFC4849](https://tools.ietf.org/html/rfc4849) - [RFC5090](https://tools.ietf.org/html/rfc5090) +- [RFC5176](https://tools.ietf.org/html/rfc5176) - [RFC5607](https://tools.ietf.org/html/rfc5607) - [RFC6519](https://tools.ietf.org/html/rfc6519) - [RFC6677](https://tools.ietf.org/html/rfc6677) +- [RFC6911](https://tools.ietf.org/html/rfc6911) +- [RFC7055](https://tools.ietf.org/html/rfc7055) +- [RFC7155](https://tools.ietf.org/html/rfc7155) ## Usage @@ -36,21 +44,13 @@ Simple example implementations are here: - retransmission feature on the client - Support the following RFC dictionaries: - - rfc4603 - - rfc4675 - rfc4679 - - rfc4818 - - rfc4849 - - rfc5176 - rfc5447 - rfc5580 - rfc5904 - rfc6572 - - rfc6911 - rfc6929 - rfc6930 - - rfc7055 - - rfc7155 - rfc7268 - rfc7499 - rfc7930 diff --git a/dicts/dictionary.rfc4603 b/dicts/dictionary.rfc4603 new file mode 100644 index 0000000..01d8076 --- /dev/null +++ b/dicts/dictionary.rfc4603 @@ -0,0 +1,19 @@ +# -*- text -*- +# Copyright (C) 2020 The FreeRADIUS Server project and contributors +# This work is licensed under CC-BY version 4.0 https://creativecommons.org/licenses/by/4.0 +# Version $Id$ +############################################################################## +# +# Attributes and values defined in RFC 4603. +# http://www.ietf.org/rfc/rfc4603.txt +# +# $Id$ +# +############################################################################## + +VALUE NAS-Port-Type PPPoA 30 +VALUE NAS-Port-Type PPPoEoA 31 +VALUE NAS-Port-Type PPPoEoE 32 +VALUE NAS-Port-Type PPPoEoVLAN 33 +VALUE NAS-Port-Type PPPoEoQinQ 34 + diff --git a/dicts/dictionary.rfc4675 b/dicts/dictionary.rfc4675 new file mode 100644 index 0000000..ceae513 --- /dev/null +++ b/dicts/dictionary.rfc4675 @@ -0,0 +1,31 @@ +# -*- text -*- +# Copyright (C) 2020 The FreeRADIUS Server project and contributors +# This work is licensed under CC-BY version 4.0 https://creativecommons.org/licenses/by/4.0 +# Version $Id$ +# +# Attributes and values defined in RFC 4675. +# http://www.ietf.org/rfc/rfc4675.txt +# +# $Id$ +# + +# +# High byte = '1' (0x31) means the frames are tagged. +# High byte = '2' (0x32) means the frames are untagged. +# +# Next 12 bits MUST be zero. +# +# Lower 12 bits is the IEEE-802.1Q VLAN VID. +# +ATTRIBUTE Egress-VLANID 56 integer +ATTRIBUTE Ingress-Filters 57 integer + +# +# First byte == '1' (0x31) means that the frames are tagged. +# First byte == '2' (0x32) means that the frames are untagged. +# +ATTRIBUTE Egress-VLAN-Name 58 string +ATTRIBUTE User-Priority-Table 59 octets + +VALUE Ingress-Filters Enabled 1 +VALUE Ingress-Filters Disabled 2 diff --git a/dicts/dictionary.rfc4818 b/dicts/dictionary.rfc4818 new file mode 100644 index 0000000..7b809b8 --- /dev/null +++ b/dicts/dictionary.rfc4818 @@ -0,0 +1,14 @@ +# -*- text -*- +# Copyright (C) 2020 The FreeRADIUS Server project and contributors +# This work is licensed under CC-BY version 4.0 https://creativecommons.org/licenses/by/4.0 +# Version $Id$ +############################################################################## +# +# Attributes and values defined in RFC 4818. +# http://www.ietf.org/rfc/rfc4818.txt +# +# $Id$ +# +############################################################################## + +ATTRIBUTE Delegated-IPv6-Prefix 123 ipv6prefix diff --git a/dicts/dictionary.rfc4849 b/dicts/dictionary.rfc4849 new file mode 100644 index 0000000..cab3be6 --- /dev/null +++ b/dicts/dictionary.rfc4849 @@ -0,0 +1,11 @@ +# -*- text -*- +# Copyright (C) 2020 The FreeRADIUS Server project and contributors +# This work is licensed under CC-BY version 4.0 https://creativecommons.org/licenses/by/4.0 +# Version $Id$ +# +# Attributes and values defined in RFC 4849. +# http://www.ietf.org/rfc/rfc4849.txt +# +# $Id$ +# +ATTRIBUTE NAS-Filter-Rule 92 string diff --git a/dicts/dictionary.rfc5176 b/dicts/dictionary.rfc5176 new file mode 100644 index 0000000..843f095 --- /dev/null +++ b/dicts/dictionary.rfc5176 @@ -0,0 +1,12 @@ +# -*- text -*- +# Copyright (C) 2020 The FreeRADIUS Server project and contributors +# This work is licensed under CC-BY version 4.0 https://creativecommons.org/licenses/by/4.0 +# Version $Id$ +# +# Attributes and values defined in RFC 5176. +# http://www.ietf.org/rfc/rfc5176.txt +# +# $Id$ +# +VALUE Error-Cause Invalid-Attribute-Value 407 +VALUE Error-Cause Multiple-Session-Selection-Unsupported 508 diff --git a/dicts/dictionary.rfc6911 b/dicts/dictionary.rfc6911 new file mode 100644 index 0000000..20a50ed --- /dev/null +++ b/dicts/dictionary.rfc6911 @@ -0,0 +1,14 @@ +# -*- text -*- +# Copyright (C) 2020 The FreeRADIUS Server project and contributors +# This work is licensed under CC-BY version 4.0 https://creativecommons.org/licenses/by/4.0 +# Version $Id$ +# +# Attributes and values defined in RFC 6911 +# http://www.ietf.org/rfc/rfc6911.txt +# + +ATTRIBUTE Framed-IPv6-Address 168 ipv6addr +ATTRIBUTE DNS-Server-IPv6-Address 169 ipv6addr +ATTRIBUTE Route-IPv6-Information 170 ipv6prefix +ATTRIBUTE Delegated-IPv6-Prefix-Pool 171 string +ATTRIBUTE Stateful-IPv6-Address-Pool 172 string diff --git a/dicts/dictionary.rfc7055 b/dicts/dictionary.rfc7055 new file mode 100644 index 0000000..4494d9b --- /dev/null +++ b/dicts/dictionary.rfc7055 @@ -0,0 +1,13 @@ +# -*- text -*- +# Copyright (C) 2020 The FreeRADIUS Server project and contributors +# This work is licensed under CC-BY version 4.0 https://creativecommons.org/licenses/by/4.0 +# Version $Id$ +# +# Attributes and values defined in RFC 7055 +# http://www.ietf.org/rfc/rfc7055.txt +# + +ATTRIBUTE GSS-Acceptor-Service-Name 164 string +ATTRIBUTE GSS-Acceptor-Host-Name 165 string +ATTRIBUTE GSS-Acceptor-Service-Specifics 166 string +ATTRIBUTE GSS-Acceptor-Realm-Name 167 string diff --git a/dicts/dictionary.rfc7155 b/dicts/dictionary.rfc7155 new file mode 100644 index 0000000..22e444c --- /dev/null +++ b/dicts/dictionary.rfc7155 @@ -0,0 +1,13 @@ +# -*- text -*- +# Copyright (C) 2020 The FreeRADIUS Server project and contributors +# This work is licensed under CC-BY version 4.0 https://creativecommons.org/licenses/by/4.0 +# Version $Id$ +# +# Attributes and values defined in RFC 7155 +# http://www.ietf.org/rfc/rfc7155.txt +# + +# The Value field contains two octets (00 - 99). ANSI T1.113 and +# BELLCORE 394 can be used for additional information about these +# values and their use. +ATTRIBUTE Originating-Line-Info 94 octets[2] diff --git a/radius/src/lib.rs b/radius/src/lib.rs index 1be81af..f3600b3 100644 --- a/radius/src/lib.rs +++ b/radius/src/lib.rs @@ -13,8 +13,16 @@ pub mod rfc3576; pub mod rfc3580; pub mod rfc4072; pub mod rfc4372; +pub mod rfc4603; +pub mod rfc4675; +pub mod rfc4818; +pub mod rfc4849; pub mod rfc5090; +pub mod rfc5176; pub mod rfc5607; pub mod rfc6519; pub mod rfc6677; +pub mod rfc6911; +pub mod rfc7055; +pub mod rfc7155; pub mod tag; diff --git a/radius/src/rfc4603.rs b/radius/src/rfc4603.rs new file mode 100644 index 0000000..73baaa2 --- /dev/null +++ b/radius/src/rfc4603.rs @@ -0,0 +1,8 @@ +// Code generated by machine generator; DO NOT EDIT. + +pub type NasPortType = u32; +pub const NAS_PORT_TYPE_PP_PO_A: NasPortType = 30; +pub const NAS_PORT_TYPE_PP_PO_EO_A: NasPortType = 31; +pub const NAS_PORT_TYPE_PP_PO_EO_E: NasPortType = 32; +pub const NAS_PORT_TYPE_PP_PO_EO_VLAN: NasPortType = 33; +pub const NAS_PORT_TYPE_PP_PO_EO_QIN_Q: NasPortType = 34; diff --git a/radius/src/rfc4675.rs b/radius/src/rfc4675.rs new file mode 100644 index 0000000..0a7b03c --- /dev/null +++ b/radius/src/rfc4675.rs @@ -0,0 +1,86 @@ +// Code generated by machine generator; DO NOT EDIT. + +use crate::avp::{AVPError, AVPType, AVP}; +use crate::packet::Packet; + +pub type IngressFilters = u32; +pub const INGRESS_FILTERS_ENABLED: IngressFilters = 1; +pub const INGRESS_FILTERS_DISABLED: IngressFilters = 2; + +pub const EGRESS_VLANID_TYPE: AVPType = 56; +pub fn delete_egress_vlanid(packet: &mut Packet) { + packet.delete(EGRESS_VLANID_TYPE); +} +pub fn add_egress_vlanid(packet: &mut Packet, value: u32) { + packet.add(AVP::from_u32(EGRESS_VLANID_TYPE, value)); +} +pub fn lookup_egress_vlanid(packet: &Packet) -> Option> { + packet.lookup(EGRESS_VLANID_TYPE).map(|v| v.encode_u32()) +} +pub fn lookup_all_egress_vlanid(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(EGRESS_VLANID_TYPE) { + vec.push(avp.encode_u32()?) + } + Ok(vec) +} + +pub const INGRESS_FILTERS_TYPE: AVPType = 57; +pub fn delete_ingress_filters(packet: &mut Packet) { + packet.delete(INGRESS_FILTERS_TYPE); +} +pub fn add_ingress_filters(packet: &mut Packet, value: IngressFilters) { + packet.add(AVP::from_u32(INGRESS_FILTERS_TYPE, value as u32)); +} +pub fn lookup_ingress_filters(packet: &Packet) -> Option> { + packet + .lookup(INGRESS_FILTERS_TYPE) + .map(|v| Ok(v.encode_u32()? as IngressFilters)) +} +pub fn lookup_all_ingress_filters(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(INGRESS_FILTERS_TYPE) { + vec.push(avp.encode_u32()? as IngressFilters) + } + Ok(vec) +} + +pub const EGRESS_VLAN_NAME_TYPE: AVPType = 58; +pub fn delete_egress_vlan_name(packet: &mut Packet) { + packet.delete(EGRESS_VLAN_NAME_TYPE); +} +pub fn add_egress_vlan_name(packet: &mut Packet, value: &str) { + packet.add(AVP::from_string(EGRESS_VLAN_NAME_TYPE, value)); +} +pub fn lookup_egress_vlan_name(packet: &Packet) -> Option> { + packet + .lookup(EGRESS_VLAN_NAME_TYPE) + .map(|v| v.encode_string()) +} +pub fn lookup_all_egress_vlan_name(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(EGRESS_VLAN_NAME_TYPE) { + vec.push(avp.encode_string()?) + } + Ok(vec) +} + +pub const USER_PRIORITY_TABLE_TYPE: AVPType = 59; +pub fn delete_user_priority_table(packet: &mut Packet) { + packet.delete(USER_PRIORITY_TABLE_TYPE); +} +pub fn add_user_priority_table(packet: &mut Packet, value: &[u8]) { + packet.add(AVP::from_bytes(USER_PRIORITY_TABLE_TYPE, value)); +} +pub fn lookup_user_priority_table(packet: &Packet) -> Option> { + packet + .lookup(USER_PRIORITY_TABLE_TYPE) + .map(|v| v.encode_bytes()) +} +pub fn lookup_all_user_priority_table(packet: &Packet) -> Vec> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(USER_PRIORITY_TABLE_TYPE) { + vec.push(avp.encode_bytes()) + } + vec +} diff --git a/radius/src/rfc4818.rs b/radius/src/rfc4818.rs new file mode 100644 index 0000000..6c90923 --- /dev/null +++ b/radius/src/rfc4818.rs @@ -0,0 +1,25 @@ +// Code generated by machine generator; DO NOT EDIT. + +use crate::avp::{AVPError, AVPType, AVP}; +use crate::packet::Packet; + +pub const DELEGATED_I_PV_6_PREFIX_TYPE: AVPType = 123; +pub fn delete_delegated_i_pv_6_prefix(packet: &mut Packet) { + packet.delete(DELEGATED_I_PV_6_PREFIX_TYPE); +} +pub fn add_delegated_i_pv_6_prefix(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> { + packet.add(AVP::from_ipv6_prefix(DELEGATED_I_PV_6_PREFIX_TYPE, value)?); + Ok(()) +} +pub fn lookup_delegated_i_pv_6_prefix(packet: &Packet) -> Option, AVPError>> { + packet + .lookup(DELEGATED_I_PV_6_PREFIX_TYPE) + .map(|v| v.encode_ipv6_prefix()) +} +pub fn lookup_all_delegated_i_pv_6_prefix(packet: &Packet) -> Result>, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(DELEGATED_I_PV_6_PREFIX_TYPE) { + vec.push(avp.encode_ipv6_prefix()?) + } + Ok(vec) +} diff --git a/radius/src/rfc4849.rs b/radius/src/rfc4849.rs new file mode 100644 index 0000000..eb8f2a0 --- /dev/null +++ b/radius/src/rfc4849.rs @@ -0,0 +1,24 @@ +// Code generated by machine generator; DO NOT EDIT. + +use crate::avp::{AVPError, AVPType, AVP}; +use crate::packet::Packet; + +pub const NAS_FILTER_RULE_TYPE: AVPType = 92; +pub fn delete_nas_filter_rule(packet: &mut Packet) { + packet.delete(NAS_FILTER_RULE_TYPE); +} +pub fn add_nas_filter_rule(packet: &mut Packet, value: &str) { + packet.add(AVP::from_string(NAS_FILTER_RULE_TYPE, value)); +} +pub fn lookup_nas_filter_rule(packet: &Packet) -> Option> { + packet + .lookup(NAS_FILTER_RULE_TYPE) + .map(|v| v.encode_string()) +} +pub fn lookup_all_nas_filter_rule(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(NAS_FILTER_RULE_TYPE) { + vec.push(avp.encode_string()?) + } + Ok(vec) +} diff --git a/radius/src/rfc5176.rs b/radius/src/rfc5176.rs new file mode 100644 index 0000000..45ce907 --- /dev/null +++ b/radius/src/rfc5176.rs @@ -0,0 +1,5 @@ +// Code generated by machine generator; DO NOT EDIT. + +pub type ErrorCause = u32; +pub const ERROR_CAUSE_INVALID_ATTRIBUTE_VALUE: ErrorCause = 407; +pub const ERROR_CAUSE_MULTIPLE_SESSION_SELECTION_UNSUPPORTED: ErrorCause = 508; diff --git a/radius/src/rfc6911.rs b/radius/src/rfc6911.rs new file mode 100644 index 0000000..245d911 --- /dev/null +++ b/radius/src/rfc6911.rs @@ -0,0 +1,107 @@ +// Code generated by machine generator; DO NOT EDIT. + +use std::net::Ipv6Addr; + +use crate::avp::{AVPError, AVPType, AVP}; +use crate::packet::Packet; + +pub const FRAMED_I_PV_6_ADDRESS_TYPE: AVPType = 168; +pub fn delete_framed_i_pv_6_address(packet: &mut Packet) { + packet.delete(FRAMED_I_PV_6_ADDRESS_TYPE); +} +pub fn add_framed_i_pv_6_address(packet: &mut Packet, value: &Ipv6Addr) { + packet.add(AVP::from_ipv6(FRAMED_I_PV_6_ADDRESS_TYPE, value)); +} +pub fn lookup_framed_i_pv_6_address(packet: &Packet) -> Option> { + packet + .lookup(FRAMED_I_PV_6_ADDRESS_TYPE) + .map(|v| v.encode_ipv6()) +} +pub fn lookup_all_framed_i_pv_6_address(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(FRAMED_I_PV_6_ADDRESS_TYPE) { + vec.push(avp.encode_ipv6()?) + } + Ok(vec) +} + +pub const DNS_SERVER_I_PV_6_ADDRESS_TYPE: AVPType = 169; +pub fn delete_dns_server_i_pv_6_address(packet: &mut Packet) { + packet.delete(DNS_SERVER_I_PV_6_ADDRESS_TYPE); +} +pub fn add_dns_server_i_pv_6_address(packet: &mut Packet, value: &Ipv6Addr) { + packet.add(AVP::from_ipv6(DNS_SERVER_I_PV_6_ADDRESS_TYPE, value)); +} +pub fn lookup_dns_server_i_pv_6_address(packet: &Packet) -> Option> { + packet + .lookup(DNS_SERVER_I_PV_6_ADDRESS_TYPE) + .map(|v| v.encode_ipv6()) +} +pub fn lookup_all_dns_server_i_pv_6_address(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(DNS_SERVER_I_PV_6_ADDRESS_TYPE) { + vec.push(avp.encode_ipv6()?) + } + Ok(vec) +} + +pub const ROUTE_I_PV_6_INFORMATION_TYPE: AVPType = 170; +pub fn delete_route_i_pv_6_information(packet: &mut Packet) { + packet.delete(ROUTE_I_PV_6_INFORMATION_TYPE); +} +pub fn add_route_i_pv_6_information(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> { + packet.add(AVP::from_ipv6_prefix(ROUTE_I_PV_6_INFORMATION_TYPE, value)?); + Ok(()) +} +pub fn lookup_route_i_pv_6_information(packet: &Packet) -> Option, AVPError>> { + packet + .lookup(ROUTE_I_PV_6_INFORMATION_TYPE) + .map(|v| v.encode_ipv6_prefix()) +} +pub fn lookup_all_route_i_pv_6_information(packet: &Packet) -> Result>, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(ROUTE_I_PV_6_INFORMATION_TYPE) { + vec.push(avp.encode_ipv6_prefix()?) + } + Ok(vec) +} + +pub const DELEGATED_I_PV_6_PREFIX_POOL_TYPE: AVPType = 171; +pub fn delete_delegated_i_pv_6_prefix_pool(packet: &mut Packet) { + packet.delete(DELEGATED_I_PV_6_PREFIX_POOL_TYPE); +} +pub fn add_delegated_i_pv_6_prefix_pool(packet: &mut Packet, value: &str) { + packet.add(AVP::from_string(DELEGATED_I_PV_6_PREFIX_POOL_TYPE, value)); +} +pub fn lookup_delegated_i_pv_6_prefix_pool(packet: &Packet) -> Option> { + packet + .lookup(DELEGATED_I_PV_6_PREFIX_POOL_TYPE) + .map(|v| v.encode_string()) +} +pub fn lookup_all_delegated_i_pv_6_prefix_pool(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(DELEGATED_I_PV_6_PREFIX_POOL_TYPE) { + vec.push(avp.encode_string()?) + } + Ok(vec) +} + +pub const STATEFUL_I_PV_6_ADDRESS_POOL_TYPE: AVPType = 172; +pub fn delete_stateful_i_pv_6_address_pool(packet: &mut Packet) { + packet.delete(STATEFUL_I_PV_6_ADDRESS_POOL_TYPE); +} +pub fn add_stateful_i_pv_6_address_pool(packet: &mut Packet, value: &str) { + packet.add(AVP::from_string(STATEFUL_I_PV_6_ADDRESS_POOL_TYPE, value)); +} +pub fn lookup_stateful_i_pv_6_address_pool(packet: &Packet) -> Option> { + packet + .lookup(STATEFUL_I_PV_6_ADDRESS_POOL_TYPE) + .map(|v| v.encode_string()) +} +pub fn lookup_all_stateful_i_pv_6_address_pool(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(STATEFUL_I_PV_6_ADDRESS_POOL_TYPE) { + vec.push(avp.encode_string()?) + } + Ok(vec) +} diff --git a/radius/src/rfc7055.rs b/radius/src/rfc7055.rs new file mode 100644 index 0000000..2ebe870 --- /dev/null +++ b/radius/src/rfc7055.rs @@ -0,0 +1,84 @@ +// Code generated by machine generator; DO NOT EDIT. + +use crate::avp::{AVPError, AVPType, AVP}; +use crate::packet::Packet; + +pub const GSS_ACCEPTOR_SERVICE_NAME_TYPE: AVPType = 164; +pub fn delete_gss_acceptor_service_name(packet: &mut Packet) { + packet.delete(GSS_ACCEPTOR_SERVICE_NAME_TYPE); +} +pub fn add_gss_acceptor_service_name(packet: &mut Packet, value: &str) { + packet.add(AVP::from_string(GSS_ACCEPTOR_SERVICE_NAME_TYPE, value)); +} +pub fn lookup_gss_acceptor_service_name(packet: &Packet) -> Option> { + packet + .lookup(GSS_ACCEPTOR_SERVICE_NAME_TYPE) + .map(|v| v.encode_string()) +} +pub fn lookup_all_gss_acceptor_service_name(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(GSS_ACCEPTOR_SERVICE_NAME_TYPE) { + vec.push(avp.encode_string()?) + } + Ok(vec) +} + +pub const GSS_ACCEPTOR_HOST_NAME_TYPE: AVPType = 165; +pub fn delete_gss_acceptor_host_name(packet: &mut Packet) { + packet.delete(GSS_ACCEPTOR_HOST_NAME_TYPE); +} +pub fn add_gss_acceptor_host_name(packet: &mut Packet, value: &str) { + packet.add(AVP::from_string(GSS_ACCEPTOR_HOST_NAME_TYPE, value)); +} +pub fn lookup_gss_acceptor_host_name(packet: &Packet) -> Option> { + packet + .lookup(GSS_ACCEPTOR_HOST_NAME_TYPE) + .map(|v| v.encode_string()) +} +pub fn lookup_all_gss_acceptor_host_name(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(GSS_ACCEPTOR_HOST_NAME_TYPE) { + vec.push(avp.encode_string()?) + } + Ok(vec) +} + +pub const GSS_ACCEPTOR_SERVICE_SPECIFICS_TYPE: AVPType = 166; +pub fn delete_gss_acceptor_service_specifics(packet: &mut Packet) { + packet.delete(GSS_ACCEPTOR_SERVICE_SPECIFICS_TYPE); +} +pub fn add_gss_acceptor_service_specifics(packet: &mut Packet, value: &str) { + packet.add(AVP::from_string(GSS_ACCEPTOR_SERVICE_SPECIFICS_TYPE, value)); +} +pub fn lookup_gss_acceptor_service_specifics(packet: &Packet) -> Option> { + packet + .lookup(GSS_ACCEPTOR_SERVICE_SPECIFICS_TYPE) + .map(|v| v.encode_string()) +} +pub fn lookup_all_gss_acceptor_service_specifics(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(GSS_ACCEPTOR_SERVICE_SPECIFICS_TYPE) { + vec.push(avp.encode_string()?) + } + Ok(vec) +} + +pub const GSS_ACCEPTOR_REALM_NAME_TYPE: AVPType = 167; +pub fn delete_gss_acceptor_realm_name(packet: &mut Packet) { + packet.delete(GSS_ACCEPTOR_REALM_NAME_TYPE); +} +pub fn add_gss_acceptor_realm_name(packet: &mut Packet, value: &str) { + packet.add(AVP::from_string(GSS_ACCEPTOR_REALM_NAME_TYPE, value)); +} +pub fn lookup_gss_acceptor_realm_name(packet: &Packet) -> Option> { + packet + .lookup(GSS_ACCEPTOR_REALM_NAME_TYPE) + .map(|v| v.encode_string()) +} +pub fn lookup_all_gss_acceptor_realm_name(packet: &Packet) -> Result, AVPError> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(GSS_ACCEPTOR_REALM_NAME_TYPE) { + vec.push(avp.encode_string()?) + } + Ok(vec) +} diff --git a/radius/src/rfc7155.rs b/radius/src/rfc7155.rs new file mode 100644 index 0000000..bc9f10c --- /dev/null +++ b/radius/src/rfc7155.rs @@ -0,0 +1,28 @@ +// Code generated by machine generator; DO NOT EDIT. + +use crate::avp::{AVPError, AVPType, AVP}; +use crate::packet::Packet; + +pub const ORIGINATING_LINE_INFO_TYPE: AVPType = 94; +pub fn delete_originating_line_info(packet: &mut Packet) { + packet.delete(ORIGINATING_LINE_INFO_TYPE); +} +pub fn add_originating_line_info(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> { + if value.len() != 2 { + return Err(AVPError::InvalidAttributeLengthError(2)); + } + packet.add(AVP::from_bytes(ORIGINATING_LINE_INFO_TYPE, value)); + Ok(()) +} +pub fn lookup_originating_line_info(packet: &Packet) -> Option> { + packet + .lookup(ORIGINATING_LINE_INFO_TYPE) + .map(|v| v.encode_bytes()) +} +pub fn lookup_all_originating_line_info(packet: &Packet) -> Vec> { + let mut vec = Vec::new(); + for avp in packet.lookup_all(ORIGINATING_LINE_INFO_TYPE) { + vec.push(avp.encode_bytes()) + } + vec +} diff --git a/scripts/generate-code.sh b/scripts/generate-code.sh index 100b492..4b372d7 100755 --- a/scripts/generate-code.sh +++ b/scripts/generate-code.sh @@ -11,13 +11,19 @@ DICTS=$(ls "$DICTS_DIR") # shellcheck disable=SC2068 for DICT in ${DICTS[@]}; do DICT_NAME="${DICT##*.}" - cat /dev/null > "${SRC_DIR}/${DICT_NAME}.rs" + DICT_FILE="${DICTS_DIR}/dictionary.${DICT_NAME}" + if [ -f "$DICT_FILE" ]; then + cat /dev/null > "${SRC_DIR}/${DICT_NAME}.rs" + fi done # shellcheck disable=SC2068 for DICT in ${DICTS[@]}; do DICT_NAME="${DICT##*.}" - cargo run --bin code-generator "${DICTS_DIR}/dictionary.${DICT_NAME}" "${SRC_DIR}/${DICT_NAME}.rs" + DICT_FILE="${DICTS_DIR}/dictionary.${DICT_NAME}" + if [ -f "$DICT_FILE" ]; then + cargo run --bin code-generator "$DICT_FILE" "${SRC_DIR}/${DICT_NAME}.rs" + fi done cargo fix --allow-dirty --allow-staged