libdoip  0.1.0
DoIP (Diagnostics over Internet Protocol) ISO 13400 C++17 Library
UdsMock.cpp
Go to the documentation of this file.
1 #include "uds/UdsMock.h"
2 #include "DoIPMessage.h"
3 
4 namespace doip::uds {
5 
7  if (request.empty())
8  return {};
9  uint8_t sid = request[0];
10  UdsService service = static_cast<UdsService>(sid);
11 
12  const UdsServiceDescriptor *desc = findServiceDescriptor(service);
13  if (!desc) {
14  return makeResponse(request, UdsResponseCode::ServiceNotSupported, {});
15  }
16 
17  if (request.size() < desc->minReqLength || request.size() > desc->maxReqLength) {
18  std::cerr << "UdsMock: Request length " << request.size()
19  << " out of bounds for service 0x" << std::hex << static_cast<int>(service) << std::dec
20  << " (expected " << desc->minReqLength << "-" << desc->maxReqLength << ")\n";
21  return makeResponse(request, UdsResponseCode::IncorrectMessageLengthOrInvalidFormat);
22  }
23 
25  auto it = m_handlers.find(sid);
26  if (it != m_handlers.end() && it->second) {
27  resp = it->second->handle(request);
28  } else {
29  return makeResponse(request, UdsResponseCode::ServiceNotSupported);
30  }
31 
32  auto rspSize = resp.second.size() + 1; // +1 for the SID
33  if (rspSize < desc->minRspLength || rspSize > desc->maxRspLength) {
34  std::cerr << "UdsMock: Response length " << resp.second.size()
35  << " out of bounds for service 0x" << std::hex << static_cast<int>(service) << std::dec
36  << " (expected " << desc->minRspLength << "-" << desc->maxRspLength << ")\n";
37  return makeResponse(request, UdsResponseCode::GeneralProgrammingFailure, {});
38  }
39 
40  return makeResponse(request, resp.first, resp.second);
41 }
42 
43 void UdsMock::registerDiagnosticSessionControlHandler(std::function<UdsResponse(uint8_t)> handler) {
44  registerService(UdsService::DiagnosticSessionControl, [handler = std::move(handler)](const ByteArray &req) -> UdsResponse {
45  uint8_t sessionType = req[1];
46  return handler(sessionType);
47  });
48 }
49 
50 void UdsMock::registerECUResetHandler(std::function<UdsResponse(uint8_t)> handler) {
51  registerService(UdsService::ECUReset, [handler = std::move(handler)](const ByteArray &req) -> UdsResponse {
52  uint8_t resetType = req[1];
53  return handler(resetType);
54  });
55 }
56 
57 void UdsMock::registerReadDataByIdentifierHandler(std::function<UdsResponse(uint16_t)> handler) {
58  registerService(UdsService::ReadDataByIdentifier, [handler = std::move(handler)](const ByteArray &req) -> UdsResponse {
59  uint16_t did = (static_cast<uint16_t>(req[1]) << 8) | req[2];
60  return handler(did);
61  });
62 }
63 
64 void UdsMock::registerWriteDataByIdentifierHandler(std::function<UdsResponse(uint16_t, ByteArray)> handler) {
65  registerService(UdsService::WriteDataByIdentifier, [handler = std::move(handler)](const ByteArray &req) -> UdsResponse {
66  uint16_t did = (static_cast<uint16_t>(req[1]) << 8) | req[2];
67  return handler(did, ByteArray(req.data() + 3, req.size() - 3));
68  });
69 }
70 
71 void UdsMock::registerTesterPresentHandler(std::function<UdsResponse(uint8_t)> handler) {
72  registerService(UdsService::TesterPresent, [handler = std::move(handler)](const ByteArray &req) -> UdsResponse {
73  uint8_t subFunction = req[1];
74  return handler(subFunction);
75  });
76 }
77 
78 } // namespace doip::uds
void registerDiagnosticSessionControlHandler(std::function< UdsResponse(uint8_t sessionType)> handler)
Definition: UdsMock.cpp:43
void registerReadDataByIdentifierHandler(std::function< UdsResponse(uint16_t did)> handler)
Definition: UdsMock.cpp:57
void registerWriteDataByIdentifierHandler(std::function< UdsResponse(uint16_t did, ByteArray value)> handler)
Definition: UdsMock.cpp:64
void registerService(UdsService serviceId, IUdsServiceHandlerPtr handler)
Definition: UdsMock.h:26
void registerECUResetHandler(std::function< UdsResponse(uint8_t resetType)> handler)
Definition: UdsMock.cpp:50
void registerTesterPresentHandler(std::function< UdsResponse(uint8_t subFunction)> handler)
Definition: UdsMock.cpp:71
ByteArray handleDiagnosticRequest(const ByteArray &request) const
Definition: UdsMock.cpp:6
const UdsServiceDescriptor * findServiceDescriptor(UdsService sid)
Find service descriptor by service ID.
Definition: UdsServices.h:73
std::pair< UdsResponseCode, ByteArray > UdsResponse
A dynamic array of bytes with utility methods for network protocol handling.
Definition: ByteArray.h:60