From 3df5dd4a9fbb0eb2af6823c64bcb8f2770eecd15 Mon Sep 17 00:00:00 2001 From: TomAwezome Date: Mon, 1 Mar 2021 03:55:49 -0500 Subject: [PATCH] Implement NetRep for full network data report. Implement IPV4Rep to report local, router, and subnet IPV4 addresses. Expand UDPRep to report socket timeout and info about messages queued at the socket. --- ...o => Zenith-latest-2021-03-01-03_38_58.iso | Bin 34617344 -> 34619392 bytes src/Home/Net/ARP.CC | 8 +++- src/Home/Net/DHCP.CC | 9 ++++ src/Home/Net/DNS.CC | 7 ++- src/Home/Net/IPV4.CC | 22 +++++++++ src/Home/Net/NetStart.CC | 2 + src/Home/Net/Tests/UDPSocketTest2.CC | 23 +++++++++ src/Home/Net/UDP.CC | 45 ++++++++++++++++-- 8 files changed, 106 insertions(+), 10 deletions(-) rename Zenith-latest-2021-02-27-22_25_44.iso => Zenith-latest-2021-03-01-03_38_58.iso (99%) create mode 100755 src/Home/Net/Tests/UDPSocketTest2.CC diff --git a/Zenith-latest-2021-02-27-22_25_44.iso b/Zenith-latest-2021-03-01-03_38_58.iso similarity index 99% rename from Zenith-latest-2021-02-27-22_25_44.iso rename to Zenith-latest-2021-03-01-03_38_58.iso index 53157787dbcdbd772cf03738f7f7dc441b440034..c94ecd6fa697f35391f40e6b4c26053736fa8663 100755 GIT binary patch delta 52110 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 diff --git a/src/Home/Net/ARP.CC b/src/Home/Net/ARP.CC index d8f94bf..4cdfe50 100755 --- a/src/Home/Net/ARP.CC +++ b/src/Home/Net/ARP.CC @@ -213,7 +213,13 @@ U0 ARPRep() CARPHash *temp_hash; U32 address; - "\n"; + "$$LTBLUE$$ARP Report:$$FG$$\n\n"; + "ARP Local Address: $FG,6$%d.%d.%d.%d$FG$\n\n", + arp_globals.local_ipv4.u8[0], + arp_globals.local_ipv4.u8[1], + arp_globals.local_ipv4.u8[2], + arp_globals.local_ipv4.u8[3]; + for (i = 0; i <= arp_cache->mask; i++) { temp_hash = arp_cache->body[i]; diff --git a/src/Home/Net/DHCP.CC b/src/Home/Net/DHCP.CC index a661462..8a0a4b1 100755 --- a/src/Home/Net/DHCP.CC +++ b/src/Home/Net/DHCP.CC @@ -526,3 +526,12 @@ U0 NetConfigure() else NetLog("$$BG,2$$$$FG,15$$==== Network Configure Success ====$$FG$$$$BG$$"); } + +U0 NetRep() +{ + "\n$$LTGREEN$$Network Report:$$FG$$\n\n"; + UDPRep; + DNSRep; + ARPRep; + IPV4Rep; +} \ No newline at end of file diff --git a/src/Home/Net/DNS.CC b/src/Home/Net/DNS.CC index baca6aa..a459d2f 100755 --- a/src/Home/Net/DNS.CC +++ b/src/Home/Net/DNS.CC @@ -654,7 +654,7 @@ U0 DNSRep() I64 i; CDNSHash *temp_hash; - "\n"; + "$$LTBLUE$$DNS Report:$$FG$$\n\n"; for (i = 0; i <= dns_cache->mask; i++) { temp_hash = dns_cache->body[i]; @@ -663,8 +663,8 @@ U0 DNSRep() { "DNS Hash @ $FG,3$0x%X$FG$:\n", temp_hash; - " Hostname: $FG,6$%s$FG$\n", temp_hash->str; - " Address: $FG,6$%s$FG$\n", + " Hostname: $FG,6$%s$FG$\n", temp_hash->str; + " IP Address: $FG,6$%s$FG$\n", NetworkToPresentation(temp_hash->info.family, &temp_hash->info.address(CSocketAddressIPV4 *)->address); // TODO: IPV4 kludge @@ -673,7 +673,6 @@ U0 DNSRep() temp_hash = temp_hash->next; } } - "\n"; } DNSCacheInit; \ No newline at end of file diff --git a/src/Home/Net/IPV4.CC b/src/Home/Net/IPV4.CC index b779546..c561bd6 100755 --- a/src/Home/Net/IPV4.CC +++ b/src/Home/Net/IPV4.CC @@ -259,5 +259,27 @@ U0 IPV4PacketParse(CIPV4Packet *packet_out, CEthernetFrame *ethernet_frame) // return 0; } +U0 IPV4Rep() +{ + "$$LTBLUE$$IPV4 Report:$$FG$$\n\n"; + + "Local IPV4:$FG,6$ %d.%d.%d.%d$FG$\n", + ipv4_globals.local_ip.u8[3], + ipv4_globals.local_ip.u8[2], + ipv4_globals.local_ip.u8[1], + ipv4_globals.local_ip.u8[0]; + "Router IPV4:$FG,6$ %d.%d.%d.%d$FG$\n", + ipv4_globals.ipv4_router_address.u8[3], + ipv4_globals.ipv4_router_address.u8[2], + ipv4_globals.ipv4_router_address.u8[1], + ipv4_globals.ipv4_router_address.u8[0]; + "Subnet IPV4:$FG,6$ %d.%d.%d.%d$FG$\n", + ipv4_globals.ipv4_subnet_mask.u8[3], + ipv4_globals.ipv4_subnet_mask.u8[2], + ipv4_globals.ipv4_subnet_mask.u8[1], + ipv4_globals.ipv4_subnet_mask.u8[0]; + "\n"; +} + // IPV4 handler moved to NetHandlerTask file. IPV4GlobalsInit; \ No newline at end of file diff --git a/src/Home/Net/NetStart.CC b/src/Home/Net/NetStart.CC index 1c15273..4d295d0 100755 --- a/src/Home/Net/NetStart.CC +++ b/src/Home/Net/NetStart.CC @@ -25,6 +25,8 @@ if (Fs != zenith_task) { if (ipv4_globals.local_ip != 0) // is set if NetConfigure is successful { + NetRep; + "\nNow run one of the $MA,"Tests",LM="Cd(\"C:/Home/Net/Tests\");Dir;\n"$.\n"; "\nIf a test crashes to Debug, try typing $FG,0$G2;$FG$\n\n"; diff --git a/src/Home/Net/Tests/UDPSocketTest2.CC b/src/Home/Net/Tests/UDPSocketTest2.CC new file mode 100755 index 0000000..803ad6f --- /dev/null +++ b/src/Home/Net/Tests/UDPSocketTest2.CC @@ -0,0 +1,23 @@ +U0 UDPSocketTest() +{ + CUDPSocket *u = UDPSocket(AF_INET); + CSocketAddressIPV4 *i = CAlloc(sizeof(CSocketAddressIPV4)); + + i->port = EndianU16(64222); + i->family = AF_INET; + i->address.address = INADDR_ANY; + + UDPSocketBind(u, i); + + "UDP Socket bound at port %d.\n", EndianU16(i->port); + "Send UDP data to the VM, then run UDPRep to see received message data in report.\n"; + + while (!CharScan) + Refresh; + + UDPSocketClose(u); + + Free(i); +} + +UDPSocketTest; \ No newline at end of file diff --git a/src/Home/Net/UDP.CC b/src/Home/Net/UDP.CC index 74fa434..0bb6ff1 100755 --- a/src/Home/Net/UDP.CC +++ b/src/Home/Net/UDP.CC @@ -804,8 +804,9 @@ U0 UDPTreeNodeRep(CUDPTreeNode *node) CSocketAddressIPV4 *ipv4_addr; CSocketAddressIPV6 *ipv6_addr; U8 *string; + CUDPMessageQueue *message; - "Port $$YELLOW$$%d$$FG$$:\n", node->port; + "Port $$YELLOW$$%d$$FG$$ (UDP Node @ $$CYAN$$0x%X$$FG$$):\n", node->port, node; while (queue != node->queue) { @@ -820,13 +821,13 @@ U0 UDPTreeNodeRep(CUDPTreeNode *node) case AF_INET: ipv4_addr = &socket->receive_address; - string = MStrPrint("%d.%d.%d.%d$FG$", + string = MStrPrint("%d.%d.%d.%d", ipv4_addr->address.address.u8[3], ipv4_addr->address.address.u8[2], ipv4_addr->address.address.u8[1], ipv4_addr->address.address.u8[0]); // todo: kludge, endianness... - " $$LTGREEN$$%s$$FG$$\n", string; + " $$BROWN$$%s$$FG$$ (UDP Tree Queue @ $$CYAN$$0x%X$$FG$$):\n", string, queue; Free(string); break; @@ -841,11 +842,43 @@ U0 UDPTreeNodeRep(CUDPTreeNode *node) } + " Timeout: %dms\n", socket->receive_timeout_ms; + if (socket->receive_queue) // todo: move socket messages Queue alloc from bind to creation to avoid check? + { + message = socket->receive_queue->next; + while (message != socket->receive_queue) + { + " Queued Message @ $$CYAN$$0x%X$$FG$$:\n", message; + switch (message->from_address.family) + { + case AF_UNSPEC: + string = StrNew("AF_UNSPEC"); + break; + case AF_INET: + ipv4_addr = &message->from_address; + string = NetworkToPresentation(ipv4_addr->family, &ipv4_addr->address); + break; + case AF_INET6: + string = StrNew("IPV6"); + break; + default: + string = StrNew("INVALID"); + break; + } + " From Address: $$BROWN$$%s$$FG$$\n", string; + " Data length: %d\n", message->data_length; + " Received data length: %d\n", message->received_length; + + Free(string); + + message = message->next; + } + } + queue = queue->next; } "\n"; - } U0 UDPRep() @@ -855,6 +888,8 @@ U0 UDPRep() CUDPRepEntry *entry; CUDPRepEntry *temp_entry; + "$$LTBLUE$$UDP Report:$$FG$$\n\n"; + if (node) { head = CAlloc(sizeof(CUDPRepEntry)); @@ -936,7 +971,7 @@ U0 UDPRep() Free(head); } else - "No UDP Sockets currently bound.\n"; + "No UDP Sockets currently bound.\n\n"; } UDPGlobalsInit; \ No newline at end of file