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 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/*
* Dibbler - a portable DHCPv6
*
* authors: Tomasz Mrugalski <thomson@klub.com.pl>
* Marek Senderski <msend@o2.pl>
*
* released under GNU GPL v2 licence
*
*/
//#include <netinet/in.h>
#include <string.h>
#include "Portable.h"
#include "DHCPConst.h"
#include "Opt.h"
#include "OptIAAddress.h"
TOptIAAddress::TOptIAAddress(char * &buf, int& n, TMsg* parent)
:TOpt(OPTION_IAADDR, parent), Valid_(false)
{
if ( n >= 24) {
Addr_ = new TIPv6Addr(buf);
buf += 16;
n -= 16;
PrefLifetime_ = readUint32(buf);
buf += sizeof(uint32_t);
n -= sizeof(uint32_t);
ValidLifetime_ = readUint32(buf);
buf += sizeof(uint32_t);
n -= sizeof(uint32_t);
Valid_ = true;
}
}
TOptIAAddress::TOptIAAddress(SPtr<TIPv6Addr> addr, unsigned long pref,
unsigned long valid, TMsg* parent)
:TOpt(OPTION_IAADDR, parent), Valid_(true) {
if(addr)
Addr_ = addr;
else
Addr_ = new TIPv6Addr();
PrefLifetime_ = pref;
ValidLifetime_ = valid;
}
size_t TOptIAAddress::getSize() {
int mySize = 28;
return mySize + getSubOptSize();
}
void TOptIAAddress::setPref(unsigned long pref) {
PrefLifetime_ = pref;
}
void TOptIAAddress::setValid(unsigned long valid) {
ValidLifetime_ = valid;
}
char * TOptIAAddress::storeSelf( char* buf)
{
buf = writeUint16(buf, OptType);
buf = writeUint16(buf, getSize() - 4 );
memcpy(buf, Addr_->getAddr(), 16);
buf += 16;
buf = writeUint32(buf, PrefLifetime_);
buf = writeUint32(buf, ValidLifetime_);
buf = storeSubOpt(buf);
return buf;
}
SPtr<TIPv6Addr> TOptIAAddress::getAddr() const {
return Addr_;
}
unsigned long TOptIAAddress::getPref() const {
return PrefLifetime_;
}
unsigned long TOptIAAddress::getValid() const {
return ValidLifetime_;
}
bool TOptIAAddress::isValid() const {
return Valid_;
}
|