From a12f52f32dcdbeda0302bd4377a48ad49d518a3d Mon Sep 17 00:00:00 2001 From: Matt Beisser Date: Mon, 15 Dec 2025 16:12:06 -0500 Subject: [PATCH 1/3] Add not implemented error for diagnostic definition request & response --- src/error.rs | 2 ++ src/request.rs | 64 ++++++++++++++++++++++++++++++++++++------------- src/response.rs | 56 ++++++++++++++++++++++++++++++++----------- 3 files changed, 92 insertions(+), 30 deletions(-) diff --git a/src/error.rs b/src/error.rs index fe69c1f..ae95000 100644 --- a/src/error.rs +++ b/src/error.rs @@ -40,4 +40,6 @@ pub enum Error { InvalidDtcFormatIdentifier(u8), #[error("Reserved for legislative use: {0} ({1})")] ReservedForLegislativeUse(String, u8), + #[error("UDS service not implemented: {0:?}")] + ServiceNotImplemented(crate::UdsServiceType), } diff --git a/src/request.rs b/src/request.rs index 1e632a4..58ad704 100644 --- a/src/request.rs +++ b/src/request.rs @@ -309,22 +309,54 @@ impl WireFormat for Request { UdsServiceType::WriteDataByIdentifier => Self::WriteDataByIdentifier( WriteDataByIdentifierRequest::decode_single_value(reader)?, ), - UdsServiceType::Authentication => todo!(), - UdsServiceType::AccessTimingParameters => todo!(), - UdsServiceType::SecuredDataTransmission => todo!(), - UdsServiceType::ResponseOnEvent => todo!(), - UdsServiceType::LinkControl => todo!(), - UdsServiceType::ReadMemoryByAddress => todo!(), - UdsServiceType::ReadScalingDataByIdentifier => todo!(), - UdsServiceType::ReadDataByIdentifierPeriodic => todo!(), - UdsServiceType::DynamicallyDefinedDataIdentifier => todo!(), - UdsServiceType::WriteMemoryByAddress => todo!(), - UdsServiceType::ClearDiagnosticInfo => todo!(), - UdsServiceType::InputOutputControlByIdentifier => todo!(), - UdsServiceType::RequestUpload => todo!(), - UdsServiceType::RequestFileTransfer => todo!(), - UdsServiceType::NegativeResponse => todo!(), - UdsServiceType::UnsupportedDiagnosticService => todo!(), + UdsServiceType::Authentication => { + return Err(Error::ServiceNotImplemented(UdsServiceType::Authentication)); + } + UdsServiceType::AccessTimingParameters => { + return Err(Error::ServiceNotImplemented(UdsServiceType::AccessTimingParameters)); + } + UdsServiceType::SecuredDataTransmission => { + return Err(Error::ServiceNotImplemented(UdsServiceType::SecuredDataTransmission)); + } + UdsServiceType::ResponseOnEvent => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ResponseOnEvent)); + } + UdsServiceType::LinkControl => { + return Err(Error::ServiceNotImplemented(UdsServiceType::LinkControl)); + } + UdsServiceType::ReadMemoryByAddress => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ReadMemoryByAddress)); + } + UdsServiceType::ReadScalingDataByIdentifier => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ReadScalingDataByIdentifier)); + } + UdsServiceType::ReadDataByIdentifierPeriodic => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ReadDataByIdentifierPeriodic)); + } + UdsServiceType::DynamicallyDefinedDataIdentifier => { + return Err(Error::ServiceNotImplemented(UdsServiceType::DynamicallyDefinedDataIdentifier)); + } + UdsServiceType::WriteMemoryByAddress => { + return Err(Error::ServiceNotImplemented(UdsServiceType::WriteMemoryByAddress)); + } + UdsServiceType::ClearDiagnosticInfo => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ClearDiagnosticInfo)); + } + UdsServiceType::InputOutputControlByIdentifier => { + return Err(Error::ServiceNotImplemented(UdsServiceType::InputOutputControlByIdentifier)); + } + UdsServiceType::RequestUpload => { + return Err(Error::ServiceNotImplemented(UdsServiceType::RequestUpload)); + } + UdsServiceType::RequestFileTransfer => { + return Err(Error::ServiceNotImplemented(UdsServiceType::RequestFileTransfer)); + } + UdsServiceType::NegativeResponse => { + return Err(Error::ServiceNotImplemented(UdsServiceType::NegativeResponse)); + } + UdsServiceType::UnsupportedDiagnosticService => { + return Err(Error::ServiceNotImplemented(UdsServiceType::UnsupportedDiagnosticService)); + } })) } diff --git a/src/response.rs b/src/response.rs index 1c7402f..bcd281f 100644 --- a/src/response.rs +++ b/src/response.rs @@ -203,23 +203,51 @@ impl WireFormat for Response { UdsServiceType::WriteDataByIdentifier => Self::WriteDataByIdentifier( WriteDataByIdentifierResponse::decode_single_value(reader)?, ), - UdsServiceType::Authentication => todo!(), - UdsServiceType::AccessTimingParameters => todo!(), - UdsServiceType::SecuredDataTransmission => todo!(), - UdsServiceType::ResponseOnEvent => todo!(), - UdsServiceType::LinkControl => todo!(), - UdsServiceType::ReadMemoryByAddress => todo!(), - UdsServiceType::ReadScalingDataByIdentifier => todo!(), - UdsServiceType::ReadDataByIdentifierPeriodic => todo!(), - UdsServiceType::DynamicallyDefinedDataIdentifier => todo!(), - UdsServiceType::WriteMemoryByAddress => todo!(), - UdsServiceType::ClearDiagnosticInfo => todo!(), - UdsServiceType::InputOutputControlByIdentifier => todo!(), - UdsServiceType::RequestUpload => todo!(), + UdsServiceType::Authentication => { + return Err(Error::ServiceNotImplemented(UdsServiceType::Authentication)); + } + UdsServiceType::AccessTimingParameters => { + return Err(Error::ServiceNotImplemented(UdsServiceType::AccessTimingParameters)); + } + UdsServiceType::SecuredDataTransmission => { + return Err(Error::ServiceNotImplemented(UdsServiceType::SecuredDataTransmission)); + } + UdsServiceType::ResponseOnEvent => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ResponseOnEvent)); + } + UdsServiceType::LinkControl => { + return Err(Error::ServiceNotImplemented(UdsServiceType::LinkControl)); + } + UdsServiceType::ReadMemoryByAddress => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ReadMemoryByAddress)); + } + UdsServiceType::ReadScalingDataByIdentifier => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ReadScalingDataByIdentifier)); + } + UdsServiceType::ReadDataByIdentifierPeriodic => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ReadDataByIdentifierPeriodic)); + } + UdsServiceType::DynamicallyDefinedDataIdentifier => { + return Err(Error::ServiceNotImplemented(UdsServiceType::DynamicallyDefinedDataIdentifier)); + } + UdsServiceType::WriteMemoryByAddress => { + return Err(Error::ServiceNotImplemented(UdsServiceType::WriteMemoryByAddress)); + } + UdsServiceType::ClearDiagnosticInfo => { + return Err(Error::ServiceNotImplemented(UdsServiceType::ClearDiagnosticInfo)); + } + UdsServiceType::InputOutputControlByIdentifier => { + return Err(Error::ServiceNotImplemented(UdsServiceType::InputOutputControlByIdentifier)); + } + UdsServiceType::RequestUpload => { + return Err(Error::ServiceNotImplemented(UdsServiceType::RequestUpload)); + } UdsServiceType::TransferData => { Self::TransferData(TransferDataResponse::decode_single_value(reader)?) } - UdsServiceType::UnsupportedDiagnosticService => todo!(), + UdsServiceType::UnsupportedDiagnosticService => { + return Err(Error::ServiceNotImplemented(UdsServiceType::UnsupportedDiagnosticService)); + } })) } From 7b3658b1410127ffabe43e8173431e2fbeef00a4 Mon Sep 17 00:00:00 2001 From: Matt Beisser Date: Mon, 15 Dec 2025 16:38:57 -0500 Subject: [PATCH 2/3] cargo fmt --- src/request.rs | 52 ++++++++++++++++++++++++++++++++++++------------- src/response.rs | 44 ++++++++++++++++++++++++++++++----------- 2 files changed, 72 insertions(+), 24 deletions(-) diff --git a/src/request.rs b/src/request.rs index 58ad704..5a18109 100644 --- a/src/request.rs +++ b/src/request.rs @@ -313,49 +313,75 @@ impl WireFormat for Request { return Err(Error::ServiceNotImplemented(UdsServiceType::Authentication)); } UdsServiceType::AccessTimingParameters => { - return Err(Error::ServiceNotImplemented(UdsServiceType::AccessTimingParameters)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::AccessTimingParameters, + )); } UdsServiceType::SecuredDataTransmission => { - return Err(Error::ServiceNotImplemented(UdsServiceType::SecuredDataTransmission)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::SecuredDataTransmission, + )); } UdsServiceType::ResponseOnEvent => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ResponseOnEvent)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ResponseOnEvent, + )); } UdsServiceType::LinkControl => { return Err(Error::ServiceNotImplemented(UdsServiceType::LinkControl)); } UdsServiceType::ReadMemoryByAddress => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ReadMemoryByAddress)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadMemoryByAddress, + )); } UdsServiceType::ReadScalingDataByIdentifier => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ReadScalingDataByIdentifier)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadScalingDataByIdentifier, + )); } UdsServiceType::ReadDataByIdentifierPeriodic => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ReadDataByIdentifierPeriodic)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadDataByIdentifierPeriodic, + )); } UdsServiceType::DynamicallyDefinedDataIdentifier => { - return Err(Error::ServiceNotImplemented(UdsServiceType::DynamicallyDefinedDataIdentifier)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::DynamicallyDefinedDataIdentifier, + )); } UdsServiceType::WriteMemoryByAddress => { - return Err(Error::ServiceNotImplemented(UdsServiceType::WriteMemoryByAddress)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::WriteMemoryByAddress, + )); } UdsServiceType::ClearDiagnosticInfo => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ClearDiagnosticInfo)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ClearDiagnosticInfo, + )); } UdsServiceType::InputOutputControlByIdentifier => { - return Err(Error::ServiceNotImplemented(UdsServiceType::InputOutputControlByIdentifier)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::InputOutputControlByIdentifier, + )); } UdsServiceType::RequestUpload => { return Err(Error::ServiceNotImplemented(UdsServiceType::RequestUpload)); } UdsServiceType::RequestFileTransfer => { - return Err(Error::ServiceNotImplemented(UdsServiceType::RequestFileTransfer)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::RequestFileTransfer, + )); } UdsServiceType::NegativeResponse => { - return Err(Error::ServiceNotImplemented(UdsServiceType::NegativeResponse)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::NegativeResponse, + )); } UdsServiceType::UnsupportedDiagnosticService => { - return Err(Error::ServiceNotImplemented(UdsServiceType::UnsupportedDiagnosticService)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::UnsupportedDiagnosticService, + )); } })) } diff --git a/src/response.rs b/src/response.rs index bcd281f..33bef81 100644 --- a/src/response.rs +++ b/src/response.rs @@ -207,37 +207,57 @@ impl WireFormat for Response { return Err(Error::ServiceNotImplemented(UdsServiceType::Authentication)); } UdsServiceType::AccessTimingParameters => { - return Err(Error::ServiceNotImplemented(UdsServiceType::AccessTimingParameters)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::AccessTimingParameters, + )); } UdsServiceType::SecuredDataTransmission => { - return Err(Error::ServiceNotImplemented(UdsServiceType::SecuredDataTransmission)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::SecuredDataTransmission, + )); } UdsServiceType::ResponseOnEvent => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ResponseOnEvent)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ResponseOnEvent, + )); } UdsServiceType::LinkControl => { return Err(Error::ServiceNotImplemented(UdsServiceType::LinkControl)); } UdsServiceType::ReadMemoryByAddress => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ReadMemoryByAddress)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadMemoryByAddress, + )); } UdsServiceType::ReadScalingDataByIdentifier => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ReadScalingDataByIdentifier)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadScalingDataByIdentifier, + )); } UdsServiceType::ReadDataByIdentifierPeriodic => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ReadDataByIdentifierPeriodic)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadDataByIdentifierPeriodic, + )); } UdsServiceType::DynamicallyDefinedDataIdentifier => { - return Err(Error::ServiceNotImplemented(UdsServiceType::DynamicallyDefinedDataIdentifier)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::DynamicallyDefinedDataIdentifier, + )); } UdsServiceType::WriteMemoryByAddress => { - return Err(Error::ServiceNotImplemented(UdsServiceType::WriteMemoryByAddress)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::WriteMemoryByAddress, + )); } UdsServiceType::ClearDiagnosticInfo => { - return Err(Error::ServiceNotImplemented(UdsServiceType::ClearDiagnosticInfo)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::ClearDiagnosticInfo, + )); } UdsServiceType::InputOutputControlByIdentifier => { - return Err(Error::ServiceNotImplemented(UdsServiceType::InputOutputControlByIdentifier)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::InputOutputControlByIdentifier, + )); } UdsServiceType::RequestUpload => { return Err(Error::ServiceNotImplemented(UdsServiceType::RequestUpload)); @@ -246,7 +266,9 @@ impl WireFormat for Response { Self::TransferData(TransferDataResponse::decode_single_value(reader)?) } UdsServiceType::UnsupportedDiagnosticService => { - return Err(Error::ServiceNotImplemented(UdsServiceType::UnsupportedDiagnosticService)); + return Err(Error::ServiceNotImplemented( + UdsServiceType::UnsupportedDiagnosticService, + )); } })) } From 8cb409b0d54c0a7c1345543cd237c32f5888e238 Mon Sep 17 00:00:00 2001 From: Matt Beisser Date: Mon, 15 Dec 2025 16:47:46 -0500 Subject: [PATCH 3/3] Add exception for clippy line count --- src/request.rs | 1 + src/response.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/request.rs b/src/request.rs index 5a18109..da6d9c3 100644 --- a/src/request.rs +++ b/src/request.rs @@ -269,6 +269,7 @@ impl WireFormat for Request { /// Some services allow for custom byte arrays at the end of the request /// It is important that only the request data is passed to this function /// or the deserialization could read unexpected data + #[allow(clippy::too_many_lines)] fn decode(reader: &mut R) -> Result, Error> { let service = UdsServiceType::service_from_request_byte(reader.read_u8()?); Ok(Some(match service { diff --git a/src/response.rs b/src/response.rs index 33bef81..fdeeca2 100644 --- a/src/response.rs +++ b/src/response.rs @@ -160,6 +160,7 @@ impl Response { } impl WireFormat for Response { + #[allow(clippy::too_many_lines)] fn decode(reader: &mut T) -> Result, Error> { let service = UdsServiceType::response_from_byte(reader.read_u8()?); Ok(Some(match service {