ITS
GNDataRequest.cpp
Go to the documentation of this file.
1 #include <GNDataRequest.h>
2 
4 {
5  QByteArray rawPacket;
6  QDataStream ds(&rawPacket, QIODevice::WriteOnly);
7 
8  quint8 opts = 0;
9  if(gnDR.maximumPacketLifeTime)
10  opts |= 1 << 7;
11  if(gnDR.repetitionInterval)
12  opts |= 1 << 6;
13  if(gnDR.maximumRepetitionTime)
14  opts |= 1 << 5;
15  if(gnDR.maximumHopLimit)
16  opts |= 1 << 4;
17 
18  ds << opts;
19 
20  ds << (quint8) gnDR.upperProtocolEntity;
21  ds << (quint8) gnDR.packetTransportType;
22  ds << gnDR.packetTransportSubType;
23  ds << gnDR.destinationPort;
24  ds << gnDR.destinationPortInfo;
25  ds << (quint8) gnDR.destinationAddress.present;
26 
28  {
30  ds.writeRawData((char*)gnDR.destinationAddress.choice.gnAddr.mid, 6);
31  }
33  {
39  }
40 
41  ds << (quint8) gnDR.gnCommunicationProfile;
42  if(gnDR.maximumPacketLifeTime != 0)
43  ds.writeRawData(gnDR.maximumPacketLifeTime->toHex(), LifeTime::helper_size);
44  if(gnDR.repetitionInterval != 0)
45  ds << *gnDR.repetitionInterval;
46  if(gnDR.maximumRepetitionTime != 0)
47  ds << *gnDR.maximumRepetitionTime;
48  if(gnDR.maximumHopLimit != 0)
49  ds << *gnDR.maximumHopLimit;
50 
51  ds.writeRawData(gnDR.trafficClass.toHex(), TrafficClass::helper_size);
52  ds << (quint16) gnDR.payload.length();
53  ds.writeRawData(gnDR.payload, gnDR.payload.length());
54 
55  return rawPacket;
56 }
57 
59 {
60  gnDataRequest_t gnDR;
61  gnDR.maximumPacketLifeTime = 0;
62  gnDR.repetitionInterval = 0;
63  gnDR.maximumRepetitionTime = 0;
64  gnDR.maximumHopLimit = 0;
65 
66  char* data= rawPacket.data();
67  int offset = 0;
68  quint8 opt = 0;
69 
70  opt = extractUInt(data, 1, &offset);
71 
72  if(opt & (1 << 7))
73  gnDR.maximumPacketLifeTime = (LifeTime*) calloc(1, sizeof *gnDR.maximumPacketLifeTime);
74  if(opt & (1 << 6))
75  gnDR.repetitionInterval = (quint16*) calloc(1, sizeof *gnDR.repetitionInterval);
76  if(opt & (1 << 5))
77  gnDR.maximumRepetitionTime = (quint16*) calloc(1, sizeof *gnDR.maximumRepetitionTime);
78  if(opt & (1 << 4))
79  gnDR.maximumHopLimit = (quint8*) calloc(1, sizeof *gnDR.maximumHopLimit);
80 
82 
84  gnDR.packetTransportSubType = extractUInt(data, 1, &offset);
85  gnDR.destinationPort = extractUInt(data, 2, &offset);
86  gnDR.destinationPortInfo = extractUInt(data, 2, &offset);
88 
90  {
92  for(int i=0; i < 6; i++)
93  gnDR.destinationAddress.choice.gnAddr.mid[i] = extractUInt(data, 1, &offset);
94  }
95 
97  {
103  }
104 
106  if(gnDR.maximumPacketLifeTime)
107  *gnDR.maximumPacketLifeTime = LifeTime(extractUInt(data, 1, &offset));
108  if(gnDR.repetitionInterval)
109  *gnDR.repetitionInterval = extractUInt(data, 2, &offset);
110  if(gnDR.maximumRepetitionTime)
111  *gnDR.maximumRepetitionTime = extractUInt(data, 2, &offset);
112  if(gnDR.maximumHopLimit)
113  *gnDR.maximumHopLimit = extractUInt(data, 1, &offset);
114 
115  gnDR.trafficClass = TrafficClass(extractUInt(data, 1, &offset));
116  quint16 plLen = extractUInt(data, 2, &offset);
117 
118  gnDR.payload = QByteArray(data + offset, plLen-2);
119 
120  return gnDR;
121 }
QByteArray toHex()
toHex Encode the LifeTime in byte array.
Definition: LifeTime.cpp:114
gnDataRequest_t structure is the GN data request definition.
Definition: GNDataRequest.h:46
LifeTime * maximumPacketLifeTime
Definition: GNDataRequest.h:55
quint16 * repetitionInterval
Definition: GNDataRequest.h:56
sniff_destinationArea_t destinationArea
Definition: GNDataRequest.h:39
quint16 * maximumRepetitionTime
Definition: GNDataRequest.h:57
GN data request definition.
e_destinationAddress_PR_present
The e_destinationAddress_PR_present enum is the type of destination.
Definition: GNDataRequest.h:20
CommonHeader::e_upperProtocolEntity upperProtocolEntity
Definition: GNDataRequest.h:48
QByteArray gnDataRequestToBin(gnDataRequest_t gnDR)
gnDataRequestToBin Encode GN data request to byte array.
quint64 extractUInt(char *data, int l, int *offset)
extractUInt Extract an unsigned integer from byte array.
Definition: apiData.cpp:3
e_gnCommunicationProfile
The e_gnCommunicationProfile enum defines the type of communication profile.
Definition: constantes.h:11
e_headerType
The e_headerType enum defines the Header type values.
Definition: CommonHeader.h:65
destinationAddress_t destinationAddress
Definition: GNDataRequest.h:53
quint8 packetTransportSubType
Definition: GNDataRequest.h:50
quint8 * maximumHopLimit
Definition: GNDataRequest.h:58
quint16 stationType_StationCountryCode
Definition: GnAddr.h:24
qint64 extractInt(char *data, int l, int *offset)
extractInt Extract an signed integer from byte array.
Definition: apiData.cpp:22
e_upperProtocolEntity
The e_upperProtocolEntity enum defines the Next header values.
Definition: CommonHeader.h:54
sniff_gnAddr_t gnAddr
Definition: GNDataRequest.h:38
quint16 destinationPort
Definition: GNDataRequest.h:51
CommonHeader::e_headerType packetTransportType
Definition: GNDataRequest.h:49
e_destinationAddress_PR_present present
Definition: GNDataRequest.h:32
QByteArray toHex()
toHex Encode the TrafficClass in binary.
quint16 destinationPortInfo
Definition: GNDataRequest.h:52
union destinationAddress_s::@2 choice
The choice union is composed by a GN_ADDR or a destination area.
gnDataRequest_t gnDataRequestFromBin(QByteArray rawPacket)
gnDataRequestFromBin Decode GN data request from byte array.
QByteArray payload
Definition: GNDataRequest.h:60
e_gnCommunicationProfile gnCommunicationProfile
Definition: GNDataRequest.h:54
TrafficClass trafficClass
Definition: GNDataRequest.h:59
quint8 mid[6]
Definition: GnAddr.h:25