1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
/*
* Dibbler - a portable DHCPv6
*
* authors: Tomasz Mrugalski <thomson@klub.com.pl>
* Marek Senderski <msend@o2.pl>
*
* released under GNU GPL v2 only licence
*
*/
#include "Logger.h"
#include "RelMsg.h"
#include "RelMsgRelayRepl.h"
#include "SmartPtr.h"
int TRelMsgRelayRepl::getSize() {
int pktsize=0;
TOptList::iterator opt;
for (opt = Options.begin(); opt!=Options.end(); ++opt)
{
pktsize += (*opt)->getSize();
}
return pktsize + MIN_RELAYREPL_LEN;
}
TRelMsgRelayRepl::TRelMsgRelayRepl(int iface, SPtr<TIPv6Addr> addr, char * data, int dataLen)
:TRelMsg(iface, addr, 0, 0) // 0,0 - avoid decoding anything
{
this->MsgType = RELAY_REPL_MSG;
if (dataLen < MIN_RELAYREPL_LEN) {
Log(Warning) << "Truncated RELAY_REPL message received." << LogEnd;
return;
}
this->MsgType = data[0]; // ignored
this->HopCount = data[1];
if (this->HopCount >= HOP_COUNT_LIMIT) {
Log(Warning) << "RelayForw with hopLimit " << this->HopCount << " received (max. allowed is " << HOP_COUNT_LIMIT
<< ". Message dropped." << LogEnd;
return;
}
this->LinkAddr = new TIPv6Addr(data+2, false);
this->PeerAddr = new TIPv6Addr(data+18, false);
data += 34;
dataLen -= 34;
// decode options
this->decodeOpts(data, dataLen);
}
bool TRelMsgRelayRepl::check() {
return true;
}
std::string TRelMsgRelayRepl::getName() const {
return "RELAY_REPL";
}
int TRelMsgRelayRepl::storeSelf(char * buffer)
{
char *start = buffer;
*(buffer++) = (char)this->MsgType;
*(buffer++) = (char)this->HopCount;
this->LinkAddr->storeSelf(buffer);
buffer += 16;
this->PeerAddr->storeSelf(buffer);
buffer += 16;
TOptList::iterator option;
for (option=Options.begin(); option!=Options.end(); ++option) {
(*option)->storeSelf(buffer);
buffer += (*option)->getSize();
}
return buffer-start;
}
|