Line data Source code
1 : // Copyright 2024 Accenture.
2 :
3 : #include "uds/base/DiagJobRoot.h"
4 :
5 : #include "transport/TransportConfiguration.h"
6 : #include "uds/UdsConstants.h"
7 : #include "uds/authentication/DefaultDiagAuthenticator.h"
8 : #include "uds/authentication/IDiagAuthenticator.h"
9 : #include "uds/connection/IncomingDiagConnection.h"
10 : #include "uds/session/IDiagSessionManager.h"
11 :
12 : namespace uds
13 : {
14 : using ::transport::TransportConfiguration;
15 :
16 154 : DiagJobRoot::DiagJobRoot() : AbstractDiagJob(nullptr, 0U, 0U)
17 : {
18 154 : fDefaultDiagReturnCode = DiagReturnCode::ISO_SERVICE_NOT_SUPPORTED;
19 154 : sfpDiagJobRoot = this;
20 154 : }
21 :
22 159 : DiagJobRoot::~DiagJobRoot() { sfpDiagJobRoot = nullptr; }
23 :
24 12 : DiagReturnCode::Type DiagJobRoot::verify(uint8_t const* const request, uint16_t const requestLength)
25 : {
26 12 : if ((request == nullptr) || (requestLength < 1U))
27 : { // no empty requests!
28 3 : return DiagReturnCode::ISO_GENERAL_REJECT;
29 : }
30 9 : return DiagReturnCode::OK;
31 : }
32 :
33 9 : DiagReturnCode::Type DiagJobRoot::execute(
34 : IncomingDiagConnection& connection, uint8_t const* const request, uint16_t const requestLength)
35 : {
36 9 : if (connection.serviceId == 0x7FU) // no response to incoming NRC
37 : {
38 0 : connection.terminate();
39 0 : return DiagReturnCode::OK;
40 : }
41 9 : if (TransportConfiguration::isFunctionalAddress(connection.targetAddress))
42 : {
43 5 : if (connection.serviceId == uds::ServiceId::TESTER_PRESENT)
44 : {
45 7 : if ((!getDiagSessionManager().isSessionTimeoutActive()) && (requestLength > 1U)
46 7 : && (((request[1] & SUPPRESS_POSITIVE_RESPONSE_MASK)) > 0U))
47 : {
48 1 : connection.terminate();
49 1 : return DiagReturnCode::OK;
50 : }
51 : }
52 : }
53 8 : DiagReturnCode::Type const ret = verify(request, requestLength);
54 8 : if (ret != DiagReturnCode::OK)
55 : {
56 0 : (void)getDiagSessionManager().acceptedJob(connection, *this, request, requestLength);
57 0 : return ret;
58 : }
59 8 : if (!fAllowedSessions.match(getSession()))
60 : {
61 0 : acceptJob(connection, request, requestLength);
62 0 : return DiagReturnCode::ISO_REQUEST_OUT_OF_RANGE;
63 : }
64 8 : return process(connection, request, requestLength);
65 : }
66 :
67 : DiagReturnCode::Type
68 59 : DiagJobRoot::verifySupplierIndication(uint8_t const* const request, uint16_t const requestLength)
69 : {
70 : (void)request;
71 : (void)requestLength;
72 59 : return DiagReturnCode::OK;
73 : }
74 :
75 : } // namespace uds
|