00001 #ifndef D__UCMetricPacket 00002 #define D__UCMetricPacket 00003 00004 #include <gea/ObjRepository.h> 00005 #include <gea/Blocker.h> 00006 #include <gea/API.h> 00007 00008 #include <awds/packettypes.h> 00009 #include <awds/TraceUcPacket.h> 00010 #include <awds/AwdsRouting.h> 00011 #include <awds/ext/Shell.h> 00012 #include <awds/Topology.h> 00013 #include <awds/toArray.h> 00014 00015 #include <awds/Flood.h> 00016 00017 namespace awds { 00018 00019 class UCMetricPacket : public UnicastPacket { 00020 public: 00021 enum Type {req,resp,first,second}; 00022 static const size_t OffsetSeq = UnicastPacket::UnicastPacketEnd; 00023 static const size_t OffsetType = OffsetSeq+sizeof(unsigned int); 00024 static const size_t OffsetOriginator = OffsetType+sizeof(Type); 00025 static const size_t OffsetTime1 = OffsetOriginator+sizeof(NodeId); 00026 static const size_t OffsetTime2 = OffsetTime1+sizeof(gea::AbsTime); 00027 static const size_t OffsetDuration = OffsetTime2+sizeof(gea::AbsTime); 00028 static const size_t MetricHeaderEnd = OffsetDuration+sizeof(gea::Duration); 00029 UCMetricPacket(BasePacket &p); 00030 UCMetricPacket(BasePacket &p,Type t,unsigned int ttl,unsigned int seq,gea::AbsTime time); 00031 UCMetricPacket(BasePacket &p,Type t,unsigned int ttl,unsigned int seq,gea::Duration duration); 00032 00033 void setSeq(unsigned int s) { 00034 *((unsigned int*)&packet.buffer[OffsetSeq]) = s; 00035 } 00036 unsigned int getSeq() { 00037 return *((unsigned int*)&packet.buffer[OffsetSeq]); 00038 } 00039 void setType(Type t) { 00040 packet.buffer[OffsetType] = t; 00041 } 00042 Type getType() { 00043 return static_cast<Type>(packet.buffer[OffsetType]); 00044 } 00045 void setOriginator(const NodeId& id) { 00046 id.toArray(&packet.buffer[OffsetOriginator]); 00047 } 00048 00049 void getOriginator(NodeId& id) const { 00050 id.fromArray(&packet.buffer[OffsetOriginator]); 00051 } 00052 00053 void setTime1(gea::AbsTime t) { 00054 *((gea::AbsTime*)&packet.buffer[OffsetTime1]) = t; 00055 } 00056 00057 gea::AbsTime getTime1() { 00058 return *((gea::AbsTime*)&packet.buffer[OffsetTime1]); 00059 } 00060 00061 void setDuration(gea::Duration d) { 00062 *((gea::Duration*)&packet.buffer[OffsetDuration]) = d; 00063 } 00064 00065 gea::Duration getDuration() { 00066 return *((gea::Duration*)&packet.buffer[OffsetDuration]); 00067 } 00068 }; 00069 00070 } 00071 00072 #endif // D__UCMetricPacket