Line data Source code
1 : /********************************************************************************
2 : * Copyright (c) 2026 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 : #pragma once
12 :
13 : #include "someip/BufferedEventSender.h"
14 : #include "someip/EventTransceiver.h"
15 : #include "someip/ISdMessageParser.h"
16 : #include "someip/IServiceRegistry.h"
17 : #include "someip/Network.h"
18 : #include "someip/NetworkConfig.h"
19 : #include "someip/QueryManager.h"
20 : #include "someip/RebootTracker.h"
21 : #include "someip/RpcHandler.h"
22 : #include "someip/RpcReceiver.h"
23 : #include "someip/SdMessageParser.h"
24 : #include "someip/SdReceiver.h"
25 : #include "someip/SdServiceRegistry.h"
26 : #include "someip/ServiceAnnouncer.h"
27 : #include "someip/ServiceManager.h"
28 : #include "someip/ServiceTracker.h"
29 : #include "someip/SessionManager.h"
30 : #include "someip/SomeIpStack.h"
31 : #include "someip/SubscriptionManager.h"
32 : #include "someip/TcpClientChannelValidator.h"
33 : #include "someip/TpTransceiver.h"
34 :
35 : #include <ip/IPAddress.h>
36 :
37 : #include <cstddef>
38 :
39 : namespace someip
40 : {
41 :
42 : namespace detail
43 : {
44 :
45 : class SdRefs
46 : {
47 : protected:
48 : Network& _network;
49 : TcpClientChannelValidator& _validator;
50 : SubscriptionManager& _subscriptionManager;
51 : ServiceTracker& _serviceTracker;
52 : QueryManager& _queryManager;
53 : ServiceManager& _serviceManager;
54 : SdServiceRegistry& _serviceRegistry;
55 : SessionManager& _sessionManager;
56 : RebootTracker& _rebootTracker;
57 : TpTransceiver& _tpTransceiver;
58 : BufferedEventSender& _eventSender;
59 : RpcHandler& _rpcHandler;
60 : EventTransceiver& _eventTransceiver;
61 : RpcReceiver& _rpcReceiver;
62 :
63 3 : SdRefs(
64 : Network& network,
65 : TcpClientChannelValidator& validator,
66 : SubscriptionManager& subscriptionManager,
67 : ServiceTracker& serviceTracker,
68 : QueryManager& queryManager,
69 : ServiceManager& serviceManager,
70 : SdServiceRegistry& serviceRegistry,
71 : SessionManager& sessionManager,
72 : RebootTracker& rebootTracker,
73 : TpTransceiver& tpTransceiver,
74 : BufferedEventSender& eventSender,
75 : RpcHandler& rpcHandler,
76 : EventTransceiver& eventTransceiver,
77 : RpcReceiver& rpcReceiver)
78 3 : : _network(network)
79 3 : , _validator(validator)
80 3 : , _subscriptionManager(subscriptionManager)
81 3 : , _serviceTracker(serviceTracker)
82 3 : , _queryManager(queryManager)
83 3 : , _serviceManager(serviceManager)
84 3 : , _serviceRegistry(serviceRegistry)
85 3 : , _sessionManager(sessionManager)
86 3 : , _rebootTracker(rebootTracker)
87 3 : , _tpTransceiver(tpTransceiver)
88 3 : , _eventSender(eventSender)
89 3 : , _rpcHandler(rpcHandler)
90 3 : , _eventTransceiver(eventTransceiver)
91 3 : , _rpcReceiver(rpcReceiver)
92 3 : {}
93 : };
94 :
95 : } // namespace detail
96 :
97 : /**
98 : * The SOME/IP Stack with SD.
99 : */
100 :
101 : class SdSomeIpStack
102 : : protected detail::SdRefs
103 : , public SomeIpStack
104 : {
105 : public:
106 : SdSomeIpStack(
107 : async::ContextType& ethernetContext,
108 : Network& network,
109 : TcpClientChannelValidator& validator,
110 : SubscriptionManager& subscriptionManager,
111 : ServiceTracker& serviceTracker,
112 : QueryManager& queryManager,
113 : ServiceManager& serviceManager,
114 : SdServiceRegistry& serviceRegistry,
115 : SessionManager& sessionManager,
116 : RebootTracker& rebootTracker,
117 : TpTransceiver& tpTransceiver,
118 : BufferedEventSender& eventSender,
119 : RpcHandler& rpcHandler,
120 : EventTransceiver& eventTransceiver,
121 : RpcReceiver& rpcReceiver,
122 : ISdMessageParser::AdditionalSDCheck additionalSDCheck = {});
123 :
124 : bool doInit() override;
125 : bool doStart() override;
126 : void doStop() override;
127 : void doShutdown() override;
128 :
129 : INetwork const& getNetwork() const;
130 : INetwork& getNetwork();
131 :
132 : EventTransceiver const& getEventTransceiver() const;
133 : EventTransceiver& getEventTransceiver();
134 :
135 : RpcHandler const& getRpcHandler() const;
136 : RpcHandler& getRpcHandler();
137 :
138 : private:
139 : ServiceAnnouncer _serviceAnnouncer;
140 : SdMessageParser _sdParser;
141 : SdReceiver _sdReceiver;
142 : };
143 :
144 : namespace declare
145 : {
146 :
147 : namespace detail
148 : {
149 :
150 : /*
151 : * Base-from-member idiom.
152 : */
153 : template<
154 : typename UdpSocketType,
155 : uint8_t NumUdpRpcSockets,
156 : typename TcpServerSocketType,
157 : uint8_t NumTcpServerSockets,
158 : typename TcpSocketType,
159 : uint8_t NumTcpRpcSockets,
160 : size_t BufferSize,
161 : uint8_t NumTpStreams,
162 : bool SdEndpointOption,
163 : size_t InternalTcpReassembleBufferSize,
164 : uint16_t NumRemoteEndpoints,
165 : uint16_t NumRemoteServices,
166 : uint16_t NumRemoteSubscriptions,
167 : uint16_t NumLocalServices,
168 : uint16_t NumLocalQueries,
169 : uint8_t NumSubscriptionEndpoints,
170 : uint8_t NumEventBuffers,
171 : uint8_t NumMulticastReceptions>
172 : class SdMembers
173 : {
174 : protected:
175 3 : SdMembers(
176 : ::ip::IPAddress const& multicastIp,
177 : ::ip::IPAddress const& localIp,
178 : uint8_t const subnet,
179 : async::ContextType& ethernetContext)
180 3 : : _rebootTracker()
181 3 : , _sessionManager()
182 3 : , _networkConfig(multicastIp, localIp, subnet)
183 3 : , _tpTransceiver(
184 3 : ethernetContext, _networkConfig._tpConfig.tpSenders, _networkConfig._tpConfig.tpReceivers)
185 3 : , _network(_networkConfig)
186 3 : , _validator(_network, _networkConfig._useMagicCookie)
187 3 : , _queryManager(_validator)
188 3 : , _eventSender(_network, ethernetContext, _tpTransceiver)
189 3 : , _subscriptionManager()
190 3 : , _eventTransceiver(_eventSender, _subscriptionManager)
191 3 : , _serviceTracker()
192 3 : , _serviceRegistry(
193 : _subscriptionManager, ethernetContext, _serviceManager, _serviceTracker, _queryManager)
194 3 : , _serviceManager()
195 3 : , _rpcHandler(_network, ethernetContext, _tpTransceiver, _serviceManager, _serviceRegistry)
196 3 : , _rpcReceiver(
197 : _network, _tpTransceiver, _eventTransceiver, _serviceRegistry, _rpcHandler, nullptr)
198 3 : {}
199 :
200 : /*
201 : * Tracks reboots from remote ECUs by monitoring session IDs.
202 : * According to spec we need to react to such reboots by re-establishing a new TCP connection
203 : */
204 : RebootTracker<NumRemoteEndpoints> _rebootTracker;
205 :
206 : SessionManager<NumRemoteEndpoints> _sessionManager;
207 :
208 : SdNetworkConfig<
209 : UdpSocketType,
210 : NumUdpRpcSockets,
211 : TcpServerSocketType,
212 : NumTcpServerSockets,
213 : TcpSocketType,
214 : NumTcpRpcSockets,
215 : BufferSize>
216 : _networkConfig;
217 :
218 : // SOME/IP-TP
219 : TpTransceiver _tpTransceiver;
220 :
221 : Network _network;
222 :
223 : // To NOT miss initial events after subscription.
224 : // Validator checks if channel is established before sub/unsub-ing.
225 : TcpClientChannelValidator _validator;
226 :
227 : // Managing offers on client side
228 : QueryManager<NumLocalQueries> _queryManager;
229 :
230 : BufferedEventSender<NumEventBuffers> _eventSender;
231 :
232 : SubscriptionManager<NumRemoteSubscriptions> _subscriptionManager;
233 : EventTransceiver<NumSubscriptionEndpoints> _eventTransceiver;
234 : ServiceTracker<NumLocalServices> _serviceTracker;
235 :
236 : // holds all services known by their offers
237 : SdServiceRegistry _serviceRegistry;
238 :
239 : ServiceManager<NumLocalServices> _serviceManager;
240 :
241 : // Handles "fire & forget"s and requests
242 : RpcHandler _rpcHandler;
243 :
244 : RpcReceiver<NumMulticastReceptions> _rpcReceiver;
245 : };
246 :
247 : } // namespace detail
248 :
249 : /**
250 : * Declares a SOME/IP Stack with SD.
251 : */
252 : template<
253 : typename UdpSocketType,
254 : uint8_t NumUdpRpcSockets,
255 : typename TcpServerSocketType,
256 : uint8_t NumTcpServerSockets,
257 : typename TcpSocketType,
258 : uint8_t NumTcpRpcSockets,
259 : size_t BufferSize,
260 : uint8_t NumTpStreams,
261 : bool SdEndpointOption,
262 : size_t InternalTcpReassembleBufferSize,
263 : uint16_t NumRemoteEndpoints,
264 : uint16_t NumRemoteServices,
265 : uint16_t NumRemoteSubscriptions,
266 : uint16_t NumLocalServices,
267 : uint16_t NumLocalQueries,
268 : uint8_t NumSubscriptionEndpoints,
269 : uint8_t NumEventBuffers = 0,
270 : uint8_t NumMulticastReceptions = 0>
271 : class SdSomeIpStack
272 : : protected detail::SdMembers<
273 : UdpSocketType,
274 : NumUdpRpcSockets,
275 : TcpServerSocketType,
276 : NumTcpServerSockets,
277 : TcpSocketType,
278 : NumTcpRpcSockets,
279 : BufferSize,
280 : NumTpStreams,
281 : SdEndpointOption,
282 : InternalTcpReassembleBufferSize,
283 : NumRemoteEndpoints,
284 : NumRemoteServices,
285 : NumRemoteSubscriptions,
286 : NumLocalServices,
287 : NumLocalQueries,
288 : NumSubscriptionEndpoints,
289 : NumEventBuffers,
290 : NumMulticastReceptions>
291 : , public ::someip::SdSomeIpStack
292 : {
293 : using mem = detail::SdMembers<
294 : UdpSocketType,
295 : NumUdpRpcSockets,
296 : TcpServerSocketType,
297 : NumTcpServerSockets,
298 : TcpSocketType,
299 : NumTcpRpcSockets,
300 : BufferSize,
301 : NumTpStreams,
302 : SdEndpointOption,
303 : InternalTcpReassembleBufferSize,
304 : NumRemoteEndpoints,
305 : NumRemoteServices,
306 : NumRemoteSubscriptions,
307 : NumLocalServices,
308 : NumLocalQueries,
309 : NumSubscriptionEndpoints,
310 : NumEventBuffers,
311 : NumMulticastReceptions>;
312 :
313 : public:
314 3 : explicit SdSomeIpStack(
315 : ::ip::IPAddress const& multicastIp,
316 : ::ip::IPAddress const& localIp,
317 : uint8_t const subnet,
318 : async::ContextType& ethernetContext)
319 : : mem(multicastIp, localIp, subnet, ethernetContext)
320 : , ::someip::SdSomeIpStack(
321 : ethernetContext,
322 3 : mem::_network,
323 3 : mem::_validator,
324 : mem::_subscriptionManager,
325 : mem::_serviceTracker,
326 : mem::_queryManager,
327 : mem::_serviceManager,
328 3 : mem::_serviceRegistry,
329 : mem::_sessionManager,
330 : mem::_rebootTracker,
331 3 : mem::_tpTransceiver,
332 : mem::_eventSender,
333 3 : mem::_rpcHandler,
334 : mem::_eventTransceiver,
335 3 : mem::_rpcReceiver)
336 3 : {}
337 : };
338 :
339 : } // namespace declare
340 : } // namespace someip
|