bool TAddrMgr::addPrefix(SPtr<TAddrClient> client, SPtr<TDUID> duid , SPtr<TIPv6Addr> addr, const std::string& ifname, int ifindex, unsigned long IAID, unsigned long T1, unsigned long T2, SPtr<TIPv6Addr> prefix, unsigned long pref, unsigned long valid, int length, bool quiet) { if (!prefix) { Log(Error) << "Attempt to add null prefix failed." << LogEnd; return false; } if (!client) { Log(Error) << "Unable to add prefix, client not defined." << LogEnd; return false; } // find this PD SPtr <TAddrIA> ptrPD; client->firstPD(); while ( ptrPD = client->getPD() ) { if ( ptrPD->getIAID() == IAID) break; } // have we found this PD? if (!ptrPD) { ptrPD = new TAddrIA(ifname, ifindex, IATYPE_PD, addr, duid, T1, T2, IAID); /// @todo: This setState() was used on reconfigure branch, but not on master ptrPD->setState(STATE_CONFIGURED); client->addPD(ptrPD); if (!quiet) Log(Debug) << "PD: Adding PD (iaid=" << IAID << ") to addrDB." << LogEnd; } ptrPD->setT1(T1); ptrPD->setT2(T2); SPtr <TAddrPrefix> ptrPrefix; ptrPD->firstPrefix(); while ( ptrPrefix = ptrPD->getPrefix() ) { if (*ptrPrefix->get()==*prefix) break; } // address already exists if (ptrPrefix) { Log(Warning) << "PD: Prefix " << ptrPrefix->get()->getPlain() << "/" << ptrPrefix->getLength() << " is already assigned to this PD." << LogEnd; return false; } // add address ptrPD->addPrefix(prefix, pref, valid, length); if (!quiet) Log(Debug) << "PD: Adding " << prefix->getPlain() << " prefix to PD (iaid=" << IAID << ") to addrDB." << LogEnd; ptrPD->setDUID(duid); return true; }