#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace vanetza { namespace geonet { class NetworkTopology { public: enum class PacketDuplicationMode { Copy_Construct, Serialize }; class RequestInterface : public dcc::RequestInterface { public: RequestInterface(NetworkTopology&, const MacAddress&); void request(const dcc::DataRequest&, std::unique_ptr) override; void reset(); void transmit(); unsigned requests = 0; unsigned transmissions = 0; dcc::DataRequest last_request; std::unique_ptr last_packet; private: NetworkTopology& network; const MacAddress& address; }; class TransportHandler : public TransportInterface { public: void indicate(const DataIndication&, std::unique_ptr) override; void reset(); unsigned counter = 0; DataIndication last_indication; std::unique_ptr last_packet; }; class RouterContext { public: RouterContext(NetworkTopology&); void set_position_accuracy_indicator(bool flag); MacAddress mac_address; RequestInterface request_interface; TransportHandler transport_interface; ManualRuntime runtime; PositionFix position; SecurityContext security; Router router; }; NetworkTopology(); boost::optional get_host(const MacAddress&); boost::optional get_router(const MacAddress&); boost::optional get_interface(const MacAddress&); boost::optional get_transport(const MacAddress&); const unsigned& get_counter_requests(const MacAddress&); const unsigned& get_counter_indications() const { return counter_indications; } ManagementInformationBase& get_mib() { return mib; } void add_router(const MacAddress&); void add_reachability(const MacAddress&, std::initializer_list); void save_request(const dcc::DataRequest&, std::unique_ptr); void dispatch(); void send(Router&, const MacAddress&, const MacAddress&, const ChunkPacket&); void set_position(const MacAddress&, CartesianPosition); void advance_time(Clock::duration t); void reset_counters(); void set_duplication_mode(PacketDuplicationMode); void set_network_delay(Clock::duration delay); void build_fully_meshed_reachability(); private: Clock::time_point next_event() const; using PendingTransmission = std::tuple>; std::unordered_map counter_requests; std::unordered_map> hosts; std::unordered_map> reachability; std::list requests; Clock::duration network_delay = Clock::duration::zero(); Clock::time_point now; ManagementInformationBase mib; unsigned counter_indications; std::function(const ChunkPacket&)> fn_duplicate; }; GeodeticPosition convert_cartesian_geodetic(const CartesianPosition&); Area circle_dest_area(units::Length radius, units::Length midpoint_x, units::Length midpoint_y); } // namespace geonet } // namespace vanetza