TBool MdnsPlatform::NifsMatch(const NetworkAdapter& aNif1, const NetworkAdapter& aNif2) { if (aNif1.Address() == aNif2.Address() && aNif1.Subnet() == aNif2.Subnet() && strcmp(aNif1.Name(), aNif2.Name()) == 0) { return true; } return false; }
void DviProtocolUpnp::HandleInterfaceChange() { TBool update = false; std::vector<DviProtocolUpnpAdapterSpecificData*> pendingDelete; { const TIpAddress kLoopbackAddr = MakeIpAddress(127, 0, 0, 1); AutoMutex a(iLock); NetworkAdapterList& adapterList = iDvStack.Env().NetworkAdapterList(); AutoNetworkAdapterRef ref(iDvStack.Env(), "DviProtocolUpnp::HandleInterfaceChange"); const NetworkAdapter* current = ref.Adapter(); TUint i = 0; std::vector<NetworkAdapter*>* subnetList = adapterList.CreateSubnetList(); std::vector<NetworkAdapter*>* adapters = adapterList.CreateNetworkAdapterList(); // remove listeners whose interface is no longer available while (i<iAdapters.size()) { if (FindAdapter(iAdapters[i]->Interface(), *adapters) != -1 && (!adapterList.SingleSubnetModeEnabled() || (current != NULL && iAdapters[i]->Interface() == current->Address()) || iAdapters[i]->Interface() == kLoopbackAddr)) { i++; } else { iAdapters[i]->SetPendingDelete(); pendingDelete.push_back(iAdapters[i]); iAdapters.erase(iAdapters.begin() + i); } } // add listeners for new subnets for (i=0; i<subnetList->size(); i++) { NetworkAdapter* subnet = (*subnetList)[i]; if (FindListenerForSubnet(subnet->Subnet()) == -1) { AddInterface(*subnet); update = iDevice.Enabled(); } } NetworkAdapterList::DestroyNetworkAdapterList(adapters); NetworkAdapterList::DestroySubnetList(subnetList); if (update) { // halt any ssdp broadcasts/responses that are currently in progress // (in case they're for a subnet that's no longer valid) // they'll be advertised again by the SendUpdateNotifications() call below iDvStack.SsdpNotifierManager().Stop(iDevice.Udn()); } } for (TUint i=0; i<pendingDelete.size(); i++) { pendingDelete[i]->Destroy(); } if (update) { SendUpdateNotifications(); } }
/* void NetworkAdapterList::TempFailureRetry(Functor& aCallback) { // static static const TUint kDelaysMs[] = { 100, 200, 400, 800, 1600, 3200, 5000, 10000, 20000, 20000, 30000 }; // roughly 90s worth of retries for (TUint i=0; i<sizeof(kDelaysMs)/sizeof(kDelaysMs[0]); i++) { try { aCallback(); return; } catch (NetworkError&) { LOG2(kNetwork, kError, "TempFailureRetry: error handling adapter change, try again in %ums\n", kDelaysMs[i]); Thread::Sleep(kDelaysMs[i]); } } THROW(NetworkError); } */ std::vector<NetworkAdapter*>* NetworkAdapterList::CreateSubnetListLocked() const { std::vector<NetworkAdapter*>* list = new std::vector<NetworkAdapter*>; for (TUint i=0; i<iNetworkAdapters->size(); i++) { NetworkAdapter* nif = (*iNetworkAdapters)[i]; TIpAddress subnet = nif->Subnet(); if (-1 == NetworkAdapterList::FindSubnet(subnet, *list)) { nif->AddRef("NetworkAdapterList"); list->push_back(nif); } } return list; }
void DviServer::SubnetListChanged() { /* DviProtocolUpnp relies on servers being available on all appropriate interfaces. We assume this happens through DviServer being created before any devices so registering for subnet change notification earlier. Assuming NetworkAdapterList always runs its listeners in the order they registered, we'll have updated before any device listeners are run. */ AutoMutex a(iLock); NetworkAdapterList& adapterList = iDvStack.Env().NetworkAdapterList(); AutoNetworkAdapterRef ref(iDvStack.Env(), "DviServer::SubnetListChanged"); NetworkAdapter* current = ref.Adapter(); if (adapterList.SingleSubnetModeEnabled()) { TInt i; // remove servers whose interface is no longer available for (i = (TInt)iServers.size() - 1; i >= 0; i--) { DviServer::Server* server = iServers[i]; if (current == NULL || server->Interface() != current->Address()) { delete server; iServers.erase(iServers.begin() + i); } } // add server if 'current' is a new subnet if (current != NULL && iServers.size() == 0) { AddServer(*current); } } else { std::vector<NetworkAdapter*>* subnetList = adapterList.CreateSubnetList(); std::vector<NetworkAdapter*>* nifList = adapterList.CreateNetworkAdapterList(); TInt i; // remove servers whose interface is no longer available for (i = (TInt)iServers.size() - 1; i >= 0; i--) { DviServer::Server* server = iServers[i]; if (FindInterface(server->Interface(), *nifList) == -1) { delete server; iServers.erase(iServers.begin() + i); } } // add servers for new subnets for (i = 0; i < (TInt)subnetList->size(); i++) { NetworkAdapter* subnet = (*subnetList)[i]; if (FindServer(subnet->Subnet()) == -1) { AddServer(*subnet); } } NetworkAdapterList::DestroyNetworkAdapterList(nifList); NetworkAdapterList::DestroySubnetList(subnetList); } }
DviProtocolUpnpAdapterSpecificData::DviProtocolUpnpAdapterSpecificData(DvStack& aDvStack, IUpnpMsearchHandler& aMsearchHandler, const NetworkAdapter& aAdapter, Bwx& aUriBase, TUint aServerPort) : iRefCount(1) , iDvStack(aDvStack) , iMsearchHandler(&aMsearchHandler) , iId(0x7fffffff) , iSubnet(aAdapter.Subnet()) , iAdapter(aAdapter.Address()) , iUriBase(aUriBase) , iServerPort(aServerPort) , iBonjourWebPage(0) , iDevice(NULL) { iListener = &(iDvStack.Env().MulticastListenerClaim(aAdapter.Address())); iId = iListener->AddMsearchHandler(this); }
void NetworkAdapterList::UpdateCurrentAdapter() { iCurrent = NULL; if (iNetworkAdapters != NULL && iNetworkAdapters->size() > 0) { for (TUint i=0; i<iNetworkAdapters->size(); i++) { NetworkAdapter* nif = (*iNetworkAdapters)[i]; if (nif->Subnet() == iDefaultSubnet) { iCurrent = nif; TraceAdapter("Subnet changed", *iCurrent); break; } } } if (iCurrent == NULL) { LOG(kTrace, "Subnet changed: none active\n"); } }
TIpAddress STDCALL OhNetNetworkAdapterSubnet(OhNetHandleNetworkAdapter aNif) { NetworkAdapter* nif = reinterpret_cast<NetworkAdapter*>(aNif); ASSERT(nif != NULL); return nif->Subnet(); }