status_t
uninit_stack()
{
    TRACE(("Unloading network stack\n"));

    put_module(NET_SOCKET_MODULE_NAME);
    uninit_timers();
    uninit_device_interfaces();
    uninit_interfaces();
    uninit_domains();
    uninit_notifications();

    mutex_destroy(&sChainLock);
    mutex_destroy(&sInitializeChainLock);

    // remove chains and families

    chain::DeleteChains(sProtocolChains);
    chain::DeleteChains(sDatalinkProtocolChains);
    chain::DeleteChains(sReceivingProtocolChains);

    uint32 cookie = 0;
    while (true) {
        struct family* family = (struct family*)hash_remove_first(sFamilies,
                                &cookie);
        if (family == NULL)
            break;

        delete family;
    }

    hash_uninit(sProtocolChains);
    hash_uninit(sDatalinkProtocolChains);
    hash_uninit(sReceivingProtocolChains);
    hash_uninit(sFamilies);

    return B_OK;
}
Example #2
0
status_t
uninit_stack()
{
	TRACE(("Unloading network stack\n"));

	put_module(NET_SOCKET_MODULE_NAME);
	uninit_timers();
	uninit_device_interfaces();
	uninit_interfaces();
	uninit_domains();
	uninit_notifications();

	mutex_destroy(&sChainLock);
	mutex_destroy(&sInitializeChainLock);

	// remove chains and families

	chain::DeleteChains(sProtocolChains);
	chain::DeleteChains(sDatalinkProtocolChains);
	chain::DeleteChains(sReceivingProtocolChains);

	struct family* current;
	current = sFamilies->Clear(true);
	while (current) {
		struct family* next = current->next;

		delete current;
		current = next;
	}

	delete sProtocolChains;
	delete sDatalinkProtocolChains;
	delete sReceivingProtocolChains;
	delete sFamilies;

	return B_OK;
}
Example #3
0
status_t
init_stack()
{
	status_t status = init_domains();
	if (status != B_OK)
		return status;

	status = init_interfaces();
	if (status != B_OK)
		goto err1;

	status = init_device_interfaces();
	if (status != B_OK)
		goto err2;

	status = init_timers();
	if (status != B_OK)
		goto err3;

	status = init_notifications();
	if (status < B_OK) {
		// If this fails, it just means there won't be any notifications,
		// it's not a fatal error.
		dprintf("networking stack notifications could not be initialized: %s\n",
			strerror(status));
	}

	module_info* dummy;
	status = get_module(NET_SOCKET_MODULE_NAME, &dummy);
	if (status != B_OK)
		goto err4;

	mutex_init(&sChainLock, "net chains");
	mutex_init(&sInitializeChainLock, "net intialize chains");

	sFamilies = new(std::nothrow) FamilyTable();
	if (sFamilies == NULL || sFamilies->Init(10) != B_OK) {
		status = B_NO_MEMORY;
		goto err5;
	}

	sProtocolChains = new(std::nothrow) ChainTable();
	if (sProtocolChains == NULL || sProtocolChains->Init(10) != B_OK) {
		status = B_NO_MEMORY;
		goto err6;
	}

	sDatalinkProtocolChains = new(std::nothrow) ChainTable();
	if (sDatalinkProtocolChains == NULL
			|| sDatalinkProtocolChains->Init(10) != B_OK) {
		status = B_NO_MEMORY;
		goto err7;
	}

	sReceivingProtocolChains = new(std::nothrow) ChainTable();
	if (sReceivingProtocolChains == NULL
			|| sReceivingProtocolChains->Init(10) != B_OK) {
		status = B_NO_MEMORY;
		goto err8;
	}

	sInitialized = true;

	link_init();
	scan_modules("network/protocols");
	scan_modules("network/datalink_protocols");

	// TODO: for now!
	register_domain_datalink_protocols(AF_INET, IFT_LOOP,
		"network/datalink_protocols/loopback_frame/v1", NULL);
#if 0 // PPP is not (currently) included in the build
	register_domain_datalink_protocols(AF_INET, IFT_PPP,
		"network/datalink_protocols/ppp_frame/v1", NULL);
#endif
	register_domain_datalink_protocols(AF_INET6, IFT_LOOP,
		"network/datalink_protocols/loopback_frame/v1", NULL);
	register_domain_datalink_protocols(AF_INET, IFT_ETHER,
		"network/datalink_protocols/arp/v1",
		"network/datalink_protocols/ethernet_frame/v1",
		NULL);
	register_domain_datalink_protocols(AF_INET6, IFT_ETHER,
		"network/datalink_protocols/ipv6_datagram/v1",
		"network/datalink_protocols/ethernet_frame/v1",
		NULL);

	return B_OK;

err8:
	delete sDatalinkProtocolChains;
err7:
	delete sProtocolChains;
err6:
	delete sFamilies;
err5:
	mutex_destroy(&sInitializeChainLock);
	mutex_destroy(&sChainLock);
err4:
	uninit_timers();
err3:
	uninit_device_interfaces();
err2:
	uninit_interfaces();
err1:
	uninit_domains();
	return status;
}
status_t
init_stack()
{
    status_t status = init_domains();
    if (status != B_OK)
        return status;

    status = init_interfaces();
    if (status != B_OK)
        goto err1;

    status = init_device_interfaces();
    if (status != B_OK)
        goto err2;

    status = init_timers();
    if (status != B_OK)
        goto err3;

    status = init_notifications();
    if (status < B_OK) {
        // If this fails, it just means there won't be any notifications,
        // it's not a fatal error.
        dprintf("networking stack notifications could not be initialized: %s\n",
                strerror(status));
    }

    module_info* dummy;
    status = get_module(NET_SOCKET_MODULE_NAME, &dummy);
    if (status != B_OK)
        goto err4;

    mutex_init(&sChainLock, "net chains");
    mutex_init(&sInitializeChainLock, "net intialize chains");

    sFamilies = hash_init(10, offsetof(struct family, next),
                          &family::Compare, &family::Hash);
    if (sFamilies == NULL) {
        status = B_NO_MEMORY;
        goto err5;
    }

    sProtocolChains = hash_init(10, offsetof(struct chain, next),
                                &chain::Compare, &chain::Hash);
    if (sProtocolChains == NULL) {
        status = B_NO_MEMORY;
        goto err6;
    }

    sDatalinkProtocolChains = hash_init(10, offsetof(struct chain, next),
                                        &chain::Compare, &chain::Hash);
    if (sDatalinkProtocolChains == NULL) {
        status = B_NO_MEMORY;
        goto err7;
    }

    sReceivingProtocolChains = hash_init(10, offsetof(struct chain, next),
                                         &chain::Compare, &chain::Hash);
    if (sReceivingProtocolChains == NULL) {
        status = B_NO_MEMORY;
        goto err8;
    }

    sInitialized = true;

    link_init();
    scan_modules("network/protocols");
    scan_modules("network/datalink_protocols");

    // TODO: for now!
    register_domain_datalink_protocols(AF_INET, IFT_LOOP,
                                       "network/datalink_protocols/loopback_frame/v1", NULL);
    register_domain_datalink_protocols(AF_INET6, IFT_LOOP,
                                       "network/datalink_protocols/loopback_frame/v1", NULL);
    register_domain_datalink_protocols(AF_INET, IFT_ETHER,
                                       "network/datalink_protocols/arp/v1",
                                       "network/datalink_protocols/ethernet_frame/v1",
                                       NULL);
    register_domain_datalink_protocols(AF_INET6, IFT_ETHER,
                                       "network/datalink_protocols/ipv6_datagram/v1",
                                       "network/datalink_protocols/ethernet_frame/v1",
                                       NULL);

    return B_OK;

err8:
    hash_uninit(sDatalinkProtocolChains);
err7:
    hash_uninit(sProtocolChains);
err6:
    hash_uninit(sFamilies);
err5:
    mutex_destroy(&sInitializeChainLock);
    mutex_destroy(&sChainLock);
err4:
    uninit_timers();
err3:
    uninit_device_interfaces();
err2:
    uninit_interfaces();
err1:
    uninit_domains();
    return status;
}
Example #5
0
int
main(int argc, char** argv)
{
	status_t status = init_timers();
	if (status < B_OK) {
		fprintf(stderr, "tcp_tester: Could not initialize timers: %s\n",
			strerror(status));
		return 1;
	}

	_add_builtin_module((module_info*)&gNetStackModule);
	_add_builtin_module((module_info*)&gNetBufferModule);
	_add_builtin_module((module_info*)&gNetSocketModule);
	_add_builtin_module((module_info*)&gNetDatalinkModule);
	_add_builtin_module(modules[0]);
	if (_get_builtin_dependencies() < B_OK) {
		fprintf(stderr, "tcp_tester: Could not initialize modules: %s\n",
			strerror(status));
		return 1;
	}

	sockaddr_in interfaceAddress;
	interfaceAddress.sin_len = sizeof(sockaddr_in);
	interfaceAddress.sin_family = AF_INET;
	interfaceAddress.sin_addr.s_addr = htonl(0xc0a80001);
	gInterface.address = (sockaddr*)&interfaceAddress;
	gInterface.domain = &sDomain;

	status = get_module("network/protocols/tcp/v1", (module_info **)&gTCPModule);
	if (status < B_OK) {
		fprintf(stderr, "tcp_tester: Could not open TCP module: %s\n",
			strerror(status));
		return 1;
	}

	net_protocol* client = init_protocol(&gClientSocket);
	if (client == NULL)
		return 1;
	net_protocol* server = init_protocol(&gServerSocket);
	if (server == NULL)
		return 1;

	setup_context(sClientContext, false);
	setup_context(sServerContext, true);

	printf("*** Server: %p (%ld), Client: %p (%ld)\n", server,
		sServerContext.thread, client, sClientContext.thread);

	setup_server();

	while (true) {
		printf("> ");
		fflush(stdout);

		char line[1024];
		if (fgets(line, sizeof(line), stdin) == NULL)
			break;

        argc = 0;
        argv = build_argv(line, &argc);
        if (argv == NULL || argc == 0)
            continue;

        int length = strlen(argv[0]);

#if 0
		char *newLine = strchr(line, '\n');
		if (newLine != NULL)
			newLine[0] = '\0';
#endif

		if (!strcmp(argv[0], "quit")
			|| !strcmp(argv[0], "exit")
			|| !strcmp(argv[0], "q"))
			break;

		bool found = false;

		for (cmd_entry* command = sBuiltinCommands; command->name != NULL; command++) {
			if (!strncmp(command->name, argv[0], length)) {
				command->func(argc, argv);
				found = true;
				break;
			}
		}

		if (!found)
			fprintf(stderr, "Unknown command \"%s\". Type \"help\" for a list of commands.\n", argv[0]);

		free(argv);
	}

	close_protocol(client);
	close_protocol(server);

	snooze(2000000);

	cleanup_context(sClientContext);
	cleanup_context(sServerContext);

	put_module("network/protocols/tcp/v1");
	uninit_timers();
	return 0;
}