Example #1
0
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;
}