Support RFC6572 and ipv4prefix type

This commit is contained in:
moznion
2020-12-06 16:54:42 +09:00
parent a251f4b2af
commit dabbf02109
6 changed files with 499 additions and 2 deletions
+20 -1
View File
@@ -103,6 +103,18 @@ impl AVP {
}
}
pub fn from_ipv4_prefix(typ: AVPType, prefix: &[u8]) -> Result<Self, AVPError> {
let prefix_len = prefix.len();
if prefix_len != 4 {
return Err(AVPError::InvalidAttributeLengthError(prefix_len));
}
Ok(AVP {
typ,
value: [vec![0x00, prefix_len as u8 & 0b00111111], prefix.to_vec()].concat::<u8>(),
})
}
pub fn from_ipv6(typ: AVPType, value: &Ipv6Addr) -> Self {
AVP {
typ,
@@ -118,7 +130,7 @@ impl AVP {
Ok(AVP {
typ,
value: [vec![0x00, prefix_len as u8], prefix.to_vec()].concat::<u8>(),
value: [vec![0x00, (prefix_len * 8) as u8], prefix.to_vec()].concat::<u8>(),
})
}
@@ -393,6 +405,13 @@ impl AVP {
}
}
pub fn encode_ipv4_prefix(&self) -> Result<Vec<u8>, AVPError> {
match self.value.len() == 6 {
true => Ok(self.value[2..].to_owned()),
false => Err(AVPError::InvalidAttributeLengthError(self.value.len())),
}
}
pub fn encode_ipv6(&self) -> Result<Ipv6Addr, AVPError> {
const IPV6_SIZE: usize = std::mem::size_of::<Ipv6Addr>();
if self.value.len() != IPV6_SIZE {
+1
View File
@@ -22,6 +22,7 @@ pub mod rfc5176;
pub mod rfc5607;
pub mod rfc5904;
pub mod rfc6519;
pub mod rfc6572;
pub mod rfc6677;
pub mod rfc6911;
pub mod rfc7055;
+415
View File
@@ -0,0 +1,415 @@
// Code generated by machine generator; DO NOT EDIT.
use std::net::{Ipv4Addr, Ipv6Addr};
use crate::avp::{AVPError, AVPType, AVP};
use crate::packet::Packet;
pub const MOBILE_NODE_IDENTIFIER_TYPE: AVPType = 145;
pub fn delete_mobile_node_identifier(packet: &mut Packet) {
packet.delete(MOBILE_NODE_IDENTIFIER_TYPE);
}
pub fn add_mobile_node_identifier(packet: &mut Packet, value: &[u8]) {
packet.add(AVP::from_bytes(MOBILE_NODE_IDENTIFIER_TYPE, value));
}
pub fn lookup_mobile_node_identifier(packet: &Packet) -> Option<Vec<u8>> {
packet
.lookup(MOBILE_NODE_IDENTIFIER_TYPE)
.map(|v| v.encode_bytes())
}
pub fn lookup_all_mobile_node_identifier(packet: &Packet) -> Vec<Vec<u8>> {
let mut vec = Vec::new();
for avp in packet.lookup_all(MOBILE_NODE_IDENTIFIER_TYPE) {
vec.push(avp.encode_bytes())
}
vec
}
pub const SERVICE_SELECTION_TYPE: AVPType = 146;
pub fn delete_service_selection(packet: &mut Packet) {
packet.delete(SERVICE_SELECTION_TYPE);
}
pub fn add_service_selection(packet: &mut Packet, value: &str) {
packet.add(AVP::from_string(SERVICE_SELECTION_TYPE, value));
}
pub fn lookup_service_selection(packet: &Packet) -> Option<Result<String, AVPError>> {
packet
.lookup(SERVICE_SELECTION_TYPE)
.map(|v| v.encode_string())
}
pub fn lookup_all_service_selection(packet: &Packet) -> Result<Vec<String>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(SERVICE_SELECTION_TYPE) {
vec.push(avp.encode_string()?)
}
Ok(vec)
}
pub const PMIP6_HOME_LMA_I_PV_6_ADDRESS_TYPE: AVPType = 147;
pub fn delete_pmip6_home_lma_i_pv_6_address(packet: &mut Packet) {
packet.delete(PMIP6_HOME_LMA_I_PV_6_ADDRESS_TYPE);
}
pub fn add_pmip6_home_lma_i_pv_6_address(packet: &mut Packet, value: &Ipv6Addr) {
packet.add(AVP::from_ipv6(PMIP6_HOME_LMA_I_PV_6_ADDRESS_TYPE, value));
}
pub fn lookup_pmip6_home_lma_i_pv_6_address(packet: &Packet) -> Option<Result<Ipv6Addr, AVPError>> {
packet
.lookup(PMIP6_HOME_LMA_I_PV_6_ADDRESS_TYPE)
.map(|v| v.encode_ipv6())
}
pub fn lookup_all_pmip6_home_lma_i_pv_6_address(
packet: &Packet,
) -> Result<Vec<Ipv6Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_HOME_LMA_I_PV_6_ADDRESS_TYPE) {
vec.push(avp.encode_ipv6()?)
}
Ok(vec)
}
pub const PMIP6_VISITED_LMA_I_PV_6_ADDRESS_TYPE: AVPType = 148;
pub fn delete_pmip6_visited_lma_i_pv_6_address(packet: &mut Packet) {
packet.delete(PMIP6_VISITED_LMA_I_PV_6_ADDRESS_TYPE);
}
pub fn add_pmip6_visited_lma_i_pv_6_address(packet: &mut Packet, value: &Ipv6Addr) {
packet.add(AVP::from_ipv6(PMIP6_VISITED_LMA_I_PV_6_ADDRESS_TYPE, value));
}
pub fn lookup_pmip6_visited_lma_i_pv_6_address(
packet: &Packet,
) -> Option<Result<Ipv6Addr, AVPError>> {
packet
.lookup(PMIP6_VISITED_LMA_I_PV_6_ADDRESS_TYPE)
.map(|v| v.encode_ipv6())
}
pub fn lookup_all_pmip6_visited_lma_i_pv_6_address(
packet: &Packet,
) -> Result<Vec<Ipv6Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_VISITED_LMA_I_PV_6_ADDRESS_TYPE) {
vec.push(avp.encode_ipv6()?)
}
Ok(vec)
}
pub const PMIP6_HOME_LMA_I_PV_4_ADDRESS_TYPE: AVPType = 149;
pub fn delete_pmip6_home_lma_i_pv_4_address(packet: &mut Packet) {
packet.delete(PMIP6_HOME_LMA_I_PV_4_ADDRESS_TYPE);
}
pub fn add_pmip6_home_lma_i_pv_4_address(packet: &mut Packet, value: &Ipv4Addr) {
packet.add(AVP::from_ipv4(PMIP6_HOME_LMA_I_PV_4_ADDRESS_TYPE, value));
}
pub fn lookup_pmip6_home_lma_i_pv_4_address(packet: &Packet) -> Option<Result<Ipv4Addr, AVPError>> {
packet
.lookup(PMIP6_HOME_LMA_I_PV_4_ADDRESS_TYPE)
.map(|v| v.encode_ipv4())
}
pub fn lookup_all_pmip6_home_lma_i_pv_4_address(
packet: &Packet,
) -> Result<Vec<Ipv4Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_HOME_LMA_I_PV_4_ADDRESS_TYPE) {
vec.push(avp.encode_ipv4()?)
}
Ok(vec)
}
pub const PMIP6_VISITED_LMA_I_PV_4_ADDRESS_TYPE: AVPType = 150;
pub fn delete_pmip6_visited_lma_i_pv_4_address(packet: &mut Packet) {
packet.delete(PMIP6_VISITED_LMA_I_PV_4_ADDRESS_TYPE);
}
pub fn add_pmip6_visited_lma_i_pv_4_address(packet: &mut Packet, value: &Ipv4Addr) {
packet.add(AVP::from_ipv4(PMIP6_VISITED_LMA_I_PV_4_ADDRESS_TYPE, value));
}
pub fn lookup_pmip6_visited_lma_i_pv_4_address(
packet: &Packet,
) -> Option<Result<Ipv4Addr, AVPError>> {
packet
.lookup(PMIP6_VISITED_LMA_I_PV_4_ADDRESS_TYPE)
.map(|v| v.encode_ipv4())
}
pub fn lookup_all_pmip6_visited_lma_i_pv_4_address(
packet: &Packet,
) -> Result<Vec<Ipv4Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_VISITED_LMA_I_PV_4_ADDRESS_TYPE) {
vec.push(avp.encode_ipv4()?)
}
Ok(vec)
}
pub const PMIP6_HOME_HN_PREFIX_TYPE: AVPType = 151;
pub fn delete_pmip6_home_hn_prefix(packet: &mut Packet) {
packet.delete(PMIP6_HOME_HN_PREFIX_TYPE);
}
pub fn add_pmip6_home_hn_prefix(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {
packet.add(AVP::from_ipv6_prefix(PMIP6_HOME_HN_PREFIX_TYPE, value)?);
Ok(())
}
pub fn lookup_pmip6_home_hn_prefix(packet: &Packet) -> Option<Result<Vec<u8>, AVPError>> {
packet
.lookup(PMIP6_HOME_HN_PREFIX_TYPE)
.map(|v| v.encode_ipv6_prefix())
}
pub fn lookup_all_pmip6_home_hn_prefix(packet: &Packet) -> Result<Vec<Vec<u8>>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_HOME_HN_PREFIX_TYPE) {
vec.push(avp.encode_ipv6_prefix()?)
}
Ok(vec)
}
pub const PMIP6_VISITED_HN_PREFIX_TYPE: AVPType = 152;
pub fn delete_pmip6_visited_hn_prefix(packet: &mut Packet) {
packet.delete(PMIP6_VISITED_HN_PREFIX_TYPE);
}
pub fn add_pmip6_visited_hn_prefix(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {
packet.add(AVP::from_ipv6_prefix(PMIP6_VISITED_HN_PREFIX_TYPE, value)?);
Ok(())
}
pub fn lookup_pmip6_visited_hn_prefix(packet: &Packet) -> Option<Result<Vec<u8>, AVPError>> {
packet
.lookup(PMIP6_VISITED_HN_PREFIX_TYPE)
.map(|v| v.encode_ipv6_prefix())
}
pub fn lookup_all_pmip6_visited_hn_prefix(packet: &Packet) -> Result<Vec<Vec<u8>>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_VISITED_HN_PREFIX_TYPE) {
vec.push(avp.encode_ipv6_prefix()?)
}
Ok(vec)
}
pub const PMIP6_HOME_INTERFACE_ID_TYPE: AVPType = 153;
pub fn delete_pmip6_home_interface_id(packet: &mut Packet) {
packet.delete(PMIP6_HOME_INTERFACE_ID_TYPE);
}
pub fn add_pmip6_home_interface_id(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {
if value.len() != 8 {
return Err(AVPError::InvalidAttributeLengthError(8));
}
packet.add(AVP::from_bytes(PMIP6_HOME_INTERFACE_ID_TYPE, value));
Ok(())
}
pub fn lookup_pmip6_home_interface_id(packet: &Packet) -> Option<Vec<u8>> {
packet
.lookup(PMIP6_HOME_INTERFACE_ID_TYPE)
.map(|v| v.encode_bytes())
}
pub fn lookup_all_pmip6_home_interface_id(packet: &Packet) -> Vec<Vec<u8>> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_HOME_INTERFACE_ID_TYPE) {
vec.push(avp.encode_bytes())
}
vec
}
pub const PMIP6_VISITED_INTERFACE_ID_TYPE: AVPType = 154;
pub fn delete_pmip6_visited_interface_id(packet: &mut Packet) {
packet.delete(PMIP6_VISITED_INTERFACE_ID_TYPE);
}
pub fn add_pmip6_visited_interface_id(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {
if value.len() != 8 {
return Err(AVPError::InvalidAttributeLengthError(8));
}
packet.add(AVP::from_bytes(PMIP6_VISITED_INTERFACE_ID_TYPE, value));
Ok(())
}
pub fn lookup_pmip6_visited_interface_id(packet: &Packet) -> Option<Vec<u8>> {
packet
.lookup(PMIP6_VISITED_INTERFACE_ID_TYPE)
.map(|v| v.encode_bytes())
}
pub fn lookup_all_pmip6_visited_interface_id(packet: &Packet) -> Vec<Vec<u8>> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_VISITED_INTERFACE_ID_TYPE) {
vec.push(avp.encode_bytes())
}
vec
}
pub const PMIP6_HOME_I_PV_4_HO_A_TYPE: AVPType = 155;
pub fn delete_pmip6_home_i_pv_4_ho_a(packet: &mut Packet) {
packet.delete(PMIP6_HOME_I_PV_4_HO_A_TYPE);
}
pub fn add_pmip6_home_i_pv_4_ho_a(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {
packet.add(AVP::from_ipv4_prefix(PMIP6_HOME_I_PV_4_HO_A_TYPE, value)?);
Ok(())
}
pub fn lookup_pmip6_home_i_pv_4_ho_a(packet: &Packet) -> Option<Result<Vec<u8>, AVPError>> {
packet
.lookup(PMIP6_HOME_I_PV_4_HO_A_TYPE)
.map(|v| v.encode_ipv4_prefix())
}
pub fn lookup_all_pmip6_home_i_pv_4_ho_a(packet: &Packet) -> Result<Vec<Vec<u8>>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_HOME_I_PV_4_HO_A_TYPE) {
vec.push(avp.encode_ipv4_prefix()?)
}
Ok(vec)
}
pub const PMIP6_VISITED_I_PV_4_HO_A_TYPE: AVPType = 156;
pub fn delete_pmip6_visited_i_pv_4_ho_a(packet: &mut Packet) {
packet.delete(PMIP6_VISITED_I_PV_4_HO_A_TYPE);
}
pub fn add_pmip6_visited_i_pv_4_ho_a(packet: &mut Packet, value: &[u8]) -> Result<(), AVPError> {
packet.add(AVP::from_ipv4_prefix(
PMIP6_VISITED_I_PV_4_HO_A_TYPE,
value,
)?);
Ok(())
}
pub fn lookup_pmip6_visited_i_pv_4_ho_a(packet: &Packet) -> Option<Result<Vec<u8>, AVPError>> {
packet
.lookup(PMIP6_VISITED_I_PV_4_HO_A_TYPE)
.map(|v| v.encode_ipv4_prefix())
}
pub fn lookup_all_pmip6_visited_i_pv_4_ho_a(packet: &Packet) -> Result<Vec<Vec<u8>>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_VISITED_I_PV_4_HO_A_TYPE) {
vec.push(avp.encode_ipv4_prefix()?)
}
Ok(vec)
}
pub const PMIP6_HOME_DHCP4_SERVER_ADDRESS_TYPE: AVPType = 157;
pub fn delete_pmip6_home_dhcp4_server_address(packet: &mut Packet) {
packet.delete(PMIP6_HOME_DHCP4_SERVER_ADDRESS_TYPE);
}
pub fn add_pmip6_home_dhcp4_server_address(packet: &mut Packet, value: &Ipv4Addr) {
packet.add(AVP::from_ipv4(PMIP6_HOME_DHCP4_SERVER_ADDRESS_TYPE, value));
}
pub fn lookup_pmip6_home_dhcp4_server_address(
packet: &Packet,
) -> Option<Result<Ipv4Addr, AVPError>> {
packet
.lookup(PMIP6_HOME_DHCP4_SERVER_ADDRESS_TYPE)
.map(|v| v.encode_ipv4())
}
pub fn lookup_all_pmip6_home_dhcp4_server_address(
packet: &Packet,
) -> Result<Vec<Ipv4Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_HOME_DHCP4_SERVER_ADDRESS_TYPE) {
vec.push(avp.encode_ipv4()?)
}
Ok(vec)
}
pub const PMIP6_VISITED_DHCP4_SERVER_ADDRESS_TYPE: AVPType = 158;
pub fn delete_pmip6_visited_dhcp4_server_address(packet: &mut Packet) {
packet.delete(PMIP6_VISITED_DHCP4_SERVER_ADDRESS_TYPE);
}
pub fn add_pmip6_visited_dhcp4_server_address(packet: &mut Packet, value: &Ipv4Addr) {
packet.add(AVP::from_ipv4(
PMIP6_VISITED_DHCP4_SERVER_ADDRESS_TYPE,
value,
));
}
pub fn lookup_pmip6_visited_dhcp4_server_address(
packet: &Packet,
) -> Option<Result<Ipv4Addr, AVPError>> {
packet
.lookup(PMIP6_VISITED_DHCP4_SERVER_ADDRESS_TYPE)
.map(|v| v.encode_ipv4())
}
pub fn lookup_all_pmip6_visited_dhcp4_server_address(
packet: &Packet,
) -> Result<Vec<Ipv4Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_VISITED_DHCP4_SERVER_ADDRESS_TYPE) {
vec.push(avp.encode_ipv4()?)
}
Ok(vec)
}
pub const PMIP6_HOME_DHCP6_SERVER_ADDRESS_TYPE: AVPType = 159;
pub fn delete_pmip6_home_dhcp6_server_address(packet: &mut Packet) {
packet.delete(PMIP6_HOME_DHCP6_SERVER_ADDRESS_TYPE);
}
pub fn add_pmip6_home_dhcp6_server_address(packet: &mut Packet, value: &Ipv6Addr) {
packet.add(AVP::from_ipv6(PMIP6_HOME_DHCP6_SERVER_ADDRESS_TYPE, value));
}
pub fn lookup_pmip6_home_dhcp6_server_address(
packet: &Packet,
) -> Option<Result<Ipv6Addr, AVPError>> {
packet
.lookup(PMIP6_HOME_DHCP6_SERVER_ADDRESS_TYPE)
.map(|v| v.encode_ipv6())
}
pub fn lookup_all_pmip6_home_dhcp6_server_address(
packet: &Packet,
) -> Result<Vec<Ipv6Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_HOME_DHCP6_SERVER_ADDRESS_TYPE) {
vec.push(avp.encode_ipv6()?)
}
Ok(vec)
}
pub const PMIP6_VISITED_DHCP6_SERVER_ADDRESS_TYPE: AVPType = 160;
pub fn delete_pmip6_visited_dhcp6_server_address(packet: &mut Packet) {
packet.delete(PMIP6_VISITED_DHCP6_SERVER_ADDRESS_TYPE);
}
pub fn add_pmip6_visited_dhcp6_server_address(packet: &mut Packet, value: &Ipv6Addr) {
packet.add(AVP::from_ipv6(
PMIP6_VISITED_DHCP6_SERVER_ADDRESS_TYPE,
value,
));
}
pub fn lookup_pmip6_visited_dhcp6_server_address(
packet: &Packet,
) -> Option<Result<Ipv6Addr, AVPError>> {
packet
.lookup(PMIP6_VISITED_DHCP6_SERVER_ADDRESS_TYPE)
.map(|v| v.encode_ipv6())
}
pub fn lookup_all_pmip6_visited_dhcp6_server_address(
packet: &Packet,
) -> Result<Vec<Ipv6Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_VISITED_DHCP6_SERVER_ADDRESS_TYPE) {
vec.push(avp.encode_ipv6()?)
}
Ok(vec)
}
pub const PMIP6_HOME_I_PV_4_GATEWAY_TYPE: AVPType = 161;
pub fn delete_pmip6_home_i_pv_4_gateway(packet: &mut Packet) {
packet.delete(PMIP6_HOME_I_PV_4_GATEWAY_TYPE);
}
pub fn add_pmip6_home_i_pv_4_gateway(packet: &mut Packet, value: &Ipv4Addr) {
packet.add(AVP::from_ipv4(PMIP6_HOME_I_PV_4_GATEWAY_TYPE, value));
}
pub fn lookup_pmip6_home_i_pv_4_gateway(packet: &Packet) -> Option<Result<Ipv4Addr, AVPError>> {
packet
.lookup(PMIP6_HOME_I_PV_4_GATEWAY_TYPE)
.map(|v| v.encode_ipv4())
}
pub fn lookup_all_pmip6_home_i_pv_4_gateway(packet: &Packet) -> Result<Vec<Ipv4Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_HOME_I_PV_4_GATEWAY_TYPE) {
vec.push(avp.encode_ipv4()?)
}
Ok(vec)
}
pub const PMIP6_VISITED_I_PV_4_GATEWAY_TYPE: AVPType = 162;
pub fn delete_pmip6_visited_i_pv_4_gateway(packet: &mut Packet) {
packet.delete(PMIP6_VISITED_I_PV_4_GATEWAY_TYPE);
}
pub fn add_pmip6_visited_i_pv_4_gateway(packet: &mut Packet, value: &Ipv4Addr) {
packet.add(AVP::from_ipv4(PMIP6_VISITED_I_PV_4_GATEWAY_TYPE, value));
}
pub fn lookup_pmip6_visited_i_pv_4_gateway(packet: &Packet) -> Option<Result<Ipv4Addr, AVPError>> {
packet
.lookup(PMIP6_VISITED_I_PV_4_GATEWAY_TYPE)
.map(|v| v.encode_ipv4())
}
pub fn lookup_all_pmip6_visited_i_pv_4_gateway(packet: &Packet) -> Result<Vec<Ipv4Addr>, AVPError> {
let mut vec = Vec::new();
for avp in packet.lookup_all(PMIP6_VISITED_I_PV_4_GATEWAY_TYPE) {
vec.push(avp.encode_ipv4()?)
}
Ok(vec)
}