status_t get_domain_datalink_protocols(Interface* interface, net_domain* domain) { TRACE(("%s(interface %p, domain %d)\n", __FUNCTION__, interface, domain->family)); struct chain* chain; { MutexLocker _(sChainLock); chain = chain::Lookup(sDatalinkProtocolChains, domain->family, interface->DeviceInterface()->device->type, 0); if (chain == NULL) return EAFNOSUPPORT; } domain_datalink* datalink = interface->DomainDatalink(domain->family); if (datalink == NULL) return B_BAD_VALUE; if (datalink->first_protocol != NULL) return B_NAME_IN_USE; // create net_protocol objects for the protocols in the chain status_t status = chain->Acquire(); if (status != B_OK) return status; net_datalink_protocol* last = NULL; for (int32 i = 0; chain->infos[i] != NULL; i++) { net_datalink_protocol* protocol; status_t status = ((net_datalink_protocol_module_info*) chain->infos[i])->init_protocol(interface, domain, &protocol); if (status != B_OK) { // free protocols we already initialized uninit_domain_datalink_protocols(datalink); chain->Release(); return status; } protocol->module = (net_datalink_protocol_module_info*)chain->infos[i]; protocol->interface = interface; protocol->domain = domain; protocol->next = NULL; if (last == NULL) { datalink->first_protocol = protocol; datalink->first_info = protocol->module; } else last->next = protocol; last = protocol; } return B_OK; }
status_t get_domain_datalink_protocols(net_interface* _interface) { struct net_interface_private* interface = (net_interface_private*)_interface; struct chain* chain; { MutexLocker _(sChainLock); chain = chain::Lookup(sDatalinkProtocolChains, interface->domain->family, interface->device_interface->device->type, 0); if (chain == NULL) return EAFNOSUPPORT; } // create net_protocol objects for the protocols in the chain status_t status = chain->Acquire(); if (status < B_OK) return status; net_datalink_protocol* last = NULL; for (int32 i = 0; chain->infos[i] != NULL; i++) { net_datalink_protocol* protocol; status_t status = ((net_datalink_protocol_module_info*) chain->infos[i])->init_protocol(interface, &protocol); if (status < B_OK) { // free protocols we already initialized uninit_domain_datalink_protocols(interface); chain->Release(); return status; } protocol->module = (net_datalink_protocol_module_info*)chain->infos[i]; protocol->interface = interface; protocol->next = NULL; if (last == NULL) { interface->first_protocol = protocol; interface->first_info = protocol->module; } else last->next = protocol; last = protocol; } return B_OK; }
status_t put_domain_datalink_protocols(net_interface* _interface) { struct net_interface_private* interface = (net_interface_private*)_interface; struct chain* chain; { MutexLocker _(sChainLock); chain = chain::Lookup(sDatalinkProtocolChains, interface->domain->family, interface->device_interface->device->type, 0); if (chain == NULL) return B_ERROR; } uninit_domain_datalink_protocols(interface); chain->Release(); return B_OK; }
status_t put_domain_datalink_protocols(Interface* interface, net_domain* domain) { TRACE(("%s(interface %p, domain %d)\n", __FUNCTION__, interface, domain->family)); struct chain* chain; { MutexLocker _(sChainLock); chain = chain::Lookup(sDatalinkProtocolChains, domain->family, interface->DeviceInterface()->device->type, 0); if (chain == NULL) return B_ERROR; } uninit_domain_datalink_protocols(interface->DomainDatalink(domain->family)); chain->Release(); return B_OK; }