Esempio n. 1
0
TClntMsgInfRequest::TClntMsgInfRequest(SPtr<TClntCfgIface> iface)
    :TClntMsg(iface->getID(), 0, INFORMATION_REQUEST_MSG) {

    IRT = INF_TIMEOUT;
    MRT = INF_MAX_RT;
    MRC = 0;
    MRD = 0;
    RT= 0 ;
    
    Iface=iface->getID();
    IsDone=false;

    if (!ClntCfgMgr().anonInfRequest()) {
        Options.push_back(new TOptDUID(OPTION_CLIENTID, ClntCfgMgr().getDUID(), this));
    } else {
        Log(Info) << "Sending anonymous INF-REQUEST (ClientID not included)." << LogEnd;
    }

    // Append the options we want to configure
    appendRequestedOptions();

    // If there is no ORO (or it is empty), skip the message.
    SPtr<TClntOptOptionRequest> oro = (Ptr*) getOption(OPTION_ORO);
    if (!oro || !oro->count()) {
        IsDone = true;
        return;
    }

    appendAuthenticationOption();
    appendElapsedOption();
    send();
}
Esempio n. 2
0
    :TClntMsg(iface, addr, SOLICIT_MSG)
{
    IRT=SOL_TIMEOUT;
    MRT=SOL_MAX_RT;
    MRC=0; //these both below mean there is no ending condition and transactions
    MRD=0; //lasts till receiving answer
    RT=0;
	
    // ClientIdentifier option
    appendClientID();

    SPtr<TAddrIA> addrIA;
    
    // all IAs are provided by ::checkSolicit()
    SPtr<TClntCfgIA> ia;
    iaLst.first();
    while (ia = iaLst.get()) {
        SPtr<TClntOptIA_NA> iaOpt;
        iaOpt = new TClntOptIA_NA(ia, this);
        Options.push_back( (Ptr*)iaOpt );
        if (!remoteAutoconf)
            ia->setState(STATE_INPROCESS);
        addrIA = ClntAddrMgr().getIA(ia->getIAID());
        if (addrIA)
            addrIA->setState(STATE_INPROCESS);
        else
            Log(Error) << "AddrMgr does not have IA with IAID=" << ia->getIAID() << LogEnd;
    }

    // TA is provided by ::checkSolicit()
    if (ta) {
	SPtr<TClntOptTA> taOpt = new TClntOptTA(ta->getIAID(), this);
	Options.push_back( (Ptr*) taOpt);
	if (!remoteAutoconf)
	    ta->setState(STATE_INPROCESS);
        addrIA = ClntAddrMgr().getTA(ta->getIAID());
        if (addrIA)
            addrIA->setState(STATE_INPROCESS);
        else
            Log(Error) << "AddrMgr does not have TA with IAID=" << ia->getIAID() << LogEnd;
    }

    // all PDs are provided by ::checkSolicit()
    SPtr<TClntCfgPD> pd;
    pdLst.first();
    while ( pd = pdLst.get() ) {
        SPtr<TClntOptIA_PD> pdOpt = new TClntOptIA_PD(pd, this);
        Options.push_back( (Ptr*)pdOpt );
        if (!remoteAutoconf)
            pd->setState(STATE_INPROCESS);
        addrIA = ClntAddrMgr().getPD(pd->getIAID());
        if (addrIA)
            addrIA->setState(STATE_INPROCESS);
        else
            Log(Error) << "AddrMgr does not have PD with IAID=" << pd->getIAID() << LogEnd;
    }
    
    if (rapid)
        Options.push_back(new TOptEmpty(OPTION_RAPID_COMMIT, this));

    // RECONF-ACCEPT is added in TClntMsg::appendRequestedOptions()

    // append and switch to INPROCESS state
    if (!remoteAutoconf)
	appendTAOptions(true); 

    // append options specified in the config file
    if (!remoteAutoconf)
	appendRequestedOptions();

    appendAuthenticationOption();
    
    IsDone = false;
    send();
}
bool TSrvMsgAdvertise::handleSolicitOptions(SPtr<TSrvMsgSolicit> solicit) {

    SPtr<TOpt>       opt;
    SPtr<TIPv6Addr> clntAddr = PeerAddr;

    // is this client supported?
    // @todo move this to a common place (for every message)
    if (!SrvCfgMgr().isClntSupported(ClientDUID, clntAddr, Iface)) {
        //No reply for this client
        Log(Notice) << "Client (DUID=" << ClientDUID->getPlain() << ",addr=" << *clntAddr
                    << ") was rejected due to accept-only or reject-client." << LogEnd;
        return false;
    }

    // --- process this message ---
    solicit->firstOption();
    while ( opt = solicit->getOption()) {
        switch (opt->getOptType()) {
        case OPTION_IA_NA : {
            SPtr<TSrvOptIA_NA> optIA_NA;
            optIA_NA = new TSrvOptIA_NA( (Ptr*)opt, ClientDUID, clntAddr, Iface, SOLICIT_MSG, this);
            Options.push_back((Ptr*)optIA_NA);
            break;
        }
        case OPTION_IA_TA: {
            SPtr<TSrvOptTA> optTA;
            optTA = new TSrvOptTA((Ptr*) opt,
                                  ClientDUID, clntAddr, Iface, SOLICIT_MSG, this);
            Options.push_back( (Ptr*) optTA);
            break;
        }
        case OPTION_IA_PD: {
            SPtr<TSrvOptIA_PD> optPD;
            optPD = new TSrvOptIA_PD((Ptr*) opt, clntAddr, ClientDUID,  Iface, SOLICIT_MSG, this);
            Options.push_back( (Ptr*) optPD);
            break;
        }
        case OPTION_RAPID_COMMIT: {
            // RAPID COMMIT present, but we're in ADVERTISE, so obviously
            // server is configured not to use RAPID COMMIT
            Log(Notice) << "Generating ADVERTISE message, RAPID COMMIT option ignored." << LogEnd;
            break;
        }
        case OPTION_IAADDR: {
            Log(Warning) << "Invalid(misplaced) IAADDR option received." << LogEnd;
            break;
        }
        case OPTION_IAPREFIX: {
            Log(Warning) << "Invalid(misplaced) IAPREFIX option received." << LogEnd;
            break;
        }
        case OPTION_AUTH : {
            ORO->addOption(OPTION_AUTH);
            break;
        }
        case OPTION_ORO:
        case OPTION_CLIENTID:
        case OPTION_ELAPSED_TIME : {
            break;
        }
        case OPTION_STATUS_CODE : {
            SPtr< TOptStatusCode > ptrStatus = (Ptr*) opt;
            Log(Error) << "Received STATUS_CODE from client:"
                       <<  ptrStatus->getCode() << ", (" << ptrStatus->getText()
                       << ")" << LogEnd;
            break;
        }

        //add options requested by client to option Request Option if
        //client didn't included them
        case OPTION_FQDN : {
            SPtr<TSrvOptFQDN> requestFQDN = (Ptr*) opt;
            SPtr<TOptFQDN> anotherFQDN = (Ptr*) opt;
            string hint = anotherFQDN->getFQDN();
            SPtr<TSrvOptFQDN> optFQDN;

            SPtr<TIPv6Addr> clntAssignedAddr = SrvAddrMgr().getFirstAddr(ClientDUID);
            if (clntAssignedAddr)
                optFQDN = this->prepareFQDN(requestFQDN, ClientDUID, clntAssignedAddr, hint, false);
            else
                optFQDN = this->prepareFQDN(requestFQDN, ClientDUID, clntAddr, hint, false);

            if (optFQDN) {
                this->Options.push_back((Ptr*) optFQDN);
            }
            break;
        }
        case OPTION_VENDOR_OPTS:
        {
            SPtr<TOptVendorData> v = (Ptr*) opt;
            appendVendorSpec(ClientDUID, Iface, v->getVendor(), ORO);
            break;
        }

        case OPTION_AAAAUTH:
        {
            Log(Debug) << "Auth: Option AAAAuthentication received." << LogEnd;
            break;
        }
        case OPTION_PREFERENCE:
        case OPTION_UNICAST:
        case OPTION_SERVERID:
        case OPTION_RELAY_MSG:
        case OPTION_INTERFACE_ID:
        {
            Log(Warning) << "Invalid option (" << opt->getOptType() << ") received." << LogEnd;
            break;
        }

        case OPTION_DNS_SERVERS:
        case OPTION_DOMAIN_LIST:
        case OPTION_SNTP_SERVERS:
        case OPTION_NEW_TZDB_TIMEZONE:
        {
            handleDefaultOption(opt);
            break;
        }
        // options not yet supported
        case OPTION_USER_CLASS :
        case OPTION_VENDOR_CLASS:
        case OPTION_RECONF_MSG :
        case OPTION_RECONF_ACCEPT:
        default: {
            Log(Debug) << "Option " << opt->getOptType() << " is not supported." << LogEnd;
            break;
        }
        } // end of switch
    } // end of while

    // append serverID, preference and possibly unicast
    appendMandatoryOptions(ORO);

    //if client requested parameters and policy doesn't forbid from answering
    appendRequestedOptions(ClientDUID, clntAddr, Iface, ORO);


    appendStatusCode();

    // this is ADVERTISE only, so we need to release assigned addresses
    this->firstOption();
    while ( opt = this->getOption()) {
        switch (opt->getOptType()) {
        case OPTION_IA_NA: {
            SPtr<TSrvOptIA_NA> ptrOptIA_NA;
            ptrOptIA_NA = (Ptr*) opt;
            ptrOptIA_NA->releaseAllAddrs(false);
            break;
        }
        case OPTION_IA_TA: {
            SPtr<TSrvOptTA> ta;
            ta = (Ptr*) opt;
            ta->releaseAllAddrs(false);
            break;
        }
        default:
            break;
        }
    }

    appendAuthenticationOption(ClientDUID);

    pkt = new char[this->getSize()];
    MRT = 0;
    send();
    return true;
}