Vanetza
Loading...
Searching...
No Matches
data_request.hpp
1#ifndef DATA_REQUEST_HPP_3JYISVXB
2#define DATA_REQUEST_HPP_3JYISVXB
3
4#include <vanetza/common/byte_buffer.hpp>
5#include <vanetza/common/its_aid.hpp>
6#include <vanetza/geonet/address.hpp>
7#include <vanetza/geonet/areas.hpp>
8#include <vanetza/geonet/interface.hpp>
9#include <vanetza/geonet/lifetime.hpp>
10#include <vanetza/geonet/mib.hpp>
11#include <vanetza/geonet/traffic_class.hpp>
12#include <vanetza/units/time.hpp>
13#include <boost/optional.hpp>
14#include <boost/variant.hpp>
15
16namespace vanetza
17{
18
19// forward declaration
20namespace btp { struct DataRequestB; }
21
22namespace geonet
23{
24
25struct DataRequest
26{
27 DataRequest(const MIB& mib, ItsAid its_aid = 0) :
28 upper_protocol(UpperProtocol::BTP_A),
29 communication_profile(CommunicationProfile::Unspecified),
30 its_aid(its_aid),
31 maximum_lifetime(mib.itsGnDefaultPacketLifetime),
32 max_hop_limit(mib.itsGnDefaultHopLimit),
33 traffic_class(mib.itsGnDefaultTrafficClass)
34 {}
35
37 {
38 units::Duration interval;
39 units::Duration maximum;
40 };
41
42 UpperProtocol upper_protocol;
43 CommunicationProfile communication_profile;
44 ItsAid its_aid;
45 ByteBuffer permissions;
46 Lifetime maximum_lifetime;
47 boost::optional<Repetition> repetition;
48 unsigned max_hop_limit;
49 TrafficClass traffic_class;
50};
51
52/**
53 * \brief Decrement maximum repetition by one interval
54 * \param repetition Repetition data structure
55 */
56void decrement_by_one(DataRequest::Repetition& repetition);
57
58/**
59 * \brief Test if request has to be repeated at least once more
60 * \param request DataRequest
61 * \return true if there is at least one repetition left
62 */
63bool has_further_repetition(const DataRequest&);
64
65/**
66 * \brief Test if at least one repetition is outstanding
67 * \param repetition
68 * \return true if there is at least one repetition left
69 */
70bool has_further_repetition(const DataRequest::Repetition&);
71
72struct DataRequestWithAddress : public DataRequest
73{
74 using DataRequest::DataRequest;
75 Address destination;
76};
77
78struct DataRequestWithArea : public DataRequest
79{
80 using DataRequest::DataRequest;
81 Area destination;
82};
83
85{
86 using DataRequestWithAddress::DataRequestWithAddress;
87};
88
90{
91 using DataRequestWithArea::DataRequestWithArea;
92};
93
95{
96 using DataRequestWithArea::DataRequestWithArea;
97};
98
99struct ShbDataRequest : public DataRequest
100{
101 using DataRequest::DataRequest;
102};
103
104struct TsbDataRequest : public DataRequest
105{
106 using DataRequest::DataRequest;
107};
108
109using DataRequestVariant =
110 boost::variant<
116 >;
117
118/**
119 * Get access to common base data request class of all variants
120 * \param variant DataRequestVariant object
121 * \return reference to underlying DataRequest
122 */
123DataRequest& access_request(DataRequestVariant&);
124
125/**
126 * Copy request parameters from BTP-B request
127 * \param btp BTP-B data request
128 * \param gn GeoNet destination request
129 */
130void copy_request_parameters(const btp::DataRequestB& btp, DataRequest& gn);
131void copy_request_parameters(const btp::DataRequestB& btp, DataRequestWithAddress& gn);
132void copy_request_parameters(const btp::DataRequestB& btp, DataRequestWithArea& gn);
133
134} // namespace geonet
135} // namespace vanetza
136
137#endif /* DATA_REQUEST_HPP_3JYISVXB */