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; }
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; }
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; }
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; }