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

View File

@@ -48,6 +48,9 @@ enum RadiusAttributeValueType {
TunnelPassword,
Octets,
IpAddr,
Ipv6Addr,
Ipv6Prefix,
IfId,
Date,
Integer,
VSA,
@@ -60,6 +63,9 @@ impl FromStr for RadiusAttributeValueType {
"string" => Ok(RadiusAttributeValueType::String),
"octets" => Ok(RadiusAttributeValueType::Octets),
"ipaddr" => Ok(RadiusAttributeValueType::IpAddr),
"ipv6addr" => Ok(RadiusAttributeValueType::Ipv6Addr),
"ipv6prefix" => Ok(RadiusAttributeValueType::Ipv6Prefix),
"ifid" => Ok(RadiusAttributeValueType::IfId),
"date" => Ok(RadiusAttributeValueType::Date),
"integer" => Ok(RadiusAttributeValueType::Integer),
"vsa" => Ok(RadiusAttributeValueType::VSA),
@@ -118,7 +124,7 @@ fn main() {
fn generate_header(w: &mut BufWriter<File>) {
let code = b"// Code generated by machine generator; DO NOT EDIT.
use std::net::Ipv4Addr;
use std::net::{Ipv4Addr, Ipv6Addr};
use chrono::{DateTime, Utc};
@@ -228,6 +234,23 @@ fn generate_attribute_code(
true => unimplemented!("tagged-ip-addr"),
false => generate_ipaddr_attribute_code(w, &method_identifier, &type_identifier),
},
RadiusAttributeValueType::Ipv6Addr => match attr.has_tag {
true => unimplemented!("tagged-ip-v6-addr"),
false => generate_ipv6addr_attribute_code(w, &method_identifier, &type_identifier),
},
RadiusAttributeValueType::Ipv6Prefix => match attr.has_tag {
true => unimplemented!("tagged-ipv6-prefix"),
false => generate_ipv6_prefix_attribute_code(w, &method_identifier, &type_identifier),
},
RadiusAttributeValueType::IfId => match attr.has_tag {
true => unimplemented!("tagged-ifid"),
false => generate_fixed_length_octets_attribute_code(
w,
&method_identifier,
&type_identifier,
8,
),
},
RadiusAttributeValueType::Date => match attr.has_tag {
true => unimplemented!("tagged-date"),
false => generate_date_attribute_code(w, &method_identifier, &type_identifier),
@@ -505,6 +528,59 @@ pub fn lookup_all_{method_identifier}(packet: &Packet) -> Result<Vec<Ipv4Addr>,
w.write_all(code.as_bytes()).unwrap();
}
fn generate_ipv6addr_attribute_code(
w: &mut BufWriter<File>,
method_identifier: &str,
type_identifier: &str,
) {
let code = format!(
"pub fn add_{method_identifier}(packet: &mut Packet, value: &Ipv6Addr) {{
packet.add(AVP::from_ipv6({type_identifier}, value));
}}
pub fn lookup_{method_identifier}(packet: &Packet) -> Option<Result<Ipv6Addr, AVPError>> {{
packet.lookup({type_identifier}).map(|v| v.encode_ipv6())
}}
pub fn lookup_all_{method_identifier}(packet: &Packet) -> Result<Vec<Ipv6Addr>, AVPError> {{
let mut vec = Vec::new();
for avp in packet.lookup_all({type_identifier}) {{
vec.push(avp.encode_ipv6()?)
}}
Ok(vec)
}}
",
method_identifier = method_identifier,
type_identifier = type_identifier,
);
w.write_all(code.as_bytes()).unwrap();
}
fn generate_ipv6_prefix_attribute_code(
w: &mut BufWriter<File>,
method_identifier: &str,
type_identifier: &str,
) {
let code = format!(
"pub fn add_{method_identifier}(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {{
packet.add(AVP::from_ipv6_prefix({type_identifier}, value)?);
Ok(())
}}
pub fn lookup_{method_identifier}(packet: &Packet) -> Option<Result<Vec<u8>, AVPError>> {{
packet.lookup({type_identifier}).map(|v| v.encode_ipv6_prefix())
}}
pub fn lookup_all_{method_identifier}(packet: &Packet) -> Result<Vec<Vec<u8>>, AVPError> {{
let mut vec = Vec::new();
for avp in packet.lookup_all({type_identifier}) {{
vec.push(avp.encode_ipv6_prefix()?)
}}
Ok(vec)
}}
",
method_identifier = method_identifier,
type_identifier = type_identifier,
);
w.write_all(code.as_bytes()).unwrap();
}
fn generate_date_attribute_code(
w: &mut BufWriter<File>,
method_identifier: &str,