/** * @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; }