22 #include "wimax-tlv.h"
36 os <<
"TLV type = " << (uint32_t) m_type <<
" TLV Length = " << (uint64_t) m_length;
39 Tlv::Tlv (uint8_t type, uint64_t length,
const TlvValue & value)
43 m_value = value.Copy ();
63 Tlv::CopyValue (
void)
const
65 return m_value->Copy ();
68 Tlv::Tlv (
const Tlv & tlv)
70 m_type = tlv.GetType ();
71 m_length = tlv.GetLength ();
72 m_value = tlv.CopyValue ();
76 Tlv::operator = (Tlv
const& o)
82 m_type = o.GetType ();
83 m_length = o.GetLength ();
84 m_value = o.CopyValue ();
92 return 1 + GetSizeOfLen () + m_value->GetSerializedSize ();
96 Tlv::GetSizeOfLen (
void)
const
98 uint8_t sizeOfLen = 1;
103 uint64_t testValue = 0xFF;
104 while (m_length > testValue)
117 uint8_t lenSize = GetSizeOfLen ();
124 i.
WriteU8 ((lenSize-1) | WIMAX_TLV_EXTENDED_LENGTH_MASK);
125 for (
int j = 0; j < lenSize - 1; j++)
127 i.
WriteU8 ((uint8_t)(m_length >> ((lenSize - 1 - 1 - j) * 8)));
130 m_value->Serialize (i);
140 uint8_t lenSize = i.
ReadU8 ();
141 uint32_t serializedSize = 2;
148 lenSize &= ~WIMAX_TLV_EXTENDED_LENGTH_MASK;
149 for (
int j = 0; j < lenSize; j++)
160 NS_FATAL_ERROR (
"Not implemented-- please implement and contribute a patch");
162 case MAC_VERSION_ENCODING:
164 NS_FATAL_ERROR (
"Not implemented-- please implement and contribute a patch");
166 case CURRENT_TRANSMIT_POWER:
168 NS_FATAL_ERROR (
"Not implemented-- please implement and contribute a patch");
170 case DOWNLINK_SERVICE_FLOW:
173 serializedSize += val.Deserialize (i, m_length);
174 m_value = val.Copy ();
177 case UPLINK_SERVICE_FLOW:
180 serializedSize += val.Deserialize (i, m_length);
181 m_value = val.Copy ();
184 case VENDOR_ID_EMCODING:
186 NS_FATAL_ERROR (
"Not implemented-- please implement and contribute a patch");
188 case VENDOR_SPECIFIC_INFORMATION:
190 NS_FATAL_ERROR (
"Not implemented-- please implement and contribute a patch");
197 return serializedSize;
201 Tlv::GetType (
void)
const
206 Tlv::GetLength (
void)
const
211 Tlv::PeekValue (
void)
217 Tlv::Copy (
void)
const
219 return new Tlv (m_type, m_length, *m_value);
222 VectorTlvValue::VectorTlvValue ()
224 m_tlvList =
new std::vector<Tlv*>;
227 VectorTlvValue::~VectorTlvValue ()
229 for (std::vector<Tlv*>::const_iterator iter = m_tlvList->begin (); iter != m_tlvList->end (); ++iter)
238 VectorTlvValue::GetSerializedSize (
void)
const
241 for (std::vector<Tlv*>::const_iterator iter = m_tlvList->begin (); iter != m_tlvList->end (); ++iter)
243 size += (*iter)->GetSerializedSize ();
249 VectorTlvValue::Serialize (Buffer::Iterator i)
const
251 for (std::vector<Tlv*>::const_iterator iter = m_tlvList->begin (); iter != m_tlvList->end (); ++iter)
253 (*iter)->Serialize (i);
254 i.Next ((*iter)->GetSerializedSize ());
258 VectorTlvValue::Iterator
259 VectorTlvValue::Begin ()
const
261 return m_tlvList->begin ();
264 VectorTlvValue::Iterator
265 VectorTlvValue::End ()
const
267 return m_tlvList->end ();
271 VectorTlvValue::Add (
const Tlv & val)
273 m_tlvList->push_back (val.Copy ());
277 SfVectorTlvValue::SfVectorTlvValue ()
283 SfVectorTlvValue::Copy (
void)
const
285 SfVectorTlvValue * tmp =
new SfVectorTlvValue ();
286 for (std::vector<Tlv*>::const_iterator iter = Begin (); iter != End (); ++iter)
288 tmp->Add (Tlv ((*iter)->GetType (), (*iter)->GetLength (), *(*iter)->PeekValue ()));
294 SfVectorTlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLen)
296 uint64_t serializedSize = 0;
297 while (serializedSize < valueLen)
299 uint8_t type = i.ReadU8 ();
301 uint8_t lenSize = i.ReadU8 ();
310 lenSize &= ~WIMAX_TLV_EXTENDED_LENGTH_MASK;
311 for (
int j = 0; j < lenSize; j++)
314 length |= i.ReadU8 ();
323 serializedSize += val.Deserialize (i);
324 Add (Tlv (SFID, 4, val));
330 serializedSize += val.Deserialize (i);
331 Add (Tlv (CID, 2, val));
334 case Service_Class_Name:
335 NS_FATAL_ERROR (
"Not implemented-- please implement and contribute a patch");
340 case QoS_Parameter_Set_Type:
343 serializedSize += val.Deserialize (i);
344 Add (Tlv (QoS_Parameter_Set_Type, 1, val));
347 case Traffic_Priority:
350 serializedSize += val.Deserialize (i);
351 Add (Tlv (Traffic_Priority, 1, val));
354 case Maximum_Sustained_Traffic_Rate:
357 serializedSize += val.Deserialize (i);
358 Add (Tlv (Maximum_Sustained_Traffic_Rate, 4, val));
361 case Maximum_Traffic_Burst:
364 serializedSize += val.Deserialize (i);
365 Add (Tlv (Maximum_Traffic_Burst, 4, val));
368 case Minimum_Reserved_Traffic_Rate:
371 serializedSize += val.Deserialize (i);
372 Add (Tlv (Minimum_Reserved_Traffic_Rate, 4, val));
375 case Minimum_Tolerable_Traffic_Rate:
378 serializedSize += val.Deserialize (i);
379 Add (Tlv (Minimum_Tolerable_Traffic_Rate, 4, val));
382 case Service_Flow_Scheduling_Type:
385 serializedSize += val.Deserialize (i);
386 Add (Tlv (Service_Flow_Scheduling_Type, 1, val));
389 case Request_Transmission_Policy:
392 serializedSize += val.Deserialize (i);
393 Add (Tlv (Request_Transmission_Policy, 4, val));
396 case Tolerated_Jitter:
399 serializedSize += val.Deserialize (i);
400 Add (Tlv (Tolerated_Jitter, 4, val));
403 case Maximum_Latency:
406 serializedSize += val.Deserialize (i);
407 Add (Tlv (Maximum_Latency, 4, val));
410 case Fixed_length_versus_Variable_length_SDU_Indicator:
413 serializedSize += val.Deserialize (i);
414 Add (Tlv (Fixed_length_versus_Variable_length_SDU_Indicator, 1, val));
420 serializedSize += val.Deserialize (i);
421 Add (Tlv (SDU_Size, 1, val));
427 serializedSize += val.Deserialize (i);
428 Add (Tlv (Target_SAID, 2, val));
434 serializedSize += val.Deserialize (i);
435 Add (Tlv (ARQ_Enable, 1, val));
438 case ARQ_WINDOW_SIZE:
441 serializedSize += val.Deserialize (i);
442 Add (Tlv (ARQ_WINDOW_SIZE, 2, val));
445 case ARQ_RETRY_TIMEOUT_Transmitter_Delay:
447 case ARQ_RETRY_TIMEOUT_Receiver_Delay:
449 case ARQ_BLOCK_LIFETIME:
453 case ARQ_DELIVER_IN_ORDER:
455 case ARQ_PURGE_TIMEOUT:
461 case CS_Specification:
464 serializedSize += val.Deserialize (i);
465 Add (Tlv (CS_Specification, 1, val));
468 case IPV4_CS_Parameters:
470 CsParamVectorTlvValue val;
471 uint32_t size = val.Deserialize (i, length);
472 serializedSize += size;
473 Add (Tlv (IPV4_CS_Parameters, size, val));
482 return serializedSize;
487 U8TlvValue::U8TlvValue (uint8_t value)
492 U8TlvValue::U8TlvValue ()
497 U8TlvValue::~U8TlvValue ()
501 U8TlvValue::GetSerializedSize (
void)
const
506 U8TlvValue::Serialize (Buffer::Iterator i)
const
511 U8TlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLen)
513 return Deserialize (i);
517 U8TlvValue::Deserialize (Buffer::Iterator i)
519 m_value = i.ReadU8 ();
524 U8TlvValue::GetValue (
void)
const
530 U8TlvValue::Copy (
void)
const
532 U8TlvValue * tmp =
new U8TlvValue (m_value);
536 U16TlvValue::U16TlvValue (uint16_t value)
541 U16TlvValue::U16TlvValue ()
546 U16TlvValue::~U16TlvValue (
void)
551 U16TlvValue::GetSerializedSize (
void)
const
556 U16TlvValue::Serialize (Buffer::Iterator i)
const
558 i.WriteHtonU16 (m_value);
561 U16TlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLen)
563 return Deserialize (i);
567 U16TlvValue::Deserialize (Buffer::Iterator i)
569 m_value = i.ReadNtohU16 ();
574 U16TlvValue::GetValue (
void)
const
580 U16TlvValue::Copy (
void)
const
582 U16TlvValue * tmp =
new U16TlvValue (m_value);
586 U32TlvValue::U32TlvValue (uint32_t value)
591 U32TlvValue::U32TlvValue ()
596 U32TlvValue::~U32TlvValue (
void)
600 uint32_t U32TlvValue::GetSerializedSize (
void)
const
605 U32TlvValue::Serialize (Buffer::Iterator i)
const
607 i.WriteHtonU32 (m_value);
610 U32TlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLen)
612 return Deserialize (i);
616 U32TlvValue::Deserialize (Buffer::Iterator i)
618 m_value = i.ReadNtohU32 ();
622 U32TlvValue::GetValue (
void)
const
628 U32TlvValue::Copy (
void)
const
630 U32TlvValue * tmp =
new U32TlvValue (m_value);
635 CsParamVectorTlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLength)
637 uint64_t serializedSize = 0;
640 while (serializedSize < valueLength)
644 lenSize = i.ReadU8 ();
653 lenSize &= ~WIMAX_TLV_EXTENDED_LENGTH_MASK;
654 for (
int j = 0; j < lenSize; j++)
657 length |= i.ReadU8 ();
663 case Classifier_DSC_Action:
666 serializedSize += val.Deserialize (i);
667 Add (Tlv (Classifier_DSC_Action, 1, val));
670 case Packet_Classification_Rule:
672 ClassificationRuleVectorTlvValue val;
673 serializedSize += val.Deserialize (i, length);
674 Add (Tlv (Packet_Classification_Rule, val.GetSerializedSize (), val));
680 return serializedSize;
683 CsParamVectorTlvValue::CsParamVectorTlvValue ()
688 CsParamVectorTlvValue *
689 CsParamVectorTlvValue::Copy (
void)
const
691 CsParamVectorTlvValue * tmp =
new CsParamVectorTlvValue ();
692 for (std::vector<Tlv*>::const_iterator iter = Begin (); iter != End (); ++iter)
694 tmp->Add (Tlv ((*iter)->GetType (), (*iter)->GetLength (), *(*iter)->PeekValue ()));
700 ClassificationRuleVectorTlvValue::ClassificationRuleVectorTlvValue ()
705 ClassificationRuleVectorTlvValue *
706 ClassificationRuleVectorTlvValue::Copy (
void)
const
708 ClassificationRuleVectorTlvValue * tmp =
new ClassificationRuleVectorTlvValue ();
709 for (std::vector<Tlv*>::const_iterator iter = Begin (); iter != End (); ++iter)
711 tmp->Add (Tlv ((*iter)->GetType (), (*iter)->GetLength (), *(*iter)->PeekValue ()));
717 ClassificationRuleVectorTlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLength)
719 uint64_t serializedSize = 0;
722 while (serializedSize < valueLength)
726 lenSize = i.ReadU8 ();
735 lenSize &= ~WIMAX_TLV_EXTENDED_LENGTH_MASK;
736 for (
int j = 0; j < lenSize; j++)
739 length |= i.ReadU8 ();
748 serializedSize += val.Deserialize (i);
749 Add (Tlv (Priority, 1, val));
755 serializedSize += val.Deserialize (i, length);
756 Add (Tlv (ToS, val.GetSerializedSize (), val));
761 ProtocolTlvValue val;
762 serializedSize += val.Deserialize (i, length);
763 Add (Tlv (Protocol, val.GetSerializedSize (), val));
768 Ipv4AddressTlvValue val;
769 serializedSize += val.Deserialize (i, length);
770 Add (Tlv (IP_src, val.GetSerializedSize (), val));
775 Ipv4AddressTlvValue val;
776 serializedSize += val.Deserialize (i, length);
777 Add (Tlv (IP_dst, val.GetSerializedSize (), val));
782 PortRangeTlvValue val;
783 serializedSize += val.Deserialize (i, length);
784 Add (Tlv (Port_src, val.GetSerializedSize (), val));
789 PortRangeTlvValue val;
790 serializedSize += val.Deserialize (i, length);
791 Add (Tlv (Port_dst, val.GetSerializedSize (), val));
797 serializedSize += val.Deserialize (i);
798 Add (Tlv (Index, 2, val));
804 return serializedSize;
808 TosTlvValue::TosTlvValue ()
814 TosTlvValue::TosTlvValue (uint8_t low, uint8_t high, uint8_t mask)
820 TosTlvValue::~TosTlvValue ()
825 TosTlvValue::GetSerializedSize (
void)
const
830 TosTlvValue::Serialize (Buffer::Iterator i)
const
837 TosTlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLength)
840 m_high = i.ReadU8 ();
841 m_mask = i.ReadU8 ();
845 TosTlvValue::GetLow (
void)
const
850 TosTlvValue::GetHigh (
void)
const
855 TosTlvValue::GetMask (
void)
const
861 TosTlvValue::Copy (
void)
const
863 return new TosTlvValue (m_low, m_high, m_mask);
867 PortRangeTlvValue::PortRangeTlvValue ()
869 m_portRange =
new std::vector<struct PortRange>;
871 PortRangeTlvValue::~PortRangeTlvValue ()
873 m_portRange->clear ();
878 PortRangeTlvValue::GetSerializedSize (
void)
const
880 return m_portRange->size () *
sizeof(
struct PortRange);
883 PortRangeTlvValue::Serialize (Buffer::Iterator i)
const
885 for (std::vector<struct PortRange>::const_iterator iter = m_portRange->begin (); iter != m_portRange->end (); ++iter)
887 i.WriteHtonU16 ((*iter).PortLow);
888 i.WriteHtonU16 ((*iter).PortHigh);
892 PortRangeTlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLength)
895 while (len < valueLength)
897 uint16_t low = i.ReadNtohU16 ();
898 uint16_t high = i.ReadNtohU16 ();
905 PortRangeTlvValue::Add (uint16_t portLow, uint16_t portHigh)
907 struct PortRange tmp;
908 tmp.PortLow = portLow;
909 tmp.PortHigh = portHigh;
910 m_portRange->push_back (tmp);
912 PortRangeTlvValue::Iterator
913 PortRangeTlvValue::Begin (
void)
const
915 return m_portRange->begin ();
918 PortRangeTlvValue::Iterator
919 PortRangeTlvValue::End (
void)
const
921 return m_portRange->end ();
925 PortRangeTlvValue::Copy (
void)
const
927 PortRangeTlvValue * tmp =
new PortRangeTlvValue ();
928 for (std::vector<struct PortRange>::const_iterator iter = m_portRange->begin (); iter != m_portRange->end (); ++iter)
930 tmp->Add ((*iter).PortLow, (*iter).PortHigh);
937 ProtocolTlvValue::ProtocolTlvValue ()
939 m_protocol =
new std::vector<uint8_t>;
941 ProtocolTlvValue::~ProtocolTlvValue ()
943 m_protocol->clear ();
952 ProtocolTlvValue::GetSerializedSize (
void)
const
954 return m_protocol->size ();
958 ProtocolTlvValue::Serialize (Buffer::Iterator i)
const
960 for (std::vector<uint8_t>::const_iterator iter = m_protocol->begin (); iter != m_protocol->end (); ++iter)
967 ProtocolTlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLength)
970 while (len < valueLength)
979 ProtocolTlvValue::Add (uint8_t protocol)
981 m_protocol->push_back (protocol);
984 ProtocolTlvValue::Iterator
985 ProtocolTlvValue::Begin (
void)
const
987 return m_protocol->begin ();
990 ProtocolTlvValue::Iterator
991 ProtocolTlvValue::End (
void)
const
993 return m_protocol->end ();
997 ProtocolTlvValue::Copy (
void)
const
999 ProtocolTlvValue* tmp =
new ProtocolTlvValue ();
1000 for (std::vector<uint8_t>::const_iterator iter = m_protocol->begin (); iter != m_protocol->end (); ++iter)
1009 Ipv4AddressTlvValue::Ipv4AddressTlvValue ()
1011 m_ipv4Addr =
new std::vector<struct ipv4Addr>;
1014 Ipv4AddressTlvValue::~Ipv4AddressTlvValue ()
1016 m_ipv4Addr->clear ();
1017 if (m_ipv4Addr != 0)
1025 Ipv4AddressTlvValue::GetSerializedSize (
void)
const
1027 return m_ipv4Addr->size () *
sizeof(
struct ipv4Addr);
1031 Ipv4AddressTlvValue::Serialize (Buffer::Iterator i)
const
1033 for (std::vector<struct ipv4Addr>::const_iterator iter = m_ipv4Addr->begin (); iter != m_ipv4Addr->end (); ++iter)
1035 i.WriteHtonU32 ((*iter).Address.Get ());
1036 i.WriteHtonU32 ((*iter).Mask.Get ());
1041 Ipv4AddressTlvValue::Deserialize (Buffer::Iterator i, uint64_t valueLength)
1044 while (len < valueLength)
1046 uint32_t addr = i.ReadNtohU32 ();
1047 uint32_t mask = i.ReadNtohU32 ();
1048 Add (Ipv4Address (addr), Ipv4Mask (mask));
1055 Ipv4AddressTlvValue::Add (Ipv4Address address, Ipv4Mask Mask)
1057 struct ipv4Addr tmp;
1058 tmp.Address = address;
1060 m_ipv4Addr->push_back (tmp);
1063 Ipv4AddressTlvValue::Iterator
1064 Ipv4AddressTlvValue::Begin ()
const
1066 return m_ipv4Addr->begin ();
1069 Ipv4AddressTlvValue::Iterator
1070 Ipv4AddressTlvValue::End ()
const
1072 return m_ipv4Addr->end ();
1075 Ipv4AddressTlvValue *
1076 Ipv4AddressTlvValue::Copy (
void)
const
1078 Ipv4AddressTlvValue * tmp =
new Ipv4AddressTlvValue ();
1079 for (std::vector<struct ipv4Addr>::const_iterator iter = m_ipv4Addr->begin (); iter != m_ipv4Addr->end (); ++iter)
1081 tmp->Add ((*iter).Address, (*iter).Mask);
virtual uint32_t Deserialize(Buffer::Iterator start)
#define NS_LOG_COMPONENT_DEFINE(name)
#define NS_FATAL_ERROR(msg)
fatal error handling
iterator in a Buffer instance
The value field of a tlv can take different values (uint8_t, uint16, vector...). This class is a virt...
virtual void Serialize(Buffer::Iterator start) const
virtual TypeId GetInstanceTypeId(void) const
virtual uint32_t GetSerializedSize(void) const
#define NS_ASSERT_MSG(condition, message)
void WriteU8(uint8_t data)
virtual void Print(std::ostream &os) const
a unique identifier for an interface.