std::shared_ptr<InterfaceMap> ThriftConfigApplier::updateInterfaces() { auto origIntfs = orig_->getInterfaces(); InterfaceMap::NodeContainer newIntfs; bool changed = false; // Process all supplied interface configs size_t numExistingProcessed = 0; for (const auto& interfaceCfg : cfg_->interfaces) { InterfaceID id(interfaceCfg.intfID); auto origIntf = origIntfs->getInterfaceIf(id); shared_ptr<Interface> newIntf; auto newAddrs = getInterfaceAddresses(&interfaceCfg); if (origIntf) { newIntf = updateInterface(origIntf, &interfaceCfg, newAddrs); ++numExistingProcessed; } else { newIntf = createInterface(&interfaceCfg, newAddrs); } updateVlanInterfaces(newIntf ? newIntf.get() : origIntf.get()); changed |= updateMap(&newIntfs, origIntf, newIntf); } if (numExistingProcessed != origIntfs->size()) { // Some existing interfaces were removed. CHECK_LT(numExistingProcessed, origIntfs->size()); changed = true; } if (!changed) { return nullptr; } return origIntfs->clone(std::move(newIntfs)); }
void UdpNetwork::broadcastConnection( int32_t device_index /*=-1*/ ) { crap::interface_adresses addresses[ 100 ]; uint32_t number = getInterfaceAddresses( _connection.socket(), addresses, 100 ); if( device_index == -1 ) { for( uint32_t i=0; i< number; ++i ) _connection.connect( addresses[i].broadcast, _connection.listenPort() ); } else if( device_index >=0 && device_index < number ) _connection.connect( addresses[device_index].broadcast, _connection.listenPort() ); }