/* * Copyright (C) 2003, 2004, 2005 Yokogawa Electric Corporation, * INTAP(Interoperability Technology Association * for Information Processing, Japan). All rights reserved. * * Redistribution and use of this software in source and binary forms, with * or without modification, are permitted provided that the following * conditions and disclaimer are agreed and accepted by the user: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. Neither the names of the copyrighters, the name of the project which * is related to this software (hereinafter referred to as "project") nor * the names of the contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * 4. No merchantable use may be permitted without prior written * notification to the copyrighters. However, using this software for the * purpose of testing or evaluating any products including merchantable * products may be permitted without any notification to the copyrighters. * * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING * BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * * $TAHI: v6eval/lib/Pz/McDHCPv6.cc,v 1.9 2005/05/09 09:35:23 akisada Exp $ */ #include "McSub.h" #include "MmHeader.h" #include "ItPosition.h" #include "WObject.h" #include "RObject.h" #include "PControl.h" #include "PvObject.h" #include "PvOctets.h" #include "PAlgorithm.h" #include "McDHCPv6.h" #include #include //////////////////////////////////////////////////////////////// PvTimezone::PvTimezone(): PvOctets() {} PvTimezone::PvTimezone(uint32_t l, OCTSTR o, bool b): PvOctets(l, o, b) {} PvTimezone::~PvTimezone() {} PvObject *PvTimezone::shallowCopy() const { return(new PvTimezone(length(), (OCTSTR)string())); } void PvTimezone::log(uint32_t t) const { print(); } void PvTimezone::print() const { printf("%s", string()); } //////////////////////////////////////////////////////////////// MmTimezone::MmTimezone(CSTR s, const PObject *g, const PObject *e): MmVarOctets(s, g, e, 0, 0) {} MmTimezone::~MmTimezone() {} PvObject *MmTimezone::reversePv(RControl &, const ItPosition &at, const ItPosition &size, const OCTBUF &buf) const { uint32_t offset = at.bytes(), length = size.bytes(); return(new PvTimezone(length, (OCTSTR)buf.string(offset))); } //////////////////////////////////////////////////////////////// #define SUPER RmObject RmDHCPAuth::RmDHCPAuth(RObject *r_parent, const MObject *m, const ItPosition &offset, const ItPosition &size, PvObject *pv, const PaDHCPAuth *dhcpauth): SUPER(r_parent, m, offset, size, pv), dhcpauth_(dhcpauth), calc_pvalue_(new OCTBUF()) {} RmDHCPAuth::~RmDHCPAuth(){ if(calc_pvalue_) { delete calc_pvalue_; calc_pvalue_ = 0; } } void RmDHCPAuth::set_calc_pvalue(PvObject *calc) { if(calc_pvalue_) { delete calc_pvalue_; } calc_pvalue_ = calc; } void RmDHCPAuth::post_reverse(Con_IPinfo &info, RControl &c, RObject *base) { if(!parent()) { return; } if(!parent()->parent()) { return; } if(!parent()->parent()->parent()) { return; } const OCTBUF *basebuf = (const OCTBUF *)base->pvalue(); uint32_t dhcplen = base->size().bytes(); uint32_t dhcpoffset0 = base->offset().bytes(); OCTSTR dhcpbuf = (OCTSTR)basebuf->string(); uint32_t authlen = size().bytes(); uint32_t authoffset = parent()->parent()->offset().bytes() + // from Udp_DHCPv6_Solicit parent()->offset().bytes() + // from Opt_DHCPv6_Authentication offset().bytes(); // from DHCPv6_Auth_Delayed uint32_t dhcpoffset = parent()->parent()->parent()->offset().bytes(); if(dhcpoffset0 != dhcpoffset) { return; } OCTBUF dhcpauthbuf(dhcplen, (OCTSTR)dhcpbuf, true); memset((void *)(dhcpauthbuf.string() + authoffset), 0, authlen); OCTBUF *calc = 0; if(dhcpauth_) { calc = dhcpauth_->DHCPAuth_Calculate(dhcpauthbuf); } set_calc_pvalue(calc); return; } #undef SUPER //////////////////////////////////////////////////////////////// #define SUPER WmObject WmDHCPAuth::WmDHCPAuth(WObject *p, const MObject *m, const PObject *po, const PaDHCPAuth *dhcpauth):SUPER(p, m, po), dhcpauth_(dhcpauth) {} WmDHCPAuth::~WmDHCPAuth(){} void WmDHCPAuth::post_generate(Con_IPinfo &info, WControl &c, OCTBUF &buf, WObject *base) { WObject *w_auth = (WObject *)info.postDHCPAuth(); if(!w_auth) { return; } const OCTBUF *basebuf = (const OCTBUF *)base->pvalue(); uint32_t dhcplen = base->size().bytes(); uint32_t dhcpoffset = base->offset().bytes(); OCTSTR dhcpbuf = (OCTSTR)basebuf->string(); uint32_t authlen = w_auth->size().bytes(); uint32_t authoffset = w_auth->offset().bytes(); if(dhcpoffset > authoffset) { return; } if(dhcpoffset + dhcplen < authoffset + authlen) { return; } OCTBUF dhcpauthbuf(dhcplen, (OCTSTR)dhcpbuf, true); OCTBUF *calc = 0; if(dhcpauth_) { calc = dhcpauth_->DHCPAuth_Calculate(dhcpauthbuf); } if(calc) { set_rgenerate(calc); SUPER::generate(c, buf); } } bool WmDHCPAuth::doEvaluate(WControl &c, RObject &r) { RmDHCPAuth &rm = (RmDHCPAuth &)r; const PvObject *ro = rm.pvalue(); const PvObject *eo = rm.calc_pvalue(); if(!eo) { eo = revaluate(); } return(valueEvaluate(c, ro, eo)); } #undef SUPER //////////////////////////////////////////////////////////////// PaDHCPAuth::PaDHCPAuth(const MObject *m, CSTR st, int l):PcObject(m ,st, l), dhcpauth_(0) {} PaDHCPAuth::~PaDHCPAuth() { if(dhcpauth_ != 0) { delete dhcpauth_; dhcpauth_ = 0; } } PObject *PaDHCPAuth::dhcpauth_member(PObject *p) { return(dhcpauth_ = (PfDHCPAuth *)(p)); } OCTBUF *PaDHCPAuth::DHCPAuth_Calculate(const OCTBUF &s) const { if(!dhcpauth_) { return(0); } dhcpauth_->init(); dhcpauth_->update(s); PvOctets *icv = dhcpauth_->result(); return(icv); } WObject *PaDHCPAuth::selfCompose(WControl &c, WObject *w_parent) const { const MObject *m = meta(); c.set_push_DHCPAuth(this); return(m != 0 ? m->compose(c, w_parent, this) : 0); } //////////////////////////////////////////////////////////////// PfDHCPAuth::PfDHCPAuth(const MfDHCPAuth *a, CSTR b, int c): PvFunction(a, b, c), meta_(a), context_(0) {} PfDHCPAuth::~PfDHCPAuth() {}; const MObject *PfDHCPAuth::meta() const { return(metaClass()); } void PfDHCPAuth::init() { const MfDHCPAuth *m = metaClass(); if(m) { context_ = m->init(context_, args()); } return; } void PfDHCPAuth::update(const OCTBUF &s) { const MfDHCPAuth *m = metaClass(); if(m) { m->update(context_, args(), s); } return; } PvOctets *PfDHCPAuth::result() { const MfDHCPAuth *m = metaClass(); PvOctets *ret = 0; if(m) { ret = m->result(context_, args()); } return(ret); } //////////////////////////////////////////////////////////////// PvDHCPAuth::PvDHCPAuth(OCTSTR o, bool b): PvOctets(16, o, b) {} PvDHCPAuth::~PvDHCPAuth() {} void PvDHCPAuth::log(uint32_t t) const { print(); } void PvDHCPAuth::print() const { COCTSTR buf = 0; uint32_t buflen = 0, d = 0; buf = string(); buflen = length(); for(d = 0; d < buflen; d ++) { printf("%02x", buf[d]); } } const PvDHCPAuth *PvDHCPAuth::zeroauth() { char tmp[16]; memset(tmp, 0, 16); return(new PvDHCPAuth((OCTSTR)tmp, true)); } PvObject *PvDHCPAuth::shallowCopy() const { return(new PvDHCPAuth((OCTSTR)string())); } //////////////////////////////////////////////////////////////// KeepDHCPAuth::KeepDHCPAuth() { current_ = 0; dhcpauth_ = new DHCPAuthList(); } KeepDHCPAuth::~KeepDHCPAuth() { current_ = 0; if(dhcpauth_) { delete dhcpauth_; dhcpauth_ = 0; } } const PaDHCPAuth *KeepDHCPAuth::GetDHCPAuth(void) { uint32_t i = current_ ++; const PaDHCPAuth *dhcpauth = 0; if(dhcpauth_) { uint32_t i9 = dhcpauth_->size(); dhcpauth = i < i9 ? dhcpauth_->index(i) : 0; } return(dhcpauth); } void KeepDHCPAuth::SetDHCPAuth(const PaDHCPAuth *dhcpauth) { dhcpauth_->append((PaDHCPAuth *)dhcpauth); } //////////////////////////////////////////////////////////////// #define AUTHZERO() PvDHCPAuth::zeroauth() MmDHCPAuth::MmDHCPAuth(CSTR s):MmOctets(s, 16, AUTHZERO(), AUTHZERO(), 0, 0) { keepdhcpauth_ = new KeepDHCPAuth(); } MmDHCPAuth::~MmDHCPAuth() { if(keepdhcpauth_) { delete keepdhcpauth_; keepdhcpauth_ = 0; } } PvObject *MmDHCPAuth::reversePv(RControl &, const ItPosition &at, const ItPosition &size, const OCTBUF &buf) const { OCTSTR str = (OCTSTR)buf.string(at.bytes()); return(new PvDHCPAuth(str, false)); } RObject *MmDHCPAuth::reverseRm(RControl &c, RObject *r_parent, const ItPosition &at, const ItPosition &size, PvObject *pv) const { const PaDHCPAuth *dhcpauth = 0; if(keepdhcpauth_) { dhcpauth = keepdhcpauth_->GetDHCPAuth(); } return(new RmDHCPAuth(r_parent, this, at, size, pv, dhcpauth)); } WObject *MmDHCPAuth::composeWm(WControl &c, WObject *w_parent, const PObject *pl) const { const PaDHCPAuth *dhcpauth = c.pushing_DHCPAuth(); if(keepdhcpauth_) { keepdhcpauth_->SetDHCPAuth(dhcpauth); } return(new WmDHCPAuth(w_parent, this, pl, dhcpauth)); } RObject *MmDHCPAuth::reverse(RControl &c, RObject *r_parent, ItPosition &at, OCTBUF &buf) const { RObject *r_self = MmOctets::reverse(c, r_parent, at, buf); if(!c.error()){ Con_IPinfo *info = c.IPinfo(); if(info) { info->postDHCPAuth(r_self); } } return(r_self); } bool MmDHCPAuth::generate(WControl &c, WObject *w_self, OCTBUF &buf) const { bool rtn = MmOctets::generate(c, w_self, buf); if(!c.error()) { Con_IPinfo *info = c.IPinfo(); if(info) { info->postDHCPAuth(w_self); } } return(rtn); } #undef AUTHZERO //////////////////////////////////////////////////////////////// MmDHCPRealm::MmDHCPRealm(CSTR s, const PObject *g, const PObject *e): MmVarOctets(s, g, e, 0, 0) {} MmDHCPRealm::~MmDHCPRealm() {} ItPosition MmDHCPRealm::length_for_reverse(RControl &c, ItPosition &at, OCTBUF &buf) const { uint32_t length = buf.remainLength(at.bytes()) - 20; return(ItPosition(length, 0)); } //////////////////////////////////////////////////////////////// #define SUPER McHeader McUdp_DHCPv6_ONE *McUdp_DHCPv6_ONE::instance_ = 0; McUdp_DHCPv6_ONE *McUdp_DHCPv6_ONE::instance() { if(!instance_) { instance_ = new McUdp_DHCPv6_ONE("DHCPv6"); } return(instance_); } McUdp_DHCPv6_ONE::McUdp_DHCPv6_ONE(CSTR key): SUPER(key) { member(new MmHeader_onDHCPv6("header")); MmUpper_onUpper::add_dhcp(this); } McUdp_DHCPv6_ONE::~McUdp_DHCPv6_ONE() {} bool McUdp_DHCPv6_ONE::containsMc(const MObject *mc) const { bool rtn = SUPER::containsMc(mc); return(rtn ? rtn : members_[0]->containsMc(mc)); } uint32_t McUdp_DHCPv6_ONE::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const { return(buf.remainLength(at.bytes())); } RObject *McUdp_DHCPv6_ONE::reverse(RControl &c, RObject *r_parent, ItPosition &at, OCTBUF &buf) const { return(members_[0]->reverse(c, r_parent, at, buf)); } #undef SUPER //////////////////////////////////////////////////////////////// #define SUPER McHeader McUdp_DHCPv6::McUdp_DHCPv6(CSTR key): SUPER(key), type_(0) { McUdp_DHCPv6_ONE::instance(); } McUdp_DHCPv6::~McUdp_DHCPv6() {} int32_t McUdp_DHCPv6::token() const { return(metaToken(tkn_upper_)); } uint32_t McUdp_DHCPv6::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const { return(buf.remainLength(at.bytes())); } bool McUdp_DHCPv6::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { ItPosition tmpat = at; RObject *rtype = type_->reverse(c, 0, tmpat, buf); if(!rtype) { return(false); } const PvNumber *pv = (const PvNumber *)rtype->pvalue(); uint32_t typevalue = pv->value(); c.DictType().type_Set(typevalue); delete(rtype); return(true); } return(false); } bool McUdp_DHCPv6::HCGENE(Type)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { int32_t val = get_dhcpv6Type(wmem); if(val < 0) { return(false); } PvNumber def(val); return(def.generate(cntr, wmem, buf)); } PObject *McUdp_DHCPv6::HCEVAL(Type)(WObject *wmem) const { int32_t val = get_dhcpv6Type(wmem); return(new PvNumber(val)); } int32_t McUdp_DHCPv6::get_dhcpv6Type(WObject *wmem) const { WObject *wc = wmem->parent(); int32_t rtn = wc ? wc->meta()->dhcpv6Type() : -1; if(rtn < 0) { wmem->mustDefine(0); } return(rtn); } RObject *McUdp_DHCPv6::reverse(RControl &c, RObject *r_parent, ItPosition &at, OCTBUF &buf) const { RObject *r_self = SUPER::reverse(c, r_parent, at, buf); if(!c.error()){ Con_IPinfo *info = c.IPinfo(); if(info) { info->reverse_postDHCPAuth(c, r_self); } } return(r_self); } bool McUdp_DHCPv6::generate(WControl &c, WObject *w_self, OCTBUF &buf) const { bool rtn = SUPER::generate(c, w_self, buf); if(!c.error()) { Con_IPinfo *info = c.IPinfo(); if(info) { info->generate_postDHCPAuth(c, buf, w_self); } } return(rtn); } #undef SUPER //////////////////////////////////////////////////////////////// McUdp_DHCPv6_ANY::McUdp_DHCPv6_ANY(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_ANY::~McUdp_DHCPv6_ANY() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Solicit::McUdp_DHCPv6_Solicit(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Solicit::~McUdp_DHCPv6_Solicit() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Advertise::McUdp_DHCPv6_Advertise(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Advertise::~McUdp_DHCPv6_Advertise() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Request::McUdp_DHCPv6_Request(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Request::~McUdp_DHCPv6_Request() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Confirm::McUdp_DHCPv6_Confirm(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Confirm::~McUdp_DHCPv6_Confirm() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Renew::McUdp_DHCPv6_Renew(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Renew::~McUdp_DHCPv6_Renew() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Rebind::McUdp_DHCPv6_Rebind(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Rebind::~McUdp_DHCPv6_Rebind() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Reply::McUdp_DHCPv6_Reply(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Reply::~McUdp_DHCPv6_Reply() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Release::McUdp_DHCPv6_Release(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Release::~McUdp_DHCPv6_Release() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Decline::McUdp_DHCPv6_Decline(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Decline::~McUdp_DHCPv6_Decline() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_Reconfigure::McUdp_DHCPv6_Reconfigure(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_Reconfigure::~McUdp_DHCPv6_Reconfigure() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_InformationRequest::McUdp_DHCPv6_InformationRequest(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_InformationRequest::~McUdp_DHCPv6_InformationRequest() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_RelayForward::McUdp_DHCPv6_RelayForward(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_RelayForward::~McUdp_DHCPv6_RelayForward() {} //////////////////////////////////////////////////////////////// McUdp_DHCPv6_RelayReply::McUdp_DHCPv6_RelayReply(CSTR key): McUdp_DHCPv6(key) {} McUdp_DHCPv6_RelayReply::~McUdp_DHCPv6_RelayReply() {} //////////////////////////////////////////////////////////////// #define DEF_LENGTH_OFFSET_OptDHCPv6 4 McOpt_DHCPv6::McOpt_DHCPv6(CSTR key): McOption(key), code_(0), length_(0) {} McOpt_DHCPv6::~McOpt_DHCPv6() {} uint32_t McOpt_DHCPv6::length_for_reverse(RControl &c, ItPosition &at, OCTBUF &buf) const { if(!length_) { return(McOption::length_for_reverse(c, at, buf)); } uint32_t valulen = length_->value(at, buf); uint32_t length = valulen + DEF_LENGTH_OFFSET_OptDHCPv6; return(length); } bool McOpt_DHCPv6::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { ItPosition tmpat = at; RObject *rcode = code_->reverse(c, 0, tmpat,buf); if(!rcode) { return(false); } const PvNumber *pv = (const PvNumber *)rcode->pvalue(); uint32_t codevalue = pv->value(); c.DictType().type_Set(codevalue); delete(rcode); return(true); } return(false); } bool McOpt_DHCPv6::HCGENE(Length)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { WObject *wc = wmem->parent(); uint32_t reallen = wc->size().bytes(); uint32_t valulen = reallen - DEF_LENGTH_OFFSET_OptDHCPv6; PvNumber def(valulen); return(def.generate(cntr, wmem, buf)); } #undef DEF_LENGTH_OFFSET_OptDHCPv6 bool McOpt_DHCPv6::HCGENE(Code)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { int32_t val = get_optionCode(wmem); if(val < 0) { return(false); } PvNumber def(val); return(def.generate(cntr, wmem, buf)); } PObject *McOpt_DHCPv6::HCEVAL(Code)(WObject *wmem) const { int32_t val = get_optionCode(wmem); return(new PvNumber(val)); } int32_t McOpt_DHCPv6::get_optionCode(WObject *wmem) const { WObject *wc = wmem->parent(); int32_t rtn = wc ? wc->meta()->optionCode() : -1; if(rtn < 0) { wmem->mustDefine(0); } return(rtn); } //////////////////////////////////////////////////////////////// McOpt_DHCPv6_ANY::McOpt_DHCPv6_ANY(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_ANY::~McOpt_DHCPv6_ANY() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_CID::McOpt_DHCPv6_CID(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_CID::~McOpt_DHCPv6_CID() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_SID::McOpt_DHCPv6_SID(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_SID::~McOpt_DHCPv6_SID() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_IA_NA::McOpt_DHCPv6_IA_NA(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_IA_NA::~McOpt_DHCPv6_IA_NA() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_IA_TA::McOpt_DHCPv6_IA_TA(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_IA_TA::~McOpt_DHCPv6_IA_TA() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_IA_Address::McOpt_DHCPv6_IA_Address(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_IA_Address::~McOpt_DHCPv6_IA_Address() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_OptionRequest::McOpt_DHCPv6_OptionRequest(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_OptionRequest::~McOpt_DHCPv6_OptionRequest() {} uint32_t McOpt_DHCPv6_OptionRequest::HC_MLC(OptionCode)(const ItPosition &at, OCTBUF &buf) const { uint32_t length = length_->value(at, buf); return(length / 2); } //////////////////////////////////////////////////////////////// McOpt_DHCPv6_Preference::McOpt_DHCPv6_Preference(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_Preference::~McOpt_DHCPv6_Preference() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_ElapsedTime::McOpt_DHCPv6_ElapsedTime(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_ElapsedTime::~McOpt_DHCPv6_ElapsedTime() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_RelayMessage::McOpt_DHCPv6_RelayMessage(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_RelayMessage::~McOpt_DHCPv6_RelayMessage() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_Authentication::McOpt_DHCPv6_Authentication(CSTR key): McOpt_DHCPv6(key), proto_(0) { AuthInfo_ = new AuthInfo(); } McOpt_DHCPv6_Authentication::~McOpt_DHCPv6_Authentication() {} void McOpt_DHCPv6_Authentication::nextAuth_set_Control(RControl &c, RObject *r_self) const { if(AuthInfo_) { RObject *next = (RObject *)r_self->corresponding(proto_); if(next){ PvNumber *pv = (PvNumber *)next->pvalue(); AuthInfo_->set_protocol(pv->value()); } } return; } RObject *McOpt_DHCPv6_Authentication::reverse(RControl &c, RObject *r_parent, ItPosition &at, OCTBUF &buf) const { ItPosition tmpat = at; RObject *r_self = McOpt_DHCPv6::reverse(c, 0, tmpat, buf); if(r_self) { nextAuth_set_Control(c, r_self); } return(McOpt_DHCPv6::reverse(c, r_parent, at, buf)); } bool McOpt_DHCPv6_Authentication::HCGENE(Protocol)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { int32_t val = get_authProto(wmem); if(val < 0) { return(false); } PvNumber def(val); return(def.generate(cntr, wmem, buf)); } PObject *McOpt_DHCPv6_Authentication::HCEVAL(Protocol)(WObject *wmem) const { int32_t val = get_authProto(wmem); return(new PvNumber(val)); } int32_t McOpt_DHCPv6_Authentication::get_authProto(WObject *wmem) const { WObject *wc = 0; WObject *wparent = wmem->parent(); if(wparent) { for(WObject *x = wparent->nextChild(); x; x = x->nextSister()) { wc = x; } } int32_t rtn = wc ? wc->meta()->authProto() : -1; if(rtn < 0) { wmem->mustDefine(0); } return(rtn); } //////////////////////////////////////////////////////////////// McOpt_DHCPv6_ServerUnicast::McOpt_DHCPv6_ServerUnicast(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_ServerUnicast::~McOpt_DHCPv6_ServerUnicast() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_StatusCode::McOpt_DHCPv6_StatusCode(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_StatusCode::~McOpt_DHCPv6_StatusCode() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_RapidCommit::McOpt_DHCPv6_RapidCommit(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_RapidCommit::~McOpt_DHCPv6_RapidCommit() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_UserClass::McOpt_DHCPv6_UserClass(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_UserClass::~McOpt_DHCPv6_UserClass() {} //////////////////////////////////////////////////////////////// #define DEF_LENGTH_OFFSET_DHCPv6_UserClassData 2 McDHCPv6_UserClassData::McDHCPv6_UserClassData(CSTR key): McOption(key), length_(0) {} McDHCPv6_UserClassData::~McDHCPv6_UserClassData() {} uint32_t McDHCPv6_UserClassData::length_for_reverse(RControl &c, ItPosition &at, OCTBUF &buf) const { if(!length_) { return(McOption::length_for_reverse(c, at, buf)); } uint32_t valulen = length_->value(at, buf); uint32_t length = valulen + DEF_LENGTH_OFFSET_DHCPv6_UserClassData; return(length); } bool McDHCPv6_UserClassData::HCGENE(Length)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { WObject *wc = wmem->parent(); uint32_t reallen = wc->size().bytes(); uint32_t valulen = reallen - DEF_LENGTH_OFFSET_DHCPv6_UserClassData; PvNumber def(valulen); return(def.generate(cntr, wmem, buf)); } #undef DEF_LENGTH_OFFSET_DHCPv6_UserClassData //////////////////////////////////////////////////////////////// McOpt_DHCPv6_VendorClass::McOpt_DHCPv6_VendorClass(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_VendorClass::~McOpt_DHCPv6_VendorClass() {} //////////////////////////////////////////////////////////////// #define DEF_LENGTH_OFFSET_DHCPv6_VendorClassData 2 McDHCPv6_VendorClassData::McDHCPv6_VendorClassData(CSTR key): McOption(key), length_(0) {} McDHCPv6_VendorClassData::~McDHCPv6_VendorClassData() {} uint32_t McDHCPv6_VendorClassData::length_for_reverse(RControl &c, ItPosition &at, OCTBUF &buf) const { if(!length_) { return(McOption::length_for_reverse(c, at, buf)); } uint32_t valulen = length_->value(at, buf); uint32_t length = valulen + DEF_LENGTH_OFFSET_DHCPv6_VendorClassData; return(length); } bool McDHCPv6_VendorClassData::HCGENE(Length)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { WObject *wc = wmem->parent(); uint32_t reallen = wc->size().bytes(); uint32_t valulen = reallen - DEF_LENGTH_OFFSET_DHCPv6_VendorClassData; PvNumber def(valulen); return(def.generate(cntr, wmem, buf)); } #undef DEF_LENGTH_OFFSET_DHCPv6_VendorClassData //////////////////////////////////////////////////////////////// McOpt_DHCPv6_VendorSpecificInfo::McOpt_DHCPv6_VendorSpecificInfo(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_VendorSpecificInfo::~McOpt_DHCPv6_VendorSpecificInfo() {} //////////////////////////////////////////////////////////////// #define DEF_LENGTH_OFFSET_DHCPv6_OptionData 4 McDHCPv6_OptionData::McDHCPv6_OptionData(CSTR key): McOption(key), length_(0) {} McDHCPv6_OptionData::~McDHCPv6_OptionData() {} uint32_t McDHCPv6_OptionData::length_for_reverse(RControl &c, ItPosition &at, OCTBUF &buf) const { if(!length_) { return(McOption::length_for_reverse(c, at, buf)); } uint32_t valulen = length_->value(at, buf); uint32_t length = valulen + DEF_LENGTH_OFFSET_DHCPv6_OptionData; return(length); } bool McDHCPv6_OptionData::HCGENE(Length)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { WObject *wc = wmem->parent(); uint32_t reallen = wc->size().bytes(); uint32_t valulen = reallen - DEF_LENGTH_OFFSET_DHCPv6_OptionData; PvNumber def(valulen); return(def.generate(cntr, wmem, buf)); } #undef DEF_LENGTH_OFFSET_DHCPv6_OptionData //////////////////////////////////////////////////////////////// McOpt_DHCPv6_IID::McOpt_DHCPv6_IID(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_IID::~McOpt_DHCPv6_IID() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_ReconfigureMessage::McOpt_DHCPv6_ReconfigureMessage(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_ReconfigureMessage::~McOpt_DHCPv6_ReconfigureMessage() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_ReconfigureAccept::McOpt_DHCPv6_ReconfigureAccept(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_ReconfigureAccept::~McOpt_DHCPv6_ReconfigureAccept() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_IA_PD::McOpt_DHCPv6_IA_PD(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_IA_PD::~McOpt_DHCPv6_IA_PD() {} //////////////////////////////////////////////////////////////// McOpt_DHCPv6_IA_Prefix::McOpt_DHCPv6_IA_Prefix(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_IA_Prefix::~McOpt_DHCPv6_IA_Prefix() {} //////////////////////////////////////////////////////////////// #define SERCHSTROFFSET 4 #define SERCHSTRLEN 16 McOpt_DHCPv6_DNS_Servers::McOpt_DHCPv6_DNS_Servers(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_DNS_Servers::~McOpt_DHCPv6_DNS_Servers() {} uint32_t McOpt_DHCPv6_DNS_Servers::HC_MLC(Address)(const ItPosition &at, OCTBUF &buf) const { uint32_t length = (buf.remainLength(at.bytes()) - SERCHSTROFFSET) / SERCHSTRLEN; return(length); } #undef SERCHSTRLEN #undef SERCHSTROFFSET //////////////////////////////////////////////////////////////// McOpt_DHCPv6_DNS_SearchList::McOpt_DHCPv6_DNS_SearchList(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_DNS_SearchList::~McOpt_DHCPv6_DNS_SearchList() {} //////////////////////////////////////////////////////////////// #define NTPSVOFFSET 4 #define NTPSVLEN 16 McOpt_DHCPv6_NTP_Servers::McOpt_DHCPv6_NTP_Servers(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_NTP_Servers::~McOpt_DHCPv6_NTP_Servers() {} uint32_t McOpt_DHCPv6_NTP_Servers::HC_MLC(Address)(const ItPosition &at, OCTBUF &buf) const { uint32_t length = (buf.remainLength(at.bytes()) - NTPSVOFFSET) / NTPSVLEN; return(length); } #undef NTPSVLEN #undef NTPSVOFFSET //////////////////////////////////////////////////////////////// McOpt_DHCPv6_NTP_Timezone::McOpt_DHCPv6_NTP_Timezone(CSTR key): McOpt_DHCPv6(key) {} McOpt_DHCPv6_NTP_Timezone::~McOpt_DHCPv6_NTP_Timezone() {} //////////////////////////////////////////////////////////////// McDHCPv6_DUID::McDHCPv6_DUID(CSTR key): McUpper(key), type_(0) {} McDHCPv6_DUID::~McDHCPv6_DUID() {} uint32_t McDHCPv6_DUID::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const { return(buf.remainLength(at.bytes())); } bool McDHCPv6_DUID::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { ItPosition tmpat = at; RObject *rtype = type_->reverse(c, 0, tmpat,buf); if(!rtype) { return(false); } const PvNumber *pv = (const PvNumber *)rtype->pvalue(); uint32_t typevalue = pv->value(); c.DictType().type_Set(typevalue); delete(rtype); return(true); } return(false); } #undef DEF_LENGTH_OFFSET_OptDHCPv6 bool McDHCPv6_DUID::HCGENE(Type)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { int32_t val = get_duidType(wmem); if(val < 0) { return(false); } PvNumber def(val); return(def.generate(cntr, wmem, buf)); } PObject *McDHCPv6_DUID::HCEVAL(Type)(WObject *wmem) const { int32_t val = get_duidType(wmem); return(new PvNumber(val)); } int32_t McDHCPv6_DUID::get_duidType(WObject *wmem) const { WObject *wc = wmem->parent(); int32_t rtn = wc ? wc->meta()->duidType() : -1; if(rtn < 0) { wmem->mustDefine(0); } return(rtn); } //////////////////////////////////////////////////////////////// McDHCPv6_DUID_ANY::McDHCPv6_DUID_ANY(CSTR key): McDHCPv6_DUID(key) {} McDHCPv6_DUID_ANY::~McDHCPv6_DUID_ANY() {} //////////////////////////////////////////////////////////////// McDHCPv6_DUID_LLT_ONE *McDHCPv6_DUID_LLT_ONE::instance_ = 0; McDHCPv6_DUID_LLT_ONE *McDHCPv6_DUID_LLT_ONE::instance() { if(!instance_) { instance_ = new McDHCPv6_DUID_LLT_ONE("DUID_LLT"); } return(instance_); } McDHCPv6_DUID_LLT_ONE::McDHCPv6_DUID_LLT_ONE(CSTR key): McDHCPv6_DUID(key) { member(new MmLLT_onDUID("llt")); MmDUID_onOption::add(this); } McDHCPv6_DUID_LLT_ONE::~McDHCPv6_DUID_LLT_ONE() {} bool McDHCPv6_DUID_LLT_ONE::containsMc(const MObject *mc) const { bool rtn = McDHCPv6_DUID::containsMc(mc); return(rtn ? rtn : members_[0]->containsMc(mc)); } uint32_t McDHCPv6_DUID_LLT_ONE::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const { return(buf.remainLength(at.bytes())); } RObject *McDHCPv6_DUID_LLT_ONE::reverse(RControl &c, RObject *r_parent, ItPosition &at, OCTBUF &buf) const { return(members_[0]->reverse(c, r_parent, at, buf)); } //////////////////////////////////////////////////////////////// McDHCPv6_DUID_LLT::McDHCPv6_DUID_LLT(CSTR key): McDHCPv6_DUID(key) { McDHCPv6_DUID_LLT_ONE::instance(); } McDHCPv6_DUID_LLT::~McDHCPv6_DUID_LLT() {} uint32_t McDHCPv6_DUID_LLT::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const { return(buf.remainLength(at.bytes())); } bool McDHCPv6_DUID_LLT::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { ItPosition tmpat = at; RObject *r_self = McDHCPv6_DUID::reverse(c, 0, tmpat, buf); RObject *rtype = (RObject *)r_self->corresponding(hwtype_); if(!rtype) { return(false); } const PvNumber *pv = (const PvNumber *)rtype->pvalue(); uint32_t typevalue = pv->value(); c.DictType().type_Set(typevalue); delete(rtype); return(true); } return(false); } bool McDHCPv6_DUID_LLT::HCGENE(HardwareType)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { int32_t val = get_hardwareType(wmem); if(val < 0) { return(false); } PvNumber def(val); return(def.generate(cntr, wmem, buf)); } PObject *McDHCPv6_DUID_LLT::HCEVAL(HardwareType)(WObject *wmem) const { int32_t val = get_hardwareType(wmem); return(new PvNumber(val)); } int32_t McDHCPv6_DUID_LLT::get_hardwareType(WObject *wmem) const { WObject *wc = wmem->parent(); int32_t rtn = wc ? wc->meta()->hardwareType() : -1; if(rtn < 0) { wmem->mustDefine(0); } return(rtn); } //////////////////////////////////////////////////////////////// McDHCPv6_DUID_LLT_ANY::McDHCPv6_DUID_LLT_ANY(CSTR key): McDHCPv6_DUID_LLT(key) {} McDHCPv6_DUID_LLT_ANY::~McDHCPv6_DUID_LLT_ANY() {} //////////////////////////////////////////////////////////////// McDHCPv6_DUID_LLT_Ether::McDHCPv6_DUID_LLT_Ether(CSTR key): McDHCPv6_DUID_LLT(key) {} McDHCPv6_DUID_LLT_Ether::~McDHCPv6_DUID_LLT_Ether() {} //////////////////////////////////////////////////////////////// McDHCPv6_DUID_EN::McDHCPv6_DUID_EN(CSTR key): McDHCPv6_DUID(key) {} McDHCPv6_DUID_EN::~McDHCPv6_DUID_EN() {} //////////////////////////////////////////////////////////////// McDHCPv6_DUID_LL_ONE *McDHCPv6_DUID_LL_ONE::instance_ = 0; McDHCPv6_DUID_LL_ONE *McDHCPv6_DUID_LL_ONE::instance() { if(!instance_) { instance_ = new McDHCPv6_DUID_LL_ONE("DUID_LL"); } return(instance_); } McDHCPv6_DUID_LL_ONE::McDHCPv6_DUID_LL_ONE(CSTR key): McDHCPv6_DUID(key) { member(new MmLL_onDUID("ll")); MmDUID_onOption::add(this); } McDHCPv6_DUID_LL_ONE::~McDHCPv6_DUID_LL_ONE() {} bool McDHCPv6_DUID_LL_ONE::containsMc(const MObject *mc) const { bool rtn = McDHCPv6_DUID::containsMc(mc); return(rtn ? rtn : members_[0]->containsMc(mc)); } uint32_t McDHCPv6_DUID_LL_ONE::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const { return(buf.remainLength(at.bytes())); } RObject *McDHCPv6_DUID_LL_ONE::reverse(RControl &c, RObject *r_parent, ItPosition &at, OCTBUF &buf) const { return(members_[0]->reverse(c, r_parent, at, buf)); } //////////////////////////////////////////////////////////////// McDHCPv6_DUID_LL::McDHCPv6_DUID_LL(CSTR key): McDHCPv6_DUID(key) { McDHCPv6_DUID_LL_ONE::instance(); } McDHCPv6_DUID_LL::~McDHCPv6_DUID_LL() {} uint32_t McDHCPv6_DUID_LL::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const { return(buf.remainLength(at.bytes())); } bool McDHCPv6_DUID_LL::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { ItPosition tmpat = at; RObject *r_self = McDHCPv6_DUID::reverse(c, 0, tmpat, buf); RObject *rtype = (RObject *)r_self->corresponding(hwtype_); if(!rtype) { return(false); } const PvNumber *pv = (const PvNumber *)rtype->pvalue(); uint32_t typevalue = pv->value(); c.DictType().type_Set(typevalue); delete(rtype); return(true); } return(false); } bool McDHCPv6_DUID_LL::HCGENE(HardwareType)(WControl &cntr, WObject *wmem, OCTBUF &buf) const { int32_t val = get_hardwareType(wmem); if(val < 0) { return(false); } PvNumber def(val); return(def.generate(cntr, wmem, buf)); } PObject *McDHCPv6_DUID_LL::HCEVAL(HardwareType)(WObject *wmem) const { int32_t val = get_hardwareType(wmem); return(new PvNumber(val)); } int32_t McDHCPv6_DUID_LL::get_hardwareType(WObject *wmem) const { WObject *wc = wmem->parent(); int32_t rtn = wc ? wc->meta()->hardwareType() : -1; if(rtn < 0) { wmem->mustDefine(0); } return(rtn); } //////////////////////////////////////////////////////////////// McDHCPv6_DUID_LL_ANY::McDHCPv6_DUID_LL_ANY(CSTR key): McDHCPv6_DUID_LL(key) {} McDHCPv6_DUID_LL_ANY::~McDHCPv6_DUID_LL_ANY() {} //////////////////////////////////////////////////////////////// McDHCPv6_DUID_LL_Ether::McDHCPv6_DUID_LL_Ether(CSTR key): McDHCPv6_DUID_LL(key) {} McDHCPv6_DUID_LL_Ether::~McDHCPv6_DUID_LL_Ether() {} //////////////////////////////////////////////////////////////// McDHCPv6_Auth::McDHCPv6_Auth(CSTR key): McUpper(key) {} McDHCPv6_Auth::~McDHCPv6_Auth() {} uint32_t McDHCPv6_Auth::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const { return(buf.remainLength(at.bytes())); } //////////////////////////////////////////////////////////////// McDHCPv6_Auth_ANY::McDHCPv6_Auth_ANY(CSTR key): McDHCPv6_Auth(key) {} McDHCPv6_Auth_ANY::~McDHCPv6_Auth_ANY() {} //////////////////////////////////////////////////////////////// McDHCPv6_Auth_Delayed::McDHCPv6_Auth_Delayed(CSTR key): McDHCPv6_Auth(key) {} McDHCPv6_Auth_Delayed::~McDHCPv6_Auth_Delayed() {} PObject *McDHCPv6_Auth_Delayed::tokenObject(int l, CSTR f) const { return(new PaDHCPAuth(this, f, l)); } //////////////////////////////////////////////////////////////// McDHCPv6_Auth_ReconfigureKey::McDHCPv6_Auth_ReconfigureKey(CSTR key): McDHCPv6_Auth(key) {} McDHCPv6_Auth_ReconfigureKey::~McDHCPv6_Auth_ReconfigureKey() {} PObject *McDHCPv6_Auth_ReconfigureKey::tokenObject(int l, CSTR f) const { return(new PaDHCPAuth(this, f, l)); } //////////////////////////////////////////////////////////////// MmHeader_onDHCPv6::MmHeader_onDHCPv6(CSTR key): MmReference_Less1(key, true) {} MmHeader_onDHCPv6::~MmHeader_onDHCPv6() {} void MmHeader_onDHCPv6::add(McUdp_DHCPv6 *mc) { dict_.add(mc->dhcpv6Type(), mc); } void MmHeader_onDHCPv6::add_other(McUdp_DHCPv6 *mc) { dict_.add_other(mc); } TypevsMcDict MmHeader_onDHCPv6::dict_; bool MmHeader_onDHCPv6::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { McUdp_DHCPv6 *any = (McUdp_DHCPv6 *)dict_.find_other(); return(any->overwrite_DictType(c, at, buf)); } return(false); } //////////////////////////////////////////////////////////////// MmOption_onDHCPv6::MmOption_onDHCPv6(CSTR key): MmReference_More0(key, true) {} MmOption_onDHCPv6::~MmOption_onDHCPv6() {} void MmOption_onDHCPv6::add(McOpt_DHCPv6 *mc) { dict_.add(mc->optionCode(), mc); } void MmOption_onDHCPv6::add_other(McOpt_DHCPv6 *mc) { dict_.add_other(mc); } TypevsMcDict MmOption_onDHCPv6::dict_; bool MmOption_onDHCPv6::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { McOpt_DHCPv6 *any = (McOpt_DHCPv6 *)dict_.find_other(); return(any->overwrite_DictType(c, at, buf)); } return(false); } //////////////////////////////////////////////////////////////// MmDUID_onOption::MmDUID_onOption(CSTR key): MmReference_Less1(key, true) {} MmDUID_onOption::~MmDUID_onOption() {} void MmDUID_onOption::add(McDHCPv6_DUID *mc) { dict_.add(mc->duidType(), mc); } void MmDUID_onOption::add_other(McDHCPv6_DUID *mc) { dict_.add_other(mc); } TypevsMcDict MmDUID_onOption::dict_; bool MmDUID_onOption::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { McDHCPv6_DUID *any = (McDHCPv6_DUID *)dict_.find_other(); return(any->overwrite_DictType(c, at, buf)); } return(false); } //////////////////////////////////////////////////////////////// MmLLT_onDUID::MmLLT_onDUID(CSTR key): MmReference_Must1(key, true) {} MmLLT_onDUID::~MmLLT_onDUID() {} void MmLLT_onDUID::add(McDHCPv6_DUID_LLT *mc) { dict_.add(mc->hardwareType(), mc); } void MmLLT_onDUID::add_other(McDHCPv6_DUID_LLT *mc) { dict_.add_other(mc); } TypevsMcDict MmLLT_onDUID::dict_; bool MmLLT_onDUID::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { McDHCPv6_DUID_LLT *any = (McDHCPv6_DUID_LLT *)dict_.find_other(); return(any->overwrite_DictType(c, at, buf)); } return(false); } //////////////////////////////////////////////////////////////// MmLL_onDUID::MmLL_onDUID(CSTR key): MmReference_Must1(key, true) {} MmLL_onDUID::~MmLL_onDUID() {} void MmLL_onDUID::add(McDHCPv6_DUID_LL *mc) { dict_.add(mc->hardwareType(), mc); } void MmLL_onDUID::add_other(McDHCPv6_DUID_LL *mc) { dict_.add_other(mc); } TypevsMcDict MmLL_onDUID::dict_; bool MmLL_onDUID::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { McDHCPv6_DUID_LL *any = (McDHCPv6_DUID_LL *)dict_.find_other(); return(any->overwrite_DictType(c, at, buf)); } return(false); } //////////////////////////////////////////////////////////////// MmUserClass_onOption::MmUserClass_onOption(CSTR key): MmReference_More0(key, true) {} MmUserClass_onOption::~MmUserClass_onOption() {} void MmUserClass_onOption::add_other(McDHCPv6_UserClassData *mc) { dict_.add_other(mc); } TypevsMcDict MmUserClass_onOption::dict_; bool MmUserClass_onOption::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { c.DictType().other_Set(); return(true); } return(false); } //////////////////////////////////////////////////////////////// MmVendorClass_onOption::MmVendorClass_onOption(CSTR key): MmReference_More0(key, true) {} MmVendorClass_onOption::~MmVendorClass_onOption() {} void MmVendorClass_onOption::add_other(McDHCPv6_VendorClassData *mc) { dict_.add_other(mc); } TypevsMcDict MmVendorClass_onOption::dict_; bool MmVendorClass_onOption::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { c.DictType().other_Set(); return(true); } return(false); } //////////////////////////////////////////////////////////////// MmOptionData_onOption::MmOptionData_onOption(CSTR key): MmReference_More0(key, true) {} MmOptionData_onOption::~MmOptionData_onOption() {} void MmOptionData_onOption::add_other(McDHCPv6_OptionData *mc) { dict_.add_other(mc); } TypevsMcDict MmOptionData_onOption::dict_; bool MmOptionData_onOption::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { c.DictType().other_Set(); return(true); } return(false); } //////////////////////////////////////////////////////////////// MmProto_onAuth::MmProto_onAuth(CSTR key, McOpt_DHCPv6_Authentication *opt): MmReference_Must1(key, true), opt_auth_(opt) {} MmProto_onAuth::~MmProto_onAuth() {} void MmProto_onAuth::add(McDHCPv6_Auth *mc) { dict_.add(mc->authProto(), mc); } void MmProto_onAuth::add_other(McDHCPv6_Auth *mc) { dict_.add_other(mc); } TypevsMcDict MmProto_onAuth::dict_; bool MmProto_onAuth::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const { if(buf.remainLength(at.bytes())) { const McOpt_DHCPv6_Authentication *opt = (const McOpt_DHCPv6_Authentication *)get_opt_auth(); if(opt) { AuthInfo *info = opt->get_auth_info(); if(info) { c.DictType().type_Set(info->get_protocol()); return(true); } } } return(false); } implementCmList(DHCPAuthList, PaDHCPAuth);