LCOV - code coverage report
Current view: top level - libs/bsw/cpp2someip/include/someip - SdSomeIpStack.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 42 42
Test Date: 2026-09-11 12:05:06 Functions: 100.0 % 3 3

            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
        

Generated by: LCOV version 2.0-1