A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
dsr-option-header.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011 Yufei Cheng
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Yufei Cheng <yfcheng@ittc.ku.edu>
19  *
20  * James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
21  * ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets
22  * Information and Telecommunication Technology Center (ITTC)
23  * and Department of Electrical Engineering and Computer Science
24  * The University of Kansas Lawrence, KS USA.
25  *
26  * Work supported in part by NSF FIND (Future Internet Design) Program
27  * under grant CNS-0626918 (Postmodern Internet Architecture),
28  * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI),
29  * US Department of Defense (DoD), and ITTC at The University of Kansas.
30  */
31 
32 #ifndef DSR_OPTION_HEADER_H
33 #define DSR_OPTION_HEADER_H
34 
35 #include <ostream>
36 #include <algorithm>
37 
38 #include "ns3/header.h"
39 #include "ns3/ipv4-address.h"
40 #include "ns3/simulator.h"
41 
42 namespace ns3 {
43 
44 class Time;
45 namespace dsr {
50 class DsrOptionHeader : public Header
51 {
52 public:
57  struct Alignment
58  {
59  uint8_t factor;
60  uint8_t offset;
61  };
66  static TypeId GetTypeId ();
71  virtual TypeId GetInstanceTypeId () const;
75  DsrOptionHeader ();
79  virtual ~DsrOptionHeader ();
84  void SetType (uint8_t type);
89  uint8_t GetType () const;
94  void SetLength (uint8_t length);
99  uint8_t GetLength () const;
105  virtual void Print (std::ostream &os) const;
110  virtual uint32_t GetSerializedSize () const;
115  virtual void Serialize (Buffer::Iterator start) const;
121  virtual uint32_t Deserialize (Buffer::Iterator start);
129  virtual Alignment GetAlignment () const;
130 
131 private:
135  uint8_t m_type;
139  uint8_t m_length;
144 };
145 
151 {
152 public:
157  static TypeId GetTypeId ();
162  virtual TypeId GetInstanceTypeId () const;
170  virtual ~DsrOptionPad1Header ();
176  virtual void Print (std::ostream &os) const;
181  virtual uint32_t GetSerializedSize () const;
186  virtual void Serialize (Buffer::Iterator start) const;
192  virtual uint32_t Deserialize (Buffer::Iterator start);
193 };
194 
200 {
201 public:
206  static TypeId GetTypeId ();
211  virtual TypeId GetInstanceTypeId () const;
216  DsrOptionPadnHeader (uint32_t pad = 2);
220  virtual ~DsrOptionPadnHeader ();
226  virtual void Print (std::ostream &os) const;
231  virtual uint32_t GetSerializedSize () const;
236  virtual void Serialize (Buffer::Iterator start) const;
242  virtual uint32_t Deserialize (Buffer::Iterator start);
243 };
244 
273 {
274 public:
279  static TypeId GetTypeId ();
284  virtual TypeId GetInstanceTypeId () const;
292  virtual ~DsrOptionRreqHeader ();
297  void SetNumberAddress (uint8_t n);
307  void SetTarget (Ipv4Address target);
312  void SetNodesAddress (std::vector<Ipv4Address> ipv4Address);
317  std::vector<Ipv4Address> GetNodesAddresses () const;
322  uint32_t GetNodesNumber () const;
327  void AddNodeAddress (Ipv4Address ipv4);
333  void SetNodeAddress (uint8_t index, Ipv4Address addr);
339  Ipv4Address GetNodeAddress (uint8_t index) const;
344  void SetDataLength (uint32_t dataLength);
349  uint32_t GetDataLength () const;
354  void SetId (uint16_t identification);
359  uint16_t GetId () const;
365  virtual void Print (std::ostream &os) const;
370  virtual uint32_t GetSerializedSize () const;
375  virtual void Serialize (Buffer::Iterator start) const;
381  virtual uint32_t Deserialize (Buffer::Iterator start);
386  virtual Alignment GetAlignment () const;
387 
388 private:
392  uint32_t m_dataLength;
397  /*
398  * Ipv4 address of target node
399  */
401  /*
402  * Ipv4 address to write when desearizing the packet
403  */
408  typedef std::vector<Ipv4Address> VectorIpv4Address_t;
413 };
414 
440 // The Route Reply header modified for ns-3 implementation
463 {
464 public:
469  static TypeId GetTypeId ();
474  virtual TypeId GetInstanceTypeId () const;
482  virtual ~DsrOptionRrepHeader ();
487  void SetNumberAddress (uint8_t n);
492  void SetNodesAddress (std::vector<Ipv4Address> ipv4Address);
497  std::vector<Ipv4Address> GetNodesAddress () const;
498  /*
499  * \brief Get the target node Ip address
500  * \return the target address
501  */
502  Ipv4Address GetTargetAddress (std::vector<Ipv4Address> ipv4Address) const;
508  void SetNodeAddress (uint8_t index, Ipv4Address addr);
514  Ipv4Address GetNodeAddress (uint8_t index) const;
515  /*
516  * \brief Search the next hop Ipv4 address
517  * \param Our own IP address
518  * \return The next hop address of the route
519  */
520  Ipv4Address SearchNextHop (Ipv4Address ipv4Address);
526  virtual void Print (std::ostream &os) const;
531  virtual uint32_t GetSerializedSize () const;
536  virtual void Serialize (Buffer::Iterator start) const;
542  virtual uint32_t Deserialize (Buffer::Iterator start);
547  virtual Alignment GetAlignment () const;
548 
549 private:
550  /*
551  * The Ip address to write to when deserialize the packet
552  */
557  typedef std::vector<Ipv4Address> VectorIpv4Address_t;
562 };
563 
590 {
591 public:
596  static TypeId GetTypeId ();
601  virtual TypeId GetInstanceTypeId () const;
609  virtual ~DsrOptionSRHeader ();
610  /*
611  * \brief Set the number of segments left to send
612  * \param The segments left
613  */
614  void SetSegmentsLeft (uint8_t segmentsLeft);
615  /*
616  * \brief Get the number of segments left to send
617  * \return The segments left
618  */
619  uint8_t GetSegmentsLeft () const;
624  void SetNumberAddress (uint8_t n);
629  void SetNodesAddress (std::vector<Ipv4Address> ipv4Address);
634  std::vector<Ipv4Address> GetNodesAddress () const;
635  /*
636  * \brief Get the node list size which is the number of ip address of the route
637  * \return the node list size
638  */
639  uint8_t GetNodeListSize () const;
645  void SetNodeAddress (uint8_t index, Ipv4Address addr);
651  Ipv4Address GetNodeAddress (uint8_t index) const;
652  /*
653  * \brief Set the salvage value for a packet
654  * \param The salvage value of the packet
655  */
656  void SetSalvage (uint8_t salvage);
657  /*
658  * \brief Get the salvage value for a packet
659  * \return The salvage value of the packet
660  */
661  uint8_t GetSalvage () const;
667  virtual void Print (std::ostream &os) const;
672  virtual uint32_t GetSerializedSize () const;
677  virtual void Serialize (Buffer::Iterator start) const;
683  virtual uint32_t Deserialize (Buffer::Iterator start);
688  virtual Alignment GetAlignment () const;
689 
690 private:
698  uint8_t m_segmentsLeft;
702  uint8_t m_salvage;
706  typedef std::vector<Ipv4Address> VectorIpv4Address_t;
711 };
712 
738 // / Error type
740 {
741  NODE_UNREACHABLE = 1, // !< NODE_UNREACHABLE
742  FLOW_STATE_NOT_SUPPORTED = 2, // !< FLOW_STATE_NOT_SUPPORTED
743  OPTION_NOT_SUPPORTED = 3, // !< OPTION_NOT_SUPPORTED
744 };
745 
747 {
748 public:
753  static TypeId GetTypeId ();
758  virtual TypeId GetInstanceTypeId () const;
766  virtual ~DsrOptionRerrHeader ();
771  void SetErrorType (uint8_t errorType);
776  uint8_t GetErrorType () const;
781  virtual void SetErrorSrc (Ipv4Address errorSrcAddress);
786  virtual Ipv4Address GetErrorSrc () const;
790  virtual void SetSalvage (uint8_t salvage);
795  virtual uint8_t GetSalvage () const;
800  virtual void SetErrorDst (Ipv4Address errorDstAddress);
805  virtual Ipv4Address GetErrorDst () const;
811  virtual void Print (std::ostream &os) const;
816  virtual uint32_t GetSerializedSize () const;
821  virtual void Serialize (Buffer::Iterator start) const;
827  virtual uint32_t Deserialize (Buffer::Iterator start);
832  virtual Alignment GetAlignment () const;
833 
834 private:
838  uint8_t m_optDataLen;
842  uint8_t m_errorType;
846  uint8_t m_reserved;
850  uint8_t m_salvage;
854  uint16_t m_errorLength;
867 };
868 
888 /*
889  * \brief The type-specific info field
890  * \verbatim
891  | 0 | 1 | 2 | 3 |
892  0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
893  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
894  | Unreachable Node Address |
895  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
896  \endverbatim
897  */
898 
900 {
901 public:
906  static TypeId GetTypeId ();
911  virtual TypeId GetInstanceTypeId () const;
919  virtual ~DsrOptionRerrUnreachHeader ();
924  virtual void SetErrorSrc (Ipv4Address errorSrcAddress);
929  virtual Ipv4Address GetErrorSrc () const;
933  virtual void SetSalvage (uint8_t salvage);
938  virtual uint8_t GetSalvage () const;
943  virtual void SetErrorDst (Ipv4Address errorDstAddress);
948  virtual Ipv4Address GetErrorDst () const;
953  void SetUnreachNode (Ipv4Address unreachNode);
958  Ipv4Address GetUnreachNode () const;
963  void SetOriginalDst (Ipv4Address originalDst);
968  Ipv4Address GetOriginalDst () const;
974  virtual void Print (std::ostream &os) const;
979  virtual uint32_t GetSerializedSize () const;
984  virtual void Serialize (Buffer::Iterator start) const;
990  virtual uint32_t Deserialize (Buffer::Iterator start);
995  virtual Alignment GetAlignment () const;
996 
997 private:
1001  uint8_t m_optDataLen;
1005  uint8_t m_errorType;
1009  uint8_t m_reserved;
1013  uint8_t m_salvage;
1033  uint16_t m_typeSpecific;
1034 };
1035 
1055 /*
1056  * \brief The type-specific info field
1057  * \unsupported option
1058  * \verbatim
1059  | 0 |
1060  0 1 2 3 4 5 6 7
1061  +-+-+-+-+-+-+-+-+
1062  |Unsupported Opt|
1063  +-+-+-+-+-+-+-+-+
1064  \endverbatim
1065  */
1066 
1068 {
1069 public:
1074  static TypeId GetTypeId ();
1079  virtual TypeId GetInstanceTypeId () const;
1087  virtual ~DsrOptionRerrUnsupportHeader ();
1092  virtual void SetErrorSrc (Ipv4Address errorSrcAddress);
1097  virtual Ipv4Address GetErrorSrc () const;
1101  virtual void SetSalvage (uint8_t salvage);
1106  virtual uint8_t GetSalvage () const;
1111  virtual void SetErrorDst (Ipv4Address errorDstAddress);
1116  virtual Ipv4Address GetErrorDst () const;
1121  void SetUnsupported (uint16_t optionType);
1126  uint16_t GetUnsupported () const;
1132  virtual void Print (std::ostream &os) const;
1137  virtual uint32_t GetSerializedSize () const;
1142  virtual void Serialize (Buffer::Iterator start) const;
1148  virtual uint32_t Deserialize (Buffer::Iterator start);
1153  virtual Alignment GetAlignment () const;
1154 
1155 private:
1159  uint8_t m_optDataLen;
1163  uint8_t m_errorType;
1167  uint8_t m_reserved;
1171  uint8_t m_salvage;
1183  uint16_t m_unsupport;
1184 };
1185 
1204 {
1205 public:
1210  static TypeId GetTypeId ();
1215  virtual TypeId GetInstanceTypeId () const;
1223  virtual ~DsrOptionAckReqHeader ();
1228  void SetAckId (uint16_t identification);
1233  uint16_t GetAckId () const;
1239  virtual void Print (std::ostream &os) const;
1244  virtual uint32_t GetSerializedSize () const;
1249  virtual void Serialize (Buffer::Iterator start) const;
1255  virtual uint32_t Deserialize (Buffer::Iterator start);
1260  virtual Alignment GetAlignment () const;
1261 
1262 private:
1263  /*
1264  * The option data length
1265  */
1266  uint8_t m_optDataLen;
1267  /*
1268  * The identification field
1269  */
1271 };
1272 
1295 {
1296 public:
1301  static TypeId GetTypeId ();
1306  virtual TypeId GetInstanceTypeId () const;
1310  DsrOptionAckHeader ();
1314  virtual ~DsrOptionAckHeader ();
1319  void SetAckId (uint16_t identification);
1324  uint16_t GetAckId () const;
1329  void SetRealSrc (Ipv4Address realSrcAddress);
1334  Ipv4Address GetRealSrc () const;
1339  void SetRealDst (Ipv4Address realDstAddress);
1344  Ipv4Address GetRealDst () const;
1350  virtual void Print (std::ostream &os) const;
1355  virtual uint32_t GetSerializedSize () const;
1360  virtual void Serialize (Buffer::Iterator start) const;
1366  virtual uint32_t Deserialize (Buffer::Iterator start);
1371  virtual Alignment GetAlignment () const;
1372 
1373 private:
1377  uint8_t m_optDataLen;
1390 };
1391 
1392 static inline std::ostream & operator<< (std::ostream& os, const DsrOptionSRHeader & sr)
1393 {
1394  sr.Print (os);
1395  return os;
1396 }
1397 
1398 } // namespace dsr
1399 } // namespace ns3
1400 
1401 #endif /* DSR_OPTION_HEADER_H */