/** * @brief adds an address to the client. * * Adds a single address to the client. If the client is not present in * address manager, adds it, too. Also, if client's IA is missing, adds it as well. * * @param clntDuid client DUID * @param clntAddr client's address (link-local, used if unicast is to be used) * @param iface interface, on which client is reachable * @param IAID ID of an IA * @param T1 - T1 timer * @param T2 - T2 timer * @param addr - address to be added * @param pref preferred lifetime * @param valid valid lifetime * @param quiet quiet mode (e.g. used during SOLICIT handling, don't print anything about * adding client/IA/address, as it will be deleted immediately anyway) * * @return true, if addition was successful */ bool TSrvAddrMgr::addClntAddr(SPtr<TDUID> clntDuid , SPtr<TIPv6Addr> clntAddr, int iface, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr<TIPv6Addr> addr, unsigned long pref, unsigned long valid, bool quiet) { // find this client SPtr <TAddrClient> ptrClient; this->firstClient(); while ( ptrClient = this->getClient() ) { if ( (*ptrClient->getDUID()) == (*clntDuid) ) break; } // have we found this client? if (!ptrClient) { if (!quiet) Log(Debug) << "Adding client (DUID=" << clntDuid->getPlain() << ") to addrDB." << LogEnd; ptrClient = new TAddrClient(clntDuid); this->addClient(ptrClient); } // find this IA SPtr <TAddrIA> ptrIA; ptrClient->firstIA(); while ( ptrIA = ptrClient->getIA() ) { if ( ptrIA->getIAID() == IAID) break; } // have we found this IA? if (!ptrIA) { ptrIA = new TAddrIA(iface, TAddrIA::TYPE_IA, clntAddr, clntDuid, T1, T2, IAID); ptrClient->addIA(ptrIA); if (!quiet) Log(Debug) << "Adding IA (IAID=" << IAID << ") to addrDB." << LogEnd; } SPtr <TAddrAddr> ptrAddr; ptrIA->firstAddr(); while ( ptrAddr = ptrIA->getAddr() ) { if (*ptrAddr->get()==*addr) break; } // address already exists if (ptrAddr) { Log(Warning) << "Address " << *ptrAddr << " is already assigned to this IA." << LogEnd; return false; } // add address ptrAddr = new TAddrAddr(addr, pref, valid); ptrIA->addAddr(ptrAddr); if (!quiet) Log(Debug) << "Adding " << ptrAddr->get()->getPlain() << " to IA (IAID=" << IAID << ") to addrDB." << LogEnd; return true; }
/** * @brief adds TA address to AddrMgr * * adds temporary address. Add missing client or TA, if necessary. * * @param clntDuid * @param clntAddr * @param iface * @param iaid * @param addr * @param pref * @param valid * * @return */ bool TSrvAddrMgr::addTAAddr(SPtr<TDUID> clntDuid , SPtr<TIPv6Addr> clntAddr, int iface, unsigned long iaid, SPtr<TIPv6Addr> addr, unsigned long pref, unsigned long valid) { // find this client SPtr <TAddrClient> ptrClient; this->firstClient(); while ( ptrClient = this->getClient() ) { if ( (*ptrClient->getDUID()) == (*clntDuid) ) break; } // have we found this client? if (!ptrClient) { Log(Debug) << "Adding client (DUID=" << clntDuid->getPlain() << ") to the addrDB." << LogEnd; ptrClient = new TAddrClient(clntDuid); this->addClient(ptrClient); } // find this TA SPtr <TAddrIA> ta; ptrClient->firstTA(); while ( ta = ptrClient->getTA() ) { if ( ta->getIAID() == iaid) break; } // have we found this TA? if (!ta) { ta = new TAddrIA(iface, TAddrIA::TYPE_TA, clntAddr, clntDuid, DHCPV6_INFINITY, DHCPV6_INFINITY, iaid); ptrClient->addTA(ta); Log(Debug) << "Adding TA (IAID=" << iaid << ") to the addrDB." << LogEnd; } SPtr <TAddrAddr> ptrAddr; ta->firstAddr(); while ( ptrAddr = ta->getAddr() ) { if (*ptrAddr->get()==*addr) break; } // address already exists if (ptrAddr) { Log(Warning) << "Address " << *ptrAddr << " is already assigned to TA (iaid=" << iaid << ")." << LogEnd; return false; } // add address ptrAddr = new TAddrAddr(addr, pref, valid); ta->addAddr(ptrAddr); Log(Debug) << "Adding " << ptrAddr->get()->getPlain() << " to TA (IAID=" << iaid << ") to addrDB." << LogEnd; return true; }
/** * match parsed interfaces with interfaces detected in system. * ClntCfgIface objects copied to CfgMgr. * * @param parser * * @return true if ok, false if interface definitions are incorrect */ bool TClntCfgMgr::matchParsedSystemInterfaces(ClntParser *parser) { int cfgIfaceCnt; cfgIfaceCnt = parser->ClntCfgIfaceLst.count(); Log(Debug) << cfgIfaceCnt << " interface(s) specified in " << CLNTCONF_FILE << LogEnd; SPtr<TClntCfgIface> cfgIface; SPtr<TIfaceIface> ifaceIface; if (cfgIfaceCnt) { // user specified some interfaces in config file parser->ClntCfgIfaceLst.first(); while(cfgIface = parser->ClntCfgIfaceLst.get()) { // for each interface (from config file) if (cfgIface->getID()==-1) { ifaceIface = ClntIfaceMgr().getIfaceByName(cfgIface->getName()); } else { ifaceIface = ClntIfaceMgr().getIfaceByID(cfgIface->getID()); } if (!ifaceIface) { if (inactiveMode()) { Log(Info) << "Interface " << cfgIface->getFullName() << " is not currently available (that's ok, inactive-mode enabled)." << LogEnd; continue; } Log(Error) << "Interface " << cfgIface->getFullName() << " specified in " << CLNTCONF_FILE << " is not present or does not support IPv6." << LogEnd; return false; } if (cfgIface->noConfig()) { Log(Info) << "Interface " << cfgIface->getFullName() << " has flag no-config set, so it is ignored." << LogEnd; continue; } #ifdef MOD_REMOTE_AUTOCONF if (RemoteAutoconf) { List(TIPv6Addr) emptyLst; SPtr<TOpt> optNeighbors = new TOptAddrLst(OPTION_NEIGHBORS, emptyLst, 0); Log(Debug) << "Enabled Neighbors option on " << cfgIface->getFullName() << LogEnd; cfgIface->addExtraOption(optNeighbors, false); } #endif cfgIface->setIfaceName(ifaceIface->getName()); cfgIface->setIfaceID(ifaceIface->getID()); // setup default prefix length (used when IPv6 address is added to the interface) ifaceIface->setPrefixLength(cfgIface->getOnLinkPrefixLength()); if (!ifaceIface->flagUp() || !ifaceIface->countLLAddress()) { if (inactiveMode()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet (does not have " << "link-local address or is down), skipping it for now." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true, true, true); // move it to InactiveLst continue; } Log(Crit) << "Interface " << ifaceIface->getFullName() << " is down or doesn't have any link-local address." << LogEnd; return false; } // Check if the interface is during bring-up phase // (i.e. DAD procedure for link-local addr is not complete yet) char tmp[64]; ifaceIface->firstLLAddress(); inet_ntop6(ifaceIface->getLLAddress(), tmp); if (is_addr_tentative(ifaceIface->getName(), ifaceIface->getID(), tmp) == LOWLEVEL_TENTATIVE_YES) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has link-local address " << tmp << ", but it is currently tentative." << LogEnd; if (this->inactiveMode()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet (link-local address " << "is not ready), skipping it for now." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true, true, true); // move it to InactiveLst continue; } Log(Crit) << "Interface " << ifaceIface->getFullName() << " has tentative link-local address (and inactive-mode is disabled)." << LogEnd; return false; } if (obeyRaBits()) { if (!ifaceIface->getMBit() && !ifaceIface->getOBit()) { Log(Info) << "Interface " << cfgIface->getFullName() << " configuration loaded, but did not receive a Router " << "Advertisement with M or O bits set, adding to inactive." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true, true, true); // move it to inactive list continue; } cfgIface->setMbit(ifaceIface->getMBit()); cfgIface->setObit(ifaceIface->getOBit()); } addIface(cfgIface); Log(Info) << "Interface " << cfgIface->getFullName() << " configuration has been loaded." << LogEnd; } return countIfaces() || (inactiveMode() && inactiveIfacesCnt()); } else { // user didn't specified any interfaces in config file, so // we'll try to configure each interface we could find Log(Warning) << "Config file does not contain any interface definitions. Trying to autodetect." << LogEnd; List(TIPv6Addr) dnsList; dnsList.clear(); parser->ParserOptStack.getLast()->setDNSServerLst(&dnsList); // Try to add a hostname char hostname[255]; if (get_hostname(hostname, 255) == LOWLEVEL_NO_ERROR) { parser->ParserOptStack.getLast()->setFQDN(string(hostname)); } else { parser->ParserOptStack.getLast()->setFQDN(string("")); } int cnt = 0; ClntIfaceMgr().firstIface(); while ( ifaceIface = ClntIfaceMgr().getIface() ) { // for each interface present in the system... if (!inactiveMode()) { if (!ifaceIface->flagUp()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is down, ignoring." << LogEnd; continue; } if (!ifaceIface->flagRunning()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has flag RUNNING not set, ignoring." << LogEnd; continue; } if (!ifaceIface->flagMulticast()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not multicast capable, ignoring." << LogEnd; continue; } } if ( !(ifaceIface->getMacLen() > 5) ) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has MAC address length " << ifaceIface->getMacLen() << " (6 or more required), ignoring." << LogEnd; continue; } // ignore disabled Teredo pseudo-interface on Win (and other similar useless junk) const static unsigned char zeros[] = {0,0,0,0,0,0,0,0}; const static unsigned char ones[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; if ( (ifaceIface->getMacLen()<=8) && (!memcmp(zeros, ifaceIface->getMac(), min(8,ifaceIface->getMacLen())) || !memcmp(ones, ifaceIface->getMac(), min(8,ifaceIface->getMacLen()))) ) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has invalid MAC address " << hexToText((uint8_t*)ifaceIface->getMac(), ifaceIface->getMacLen(), true) << ", ignoring." << LogEnd; continue; } if (!ifaceIface->countLLAddress()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has no link-local address, ignoring. " << "(Disconnected? Not associated? No-link?)" << LogEnd; continue; } // One address... SPtr<TClntCfgAddr> addr(new TClntCfgAddr()); addr->setOptions(parser->ParserOptStack.getLast()); // ... is stored in one IA... SPtr<TClntCfgIA> ia = new TClntCfgIA(); ia->setOptions(parser->ParserOptStack.getLast()); ia->addAddr(addr); // ... on this newly created interface... cfgIface = SPtr<TClntCfgIface>(new TClntCfgIface(ifaceIface->getID())); cfgIface->setIfaceName(ifaceIface->getName()); cfgIface->setIfaceID(ifaceIface->getID()); cfgIface->addIA(ia); cfgIface->setOptions(parser->ParserOptStack.getLast()); // ... which is added to ClntCfgMgr addIface(cfgIface); Log(Info) << "Interface " << cfgIface->getFullName() << " has been added." << LogEnd; if (inactiveMode() && !ifaceIface->flagRunning() ) { makeInactiveIface(cfgIface->getID(), true, true, true); // move it to InactiveLst Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet" << " (not running), made inactive." << LogEnd; } cnt ++; } if (!cnt) { Log(Crit) << "Unable to detect any suitable interfaces. If there are any interfaces that you" << " want to have configured, please specify them in client.conf file." << LogEnd; return false; } } 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; }
/** * match parsed interfaces with interfaces detected in system. * ClntCfgIface objects copied to CfgMgr. * * @param parser * * @return */ bool TClntCfgMgr::matchParsedSystemInterfaces(ClntParser *parser) { int cfgIfaceCnt; cfgIfaceCnt = parser->ClntCfgIfaceLst.count(); Log(Debug) << cfgIfaceCnt << " interface(s) specified in " << CLNTCONF_FILE << LogEnd; SPtr<TClntCfgIface> cfgIface; SPtr<TIfaceIface> ifaceIface; if (cfgIfaceCnt) { // user specified some interfaces in config file parser->ClntCfgIfaceLst.first(); while(cfgIface = parser->ClntCfgIfaceLst.get()) { // for each interface (from config file) if (cfgIface->getID()==-1) { ifaceIface = ClntIfaceMgr().getIfaceByName(cfgIface->getName()); } else { ifaceIface = ClntIfaceMgr().getIfaceByID(cfgIface->getID()); } if (!ifaceIface) { Log(Error) << "Interface " << cfgIface->getName() << "/" << cfgIface->getID() << " specified in " << CLNTCONF_FILE << " is not present or does not support IPv6." << LogEnd; return false; } if (cfgIface->noConfig()) { Log(Info) << "Interface " << cfgIface->getName() << "/" << cfgIface->getID() << " has flag no-config set, so it is ignored." << LogEnd; continue; } #ifdef MOD_REMOTE_AUTOCONF if (RemoteAutoconf) { List(TIPv6Addr) emptyLst; SPtr<TOpt> optNeighbors = new TOptAddrLst(OPTION_NEIGHBORS, emptyLst, 0); Log(Debug) << "Enabled Neighbors option on " << cfgIface->getFullName() << LogEnd; cfgIface->addExtraOption(optNeighbors, false); } #endif cfgIface->setIfaceName(ifaceIface->getName()); cfgIface->setIfaceID(ifaceIface->getID()); // setup default prefix length (used when IPv6 address is added to the interface) ifaceIface->setPrefixLength(cfgIface->getPrefixLength()); if (!ifaceIface->countLLAddress()) { if (this->inactiveMode()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet (does not have " << "link-local address), skipping it for now." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true); // move it to InactiveLst return true; } Log(Crit) << "Interface " << ifaceIface->getFullName() << " is down or doesn't have any link-local address." << LogEnd; return false; } // Check if the interface is during bring-up phase // (i.e. DAD procedure for link-local addr is not complete yet) char tmp[64]; ifaceIface->firstLLAddress(); inet_ntop6(ifaceIface->getLLAddress(), tmp); if (is_addr_tentative(ifaceIface->getName(), ifaceIface->getID(), tmp) == LOWLEVEL_TENTATIVE_YES) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has link-local address " << tmp << ", but it is currently tentative." << LogEnd; if (this->inactiveMode()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not operational yet (link-local address " << "is not ready), skipping it for now." << LogEnd; addIface(cfgIface); makeInactiveIface(cfgIface->getID(), true); // move it to InactiveLst return true; } Log(Crit) << "Interface " << ifaceIface->getFullName() << " has tentative link-local address (and inactive-mode is disabled)." << LogEnd; return false; } this->addIface(cfgIface); Log(Info) << "Interface " << cfgIface->getName() << "/" << cfgIface->getID() << " configuation has been loaded." << LogEnd; } } else { // user didn't specified any interfaces in config file, so // we'll try to configure each interface we could find Log(Warning) << "Config file does not contain any interface definitions. Trying to autodetect." << LogEnd; List(TIPv6Addr) dnsList; dnsList.clear(); parser->ParserOptStack.getLast()->setDNSServerLst(&dnsList); int cnt = 0; ClntIfaceMgr().firstIface(); while ( ifaceIface = ClntIfaceMgr().getIface() ) { // for each interface present in the system... if (!ifaceIface->flagUp()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is down, ignoring." << LogEnd; continue; } if (!ifaceIface->flagRunning()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has flag RUNNING not set, ignoring." << LogEnd; continue; } if (!ifaceIface->flagMulticast()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " is not multicast capable, ignoring." << LogEnd; continue; } if ( !(ifaceIface->getMacLen() > 5) ) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has MAC address length " << ifaceIface->getMacLen() << " (6 or more required), ignoring." << LogEnd; continue; } ifaceIface->firstLLAddress(); if (!ifaceIface->getLLAddress()) { Log(Notice) << "Interface " << ifaceIface->getFullName() << " has no link-local address, ignoring. " << "(Disconnected? Not associated? No-link?)" << LogEnd; continue; } // One address... SPtr<TClntCfgAddr> addr(new TClntCfgAddr()); addr->setOptions(parser->ParserOptStack.getLast()); // ... is stored in one IA... SPtr<TClntCfgIA> ia = new TClntCfgIA(); ia->setOptions(parser->ParserOptStack.getLast()); ia->addAddr(addr); // ... on this newly created interface... cfgIface = SPtr<TClntCfgIface>(new TClntCfgIface(ifaceIface->getID())); cfgIface->setIfaceName(ifaceIface->getName()); cfgIface->setIfaceID(ifaceIface->getID()); cfgIface->addIA(ia); cfgIface->setOptions(parser->ParserOptStack.getLast()); // ... which is added to ClntCfgMgr this->addIface(cfgIface); Log(Info) << "Interface " << cfgIface->getName() << "/" << cfgIface->getID() << " has been added." << LogEnd; cnt ++; } if (!cnt) { Log(Crit) << "Unable to detect any suitable interfaces. If there are any interfaces that you" << " want to have configured, please specify them in client.conf file." << LogEnd; return false; } } 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; }