//opts - all options list WITHOUT serverDUID including server id TClntMsgInfRequest::TClntMsgInfRequest(TOptList ReqOpts, int iface) :TClntMsg(iface, 0, INFORMATION_REQUEST_MSG) { IRT = INF_TIMEOUT; MRT = INF_MAX_RT; MRC = 0; MRD = 0; RT=0; Iface=iface; IsDone=false; SPtr<TIfaceIface> ptrIface = ClntIfaceMgr().getIfaceByID(iface); if (!ptrIface) { Log(Error) << "Unable to find interface with ifindex=" << iface << " while trying to generate INF-REQUEST." << LogEnd; IsDone = true; return; } Log(Debug) << "Creating INF-REQUEST on the " << ptrIface->getFullName() << "." << LogEnd; // copy whole list from Verify ... Options = ReqOpts; SPtr<TOpt> opt; firstOption(); while(opt=getOption()) { switch (opt->getOptType()) { //These options possibly receipt from verify transaction //can't appear in request message and have to be deleted case OPTION_UNICAST: case OPTION_STATUS_CODE: case OPTION_PREFERENCE: case OPTION_IA_TA: case OPTION_RELAY_MSG: case OPTION_SERVERID: case OPTION_IA_NA: case OPTION_IAADDR: case OPTION_RAPID_COMMIT: case OPTION_INTERFACE_ID: case OPTION_RECONF_MSG: case OPTION_AUTH: case OPTION_ELAPSED_TIME: //delete the old elapsed option,as we will append a new one delOption(opt->getOptType()); break; } //The other options can be included in Information request option //CLIENTID,ORO,ELAPSED_TIME,USER_CLASS,VENDOR_CLASS, //VENDOR_OPTS,DNS_RESOLVERS,DOMAIN_LIST,NTP_SERVERS,TIME_ZONE, //RECONF_ACCEPT - maybe also SERVERID if information request //is answer to reconfigure message } appendElapsedOption(); appendAuthenticationOption(); this->send(); }
bool TClntOptLifetime::doDuties() { string reason = "trying to set Lifetime timer."; int ifindex = this->Parent->getIface(); if (!DUID) { Log(Error) << "Unable to find proper DUID while " << reason << LogEnd; return false; } SPtr<TClntIfaceIface> iface = (Ptr*)ClntIfaceMgr().getIfaceByID(ifindex); if (!iface) { Log(Error) << "Unable to find interface ifindex=" << ifindex << reason << LogEnd; return false; } SPtr<TClntCfgIface> cfgIface = ClntCfgMgr().getIface(ifindex); return iface->setLifetime(DUID, Parent->getAddr(), Value); }
bool TClntOptNTPServers::doDuties() { string reason = "trying to set NTP server(s)."; int ifindex = this->Parent->getIface(); if (!this->DUID) { Log(Error) << "Unable to find proper DUID while " << reason << LogEnd; return false; } SPtr<TClntIfaceIface> iface = (Ptr*)ClntIfaceMgr().getIfaceByID(ifindex); if (!iface) { Log(Error) << "Unable to find interface ifindex=" << ifindex << reason << LogEnd; return false; } SPtr<TClntCfgIface> cfgIface = ClntCfgMgr().getIface(ifindex); cfgIface->setNTPServerState(STATE_CONFIGURED); return iface->setNTPServerLst(DUID, Parent->getAddr(), AddrLst); }
:TClntMsg(iface, addr, RELEASE_MSG) { SPtr<TDUID> srvDUID; IRT=REL_TIMEOUT; MRT=0; MRC=REL_MAX_RC; MRD=0; RT=0; // obtain IA, TA or PD, so server DUID can be obtained SPtr<TAddrIA> x = 0; if (iaLst.count()) { iaLst.first(); x=iaLst.get(); } if (!x) x = ta; if (!x) { pdLst.first(); x = pdLst.get(); } if (!x) { Log(Error) << "Unable to send RELEASE. No IA, TA or PD provided." << LogEnd; this->IsDone = true; return; } if (!x->getDUID()) { Log(Error) << "Unable to send RELEASE. Unable to find DUID. " << LogEnd; this->IsDone = true; return; } srvDUID = x->getDUID(); Options.push_back(new TOptDUID(OPTION_SERVERID, srvDUID,this)); Options.push_back(new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(),this)); #if 0 if (ClntCfgMgr().getNotifyScripts()) { // release workaround (add removed IAs) /// @todo: WTF? Why are those IAs removed? iaLst.first(); SPtr<TAddrIA> ia; while (ia = iaLst.get()) { ClntAddrMgr().addIA(ia); } iaLst.first(); while (ia = iaLst.get()) { ClntAddrMgr().delIA(ia->getIAID()); } } #endif // --- RELEASE IA --- iaLst.first(); while(x=iaLst.get()) { Options.push_back(new TClntOptIA_NA(x,this)); SPtr<TAddrAddr> ptrAddr; SPtr<TClntIfaceIface> ptrIface; ptrIface = (Ptr*)ClntIfaceMgr().getIfaceByID(x->getIface()); x->firstAddr(); while (ptrAddr = x->getAddr()) { ptrIface->delAddr(ptrAddr->get(), ptrAddr->getPrefix()); } // --- DNS Update --- SPtr<TIPv6Addr> dns = x->getFQDNDnsServer(); if (dns) { string fqdn = ptrIface->getFQDN(); ClntIfaceMgr().fqdnDel(ptrIface, x, fqdn); } // --- DNS Update --- } // --- RELEASE TA --- if (ta) Options.push_back(new TClntOptTA(ta, this)); // --- RELEASE PD --- SPtr<TAddrIA> pd = 0; pdLst.first(); while(pd=pdLst.get()) { SPtr<TClntOptIA_PD> pdOpt = new TClntOptIA_PD(pd,this); Options.push_back( (Ptr*)pdOpt ); pdOpt->setContext(srvDUID, addr, this); pdOpt->delPrefixes(); ClntAddrMgr().delPD(pd->getIAID() ); } appendElapsedOption(); appendAuthenticationOption(); IsDone = false; send(); }
bool TClntOptIA_PD::modifyPrefixes(TClntIfaceMgr::PrefixModifyMode mode) { bool status = false; EState state = STATE_NOTCONFIGURED; SPtr<TClntOptIAPrefix> prefix; string action; switch(mode) { case TClntIfaceMgr::PREFIX_MODIFY_ADD: action = "addition"; state = STATE_CONFIGURED; break; case TClntIfaceMgr::PREFIX_MODIFY_UPDATE: action = "update"; state = STATE_CONFIGURED; break; case TClntIfaceMgr::PREFIX_MODIFY_DEL: action = "delete"; state = STATE_NOTCONFIGURED; break; } if ( (mode==TClntIfaceMgr::PREFIX_MODIFY_ADD) || (mode==TClntIfaceMgr::PREFIX_MODIFY_UPDATE) ) { if ( (T1==0) && (T2==0) ) { firstPrefix(); if (prefix = getPrefix()) { T1 = prefix->getPref()/2; T2 = (int)((prefix->getPref())*0.7); Log(Notice) << "Server set T1 and T2 to 0. Choosing default (50%, 70% * prefered-lifetime): T1=" << T1 << ", T2=" << T2 << LogEnd; } } } this->firstPrefix(); while (prefix = this->getPrefix() ) { switch (mode) { case TClntIfaceMgr::PREFIX_MODIFY_ADD: ClntAddrMgr().addPrefix(this->DUID, this->Prefix, this->Iface, this->IAID, this->T1, this->T2, prefix->getPrefix(), prefix->getPref(), prefix->getValid(), prefix->getPrefixLength(), false); status = ClntIfaceMgr().addPrefix(this->Iface, prefix->getPrefix(), prefix->getPrefixLength(), prefix->getPref(), prefix->getValid()); Log(Debug) << "RENEW will be sent (T1) after " << T1 << ", REBIND (T2) after " << T2 << " seconds." << LogEnd; action = "addition"; break; case TClntIfaceMgr::PREFIX_MODIFY_UPDATE: ClntAddrMgr().updatePrefix(this->DUID, this->Prefix, this->Iface, this->IAID, this->T1, this->T2, prefix->getPrefix(), prefix->getPref(), prefix->getValid(), prefix->getPrefixLength(), false); status = ClntIfaceMgr().updatePrefix(this->Iface, prefix->getPrefix(), prefix->getPrefixLength(), prefix->getPref(), prefix->getValid()); Log(Debug) << "RENEW will be sent (T1) after " << T1 << ", REBIND (T2) after " << T2 << " seconds." << LogEnd; action = "update"; break; case TClntIfaceMgr::PREFIX_MODIFY_DEL: ClntAddrMgr().delPrefix(ClntCfgMgr().getDUID(), this->IAID, prefix->getPrefix(), false); status = ClntIfaceMgr().delPrefix(this->Iface, prefix->getPrefix(), prefix->getPrefixLength() ); action = "delete"; break; } if (!status) { string tmp = error_message(); Log(Error) << "Prefix error encountered during prefix " << action << " operation: " << tmp << LogEnd; // Let's pretend it was configured and renew it // setState(STATE_FAILED); //return true; } } setState(state); return true; }
bool TClntOptIA_NA::doDuties() { // find this IA in addrMgr... SPtr<TAddrIA> ptrIA=ClntAddrMgr().getIA(this->getIAID()); if (!ptrIA) { // unknown IAID, ignore it Log(Warning) << "Received message contains unknown IA (IAID=" << this->getIAID() << "). We didn't order it. Weird... ignoring it." << LogEnd; return true; } // IAID found, set up new received options. SPtr<TAddrAddr> ptrAddrAddr; SPtr<TOptIAAddress> ptrOptAddr; SPtr<TIfaceIface> ptrIface; ptrIface = ClntIfaceMgr().getIfaceByID(Iface_); if (!ptrIface) { Log(Error) << "Interface with ifindex=" << Iface_ << " not found." << LogEnd; return true; } // for each address in IA option... this->firstAddr(); while (ptrOptAddr = this->getAddr() ) { ptrAddrAddr = ptrIA->getAddr( ptrOptAddr->getAddr() ); // no such address in DB ?? if (!ptrAddrAddr) { if (ptrOptAddr->getValid()) { int prefixLen = ptrIface->getPrefixLength(); if (ptrOptAddr->getOption(OPTION_ADDRPARAMS)) { Log(Debug) << "Experimental addr-params found." << LogEnd; SPtr<TOptAddrParams> optAddrParams = SPtr_cast<TOptAddrParams>(ptrOptAddr->getOption(OPTION_ADDRPARAMS)); prefixLen = optAddrParams->getPrefix(); } // add this address in addrDB... ptrIA->addAddr(ptrOptAddr->getAddr(), ptrOptAddr->getPref(), ptrOptAddr->getValid(), prefixLen); ptrIA->setDUID(this->DUID); // ... and in IfaceMgr - ptrIface->addAddr(ptrOptAddr->getAddr(), ptrOptAddr->getPref(), ptrOptAddr->getValid(), prefixLen); } else { Log(Warning) << "Server send new addr with valid lifetime 0." << LogEnd; } } else { // we have this addr in DB if ( ptrOptAddr->getValid() == 0 ) { // valid=0, release this address // delete address from addrDB ptrIA->delAddr(ptrOptAddr->getAddr()); // delete address from IfaceMgr ptrIface->delAddr(ptrOptAddr->getAddr(), ptrIface->getPrefixLength()); break; // analyze next option OPTION_IA_NA } // set up new options in IfaceMgr SPtr<TIfaceIface> ptrIface = ClntIfaceMgr().getIfaceByID(Iface_); if (ptrIface) ptrIface->updateAddr(ptrOptAddr->getAddr(), ptrOptAddr->getPref(), ptrOptAddr->getValid()); // set up new options in addrDB ptrAddrAddr->setPref(ptrOptAddr->getPref()); ptrAddrAddr->setValid(ptrOptAddr->getValid()); ptrAddrAddr->setTimestamp(); } } SPtr<TClntCfgIA> ptrCfgIA; ptrCfgIA=ClntCfgMgr().getIA(ptrIA->getIAID()); if (getT1() && getT2()) { ptrIA->setT1( this->getT1() ); ptrIA->setT2( this->getT2() ); Log(Debug) << "RENEW(IA_NA) will be sent (T1) after " << ptrIA->getT1() << ", REBIND (T2) after " << ptrIA->getT2() << " seconds." << LogEnd; } else { this->firstAddr(); ptrOptAddr = this->getAddr(); if (ptrOptAddr) { ptrIA->setT1( ptrOptAddr->getPref()/2); ptrIA->setT2( (int)((ptrOptAddr->getPref())*0.7) ); Log(Notice) << "Server set T1 and T2 to 0. Choosing default (50%, " << "70% * prefered-lifetime): T1=" << ptrIA->getT1() << ", T2=" << ptrIA->getT2() << LogEnd; } } ptrIA->setTimestamp(); ptrIA->setState(STATE_CONFIGURED); ptrCfgIA->setState(STATE_CONFIGURED); return true; }
*/bool TClntOptTA::doDuties() { // find this TA in addrMgr... SPtr<TAddrIA> ta = ClntAddrMgr().getTA(this->getIAID()); if (!ta) { Log(Debug) << "Creating TA (iaid=" << this->getIAID() << ") in the addrDB." << LogEnd; ta = new TAddrIA(this->Iface, TAddrIA::TYPE_TA, 0 /*if unicast, then this->Addr*/, this->DUID, DHCPV6_INFINITY, DHCPV6_INFINITY, this->getIAID()); ClntAddrMgr().addTA(ta); } // IAID found, set up new received options. SPtr<TAddrAddr> addr; SPtr<TClntOptIAAddress> optAddr; SPtr<TIfaceIface> ptrIface; ptrIface = ClntIfaceMgr().getIfaceByID(this->Iface); if (!ptrIface) { Log(Error) << "Interface " << this->Iface << " not found." << LogEnd; return true; } // for each address in IA option... this->firstAddr(); while (optAddr = this->getAddr() ) { addr = ta->getAddr( optAddr->getAddr() ); if (!addr) { // - no such address in DB - if (!optAddr->getValid()) { Log(Warning) << "Server send new addr with valid=0." << LogEnd; continue; } // add this address in addrDB... ta->addAddr(optAddr->getAddr(), optAddr->getPref(), optAddr->getValid()); ta->setDUID(this->DUID); // ... and in IfaceMgr - ptrIface->addAddr(optAddr->getAddr(), optAddr->getPref(), optAddr->getValid(), ptrIface->getPrefixLength()); Log(Notice) << "Temp. address " << *optAddr->getAddr() << " has been added to " << ptrIface->getName() << "/" << ptrIface->getID() << " interface." << LogEnd; } else { // - we have this addr in DB - if ( optAddr->getValid() == 0 ) { // valid=0, release this address and delete address from addrDB ta->delAddr(optAddr->getAddr()); // delete address from IfaceMgr ptrIface->delAddr(optAddr->getAddr(), ptrIface->getPrefixLength()); continue; // analyze next option OPTION_IA } // set up new options in IfaceMgr ptrIface->updateAddr(optAddr->getAddr(), optAddr->getPref(), optAddr->getValid()); // set up new options in addrDB addr->setPref(optAddr->getPref()); addr->setValid(optAddr->getValid()); addr->setTimestamp(); } } // mark this TA as configured SPtr<TClntCfgTA> cfgTA; SPtr<TClntCfgIface> cfgIface; if (! (cfgIface = ClntCfgMgr().getIface(this->Iface)) ) { Log(Error) << "Unable to find TA class in the CfgMgr, on the " << this->Iface << " interface." << LogEnd; return true; } cfgIface->firstTA(); cfgTA = cfgIface->getTA(); cfgTA->setState(STATE_CONFIGURED); ta->setState(STATE_CONFIGURED); return true; }