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