diff -r b3db7d51f260 -r efad81f3cb47 src/dsr/model/dsr-fs-header.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dsr/model/dsr-fs-header.h Fri Jan 27 15:15:48 2012 -0800 @@ -0,0 +1,339 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2011 Yufei Cheng + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Yufei Cheng + * + * James P.G. Sterbenz , director + * ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets + * Information and Telecommunication Technology Center (ITTC) + * and Department of Electrical Engineering and Computer Science + * The University of Kansas Lawrence, KS USA. + * + * Work supported in part by NSF FIND (Future Internet Design) Program + * under grant CNS-0626918 (Postmodern Internet Architecture), + * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI), + * US Department of Defense (DoD), and ITTC at The University of Kansas. + */ + +#ifndef DSR_FS_HEADER_H +#define DSR_FS_HEADER_H + +#include +#include +#include + +#include "ns3/header.h" +#include "ns3/ipv4-address.h" +#include "dsr-option-header.h" + +namespace ns3 { +namespace dsr { +/** + * \class DsrHeader + * \brief Header for Dsr Routing. + */ + +/** +* \ingroup dsr +* \brief Dsr fixed size header Format + \verbatim + | 0 | 1 | 2 | 3 | + 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next Header |F| Reservd | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Options | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + \endverbatim +*/ + +/** +* \ingroup dsr +* \brief The modified version of Dsr fixed size header Format + \verbatim + | 0 | 1 | 2 | 3 | + 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next Header |F| Message Type | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Source Id | Dest Id | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Options | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + \endverbatim +*/ + +enum DsrMessageType +{ + DSR_CONTROL_PACKET = 1, + DSR_DATA_PACKET = 2 +}; + +class DsrFsHeader : public Header +{ +public: + /** + * \brief Get the type identificator. + * \return type identificator + */ + static TypeId GetTypeId (); + /** + * \brief Get the instance type ID. + * \return instance type ID + */ + virtual TypeId GetInstanceTypeId () const; + /** + * \brief Constructor. + */ + DsrFsHeader (); + /** + * \brief Destructor. + */ + virtual ~DsrFsHeader (); + /** + * \brief Set the "Next header" field. + * \param nextHeader the next header number + */ + void SetNextHeader (uint8_t protocol); + /** + * \brief Get the next header. + * \return the next header number + */ + uint8_t GetNextHeader () const; + /** + * brief Set the message type of the header. + * \param message type the message type of the header + */ + void SetMessageType (uint8_t messageType); + /** + * brief Get the message type of the header. + * \return message type the message type of the header + */ + uint8_t GetMessageType () const; + /** + * brief Set the source id of the header. + * \param source id the source id of the header + */ + void SetSourceId (uint16_t sourceId); + /** + * brief Get the source id of the header. + * \return source id the source id of the header + */ + uint16_t GetSourceId () const; + /** + * brief Set the dest id of the header. + * \param dest id the dest id of the header + */ + void SetDestId (uint16_t destId); + /** + * brief Get the dest id of the header. + * \return dest id the dest id of the header + */ + uint16_t GetDestId () const; + /** + * brief Set the payload length of the header. + * \param length the payload length of the header in bytes + */ + void SetPayloadLength (uint16_t length); + /** + * \brief Get the payload length of the header. + * \return the payload length of the header + */ + uint16_t GetPayloadLength () const; + /** + * \brief Print some informations about the packet. + * \param os output stream + * \return info about this packet + */ + virtual void Print (std::ostream &os) const; + /** + * \brief Get the serialized size of the packet. + * \return size + */ + virtual uint32_t GetSerializedSize () const; + /** + * \brief Serialize the packet. + * \param start Buffer iterator + */ + virtual void Serialize (Buffer::Iterator start) const; + /** + * \brief Deserialize the packet. + * \param start Buffer iterator + * \return size of the packet + */ + virtual uint32_t Deserialize (Buffer::Iterator start); + +private: + /** + * \brief The "next header" field. + */ + uint8_t m_nextHeader; + /** + * \brief The type of the message. + */ + uint8_t m_messageType; + /** + * \brief The "payload length" field. + */ + uint16_t m_payloadLen; + /** + * \brief The source node id + */ + uint16_t m_sourceId; + /** + * \brief The destination node id + */ + uint16_t m_destId; + /** + * \brief The data of the extension. + */ + Buffer m_data; +}; + +/** + * \class OptionField + * \brief Option field for an DsrFsHeader + * Enables adding options to an DsrFsHeader + * + * Implementor's note: Make sure to add the result of + * OptionField::GetSerializedSize () to your DsrFsHeader::GetSerializedSize () + * return value. Call OptionField::Serialize and OptionField::Deserialize at the + * end of your corresponding DsrFsHeader methods. + */ +class DsrOptionField +{ +public: + /** + * \brief Constructor. + * \param optionsOffset option offset + */ + DsrOptionField (uint32_t optionsOffset); + /** + * \brief Destructor. + */ + ~DsrOptionField (); + /** + * \brief Get the serialized size of the packet. + * \return size + */ + uint32_t GetSerializedSize () const; + /** + * \brief Serialize all added options. + * \param start Buffer iterator + */ + void Serialize (Buffer::Iterator start) const; + /** + * \brief Deserialize the packet. + * \param start Buffer iterator + * \param length length + * \return size of the packet + */ + uint32_t Deserialize (Buffer::Iterator start, uint32_t length); + /** + * \brief Serialize the option, prepending pad1 or padn option as necessary + * \param option the option header to serialize + */ + void AddDsrOption (DsrOptionHeader const& option); + /** + * \brief Get the offset where the options begin, measured from the start of + * the extension header. + * \return the offset from the start of the extension header + */ + uint32_t GetDsrOptionsOffset (); + /** + * \brief Get the buffer. + * \return buffer + */ + Buffer GetDsrOptionBuffer (); + +private: + /** + * \brief Calculate padding. + * \param alignment alignment + */ + uint32_t CalculatePad (DsrOptionHeader::Alignment alignment) const; + /** + * \brief Data payload. + */ + Buffer m_optionData; + /** + * \brief Offset. + */ + uint32_t m_optionsOffset; +}; + +/** + * \class DsrRoutingHeader + * \brief Header of Dsr Routing + */ +class DsrRoutingHeader : public DsrFsHeader, + public DsrOptionField +{ +public: + /** + * \brief Get the type identificator. + * \return type identificator + */ + static TypeId GetTypeId (); + /** + * \brief Get the instance type ID. + * \return instance type ID + */ + virtual TypeId GetInstanceTypeId () const; + /** + * \brief Constructor. + */ + DsrRoutingHeader (); + /** + * \brief Destructor. + */ + virtual ~DsrRoutingHeader (); + /** + * \brief Print some informations about the packet. + * \param os output stream + * \return info about this packet + */ + virtual void Print (std::ostream &os) const; + /** + * \brief Get the serialized size of the packet. + * \return size + */ + virtual uint32_t GetSerializedSize () const; + /** + * \brief Serialize the packet. + * \param start Buffer iterator + */ + virtual void Serialize (Buffer::Iterator start) const; + /** + * \brief Deserialize the packet. + * \param start Buffer iterator + * \return size of the packet + */ + virtual uint32_t Deserialize (Buffer::Iterator start); +}; + +static inline std::ostream & operator<< (std::ostream& os, const DsrRoutingHeader & dsr) +{ + dsr.Print (os); + return os; +} + +} // namespace dsr +} // namespace ns3 + +#endif /* DSR_FS_HEADER_H */ +