Line data Source code
1 : /********************************************************************************
2 : * Copyright (c) 2024 Accenture
3 : *
4 : * This program and the accompanying materials are made available under the
5 : * terms of the Apache License Version 2.0 which is available at
6 : * https://www.apache.org/licenses/LICENSE-2.0
7 : *
8 : * SPDX-License-Identifier: Apache-2.0
9 : ********************************************************************************/
10 :
11 : #include "uds/base/Service.h"
12 :
13 : #include "uds/connection/IncomingDiagConnection.h"
14 : #include "uds/session/DiagSession.h"
15 : #include "uds/session/IDiagSessionManager.h"
16 :
17 : namespace uds
18 : {
19 : namespace
20 : {
21 157 : ::etl::array<uint8_t, 1U> makeImplementedRequest(uint8_t const service) { return {{service}}; }
22 : } // namespace
23 :
24 104 : Service::Service(uint8_t const service, DiagSession::DiagSessionMask const sessionMask)
25 : : AbstractDiagJob(
26 104 : makeImplementedRequest(service),
27 : 0U,
28 : AbstractDiagJob::VARIABLE_REQUEST_LENGTH,
29 : AbstractDiagJob::VARIABLE_RESPONSE_LENGTH,
30 208 : sessionMask)
31 : {
32 104 : init();
33 104 : }
34 :
35 53 : Service::Service(
36 : uint8_t const service,
37 : uint8_t const requestPayloadLength,
38 : uint8_t const responseLength,
39 53 : DiagSession::DiagSessionMask const sessionMask)
40 : : AbstractDiagJob(
41 53 : makeImplementedRequest(service), 0U, requestPayloadLength, responseLength, sessionMask)
42 : {
43 53 : init();
44 53 : }
45 :
46 157 : void Service::init() { setDefaultDiagReturnCode(DiagReturnCode::ISO_SUBFUNCTION_NOT_SUPPORTED); }
47 :
48 : DiagReturnCode::Type
49 32 : Service::verify(uint8_t const* const request, uint16_t const /* requestLength */)
50 : {
51 32 : ::etl::span<uint8_t const> const requestView(request, 1U);
52 32 : if (requestView[0U] != getImplementedRequestView()[0U])
53 : {
54 4 : return DiagReturnCode::NOT_RESPONSIBLE;
55 : }
56 28 : if (!fAllowedSessions.match(getSession()))
57 : {
58 1 : return DiagReturnCode::ISO_SERVICE_NOT_SUPPORTED_IN_ACTIVE_SESSION;
59 : }
60 27 : return DiagReturnCode::OK;
61 : }
62 :
63 : } // namespace uds
|