Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}