Support RFC3162

This commit is contained in:
moznion
2020-12-06 15:33:13 +09:00
parent 84f225b4c0
commit bb1743a96c
6 changed files with 245 additions and 2 deletions
+19
View File
@@ -103,6 +103,18 @@ impl AVP {
}
}
pub fn from_ipv6_prefix(typ: AVPType, prefix: &[u8]) -> Result<Self, AVPError> {
let prefix_len = prefix.len();
if prefix_len > 16 {
return Err(AVPError::InvalidAttributeLengthError(prefix_len));
}
Ok(AVP {
typ,
value: [vec![0x00, prefix_len as u8], prefix.to_vec()].concat::<u8>(),
})
}
pub fn from_user_password(
typ: AVPType,
plain_text: &[u8],
@@ -374,6 +386,13 @@ impl AVP {
}
}
pub fn encode_ipv6_prefix(&self) -> Result<Vec<u8>, AVPError> {
match self.value.len() > 2 {
true => Ok(self.value[2..].to_owned()),
false => Err(AVPError::InvalidAttributeLengthError(self.value.len())),
}
}
pub fn encode_user_password(
&self,
secret: &[u8],
+1
View File
@@ -8,6 +8,7 @@ pub mod rfc2866;
pub mod rfc2867;
pub mod rfc2868;
pub mod rfc2869;
pub mod rfc3162;
pub mod rfc3576;
pub mod rfc4072;
pub mod rfc5090;
+131
View File
@@ -0,0 +1,131 @@
// Code generated by machine generator; DO NOT EDIT.
use std::net::Ipv6Addr;
use crate::avp::{AVPError, AVPType, AVP};
use crate::packet::Packet;
pub const NAS_IPV_6_ADDRESS_TYPE: AVPType = 95;
pub fn delete_nas_ipv_6_address(packet: &mut Packet) {
packet.delete(NAS_IPV_6_ADDRESS_TYPE);
}
pub fn add_nas_ipv_6_address(packet: &mut Packet, value: &Ipv6Addr) {
packet.add(AVP::from_ipv6(NAS_IPV_6_ADDRESS_TYPE, value));
}
pub fn lookup_nas_ipv_6_address(packet: &Packet) -> Option<Result<Ipv6Addr, AVPError>> {
packet
.lookup(NAS_IPV_6_ADDRESS_TYPE)
.map(|v| v.encode_ipv6())
}
pub fn lookup_all_nas_ipv_6_address(packet: &Packet) -> Result<Vec<Ipv6Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(NAS_IPV_6_ADDRESS_TYPE) {
vec.push(avp.encode_ipv6()?)
}
Ok(vec)
}
pub const FRAMED_INTERFACE_ID_TYPE: AVPType = 96;
pub fn delete_framed_interface_id(packet: &mut Packet) {
packet.delete(FRAMED_INTERFACE_ID_TYPE);
}
pub fn add_framed_interface_id(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {
if value.len() != 8 {
return Err(AVPError::InvalidAttributeLengthError(8));
}
packet.add(AVP::from_bytes(FRAMED_INTERFACE_ID_TYPE, value));
Ok(())
}
pub fn lookup_framed_interface_id(packet: &Packet) -> Option<Vec<u8>> {
packet
.lookup(FRAMED_INTERFACE_ID_TYPE)
.map(|v| v.encode_bytes())
}
pub fn lookup_all_framed_interface_id(packet: &Packet) -> Vec<Vec<u8>> {
let mut vec = Vec::new();
for avp in packet.lookup_all(FRAMED_INTERFACE_ID_TYPE) {
vec.push(avp.encode_bytes())
}
vec
}
pub const FRAMED_IPV_6_PREFIX_TYPE: AVPType = 97;
pub fn delete_framed_ipv_6_prefix(packet: &mut Packet) {
packet.delete(FRAMED_IPV_6_PREFIX_TYPE);
}
pub fn add_framed_ipv_6_prefix(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {
packet.add(AVP::from_ipv6_prefix(FRAMED_IPV_6_PREFIX_TYPE, value)?);
Ok(())
}
pub fn lookup_framed_ipv_6_prefix(packet: &Packet) -> Option<Result<Vec<u8>, AVPError>> {
packet
.lookup(FRAMED_IPV_6_PREFIX_TYPE)
.map(|v| v.encode_ipv6_prefix())
}
pub fn lookup_all_framed_ipv_6_prefix(packet: &Packet) -> Result<Vec<Vec<u8>>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(FRAMED_IPV_6_PREFIX_TYPE) {
vec.push(avp.encode_ipv6_prefix()?)
}
Ok(vec)
}
pub const LOGIN_IPV_6_HOST_TYPE: AVPType = 98;
pub fn delete_login_ipv_6_host(packet: &mut Packet) {
packet.delete(LOGIN_IPV_6_HOST_TYPE);
}
pub fn add_login_ipv_6_host(packet: &mut Packet, value: &Ipv6Addr) {
packet.add(AVP::from_ipv6(LOGIN_IPV_6_HOST_TYPE, value));
}
pub fn lookup_login_ipv_6_host(packet: &Packet) -> Option<Result<Ipv6Addr, AVPError>> {
packet
.lookup(LOGIN_IPV_6_HOST_TYPE)
.map(|v| v.encode_ipv6())
}
pub fn lookup_all_login_ipv_6_host(packet: &Packet) -> Result<Vec<Ipv6Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(LOGIN_IPV_6_HOST_TYPE) {
vec.push(avp.encode_ipv6()?)
}
Ok(vec)
}
pub const FRAMED_IPV_6_ROUTE_TYPE: AVPType = 99;
pub fn delete_framed_ipv_6_route(packet: &mut Packet) {
packet.delete(FRAMED_IPV_6_ROUTE_TYPE);
}
pub fn add_framed_ipv_6_route(packet: &mut Packet, value: &str) {
packet.add(AVP::from_string(FRAMED_IPV_6_ROUTE_TYPE, value));
}
pub fn lookup_framed_ipv_6_route(packet: &Packet) -> Option<Result<String, AVPError>> {
packet
.lookup(FRAMED_IPV_6_ROUTE_TYPE)
.map(|v| v.encode_string())
}
pub fn lookup_all_framed_ipv_6_route(packet: &Packet) -> Result<Vec<String>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(FRAMED_IPV_6_ROUTE_TYPE) {
vec.push(avp.encode_string()?)
}
Ok(vec)
}
pub const FRAMED_IPV_6_POOL_TYPE: AVPType = 100;
pub fn delete_framed_ipv_6_pool(packet: &mut Packet) {
packet.delete(FRAMED_IPV_6_POOL_TYPE);
}
pub fn add_framed_ipv_6_pool(packet: &mut Packet, value: &str) {
packet.add(AVP::from_string(FRAMED_IPV_6_POOL_TYPE, value));
}
pub fn lookup_framed_ipv_6_pool(packet: &Packet) -> Option<Result<String, AVPError>> {
packet
.lookup(FRAMED_IPV_6_POOL_TYPE)
.map(|v| v.encode_string())
}
pub fn lookup_all_framed_ipv_6_pool(packet: &Packet) -> Result<Vec<String>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(FRAMED_IPV_6_POOL_TYPE) {
vec.push(avp.encode_string()?)
}
Ok(vec)
}