A Discrete-Event Network Simulator
API
wimax-tlv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009 INRIA, UDcast
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Mohamed Amine Ismail <amine.ismail@sophia.inria.fr>
18  *
19  */
20 
21 #ifndef WIMAX_TLV_H
22 #define WIMAX_TLV_H
23 
24 #define WIMAX_TLV_EXTENDED_LENGTH_MASK 0x80
25 
26 #include "ns3/assert.h"
27 #include "ns3/header.h"
28 #include "ns3/ipv4-address.h"
29 #include "ns3/log.h"
30 #include "ns3/uinteger.h"
31 
32 #include <cstdlib>
33 #include <vector>
34 
35 namespace ns3
36 {
37 
44 class TlvValue
45 {
46  public:
47  virtual ~TlvValue()
48  {
49  }
50 
55  virtual uint32_t GetSerializedSize() const = 0;
60  virtual void Serialize(Buffer::Iterator start) const = 0;
67  virtual uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) = 0;
72  virtual TlvValue* Copy() const = 0;
73 
74  private:
75 };
76 
77 // =============================================================================
86 class Tlv : public Header
87 {
88  public:
91  {
92  HMAC_TUPLE = 149,
99  };
100 
108  Tlv(uint8_t type, uint64_t length, const TlvValue& value);
109  Tlv();
110  ~Tlv() override;
115  static TypeId GetTypeId();
116  TypeId GetInstanceTypeId() const override;
117  void Print(std::ostream& os) const override;
118  uint32_t GetSerializedSize() const override;
119  void Serialize(Buffer::Iterator start) const override;
120  uint32_t Deserialize(Buffer::Iterator start) override;
125  uint8_t GetSizeOfLen() const;
130  uint8_t GetType() const;
135  uint64_t GetLength() const;
140  TlvValue* PeekValue();
145  Tlv* Copy() const;
150  TlvValue* CopyValue() const;
156  Tlv& operator=(const Tlv& o);
161  Tlv(const Tlv& tlv);
162 
163  private:
164  uint8_t m_type;
165  uint64_t m_length;
167 };
168 
169 // ==============================================================================
174 class U8TlvValue : public TlvValue
175 {
176  public:
182  U8TlvValue(uint8_t value);
183  U8TlvValue();
184  ~U8TlvValue() override;
185  uint32_t GetSerializedSize() const override;
186  void Serialize(Buffer::Iterator start) const override;
187  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override;
198  uint8_t GetValue() const;
203  U8TlvValue* Copy() const override;
204 
205  private:
206  uint8_t m_value;
207 };
208 
209 // ==============================================================================
214 class U16TlvValue : public TlvValue
215 {
216  public:
222  U16TlvValue(uint16_t value);
223  U16TlvValue();
224  ~U16TlvValue() override;
225  uint32_t GetSerializedSize() const override;
226  void Serialize(Buffer::Iterator start) const override;
227  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override;
238  uint16_t GetValue() const;
243  U16TlvValue* Copy() const override;
244 
245  private:
246  uint16_t m_value;
247 };
248 
249 // ==============================================================================
254 class U32TlvValue : public TlvValue
255 {
256  public:
262  U32TlvValue(uint32_t value);
263  U32TlvValue();
264  ~U32TlvValue() override;
265 
266  uint32_t GetSerializedSize() const override;
267  void Serialize(Buffer::Iterator start) const override;
268  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override;
279  uint32_t GetValue() const;
284  U32TlvValue* Copy() const override;
285 
286  private:
287  uint32_t m_value;
288 };
289 
290 // ==============================================================================
291 
296 class VectorTlvValue : public TlvValue
297 {
298  public:
300  typedef std::vector<Tlv*>::const_iterator Iterator;
301  VectorTlvValue();
302  ~VectorTlvValue() override;
303  uint32_t GetSerializedSize() const override;
304  void Serialize(Buffer::Iterator start) const override;
305  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override = 0;
310  Iterator Begin() const;
315  Iterator End() const;
320  void Add(const Tlv& val);
325  VectorTlvValue* Copy() const override = 0;
326 
327  private:
328  std::vector<Tlv*>* m_tlvList;
329 };
330 
331 // ==============================================================================
337 {
338  public:
340  enum Type
341  {
342  SFID = 1,
343  CID = 2,
357  SDU_Size = 16,
368  reserved2 = 27,
370  IPV4_CS_Parameters = 100
371  };
372 
374  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
375  SfVectorTlvValue* Copy() const override;
376 };
377 
378 // ==============================================================================
379 
385 {
386  public:
388  enum Type
389  {
392  };
393 
395  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
396  CsParamVectorTlvValue* Copy() const override;
397 
398  private:
399 };
400 
401 // ==============================================================================
402 
408 {
409  public:
412  {
413  Priority = 1,
414  ToS = 2,
415  Protocol = 3,
416  IP_src = 4,
417  IP_dst = 5,
418  Port_src = 6,
419  Port_dst = 7,
420  Index = 14,
421  };
422 
424  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
425  ClassificationRuleVectorTlvValue* Copy() const override;
426 
427  private:
428 };
429 
430 // ==============================================================================
435 class TosTlvValue : public TlvValue
436 {
437  public:
438  TosTlvValue();
446  TosTlvValue(uint8_t low, uint8_t high, uint8_t mask);
447  ~TosTlvValue() override;
448  uint32_t GetSerializedSize() const override;
449  void Serialize(Buffer::Iterator start) const override;
450  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
455  uint8_t GetLow() const;
460  uint8_t GetHigh() const;
465  uint8_t GetMask() const;
470  TosTlvValue* Copy() const override;
471 
472  private:
473  uint8_t m_low;
474  uint8_t m_high;
475  uint8_t m_mask;
476 };
477 
478 // ==============================================================================
484 {
485  public:
487  struct PortRange
488  {
489  uint16_t PortLow;
490  uint16_t PortHigh;
491  };
493  typedef std::vector<struct PortRange>::const_iterator Iterator;
495  ~PortRangeTlvValue() override;
496  uint32_t GetSerializedSize() const override;
497  void Serialize(Buffer::Iterator start) const override;
498  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
504  void Add(uint16_t portLow, uint16_t portHigh);
509  Iterator Begin() const;
514  Iterator End() const;
519  PortRangeTlvValue* Copy() const override;
520 
521  private:
522  std::vector<struct PortRange>* m_portRange;
523 };
524 
525 // ==============================================================================
531 {
532  public:
534  ~ProtocolTlvValue() override;
536  typedef std::vector<uint8_t>::const_iterator Iterator;
537  uint32_t GetSerializedSize() const override;
538  void Serialize(Buffer::Iterator start) const override;
539  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
544  void Add(uint8_t protocol);
549  Iterator Begin() const;
554  Iterator End() const;
559  ProtocolTlvValue* Copy() const override;
560 
561  private:
562  std::vector<uint8_t>* m_protocol;
563 };
564 
565 // ==============================================================================
566 
572 {
573  public:
575  struct Ipv4Addr
576  {
579  };
580 
582  typedef std::vector<Ipv4Addr>::const_iterator Iterator;
584  ~Ipv4AddressTlvValue() override;
585  uint32_t GetSerializedSize() const override;
586  void Serialize(Buffer::Iterator start) const override;
587  uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override;
593  void Add(Ipv4Address address, Ipv4Mask mask);
598  Iterator Begin() const;
603  Iterator End() const;
604  Ipv4AddressTlvValue* Copy() const override;
605 
606  private:
607  std::vector<Ipv4Addr>* m_ipv4Addr;
608 };
609 
610 } // namespace ns3
611 
612 #endif /* WIMAX_TLV_H */
iterator in a Buffer instance
Definition: buffer.h:100
this class implements the classifier descriptor as a tlv vector
Definition: wimax-tlv.h:408
ClassificationRuleVectorTlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:711
ClassificationRuleTlvType
ClassificationRuleTlvType enumeration.
Definition: wimax-tlv.h:412
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:722
this class implements the convergence sub-layer descriptor as a tlv vector
Definition: wimax-tlv.h:385
CsParamVectorTlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:694
Type
Type enumeration.
Definition: wimax-tlv.h:389
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:643
Protocol header serialization and deserialization.
Definition: header.h:44
virtual uint32_t Deserialize(Buffer::Iterator start)=0
Deserialize the object from a buffer iterator.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:43
Ipv4AddressTlvValue class.
Definition: wimax-tlv.h:572
Iterator End() const
End iterator.
Definition: wimax-tlv.cc:1085
std::vector< Ipv4Addr >::const_iterator Iterator
IPv4 address vector iterator typedef.
Definition: wimax-tlv.h:582
void Serialize(Buffer::Iterator start) const override
Serialize to a buffer.
Definition: wimax-tlv.cc:1047
void Add(Ipv4Address address, Ipv4Mask mask)
Add IPv4 address and mask.
Definition: wimax-tlv.cc:1073
std::vector< Ipv4Addr > * m_ipv4Addr
ipv4 addr
Definition: wimax-tlv.h:607
Ipv4AddressTlvValue * Copy() const override
Copy function.
Definition: wimax-tlv.cc:1091
uint32_t GetSerializedSize() const override
Get serialized size in bytes.
Definition: wimax-tlv.cc:1041
Iterator Begin() const
Begin iterator.
Definition: wimax-tlv.cc:1079
~Ipv4AddressTlvValue() override
Definition: wimax-tlv.cc:1030
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:1059
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:258
PortRangeTlvValue class.
Definition: wimax-tlv.h:484
uint32_t GetSerializedSize() const override
Get serialized size in bytes.
Definition: wimax-tlv.cc:883
std::vector< struct PortRange >::const_iterator Iterator
PortRange vector iterator typedef.
Definition: wimax-tlv.h:493
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:901
Iterator End() const
End iterator.
Definition: wimax-tlv.cc:930
std::vector< struct PortRange > * m_portRange
port range
Definition: wimax-tlv.h:522
void Serialize(Buffer::Iterator start) const override
Serialize to a buffer.
Definition: wimax-tlv.cc:889
~PortRangeTlvValue() override
Definition: wimax-tlv.cc:876
Iterator Begin() const
Begin iterator.
Definition: wimax-tlv.cc:924
void Add(uint16_t portLow, uint16_t portHigh)
Add a range.
Definition: wimax-tlv.cc:915
PortRangeTlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:936
ProtocolTlvValue class.
Definition: wimax-tlv.h:531
~ProtocolTlvValue() override
Definition: wimax-tlv.cc:955
std::vector< uint8_t > * m_protocol
protocol
Definition: wimax-tlv.h:562
void Add(uint8_t protocol)
Add protocol number.
Definition: wimax-tlv.cc:994
Iterator Begin() const
Begin iterator.
Definition: wimax-tlv.cc:1000
uint32_t GetSerializedSize() const override
Get serialized size in bytes.
Definition: wimax-tlv.cc:966
ProtocolTlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:1012
std::vector< uint8_t >::const_iterator Iterator
Iterator typedef.
Definition: wimax-tlv.h:536
Iterator End() const
End iterator.
Definition: wimax-tlv.cc:1006
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:982
void Serialize(Buffer::Iterator start) const override
Serialize to a buffer.
Definition: wimax-tlv.cc:972
SfVectorTlvValue class.
Definition: wimax-tlv.h:337
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:309
Type
Type enumeration.
Definition: wimax-tlv.h:341
@ Fixed_length_versus_Variable_length_SDU_Indicator
Definition: wimax-tlv.h:356
@ ARQ_RETRY_TIMEOUT_Transmitter_Delay
Definition: wimax-tlv.h:361
SfVectorTlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:298
This class implements the Type-Len-Value structure channel encodings as described by "IEEE Standard f...
Definition: wimax-tlv.h:87
uint8_t m_type
type
Definition: wimax-tlv.h:164
TlvValue * CopyValue() const
Copy TlvValue.
Definition: wimax-tlv.cc:75
~Tlv() override
Definition: wimax-tlv.cc:65
uint64_t m_length
length
Definition: wimax-tlv.h:165
Tlv * Copy() const
Copy TLV.
Definition: wimax-tlv.cc:229
uint8_t GetType() const
Get type value.
Definition: wimax-tlv.cc:211
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
Definition: wimax-tlv.cc:40
Tlv & operator=(const Tlv &o)
assignment operator
Definition: wimax-tlv.cc:88
TlvValue * PeekValue()
Peek value.
Definition: wimax-tlv.cc:223
static TypeId GetTypeId()
Register this type.
Definition: wimax-tlv.cc:32
uint64_t GetLength() const
Get length value.
Definition: wimax-tlv.cc:217
CommonTypes
CommonTypes enumeration.
Definition: wimax-tlv.h:91
@ UPLINK_SERVICE_FLOW
Definition: wimax-tlv.h:96
@ VENDOR_ID_EMCODING
Definition: wimax-tlv.h:97
@ DOWNLINK_SERVICE_FLOW
Definition: wimax-tlv.h:95
@ CURRENT_TRANSMIT_POWER
Definition: wimax-tlv.h:94
@ HMAC_TUPLE
Definition: wimax-tlv.h:92
@ MAC_VERSION_ENCODING
Definition: wimax-tlv.h:93
@ VENDOR_SPECIFIC_INFORMATION
Definition: wimax-tlv.h:98
uint8_t GetSizeOfLen() const
Get size of length field.
Definition: wimax-tlv.cc:108
void Print(std::ostream &os) const override
Definition: wimax-tlv.cc:46
TlvValue * m_value
value
Definition: wimax-tlv.h:166
uint32_t GetSerializedSize() const override
Definition: wimax-tlv.cc:102
void Serialize(Buffer::Iterator start) const override
Definition: wimax-tlv.cc:126
The value field of a tlv can take different values (uint8_t, uint16, vector, ...).
Definition: wimax-tlv.h:45
virtual ~TlvValue()
Definition: wimax-tlv.h:47
virtual uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen)=0
Deserialize from a buffer.
virtual uint32_t GetSerializedSize() const =0
Get serialized size in bytes.
virtual TlvValue * Copy() const =0
Copy function.
virtual void Serialize(Buffer::Iterator start) const =0
Serialize to a buffer.
TosTlvValue class.
Definition: wimax-tlv.h:436
void Serialize(Buffer::Iterator start) const override
Serialize to a buffer.
Definition: wimax-tlv.cc:830
uint8_t m_high
high
Definition: wimax-tlv.h:474
uint8_t GetHigh() const
Get high part.
Definition: wimax-tlv.cc:853
uint32_t GetSerializedSize() const override
Get serialized size in bytes.
Definition: wimax-tlv.cc:824
~TosTlvValue() override
Definition: wimax-tlv.cc:819
uint8_t GetLow() const
Get low part.
Definition: wimax-tlv.cc:847
uint8_t GetMask() const
Get the mask.
Definition: wimax-tlv.cc:859
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:838
TosTlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:865
uint8_t m_mask
mask
Definition: wimax-tlv.h:475
uint8_t m_low
low
Definition: wimax-tlv.h:473
a unique identifier for an interface.
Definition: type-id.h:60
U16TlvValue class.
Definition: wimax-tlv.h:215
void Serialize(Buffer::Iterator start) const override
Serialize to a buffer.
Definition: wimax-tlv.cc:557
U16TlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:582
uint16_t m_value
value
Definition: wimax-tlv.h:246
uint32_t GetSerializedSize() const override
Get serialized size in bytes.
Definition: wimax-tlv.cc:551
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:563
uint16_t GetValue() const
Get value.
Definition: wimax-tlv.cc:576
~U16TlvValue() override
Definition: wimax-tlv.cc:546
U32TlvValue class.
Definition: wimax-tlv.h:255
uint32_t GetValue() const
Get value.
Definition: wimax-tlv.cc:629
uint32_t GetSerializedSize() const override
Get serialized size in bytes.
Definition: wimax-tlv.cc:604
~U32TlvValue() override
Definition: wimax-tlv.cc:599
void Serialize(Buffer::Iterator start) const override
Serialize to a buffer.
Definition: wimax-tlv.cc:610
U32TlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:635
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:616
uint32_t m_value
value
Definition: wimax-tlv.h:287
U8TlvValue class.
Definition: wimax-tlv.h:175
~U8TlvValue() override
Definition: wimax-tlv.cc:493
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLen) override
Deserialize from a buffer.
Definition: wimax-tlv.cc:510
uint8_t GetValue() const
Get value.
Definition: wimax-tlv.cc:523
uint8_t m_value
value
Definition: wimax-tlv.h:206
uint32_t GetSerializedSize() const override
Get serialized size in bytes.
Definition: wimax-tlv.cc:498
void Serialize(Buffer::Iterator start) const override
Serialize to a buffer.
Definition: wimax-tlv.cc:504
U8TlvValue * Copy() const override
Copy.
Definition: wimax-tlv.cc:529
this class is used to implement a vector of values in one tlv value field
Definition: wimax-tlv.h:297
uint32_t GetSerializedSize() const override
Get serialized size in bytes.
Definition: wimax-tlv.cc:252
VectorTlvValue * Copy() const override=0
Copy.
~VectorTlvValue() override
Definition: wimax-tlv.cc:240
std::vector< Tlv * >::const_iterator Iterator
TLV vector iterator typedef.
Definition: wimax-tlv.h:300
void Serialize(Buffer::Iterator start) const override
Serialize to a buffer.
Definition: wimax-tlv.cc:264
Iterator End() const
End iterator.
Definition: wimax-tlv.cc:281
Iterator Begin() const
Begin iterator.
Definition: wimax-tlv.cc:275
void Add(const Tlv &val)
Add a TLV.
Definition: wimax-tlv.cc:287
std::vector< Tlv * > * m_tlvList
tlv list
Definition: wimax-tlv.h:328
uint32_t Deserialize(Buffer::Iterator start, uint64_t valueLength) override=0
Deserialize from a buffer.
address
Definition: first.py:40
Every class exported by the ns3 library is enclosed in the ns3 namespace.
value
Definition: second.py:41
PortRange structure.
Definition: wimax-tlv.h:488