Add severity level to IPR response and downgrade filter check failed (#4447)

* Add info level to response from ipr

* Downgrade exit policy filter check failed to warning

* Bump ipr request response version
This commit is contained in:
Jon Häggblad
2024-03-08 15:21:41 +01:00
committed by GitHub
parent fa8e81d9dd
commit 0e56d8c2f7
3 changed files with 32 additions and 15 deletions
+2 -1
View File
@@ -8,7 +8,8 @@ pub mod response;
// version 3: initial version
// version 4: IPv6 support
pub const CURRENT_VERSION: u8 = 4;
// version 5: Add severity level to info response
pub const CURRENT_VERSION: u8 = 5;
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct IpPair {
+25 -11
View File
@@ -116,24 +116,30 @@ impl IpPacketResponse {
) -> Self {
Self {
version: CURRENT_VERSION,
data: IpPacketResponseData::Error(ErrorResponse {
data: IpPacketResponseData::Info(InfoResponse {
request_id,
reply_to,
reply: ErrorResponseReply::VersionMismatch {
reply: InfoResponseReply::VersionMismatch {
request_version,
response_version: our_version,
},
level: InfoLevel::Error,
}),
}
}
pub fn new_data_error_response(reply_to: Recipient, reply: ErrorResponseReply) -> Self {
pub fn new_data_info_response(
reply_to: Recipient,
reply: InfoResponseReply,
level: InfoLevel,
) -> Self {
Self {
version: CURRENT_VERSION,
data: IpPacketResponseData::Error(ErrorResponse {
data: IpPacketResponseData::Info(InfoResponse {
request_id: 0,
reply_to,
reply,
level,
}),
}
}
@@ -147,7 +153,7 @@ impl IpPacketResponse {
IpPacketResponseData::Data(_) => None,
IpPacketResponseData::Pong(response) => Some(response.request_id),
IpPacketResponseData::Health(response) => Some(response.request_id),
IpPacketResponseData::Error(response) => Some(response.request_id),
IpPacketResponseData::Info(response) => Some(response.request_id),
}
}
@@ -160,7 +166,7 @@ impl IpPacketResponse {
IpPacketResponseData::Data(_) => None,
IpPacketResponseData::Pong(response) => Some(&response.reply_to),
IpPacketResponseData::Health(response) => Some(&response.reply_to),
IpPacketResponseData::Error(response) => Some(&response.reply_to),
IpPacketResponseData::Info(response) => Some(&response.reply_to),
}
}
@@ -201,8 +207,8 @@ pub enum IpPacketResponseData {
// Response for a health request
Health(HealthResponse),
// Error response
Error(ErrorResponse),
// Info response. This can be anything from informative messages to errors
Info(InfoResponse),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
@@ -338,14 +344,15 @@ pub struct HealthResponseReply {
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ErrorResponse {
pub struct InfoResponse {
pub request_id: u64,
pub reply_to: Recipient,
pub reply: ErrorResponseReply,
pub reply: InfoResponseReply,
pub level: InfoLevel,
}
#[derive(Clone, Debug, Serialize, Deserialize, thiserror::Error)]
pub enum ErrorResponseReply {
pub enum InfoResponseReply {
#[error("{msg}")]
Generic { msg: String },
#[error(
@@ -358,3 +365,10 @@ pub enum ErrorResponseReply {
#[error("destination failed exit policy filter check: {dst}")]
ExitPolicyFilterCheckFailed { dst: String },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum InfoLevel {
Info,
Warn,
Error,
}
@@ -4,11 +4,12 @@ use std::{collections::HashMap, net::SocketAddr};
use bytes::{Bytes, BytesMut};
use futures::StreamExt;
use nym_ip_packet_requests::response::InfoLevel;
use nym_ip_packet_requests::{
codec::MultiIpPacketCodec,
request::{IpPacketRequest, IpPacketRequestData},
response::{
DynamicConnectFailureReason, ErrorResponseReply, IpPacketResponse,
DynamicConnectFailureReason, InfoResponseReply, IpPacketResponse,
StaticConnectFailureReason,
},
IpPair,
@@ -480,11 +481,12 @@ impl MixnetListener {
Ok(None)
} else {
log::info!("Denied filter check: {dst}");
Ok(Some(IpPacketResponse::new_data_error_response(
Ok(Some(IpPacketResponse::new_data_info_response(
connected_client.nym_address,
ErrorResponseReply::ExitPolicyFilterCheckFailed {
InfoResponseReply::ExitPolicyFilterCheckFailed {
dst: dst.to_string(),
},
InfoLevel::Warn,
)))
}
} else {