bool TSrvIfaceMgr::setupRelay(std::string name, int ifindex, int underIfindex,
                              SPtr<TSrvOptInterfaceID> interfaceID) {
    SPtr<TSrvIfaceIface> under = (Ptr*)this->getIfaceByID(underIfindex);
    if (!under) {
        Log(Crit) << "Unable to setup " << name << "/" << ifindex
                  << " relay: underlaying interface with id=" << underIfindex
                  << " is not present in the system or does not support IPv6." << LogEnd;
        return false;
    }

    if (!under->flagUp()) {
        Log(Crit) << "Unable to setup " << name << "/" << ifindex
                  << " relay: underlaying interface " << under->getName() << "/" << underIfindex
                  << " is down." << LogEnd;
        return false;
    }

    SPtr<TSrvIfaceIface> relay = new TSrvIfaceIface((const char*)name.c_str(), ifindex,
                                                        IF_UP | IF_RUNNING | IF_MULTICAST,   // flags
                                                        0,   // MAC
                                                        0,   // MAC length
                                                        0,0, // link address
                                                        0,0, // global addresses
                                                        0);  // hardware type
    relay->setUnderlaying(under);
    this->IfaceLst.append((Ptr*)relay);

    if (!under->appendRelay(relay, interfaceID)) {
        Log(Crit) << "Unable to setup " << name << "/" << ifindex
                  << " relay: underlaying interface " << under->getName() << "/" << underIfindex
                  << " already has " << HOP_COUNT_LIMIT << " relays defined." << LogEnd;
        return false;
    }

    Log(Notice) << "Relay " << name << "/" << ifindex << " (underlaying " << under->getName()
                << "/" << under->getID() << ") has been configured." << LogEnd;

    return true;
}