00001
00002 #ifndef PACKET_H
00003 #define PACKET_H
00004
00005 #include <map>
00006 #include <iostream>
00007 #include <iomanip>
00008 using namespace std;
00009 #include <boost/shared_ptr.hpp>
00010
00011 #include "utility.hpp"
00012 #include "sim_time.hpp"
00013 #include "node.hpp"
00014
00018 class PacketData {
00019 public:
00021 typedef boost::shared_ptr<PacketData> PacketDataPtr;
00022
00024 virtual ~PacketData() {}
00025
00030 static inline PacketDataPtr create()
00031 {
00032 PacketDataPtr p(new PacketData());
00033 return p;
00034 }
00035
00040 static inline PacketDataPtr create(const PacketData& rhs)
00041 {
00042 return rhs.clone();
00043 }
00044
00049 virtual inline t_uint getSizeInBytes() const
00050 {
00051 return m_DEFAULT_SIZE_IN_BYTES;
00052 }
00053
00057 virtual inline ostream& print(ostream& s) const
00058 {
00059 return s << "sizeInBytes=" << getSizeInBytes();
00060 }
00061
00062 protected:
00063
00065 PacketData() {}
00066
00068 PacketData(const PacketData& rhs) {}
00069
00076 virtual PacketDataPtr clone() const
00077 {
00078 PacketDataPtr p(new PacketData(*this));
00079 return p;
00080 }
00081
00082 private:
00083
00085 static const t_uint m_DEFAULT_SIZE_IN_BYTES = 32;
00086
00088 PacketData& operator= (const PacketData& rhs);
00089
00090 };
00091 typedef boost::shared_ptr<PacketData> PacketDataPtr;
00092
00097 class Packet {
00098 friend ostream& operator<< (ostream& s, const Packet& packet);
00099 public:
00101 typedef boost::shared_ptr<Packet> PacketPtr;
00102
00107 enum DataTypes {
00108 DataTypes_Physical,
00109 DataTypes_Link,
00110 DataTypes_Network,
00111 DataTypes_Transport,
00112 DataTypes_Application
00113 };
00114
00116 typedef map<DataTypes,PacketDataPtr> DataTypeMap;
00117
00119 virtual ~Packet();
00120
00125 static inline PacketPtr create();
00126
00131 static inline PacketPtr create(const Packet& rhs);
00132
00138 inline t_uint getSizeInBytes() const;
00139
00145 inline t_uint getSizeInBits() const;
00146
00152 inline double getDataRate() const;
00153
00159 inline void setDataRate(double dataRate);
00160
00166 inline bool getHasError() const;
00167
00174 inline void setHasError(bool hasError);
00175
00180 SimTime getDuration() const;
00181
00191 void addData(DataTypes dataType, const PacketData& data);
00192
00200 PacketDataPtr getData(DataTypes dataType);
00201
00209 bool removeData(DataTypes dataTypes);
00210
00219 bool hasUpperLayerData(DataTypes dataTypes);
00220
00228 inline void setDestination(const NodeId& destination);
00229
00237 inline NodeId getDestination() const;
00238
00254 inline void setTxPower(double txPower);
00255
00271 inline double getTxPower() const;
00272
00284 inline void setDoMaxTxPower(bool doMaxTxPower);
00285
00297 inline bool getDoMaxTxPower() const;
00298
00304 inline t_ulong getUniqueId() const;
00305
00306 protected:
00307
00309 Packet();
00310
00312 Packet(const Packet& rhs);
00313
00320 virtual PacketPtr clone() const;
00321
00322 private:
00323
00326 static const t_uint m_DEFAULT_SIZE_IN_BYTES;
00327
00329 static const double m_DEFAULT_DATA_RATE;
00330
00332 static const t_uint m_DEFAULT_DESTINATION;
00333
00336 static t_ulong m_nextUniqueId;
00337
00341 double m_dataRate;
00342
00348 double m_txPower;
00349
00355 bool m_doMaxTxPower;
00356
00360 bool m_hasError;
00361
00367 DataTypeMap m_data;
00368
00375 NodeId m_destination;
00376
00380 t_ulong m_uniqueId;
00381
00383 Packet& operator= (const Packet& rhs);
00384
00385 };
00386
00387 typedef boost::shared_ptr<Packet> PacketPtr;
00388 typedef boost::shared_ptr<Packet const> ConstPacketPtr;
00389
00391
00393
00394 inline PacketPtr Packet::create()
00395 {
00396 PacketPtr p(new Packet());
00397 p->m_uniqueId = Packet::m_nextUniqueId++;
00398 return p;
00399 }
00400
00401 inline PacketPtr Packet::create(const Packet& rhs)
00402 {
00403 return rhs.clone();
00404 }
00405
00406 inline t_uint Packet::getSizeInBytes() const
00407 {
00408
00409 t_uint sizeInBytes = m_DEFAULT_SIZE_IN_BYTES;
00410
00411
00412
00413
00414 if(m_data.begin() != m_data.end()) {
00415 sizeInBytes = 0;
00416 DataTypeMap::const_iterator p;
00417 for(p = m_data.begin(); p != m_data.end(); ++p) {
00418 sizeInBytes += p->second->getSizeInBytes();
00419 }
00420 }
00421
00422 return sizeInBytes;
00423 }
00424
00425 inline t_uint Packet::getSizeInBits() const
00426 {
00427 return (getSizeInBytes() * 8);
00428 }
00429
00430 inline double Packet::getDataRate() const
00431 {
00432 return m_dataRate;
00433 }
00434
00435 inline void Packet::setDataRate(double dataRate)
00436 {
00437 assert(dataRate > 0.0);
00438 m_dataRate = dataRate;
00439 }
00440
00441 inline bool Packet::getHasError() const
00442 {
00443 return m_hasError;
00444 }
00445
00446 inline void Packet::setHasError(bool hasError)
00447 {
00448 m_hasError = hasError;
00449 }
00450
00451 inline void Packet::setDestination(const NodeId& destination)
00452 {
00453 m_destination = destination;
00454 }
00455
00456 inline NodeId Packet::getDestination() const
00457 {
00458 return m_destination;
00459 }
00460
00461 inline void Packet::setTxPower(double txPower)
00462 {
00463 assert(txPower >= 0.0);
00464 m_txPower = txPower;
00465 }
00466
00467 inline double Packet::getTxPower() const
00468 {
00469 return m_txPower;
00470 }
00471
00472 inline void Packet::setDoMaxTxPower(bool doMaxTxPower)
00473 {
00474 m_doMaxTxPower = doMaxTxPower;
00475 }
00476
00477 inline bool Packet::getDoMaxTxPower() const
00478 {
00479 return m_doMaxTxPower;
00480 }
00481
00482 inline t_ulong Packet::getUniqueId() const
00483 {
00484 return m_uniqueId;
00485 }
00486
00488
00490
00491 inline ostream& operator<< (ostream& s,
00492 const Packet::DataTypes& dataType)
00493 {
00494 switch(dataType) {
00495 case Packet::DataTypes_Physical:
00496 s << "physical";
00497 break;
00498 case Packet::DataTypes_Link:
00499 s << "link";
00500 break;
00501 case Packet::DataTypes_Network:
00502 s << "network";
00503 break;
00504 case Packet::DataTypes_Transport:
00505 s << "transport";
00506 break;
00507 case Packet::DataTypes_Application:
00508 s << "application";
00509 break;
00510 }
00511 s << "LayerData";
00512 return s;
00513 }
00514
00515 inline ostream& operator<< (ostream& s, const PacketData& data)
00516 {
00517 return data.print(s);
00518 }
00519
00520 inline ostream& operator<< (ostream& s, const Packet& packet)
00521 {
00522 ostringstream powerStream;
00523 if(packet.getDoMaxTxPower()) {
00524 powerStream << ", doMaxTxPower=" << boolalpha <<
00525 packet.getDoMaxTxPower();
00526 } else {
00527 powerStream << ", txPower=" << packet.getTxPower();
00528 }
00529
00530
00531 s << "[ packetState " <<
00532 "uniqueId=" << packet.getUniqueId() <<
00533 ", sizeInBytes=" << packet.getSizeInBytes() <<
00534 powerStream.str() <<
00535 ", dataRate=" << packet.getDataRate() <<
00536 ", durationInSeconds=" << setprecision(8) <<
00537 packet.getDuration() <<
00538 ", hasError=" << boolalpha << packet.getHasError() << " ]";
00539
00540 typedef map<Packet::DataTypes,PacketDataPtr> DataTypeMap;
00541
00542 if(packet.m_data.begin() != packet.m_data.end()) {
00543 DataTypeMap::const_iterator p;
00544 for(p = packet.m_data.begin(); p != packet.m_data.end(); ++p) {
00545 s << " [ " << p->first << " " << *p->second << " ]";
00546 }
00547 }
00548 return s;
00549 }
00550
00551 #endif // PACKET_H
00552