From de1878c1f77bc83331eebf31c42c902708e84c81 Mon Sep 17 00:00:00 2001 From: TomAwezome Date: Wed, 20 Jan 2021 19:33:03 -0500 Subject: [PATCH] Fixed 4 million context swap/second Networking bug. Revamped NetHandlerTask into interrupt-based NetHandler. Created NetLog to output Network info to, instead of outputting to zenith_task. Updated NetStart.CC and Test files some. Changed UDPSocketReceiveFrom behaviour to NetWarn instead of Debug when hits timeout and sees AF_UNSPEC. --- ...o => Zenith-latest-2021-01-20-19_26_38.iso | Bin 34607104 -> 34607104 bytes src/Home/Net/ARP.CC | 24 +++--- src/Home/Net/DHCP.CC | 72 ++++++++--------- src/Home/Net/DNS.CC | 42 +++++----- src/Home/Net/Docs/ZenithStackNotes.DD | Bin 3083 -> 3125 bytes src/Home/Net/Ethernet.CC | 2 +- src/Home/Net/ICMP.CC | 4 +- src/Home/Net/IPV4.CC | 14 ++-- .../Net/{NetHandlerTask.CC => NetHandler.CC} | 40 +++++----- src/Home/Net/NetLog.CC | 48 ++++++++++++ src/Home/Net/NetQueue.CC | 22 +++--- src/Home/Net/NetStart.CC | 30 +++---- src/Home/Net/PCNet.CC | 74 +++++++++--------- src/Home/Net/Sockets.CC | 18 ++--- src/Home/Net/Tests/DHCPSendTrash1.CC | 7 +- src/Home/Net/Tests/DHCPSendTrash2.CC | 6 ++ src/Home/Net/Tests/DNSSendTrash.CC | 7 +- src/Home/Net/Tests/HostTest1.CC | 9 ++- src/Home/Net/Tests/Old/Test.CC | 8 +- src/Home/Net/Tests/Old/Test2.CC | 16 ++-- src/Home/Net/Tests/UDPSendTrash1.CC | 2 +- src/Home/Net/UDP.CC | 56 ++++++------- 22 files changed, 279 insertions(+), 222 deletions(-) rename Zenith-latest-2021-01-18-23_29_01.iso => Zenith-latest-2021-01-20-19_26_38.iso (99%) rename src/Home/Net/{NetHandlerTask.CC => NetHandler.CC} (53%) create mode 100755 src/Home/Net/NetLog.CC diff --git a/Zenith-latest-2021-01-18-23_29_01.iso b/Zenith-latest-2021-01-20-19_26_38.iso similarity index 99% rename from Zenith-latest-2021-01-18-23_29_01.iso rename to Zenith-latest-2021-01-20-19_26_38.iso index 271f72581a9ed47b86f7bf647dc5a139baae99f7..0663327373f67202997d8cae5eed374b9f4ccc09 100755 GIT binary patch delta 38614 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

v=P02hFXe7`ksbZdn`V`D43&5y>05w z1VMjG+jJ%K-!c3Sp7$Yj-qUowEXLS2`ngI5PUx5$fx^;X8v;w_oZWQQsbE`l@&AR!>*PBfOeZt%*&=<_D0zG8bl_CF2vq_*| zn;QlCow-$@v{`3DeyG_b&|-6=Kw(ILl<8EOqwZER>9pEx0t$O7Pc#CxG~VsRB)QsF z1pHaFwbCpVD*{;`J=WjiU*p7l5aDLi-h`j>n8k*1-=j1WV2ORkiP@Rv=&ptNkHabm z6!4uBbEx-Ef5=-)UCmH!@oxrQpz2$``_qZ(EM#x@_pq+8u21;osu+u3t~2u?-E(66 zEn%abnRjmg#UDYc#bc#2lNCCiOG#HdHOW0nBYMf6`f37fJIPAit zSRzy|%v)RpE3Uv(7sbUZT(lB)wWa61@HalZWU;v}%saI{`^2BBP?C5Ily596P$_zwNR6#DSiTrGz|W)XX~}eGR4tsTpZ7 z<>;?HE!aeRUKF)$qQlkDM1#zYKr`qNbE`lHn|1JS#0)yxY!c{5bE81B%&h{QV%8-g ze~#HC&@ywQKo^=@1-i(rOGf^EW|Kgn-xla2=2n5OGwV{2|CQM!&~MC*0zGMN73fbE z*zaI=srwqbWUCoRz6ow=AE##eIxS^so2F(ih1eExPo05idAI&^l<~1du23_(`#4r$ zXj7$U_6M3od*m$HTVlZuRa zlg4rRDOBZ<^h!9gwD+R;Ej(88H?Op63A~rL@LuUzZ@14l58iw$tty=>v8l_eyYEBJ zgX2`DCB=mcsa(-ZnIu4-s3q&;+ z-O^@(JnH?E(z5Z!XyDs+o!EeT*}AZq1AOcT4fu??5oiY8Zf+H*!mRrQpP>N@G{)R0 z&?IxKK(j5nBW}#zxZqnpdo7JOqz@sP{}|s%`&fLgyD@9M$@AZ;M?^UGXJJZeFE|pl zM5*1GdHJsS*TvtM?ZA)B1(4$-GL&w(BZD*B*^pp1ETeviw21>w6m@h%7YGhE==xc( z@q~MOnE#X8m2OG;-!hQN4)~1}M=KXS`t9 zO-tM3?o5jZd17~#i`HiN)qSLIY2OOILTtxpqDir|?RO~nXYNeX?IStm&J1T12f5jn z#2?%l_`1yYZI;J=bY~`n-&Q|`2h$`B3H&{n&Re#A$bq;qt`@&o59Y(f2>Gm_O=`un zf>KSvq{Bsa$BluCGRK2CYO=MZQbaT!vJ(;FkO2gvumM8O7kG1JbP`b~4=nQ!1GheQFGUFL$?^TQOx+il?DSr}d9YfmV z3(g++$CKHM-y^i_qrI4m!mA0EoeD1|R@G;5xOy>X`z|mq5O>qIfeaJsiMh>9!%Rr~ zwfi?p1AgiLjZ(1|f#JAJQPTWNaB=~h=OmumTxTcaxPvm#Afb%AT%yy?c2^@w5^4V( zG*BcO3zjqSML-~Jy4Jo7Q)Hq4@aoE(xfktq)m4T3vTJIjfstr = MStrPrint("%X", ip_address); entry->type = HTT_ARP; @@ -118,7 +118,7 @@ CARPHash *ARPCachePut(U32 ip_address, U8 *mac_address) HashAdd(entry, arp_cache); } else - ZenithWarn("ARP CACHE Put: Entry was already found in Cache. TODO: overwrite?\n"); + NetWarn("ARP CACHE Put: Entry was already found in Cache. TODO: overwrite?"); return entry; } @@ -152,18 +152,18 @@ I64 ARPHandler(CEthernetFrame *ethernet_frame) CARPHeader *header; U16 operation; - ZenithLog("ARP HANDLER: Entering ARP Handler.\n"); + NetLog("ARP HANDLER: Entering ARP Handler."); // shrine checks if frame ethertype is ARP and ensures length is not less than CARPHeader // since revising Shrine implement, will do same checks for now .. if (ethernet_frame->ethertype != ETHERTYPE_ARP) { - ZenithErr("ARP HANDLER: Caught wrong frame ethertype.\n"); + NetErr("ARP HANDLER: Caught wrong frame ethertype."); return -1; // External use of ARPHandler must account for -1 error codes } if (ethernet_frame->length < sizeof(CARPHeader)) { - ZenithErr("ARP HANDLER: Caught wrong frame length.\n"); + NetErr("ARP HANDLER: Caught wrong frame length."); return -1; // External use of ARPHandler must account for -1 error codes } @@ -176,22 +176,22 @@ I64 ARPHandler(CEthernetFrame *ethernet_frame) // hlen(?) != 6(?), and that plen(?) == 4 (?) if (EndianU16(header->hardware_type) != HTYPE_ETHERNET) { - ZenithErr("ARP HANDLER: Caught wrong frame hardware type.\n"); + NetErr("ARP HANDLER: Caught wrong frame hardware type."); return -1; // External use of ARPHandler must account for -1 error codes } if (EndianU16(header->protocol_type) != ETHERTYPE_IPV4) { - ZenithErr("ARP HANDLER: Caught wrong frame protocol type.\n"); + NetErr("ARP HANDLER: Caught wrong frame protocol type."); return -1; // External use of ARPHandler must account for -1 error codes } if (header->hardware_addr_len != HLEN_ETHERNET) { - ZenithErr("ARP HANDLER: Caught wrong frame hardware address length.\n"); + NetErr("ARP HANDLER: Caught wrong frame hardware address length."); return -1; // External use of ARPHandler must account for -1 error codes } if (header->protocol_addr_len != PLEN_IPV4) { - ZenithErr("ARP HANDLER: Caught wrong frame protocol address length.\n"); + NetErr("ARP HANDLER: Caught wrong frame protocol address length."); return -1; // External use of ARPHandler must account for -1 error codes } diff --git a/src/Home/Net/DHCP.CC b/src/Home/Net/DHCP.CC index 54e43981..cff6e5b3 100755 --- a/src/Home/Net/DHCP.CC +++ b/src/Home/Net/DHCP.CC @@ -95,7 +95,7 @@ I64 DHCPSendDiscover(U32 xid) sizeof(CDHCPHeader) + sizeof(CDHCPDiscoverOptions)); if (de_index < 0) { - ZenithErr("DHCP SEND DISCOVER: Failed, UDP Packet Allocate error.\n"); + NetErr("DHCP SEND DISCOVER: Failed, UDP Packet Allocate error."); return de_index; } @@ -151,7 +151,7 @@ I64 DHCPSendRequest(U32 xid, U32 requested_ip, U32 server_ip) sizeof(CDHCPHeader) + sizeof(CDHCPRequestOptions)); if (de_index < 0) { - ZenithErr("DHCP SEND REQUEST: Failed, UDP Packet Allocate error.\n"); + NetErr("DHCP SEND REQUEST: Failed, UDP Packet Allocate error."); } dhcp = ethernet_frame; @@ -197,7 +197,7 @@ I64 DHCPParseBegin(U8 **data_inout, I64 *length_inout, CDHCPHeader **header_out) if (length < sizeof(CDHCPHeader) + 4) // + 4? { - ZenithErr("DHCP PARSE BEGIN: Failed, length too short.\n"); + NetErr("DHCP PARSE BEGIN: Failed, length too short."); return -1; } @@ -205,7 +205,7 @@ I64 DHCPParseBegin(U8 **data_inout, I64 *length_inout, CDHCPHeader **header_out) if (EndianU32(*cookie) != DHCP_COOKIE) { - ZenithErr("DHCP PARSE BEGIN: Failed, cookie doesn't match DHCP-cookie.\n"); + NetErr("DHCP PARSE BEGIN: Failed, cookie doesn't match DHCP-cookie."); return -1; } @@ -223,13 +223,13 @@ I64 DHCPParseOption(U8 **data_inout, I64 *length_inout, U8 *type_out, U8 *value_ if (length < 2 || length < 2 + data[1]) // ??? what is the 1 { - ZenithErr("DHCP PARSE OPTION: Failed, length too short.\n"); + NetErr("DHCP PARSE OPTION: Failed, length too short."); return -1; } if (data[0] == 0xFF) // ahead, data[0] is type_out, so data[0] is perhaps usually type? { - ZenithLog("DHCP PARSE OPTION: Saw 0xFF, returning 0.\n"); + NetLog("DHCP PARSE OPTION: Saw 0xFF, returning 0."); return 0; } @@ -262,7 +262,7 @@ I64 DHCPParseOffer(U32 xid, U8 *data, I64 length, if (EndianU32(header->xid) != xid) { - ZenithErr("DHCP PARSE OFFER: Failed, parsed and parameter Transaction IDs do not match.\n"); + NetErr("DHCP PARSE OFFER: Failed, parsed and parameter Transaction IDs do not match."); return -1; } @@ -272,7 +272,7 @@ I64 DHCPParseOffer(U32 xid, U8 *data, I64 length, if (error < 0) { - ZenithErr("DHCP PARSE OFFER: Failed at DHCP Parse Option.\n"); + NetErr("DHCP PARSE OFFER: Failed at DHCP Parse Option."); return error; } if (error == 0) @@ -283,13 +283,13 @@ I64 DHCPParseOffer(U32 xid, U8 *data, I64 length, switch (type) { case DHCP_OPTION_MESSAGETYPE: - ZenithLog("DHCP PARSE OFFER: Parsed Option, Type MESSAGETYPE.\n"); + NetLog("DHCP PARSE OFFER: Parsed Option, Type MESSAGETYPE."); if (value_length == 1 && value[0] == DHCP_MESSAGETYPE_OFFER) have_type = TRUE; break; case DHCP_OPTION_DNS: - ZenithLog("DHCP PARSE OFFER: Parsed Option, Type DNS.\n"); + NetLog("DHCP PARSE OFFER: Parsed Option, Type DNS."); if (value_length == 4) { *dns_ip_out = EndianU32(*(value(U32 *))); // TODO: this syntax used on last 3 cases is gross, alter it @@ -298,7 +298,7 @@ I64 DHCPParseOffer(U32 xid, U8 *data, I64 length, break; case DHCP_OPTION_ROUTER: - ZenithLog("DHCP PARSE OFFER: Parsed Option, Type ROUTER.\n"); + NetLog("DHCP PARSE OFFER: Parsed Option, Type ROUTER."); if (value_length == 4) { *router_ip_out = EndianU32(*(value(U32 *))); // @@ -307,7 +307,7 @@ I64 DHCPParseOffer(U32 xid, U8 *data, I64 length, break; case DHCP_OPTION_SUBNET_MASK: - ZenithLog("DHCP PARSE OFFER: Parsed Option, Type SUBNET MASK.\n"); + NetLog("DHCP PARSE OFFER: Parsed Option, Type SUBNET MASK."); if (value_length == 4) { *subnet_mask_out = EndianU32(*(value(U32 *))); // @@ -320,16 +320,16 @@ I64 DHCPParseOffer(U32 xid, U8 *data, I64 length, if (have_type && have_dns && have_subnet && have_router) { *your_ip_out = EndianU32(header->your_ip); - ZenithLog("DHCP PARSE OFFER: Success, got your-ip from DHCP Header.\n"); + NetLog("DHCP PARSE OFFER: Success, got your-ip from DHCP Header."); return 0; } else { - ZenithErr("DHCP PARSE OFFER: Failed, did not have needed Options.\n"); - ZenithErr(" have_type: %Z\n", have_type, "ST_FALSE_TRUE"); - ZenithErr(" have_dns: %Z\n", have_dns, "ST_FALSE_TRUE"); - ZenithErr(" have_router: %Z\n", have_router, "ST_FALSE_TRUE"); - ZenithErr(" have_subnet: %Z\n", have_subnet, "ST_FALSE_TRUE"); + NetErr("DHCP PARSE OFFER: Failed, did not have needed Options."); + NetErr(" have_type: %Z", have_type, "ST_FALSE_TRUE"); + NetErr(" have_dns: %Z", have_dns, "ST_FALSE_TRUE"); + NetErr(" have_router: %Z", have_router, "ST_FALSE_TRUE"); + NetErr(" have_subnet: %Z", have_subnet, "ST_FALSE_TRUE"); return -1; } } @@ -344,7 +344,7 @@ I64 DHCPParseAck(U32 xid, U8 *data, I64 length) if (EndianU32(header->xid) != xid) { - ZenithErr("DHCP PARSE ACK: Failed, parsed and parameter Transaction IDs do not match.\n"); + NetErr("DHCP PARSE ACK: Failed, parsed and parameter Transaction IDs do not match."); return -1; } @@ -354,7 +354,7 @@ I64 DHCPParseAck(U32 xid, U8 *data, I64 length) if (error < 0) { - ZenithErr("DHCP PARSE ACK: Failed at DHCP Parse Option.\n"); + NetErr("DHCP PARSE ACK: Failed at DHCP Parse Option."); return error; } if (error == 0) @@ -371,7 +371,7 @@ I64 DHCPParseAck(U32 xid, U8 *data, I64 length) } } - ZenithErr("DHCP PARSE ACK: Failed.\n"); + NetErr("DHCP PARSE ACK: Failed."); return -1; } @@ -402,7 +402,7 @@ I64 DHCPConfigureInner(CUDPSocket *udp_socket, if (UDPSocketBind(udp_socket, &ipv4_addr) < 0) { - ZenithErr("DHCP CONFIGURE INNER: Failed to Bind UDP Socket.\n"); + NetErr("DHCP CONFIGURE INNER: Failed to Bind UDP Socket."); return -1; } @@ -419,11 +419,11 @@ I64 DHCPConfigureInner(CUDPSocket *udp_socket, break; case DHCP_STATE_CLIENT_DISCOVER: - ZenithLog("DHCP CONFIGURE INNER: Trying Discover.\n"); + NetLog("DHCP CONFIGURE INNER: Trying Discover."); error = DHCPSendDiscover(xid); if (error < 0) { - ZenithErr("DHCP CONFIGURE INNER: Failed, DHCP Send Discover error.\n"); + NetErr("DHCP CONFIGURE INNER: Failed, DHCP Send Discover error."); return error; } @@ -431,11 +431,11 @@ I64 DHCPConfigureInner(CUDPSocket *udp_socket, if (count > 0) { // 'Try a parse offer' - ZenithLog("DHCP CONFIGURE INNER: Trying Parse Offer.\n"); + NetLog("DHCP CONFIGURE INNER: Trying Parse Offer."); error = DHCPParseOffer(xid, buffer, count, your_ip_out, dns_ip_out, router_ip_out, subnet_mask_out); if (error < 0) - ZenithWarn("DHCP CONFIGURE INNER: Unsuccessful DHCP Parse Offer.\n"); + NetWarn("DHCP CONFIGURE INNER: Unsuccessful DHCP Parse Offer."); } if (count > 0 && error >= 0) // TODO: >= ? can DHCPSendDiscover or DHCPParseOffer return greater than zero? @@ -446,19 +446,19 @@ I64 DHCPConfigureInner(CUDPSocket *udp_socket, } else if (++retries == DHCP_MAX_RETRIES) { - ZenithErr("DHCP CONFIGURE INNER: Failed, hit max retries in DHCP DISCOVER state.\n"); + NetErr("DHCP CONFIGURE INNER: Failed, hit max retries in DHCP DISCOVER state."); return -1; } break; case DHCP_STATE_CLIENT_REQUEST: - ZenithLog("DHCP CONFIGURE INNER: Trying Send Request.\n"); + NetLog("DHCP CONFIGURE INNER: Trying Send Request."); error = DHCPSendRequest(xid, *your_ip_out, dhcp_addr); if (error < 0) { - ZenithErr("DHCP CONFIGURE INNER: Failed, unsuccessful DHCP Send Request.\n"); + NetErr("DHCP CONFIGURE INNER: Failed, unsuccessful DHCP Send Request."); return error; } @@ -469,7 +469,7 @@ I64 DHCPConfigureInner(CUDPSocket *udp_socket, error = DHCPParseAck(xid, buffer, count); if (error < 0) - ZenithWarn("DHCP CONFIGURE INNER: Unsuccessful DHCP Parse Ack.\n"); + NetWarn("DHCP CONFIGURE INNER: Unsuccessful DHCP Parse Ack."); } if (count > 0 && error >= 0) // see above TODO @@ -479,7 +479,7 @@ I64 DHCPConfigureInner(CUDPSocket *udp_socket, } else if (++retries == DHCP_MAX_RETRIES) { - ZenithErr("DHCP CONFIGURE INNER: Failed, hit max retries in DHCP REQUEST state.\n"); + NetErr("DHCP CONFIGURE INNER: Failed, hit max retries in DHCP REQUEST state."); return -1; } @@ -505,7 +505,7 @@ I64 DHCPConfigure() if (state == DHCP_STATE_CLIENT_REQ_ACCEPTED) { address.address = EndianU32(your_ip); - ZenithLog("$$FG,2$$DHCP CONFIGURE: Obtained IPV4 Address! : %s $$FG$$\n", NetworkToPresentation(AF_INET, &address)); + NetLog("$$BG,2$$$$FG,15$$DHCP CONFIGURE: Obtained IPV4 Address! : %s $$BG$$$$FG$$", NetworkToPresentation(AF_INET, &address)); IPV4SetAddress(your_ip); IPV4SetSubnet(router_ip, subnet_mask); @@ -514,7 +514,7 @@ I64 DHCPConfigure() } else { - ZenithErr("$$FG,4$$DHCP CONFIGURE: Failed, incorrect state.$$FG$$\n"); + NetErr("$$BG,4$$DHCP CONFIGURE: Failed, incorrect state.$$BG$$"); return -1; } } @@ -524,11 +524,11 @@ U0 NetConfigure() { I64 error; - ZenithLog("==== Configuring Network. ====\n"); + NetLog("==== Configuring Network. ===="); error = DHCPConfigure(); if (error < 0) - ZenithLog("$$FG,4$$==== Network Configure Failed ====$$FG$$\n"); + NetErr("==== Network Configure Failed ===="); else - ZenithLog("$$FG,2$$==== Network Configure Success ====$$FG$$\n"); + NetLog("$$BG,2$$$$FG,15$$==== Network Configure Success ====$$FG$$$$BG$$"); } diff --git a/src/Home/Net/DNS.CC b/src/Home/Net/DNS.CC index a102ca93..8c579fab 100755 --- a/src/Home/Net/DNS.CC +++ b/src/Home/Net/DNS.CC @@ -16,9 +16,9 @@ #define DNS_CLASS_IN 1 -#define DNS_TIMEOUT 1000 +#define DNS_TIMEOUT 5000 -#define DNS_MAX_RETRIES 20 // Shrine has 3, why not 5? :^) +#define DNS_MAX_RETRIES 5 class CDNSHash:CHash { // store U8 *hostname as CHash->str U8 * @@ -85,14 +85,14 @@ CDNSHash *DNSCacheFind(U8 *hostname) CDNSHash *entry = HashFind(hostname, dns_cache, HTT_DNS); if (entry == NULL) - ZenithWarn("DNS CACHE FIND: Could not find a hostname in the DNS Cache.\n"); + NetWarn("DNS CACHE FIND: Could not find a hostname in the DNS Cache."); return entry; } CDNSHash *DNSCachePut(U8 *hostname, CAddressInfo *info) { - ZenithLog("DNS CACHE PUT: Attempting Find DNS Entry in Cache: hostname: %s\n", hostname); + NetLog("DNS CACHE PUT: Attempting Find DNS Entry in Cache: hostname: %s", hostname); CDNSHash *entry = DNSCacheFind(hostname); if (!entry) @@ -106,7 +106,7 @@ CDNSHash *DNSCachePut(U8 *hostname, CAddressInfo *info) HashAdd(entry, dns_cache); } else - ZenithWarn("DNS CACHE PUT: Entry was already found in Cache. TODO: overwrite?"); + NetWarn("DNS CACHE PUT: Entry was already found in Cache. TODO: overwrite?"); return entry; } @@ -156,11 +156,11 @@ I64 DNSSendQuestion(U16 id, U16 local_port, CDNSQuestion *q) switch (dns_globals.addr_family) { case AF_UNSPEC: // 0, global dns ip not set - ZenithErr("DNS SEND QUESTION: Failed, global dns addr family was AF_UNSPEC.\n"); + NetErr("DNS SEND QUESTION: Failed, global dns addr family was AF_UNSPEC."); return -1; case AF_INET6: - ZenithErr("DNS SEND QUESTION: Failed, IPV6 not supported yet in DNS.\n"); + NetErr("DNS SEND QUESTION: Failed, IPV6 not supported yet in DNS."); throw('DNS'); case AF_INET: @@ -168,7 +168,7 @@ I64 DNSSendQuestion(U16 id, U16 local_port, CDNSQuestion *q) if (!*ipv4_addr) { - ZenithErr("DNS SEND QUESTION: Failed, ipv4_addr had no value set.\n"); + NetErr("DNS SEND QUESTION: Failed, ipv4_addr had no value set."); return -1; } } @@ -182,7 +182,7 @@ I64 DNSSendQuestion(U16 id, U16 local_port, CDNSQuestion *q) sizeof(CDNSHeader) + DNSCalculateQuestionSize(q)); if (de_index < 0) { - ZenithErr("DNS SEND QUESTION: Failed, UDPPacketAllocate returned error.\n"); + NetErr("DNS SEND QUESTION: Failed, UDPPacketAllocate returned error."); return de_index; } @@ -215,7 +215,7 @@ I64 DNSParseDomainName(U8 *packet_data, I64 packet_length, U8 **data_inout, I64 if (length < 1) { - ZenithErr("DNS PARSE DOMAIN NAME: Length less than one.\n"); + NetErr("DNS PARSE DOMAIN NAME: Length less than one."); return -1; } @@ -241,7 +241,7 @@ I64 DNSParseDomainName(U8 *packet_data, I64 packet_length, U8 **data_inout, I64 *data_inout = data + 1; *length_inout = length - 1; jump_taken = TRUE; - ZenithLog("DNS PARSE DOMAIN NAME: Jump taken\n"); + NetLog("DNS PARSE DOMAIN NAME: Jump taken"); } data = packet_data + ((label_len << 8) | *data); @@ -341,7 +341,7 @@ I64 DNSParseResponse(U16 id, U8 *data, I64 length, CDNSHeader **header_out, CDNS if (length < sizeof(CDNSHeader)) { - ZenithErr("DNS PARSE RESPONSE: Length too short.\n"); + NetErr("DNS PARSE RESPONSE: Length too short."); return -1; } @@ -350,7 +350,7 @@ I64 DNSParseResponse(U16 id, U8 *data, I64 length, CDNSHeader **header_out, CDNS if (id != 0 && EndianU16(header->id) != id) { - ZenithErr("DNS PARSE RESPONSE: Header ID mismatch.\n"); + NetErr("DNS PARSE RESPONSE: Header ID mismatch."); return -1; } @@ -477,7 +477,7 @@ I64 DNSRunQuery(CUDPSocket *udp_socket, U8 *name, U16 port, CAddressInfo **resul // UDPSocketBind will be attempted on the udp_socket param, method expects a UDPSocket() result to be made already if (UDPSocketBind(udp_socket, &ipv4_addr)) // expected return value is 0 { - ZenithErr("DNS RUN QUERY: Failed to bind UDP socket.\n"); + NetErr("DNS RUN QUERY: Failed to bind UDP socket."); return -1; } @@ -488,7 +488,7 @@ I64 DNSRunQuery(CUDPSocket *udp_socket, U8 *name, U16 port, CAddressInfo **resul error = DNSSendQuestion(id, local_port, &q); if (error < 0) { - ZenithErr("DNS RUN QUERY: Failed to Send Question.\n"); + NetErr("DNS RUN QUERY: Failed to Send Question."); return -1; } @@ -496,7 +496,7 @@ I64 DNSRunQuery(CUDPSocket *udp_socket, U8 *name, U16 port, CAddressInfo **resul if (count > 0) { - ZenithLog("DNS RUN QUERY: Trying Parse Response.\n"); + NetLog("DNS RUN QUERY: Trying Parse Response."); header = NULL; questions = NULL; @@ -554,18 +554,18 @@ I64 DNSRunQuery(CUDPSocket *udp_socket, U8 *name, U16 port, CAddressInfo **resul // Shrine comment: 'at this point, we could try iterative resolution, // but all end-user DNS servers would have tried that already' - ZenithErr("DNS RUN QUERY: Failed to find suitable answer in reply.\n"); + NetErr("DNS RUN QUERY: Failed to find suitable answer in reply."); error = -1; } else { - ZenithErr("DNS RUN QUERY: Failed a DNS Parse Response.\n"); + NetErr("DNS RUN QUERY: Failed a DNS Parse Response."); } } if (++retries == DNS_MAX_RETRIES) { - ZenithErr("DNS RUN QUERY: Failed, max retries reached.\n"); + NetErr("DNS RUN QUERY: Failed, max retries reached."); error = -1; break; } @@ -602,7 +602,7 @@ I64 DNSGetAddressInfo(U8 *node_name, U16 port, CAddressInfo **result) } else { - ZenithErr("DNS GET ADDRESS INFO: Failed to make UDP Socket.\n"); + NetErr("DNS GET ADDRESS INFO: Failed to make UDP Socket."); error = -1; } @@ -626,7 +626,7 @@ U0 Host(U8 *hostname) if (error < 0) { - ZenithErr("HOST(): Failed at DNS Get Address Info.\n"); + NetErr("HOST(): Failed at DNS Get Address Info."); } else { diff --git a/src/Home/Net/Docs/ZenithStackNotes.DD b/src/Home/Net/Docs/ZenithStackNotes.DD index 91b82a8b1abb577e2f46710790531edec201db3f..24283fa6f425dc0d786e544a3eca4cc7fbcf8678 100755 GIT binary patch delta 30 lcmeB{*eWq0S2#u~CNDdestination_address, frame, MAC_ADDRESS_LENGTH); diff --git a/src/Home/Net/ICMP.CC b/src/Home/Net/ICMP.CC index 8b7d2720..d0ff764d 100755 --- a/src/Home/Net/ICMP.CC +++ b/src/Home/Net/ICMP.CC @@ -32,7 +32,7 @@ I64 ICMPSendReply(U32 destination_ip_address, sizeof(CICMPHeader) + length); if (de_index < 0) { - ZenithErr("ICMP SEND REPLY: Failed to allocate IPV4 packet.\n"); + NetErr("ICMP SEND REPLY: Failed to allocate IPV4 packet."); return de_index; } @@ -57,7 +57,7 @@ I64 ICMPHandler(CIPV4Packet *packet) if (packet->length < sizeof(CICMPHeader)) { - ZenithErr("ICMP HANDLER: Caught wrong IPV4 length.\n"); + NetErr("ICMP HANDLER: Caught wrong IPV4 length."); return -1; } diff --git a/src/Home/Net/IPV4.CC b/src/Home/Net/IPV4.CC index 8b2ad9a7..8d075699 100755 --- a/src/Home/Net/IPV4.CC +++ b/src/Home/Net/IPV4.CC @@ -98,12 +98,12 @@ I64 GetMACAddressForIP(U32 ip_address, U8 **mac_out) if (ip_address == 0) { - ZenithErr("GET MAC FOR IP: Failed. Address = 0\n"); + NetErr("GET MAC FOR IP: Failed. Address = 0"); return IPV4_ERR_ADDR_INVALID; } if (ip_address == 0xFFFFFFFF) { - ZenithLog("GET MAC FOR IP: Returning ethernet broadcast\n"); + NetLog("GET MAC FOR IP: Returning ethernet broadcast"); *mac_out = ethernet_globals.ethernet_broadcast; return 0; @@ -113,12 +113,12 @@ I64 GetMACAddressForIP(U32 ip_address, U8 **mac_out) if ((ip_address & ipv4_globals.ipv4_subnet_mask) != (ipv4_globals.local_ip & ipv4_globals.ipv4_subnet_mask)) { // TODO: Shrine recurses here... and says FIXME infinite loop if mis-configured... - ZenithWarn("GET MAC FOR IP: TODO: Doing GetMACAddressForIP recursion, could infinite loop and overflow stack."); + NetWarn("GET MAC FOR IP: TODO: Doing GetMACAddressForIP recursion, could infinite loop and overflow stack."); return GetMACAddressForIP(ipv4_globals.ipv4_router_address, mac_out); } else // "local network" { - ZenithLog("GET MAC FOR IP: Attempting ARP Find by IP for address: %d.\n", ip_address); + NetLog("GET MAC FOR IP: Attempting ARP Find by IP for address: %d.", ip_address); entry = ARPCacheFindByIP(ip_address); if (entry) @@ -158,7 +158,7 @@ I64 GetMACAddressForIP(U32 ip_address, U8 **mac_out) } //Shrine does some in_addr mess to log error - ZenithErr("GET MAC FOR IP: Failed to resolve address %d\n", ip_address); + NetErr("GET MAC FOR IP: Failed to resolve address %d", ip_address); return IPV4_ERR_HOST_UNREACHABLE; } } @@ -180,7 +180,7 @@ I64 IPV4PacketAllocate(U8 **frame_out, if (error < 0) { - ZenithLog("IPV4 PACKET ALLOCATE: Failed to get MAC for destination.\n"); + NetLog("IPV4 PACKET ALLOCATE: Failed to get MAC for destination."); return error; } @@ -191,7 +191,7 @@ I64 IPV4PacketAllocate(U8 **frame_out, sizeof(CIPV4Header) + length); if (de_index < 0) { - ZenithLog("IPV4 PACKET ALLOCATE: Ethernet Frame Allocate failed.\n"); + NetLog("IPV4 PACKET ALLOCATE: Ethernet Frame Allocate failed."); return de_index; } diff --git a/src/Home/Net/NetHandlerTask.CC b/src/Home/Net/NetHandler.CC similarity index 53% rename from src/Home/Net/NetHandlerTask.CC rename to src/Home/Net/NetHandler.CC index cf7d929f..c8993a0c 100755 --- a/src/Home/Net/NetHandlerTask.CC +++ b/src/Home/Net/NetHandler.CC @@ -9,7 +9,7 @@ U0 IPV4Handler(CEthernetFrame *ethernet_frame) switch (packet.protocol) { case IP_PROTOCOL_ICMP: - ZenithLog("IPV4 HANDLER: ICMP.\n"); + NetLog("IPV4 HANDLER: ICMP."); ICMPHandler(&packet); break; @@ -17,7 +17,7 @@ U0 IPV4Handler(CEthernetFrame *ethernet_frame) break; case IP_PROTOCOL_UDP: - ZenithLog("IPV4 HANDLER: UDP.\n"); + NetLog("IPV4 HANDLER: UDP."); UDPHandler(&packet); break; } @@ -32,37 +32,33 @@ U0 HandleNetQueueEntry(CNetQueueEntry *entry) switch (ethernet_frame.ethertype) { case ETHERTYPE_ARP: - ZenithLog("HANDLE NETQUEUE ENTRY: ARP.\n"); + NetLog("HANDLE NETQUEUE ENTRY: ARP."); ARPHandler(ðernet_frame); break; case ETHERTYPE_IPV4: - ZenithLog("HANDLE NETQUEUE ENTRY: IPV4.\n"); + NetLog("HANDLE NETQUEUE ENTRY: IPV4."); IPV4Handler(ðernet_frame); break; } } -U0 NetHandlerTask(I64) +interrupt U0 NetHandler() { - while (TRUE) - { - CNetQueueEntry *entry = NetQueuePull(); + CNetQueueEntry *entry = NetQueuePull(); - if (entry) - { - ZenithLog("NET HANDLER TASK: Caught NetQueue Entry, handling.\n"); - HandleNetQueueEntry(entry); - } - else - { - LBts(&Fs->task_flags, TASKf_IDLE); - //ZenithLog("IDLE: NetHandler\n"); - Yield; - } - + if (entry) + { + NetLog("NET HANDLER TASK: Caught NetQueue Entry, handling."); + HandleNetQueueEntry(entry); } - ZenithErr("Net Handler Task exit! Debug!\n"); // shouldn't ever reach this + + *(dev.uncached_alias + LAPIC_EOI)(U32*) = 0; } -net_handler_task = Spawn(&NetHandlerTask, NULL, "NetQueueHandler"); \ No newline at end of file +U0 NetHandlerInit() +{ + IntEntrySet(I_NETHANDLER, &NetHandler); +} + +NetHandlerInit; diff --git a/src/Home/Net/NetLog.CC b/src/Home/Net/NetLog.CC new file mode 100755 index 00000000..70a88a5d --- /dev/null +++ b/src/Home/Net/NetLog.CC @@ -0,0 +1,48 @@ + +CTask *net_log_task = NULL; + +U0 NetLogTask(I64) +{ + + while (TRUE) + { + Refresh; + } +} + +U0 NetLogInit() +{ + net_log_task = Spawn(&ServerCmdLine, NULL, "Network Log"); + TaskWait(net_log_task); + WinTileHorz; + WinFocus; +} + +U0 NetLog(U8 *format, ...) +{ // Output text to NetLogTask as Log. + U8 *buf = StrPrintJoin(NULL, format, argc, argv); + + DocBottom(net_log_task->put_doc); + DocPrint(net_log_task->put_doc, "$$LTGRAY$$%s$$FG$$\n", buf); + +} + +U0 NetWarn(U8 *format, ...) +{ // Output text to NetLogTask as Warning. + U8 *buf = StrPrintJoin(NULL, format, argc, argv); + + DocBottom(net_log_task->put_doc); + DocPrint(net_log_task->put_doc, "$$BG,BROWN$$$$WHITE$$%s$$BG$$$$FG$$\n", buf); + +} + +U0 NetErr(U8 *format, ...) +{ // Output text to NetLogTask as Error. + U8 *buf = StrPrintJoin(NULL, format, argc, argv); + + DocBottom(net_log_task->put_doc); + DocPrint(net_log_task->put_doc, "$$BG,RED$$$$WHITE$$%s$$BG$$$$FG$$\n", buf); + +} + +NetLogInit; \ No newline at end of file diff --git a/src/Home/Net/NetQueue.CC b/src/Home/Net/NetQueue.CC index 3c05ede7..f7841858 100755 --- a/src/Home/Net/NetQueue.CC +++ b/src/Home/Net/NetQueue.CC @@ -23,12 +23,17 @@ class CNetQueueEntry:CQueue CQueue *net_queue; // no QueueRemove the Head! only Entries! -/* Net Handler Task is set idle and active depending - on if entries in Net Queue. See $LK,"NetHandlerTask",A="FF:C:/Home/Net/NetHandlerTask.CC,net_handler_task"$ */ - -CTask *net_handler_task = NULL; +/* PCNet reroutes PCI interrupts to software. See $LK,"PCNet",A="FF:C:/Home/Net/PCNet.CC,I_PCNET0"$. + Net Handler interrupt is generated whenever an entry is + pushed to the NetQueue. See $LK,"NetHandler",A="FF:C:/Home/Net/NetHandler.CC,I_NETHANDLER"$ */ +#define I_PCNET0 I_USER + 0 +#define I_PCNET1 I_USER + 1 +#define I_PCNET2 I_USER + 2 +#define I_PCNET3 I_USER + 3 +#define I_NETHANDLER I_USER + 4 +#define INT_DEST_CPU 0 U0 NetQueueInit() { @@ -46,7 +51,7 @@ CNetQueueEntry *NetQueuePull() { entry = net_queue->next; - ZenithLog("NETQUEUE PULL: Removing entry from queue.\n"); + NetLog("NETQUEUE PULL: Removing entry from queue."); QueueRemove(entry); } else // Queue is empty if head->next is head itself. @@ -71,10 +76,9 @@ U0 NetQueuePushCopy(U8 *data, I64 length) QueueInsert(entry, net_queue->last); - //Set Net Handler Task active. - ZenithLog("NETQUEUE PUSH COPY: Setting NetHandler ACTIVE.\n"); - if (net_handler_task) - LBtr(&net_handler_task->task_flags, TASKf_IDLE); + // Generate Net Handler interrupt. + NetLog("NETQUEUE PUSH COPY: Generating NetHandler interrupt."); + MPInt(I_NETHANDLER, INT_DEST_CPU); } diff --git a/src/Home/Net/NetStart.CC b/src/Home/Net/NetStart.CC index ad8527b4..20e19c6f 100755 --- a/src/Home/Net/NetStart.CC +++ b/src/Home/Net/NetStart.CC @@ -1,16 +1,7 @@ -if (Fs != zenith_task) -{ - WinVert(2, zenith_task->win_bottom + zenith_task->win_bottom / 3, zenith_task); - WinVert(zenith_task->win_bottom + 3, TEXT_ROWS - 2); -} -else -{ - WinVert(2, zenith_task->win_bottom + zenith_task->win_bottom / 3, zenith_task); - WinVert(zenith_task->win_bottom + 3, TEXT_ROWS - 2, zenith_task->next_task); -} - #include "C:/Home/Net/Net.HH" +#include "C:/Home/Net/NetLog" + #include "C:/Home/Net/NetQueue" #include "C:/Home/Net/PCNet" #include "C:/Home/Net/Ethernet" @@ -26,15 +17,26 @@ else #include "C:/Home/Net/DNS" #include "C:/Home/Net/DHCP" -#include "C:/Home/Net/NetHandlerTask" // needs IPV4, UDP, ICMP +#include "C:/Home/Net/NetHandler" // needs IPV4, UDP, ICMP if (Fs != zenith_task) { NetConfigure; - "\nNow run one of the $MA,"Tests",LM="Cd(\"C:/Home/Net/Tests\");Dir;\n"$.\n\n"; + if (ipv4_globals.local_ip != 0) // is set if NetConfigure is successful + { + "\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"; + } + else + { + "\nNetConfigure unsuccessful. See Network Log for details.\n\n"; + } + } else { XTalkStr(zenith_task->next_task, "NetConfigure;\n"); -} \ No newline at end of file +} + diff --git a/src/Home/Net/PCNet.CC b/src/Home/Net/PCNet.CC index d8f4bf36..1bb28dc6 100755 --- a/src/Home/Net/PCNet.CC +++ b/src/Home/Net/PCNet.CC @@ -78,8 +78,6 @@ #define PCNET_DESCRIPTORf_OWN 31 // AMD PCNet datasheet p.1-992, 1-994 //#define PCNET_DESCRIPTORF_OWN (1 << PCNET_DESCRIPTORf_OWN) -#define INT_DEST_CPU 0 - class CPCNet { CPCIDev *pci; @@ -217,14 +215,12 @@ U0 PCNetGetMAC() APROM accessible at first 16 bytes of PCI IO space. */ I64 i; - ZenithLog("PCNET GET MAC: Getting VM MAC.\n"); - ZenithLog(" "); + NetLog("PCNET GET MAC: Getting VM MAC."); for (i = 0; i < 6; i++) { pcnet.mac_address[i] = InU8(PCNetGetIOBase() + i); - ZenithLog(" %02X", pcnet.mac_address[i]); + NetLog(" %02X", pcnet.mac_address[i]); } - ZenithLog("\n"); } U0 PCNetInitDescriptorEntry(CPCNetDescriptorEntry *entry, U32 buffer_address, I64 is_rx) @@ -322,11 +318,11 @@ U0 PCNetDirectInit() The OR and bit-shift of 8 allows writing separate U8 values in the correct locations of the CSR. */ - ZenithLog("PCNetDirectInit: Write MAC to CSR: 0x%X \n", pcnet.mac_address[0] | (pcnet.mac_address[1] << 8)); + NetLog("PCNetDirectInit: Write MAC to CSR: 0x%X ", pcnet.mac_address[0] | (pcnet.mac_address[1] << 8)); PCNetWriteCSR(PCNET_CSR_PADR0, pcnet.mac_address[0] | (pcnet.mac_address[1] << 8)); - ZenithLog("PCNetDirectInit: Write MAC to CSR: 0x%X \n", pcnet.mac_address[2] | (pcnet.mac_address[3] << 8)); + NetLog("PCNetDirectInit: Write MAC to CSR: 0x%X ", pcnet.mac_address[2] | (pcnet.mac_address[3] << 8)); PCNetWriteCSR(PCNET_CSR_PADR1, pcnet.mac_address[2] | (pcnet.mac_address[3] << 8)); - ZenithLog("PCNetDirectInit: Write MAC to CSR: 0x%X \n", pcnet.mac_address[4] | (pcnet.mac_address[5] << 8)); + NetLog("PCNetDirectInit: Write MAC to CSR: 0x%X ", pcnet.mac_address[4] | (pcnet.mac_address[5] << 8)); PCNetWriteCSR(PCNET_CSR_PADR2, pcnet.mac_address[4] | (pcnet.mac_address[5] << 8)); /* AMD PCNet datasheet p.1-961, 1-962, 1-963 @@ -466,7 +462,7 @@ I64 PCNetAllocateTransmitPacket(U8 **packet_buffer_out, I64 length) if (length > 0xFFF) { // Max packet length must fit into BCNT 12-bit register. - ZenithErr("PCNET ALLOCATE TX PACKET: Invalid TX Packet Length\n"); + NetErr("PCNET ALLOCATE TX PACKET: Invalid TX Packet Length"); throw('PCNet'); } @@ -474,12 +470,12 @@ I64 PCNetAllocateTransmitPacket(U8 **packet_buffer_out, I64 length) if (!PCNetDriverOwns(entry)) { - ZenithErr("PCNET ALLOCATE TX PACKET: TX FIFO Full\n"); + NetErr("PCNET ALLOCATE TX PACKET: TX FIFO Full"); return -1; // Positive value expected. Functions calling this must factor this in. } else { - ZenithLog("PCNET ALLOCATE TX PACKET: Driver owns TX DE at index %d.\n", de_index); + NetLog("PCNET ALLOCATE TX PACKET: Driver owns TX DE at index %d.", de_index); } Bts(&entry->status1, PCNET_DESCRIPTORf_STP); @@ -505,7 +501,7 @@ I64 PCNetAllocateTransmitPacket(U8 **packet_buffer_out, I64 length) MemSet(*packet_buffer_out, 0, ETHERNET_FRAME_SIZE); // Clear buffer contents in advance. - ZenithLog("PCNET ALLOCATE TX PACKET: de_index: %X.\n", de_index); + NetLog("PCNET ALLOCATE TX PACKET: de_index: %X.", de_index); return de_index; } @@ -516,7 +512,7 @@ U0 PCNetFinishTransmitPacket(I64 de_index) CPCNetDescriptorEntry *entry = &pcnet.tx_de_buffer[de_index * sizeof(CPCNetDescriptorEntry)]; Bts(&entry->status1, PCNET_DESCRIPTORf_OWN); - ZenithLog("PCNet FINISH TX PACKET: TX DE index: %X, OWN bit of entry at entry: %b.\n", + NetLog("PCNet FINISH TX PACKET: TX DE index: %X, OWN bit of entry at entry: %b.", de_index, Bt(&entry->status1, PCNET_DESCRIPTORf_OWN)); } @@ -539,7 +535,7 @@ I64 PCNetReceivePacket(U8 **packet_buffer_out, U16 *packet_length_out) I64 de_index = pcnet.current_rx_de_index; U16 packet_length; - ZenithLog("PCNET RECEIVE PACKET: PCNet received packet. %X , %X \n", packet_buffer_out, packet_length_out); + NetLog("PCNET RECEIVE PACKET: PCNet received packet. %X , %X ", packet_buffer_out, packet_length_out); CPCNetDescriptorEntry *entry = &pcnet.rx_de_buffer[de_index * sizeof(CPCNetDescriptorEntry)]; @@ -576,13 +572,13 @@ interrupt U0 PCNetIRQ() while (PCNetDriverOwns(&entry[pcnet.current_rx_de_index])) { - ZenithLog("PCNET IRQ: Saw owned RX DE index %d.\n", pcnet.current_rx_de_index); + NetLog("PCNET IRQ: Saw owned RX DE index %d.", pcnet.current_rx_de_index); de_index = PCNetReceivePacket(&packet_buffer, &packet_length); if (de_index >= 0) // necessary? check increment logic in PCNetReceivePacket. { - ZenithLog("PCNET IRQ: Pushing copy into Net Queue, Releasing Receive Packet\n"); + NetLog("PCNET IRQ: Pushing copy into Net Queue, Releasing Receive Packet"); NetQueuePushCopy(packet_buffer, packet_length); PCNetReleaseReceivePacket(de_index); } @@ -612,11 +608,11 @@ U0 PCIRerouteInterrupts(I64 base) U0 PCNetSetupInterrupts() { // todo: comments explaining process - IntEntrySet(I_USER + 0, &PCNetIRQ, IDTET_IRQ); - IntEntrySet(I_USER + 1, &PCNetIRQ, IDTET_IRQ); - IntEntrySet(I_USER + 2, &PCNetIRQ, IDTET_IRQ); - IntEntrySet(I_USER + 3, &PCNetIRQ, IDTET_IRQ); - PCIRerouteInterrupts(I_USER); + IntEntrySet(I_PCNET0, &PCNetIRQ); + IntEntrySet(I_PCNET1, &PCNetIRQ); + IntEntrySet(I_PCNET2, &PCNetIRQ); + IntEntrySet(I_PCNET3, &PCNetIRQ); + PCIRerouteInterrupts(I_PCNET0); } U0 PCNetInit() @@ -643,10 +639,10 @@ U0 PCNetInit() PCNetEnter32BitMode; U32 csr = PCNetReadCSR(PCNET_CSR_CTRLSTATUS); - ZenithLog("PCNET INIT START: what is INIT ?: %d\n", Bt(&csr, PCNET_CTRL_INIT)); - ZenithLog("PCNET INIT START: what is STRT ?: %d\n", Bt(&csr, PCNET_CTRL_STRT)); - ZenithLog("PCNET INIT START: what is STOP ?: %d\n", Bt(&csr, PCNET_CTRL_STOP)); - ZenithLog("PCNET INIT START: what is RINT ?: %d\n", Bt(&csr, PCNET_CTRL_RINT)); + NetLog("PCNET INIT START: what is INIT ?: %d", Bt(&csr, PCNET_CTRL_INIT)); + NetLog("PCNET INIT START: what is STRT ?: %d", Bt(&csr, PCNET_CTRL_STRT)); + NetLog("PCNET INIT START: what is STOP ?: %d", Bt(&csr, PCNET_CTRL_STOP)); + NetLog("PCNET INIT START: what is RINT ?: %d", Bt(&csr, PCNET_CTRL_RINT)); PCNetSetSWStyle; @@ -666,10 +662,10 @@ U0 PCNetInit() PCNetWriteCSR(0, PCNetReadCSR(0) | 1 | (1<<6)); csr = PCNetReadCSR(PCNET_CSR_CTRLSTATUS); - ZenithLog("PCNET INIT UPLOAD: what is INIT ?: %d\n", Bt(&csr, PCNET_CTRL_INIT)); - ZenithLog("PCNET INIT UPLOAD: what is STRT ?: %d\n", Bt(&csr, PCNET_CTRL_STRT)); - ZenithLog("PCNET INIT UPLOAD: what is STOP ?: %d\n", Bt(&csr, PCNET_CTRL_STOP)); - ZenithLog("PCNET INIT UPLOAD: what is RINT ?: %d\n", Bt(&csr, PCNET_CTRL_RINT)); + NetLog("PCNET INIT UPLOAD: what is INIT ?: %d", Bt(&csr, PCNET_CTRL_INIT)); + NetLog("PCNET INIT UPLOAD: what is STRT ?: %d", Bt(&csr, PCNET_CTRL_STRT)); + NetLog("PCNET INIT UPLOAD: what is STOP ?: %d", Bt(&csr, PCNET_CTRL_STOP)); + NetLog("PCNET INIT UPLOAD: what is RINT ?: %d", Bt(&csr, PCNET_CTRL_RINT)); while (!(PCNetReadCSR(0) & (1<<8))) Yield; @@ -688,15 +684,15 @@ U0 PCNetInit() "pcnet->rx_de_buffer_phys: %X\n", pcnet.tx_de_buffer_phys; */ csr = PCNetReadCSR(PCNET_CSR_CTRLSTATUS); - ZenithLog("PCNET INIT END: what is INIT ?: %d\n", Bt(&csr, PCNET_CTRL_INIT)); - ZenithLog("PCNET INIT END: what is STRT ?: %d\n", Bt(&csr, PCNET_CTRL_STRT)); - ZenithLog("PCNET INIT END: what is STOP ?: %d\n", Bt(&csr, PCNET_CTRL_STOP)); - ZenithLog("PCNET INIT END: what is RINT ?: %d\n", Bt(&csr, PCNET_CTRL_RINT)); - ZenithLog("PCNET INIT END: what is TXON ?: %d\n", Bt(&csr, 4)); - ZenithLog("PCNET INIT END: what is RXON ?: %d\n", Bt(&csr, 5)); + NetLog("PCNET INIT END: what is INIT ?: %d", Bt(&csr, PCNET_CTRL_INIT)); + NetLog("PCNET INIT END: what is STRT ?: %d", Bt(&csr, PCNET_CTRL_STRT)); + NetLog("PCNET INIT END: what is STOP ?: %d", Bt(&csr, PCNET_CTRL_STOP)); + NetLog("PCNET INIT END: what is RINT ?: %d", Bt(&csr, PCNET_CTRL_RINT)); + NetLog("PCNET INIT END: what is TXON ?: %d", Bt(&csr, 4)); + NetLog("PCNET INIT END: what is RXON ?: %d", Bt(&csr, 5)); csr = PCNetReadCSR(PCNET_CSR_POLLINT); - ZenithLog("PCNET INIT END: what is POLLINT ?: %d\n", Bt(&csr, PCNET_CTRL_RINT)); + NetLog("PCNET INIT END: what is POLLINT ?: %d", Bt(&csr, PCNET_CTRL_RINT)); Free(setup); } @@ -719,7 +715,7 @@ I64 EthernetFrameAllocate(U8 **packet_buffer_out, //need to see if 3 years later VirtualBox supports APAD_XMT! if (packet_length < ETHERNET_MIN_FRAME_SIZE) { - ZenithWarn("ETHERNET FRAME ALLOCATE: PCNET APAD XMT TRUNCATE ? ...\n"); + NetWarn("ETHERNET FRAME ALLOCATE: PCNET APAD XMT TRUNCATE ? ..."); packet_length = ETHERNET_MIN_FRAME_SIZE; } @@ -727,7 +723,7 @@ I64 EthernetFrameAllocate(U8 **packet_buffer_out, if (de_index < 0) { - ZenithErr("ETHERNET FRAME ALLOCATE: Failure\n"); + NetErr("ETHERNET FRAME ALLOCATE: Failure"); return -1; // Positive value expected. Functions calling this must factor this in. } diff --git a/src/Home/Net/Sockets.CC b/src/Home/Net/Sockets.CC index fb3978f0..89671e97 100755 --- a/src/Home/Net/Sockets.CC +++ b/src/Home/Net/Sockets.CC @@ -178,12 +178,12 @@ Bool IPV4AddressParse(U8 *string, U32 *destination) case TK_I64: if (cc->cur_i64 > 255 || cc->cur_i64 < 0) { - ZenithErr("IPV4 ADDRESS PARSE: Invalid value, must be 0 - 255.\n"); + NetErr("IPV4 ADDRESS PARSE: Invalid value, must be 0 - 255."); return FALSE; } if (current_section > 3) { - ZenithErr("IPV4 ADDRESS PARSE: IP Address can only have 4 sections.\n"); + NetErr("IPV4 ADDRESS PARSE: IP Address can only have 4 sections."); return FALSE; } @@ -195,7 +195,7 @@ Bool IPV4AddressParse(U8 *string, U32 *destination) break; default: - ZenithErr("IPV4 ADDRESS PARSE: Expected decimal. \n"); + NetErr("IPV4 ADDRESS PARSE: Expected decimal. "); return FALSE; } break; @@ -208,7 +208,7 @@ Bool IPV4AddressParse(U8 *string, U32 *destination) break; default: - ZenithErr("IPV4 ADDRESS PARSE: Expected dot. \n"); + NetErr("IPV4 ADDRESS PARSE: Expected dot. "); return FALSE; } break; @@ -245,7 +245,7 @@ I64 PresentationToNetwork(I64 address_family, U8 *string, CIPAddressStorage *des case AF_INET: if (string_length > INET_ADDRSTRLEN || string_length < INET_MIN_ADDRSTRLEN) { - ZenithErr("IP to Socket Address failed: Invalid Input String Size.\n"); + NetErr("IP to Socket Address failed: Invalid Input String Size."); return -1; } ipv4_address = destination; @@ -257,7 +257,7 @@ I64 PresentationToNetwork(I64 address_family, U8 *string, CIPAddressStorage *des case AF_INET6: if (string_length > INET6_ADDRSTRLEN || string_length < INET6_MIN_ADDRSTRLEN) { - ZenithErr("IP to Socket Address failed: Invalid Input String Size.\n"); + NetErr("IP to Socket Address failed: Invalid Input String Size."); return -1; } ipv6_address = destination; @@ -269,7 +269,7 @@ I64 PresentationToNetwork(I64 address_family, U8 *string, CIPAddressStorage *des break; default: - ZenithErr("IP to Socket Address failed: Invalid Address Family.\n"); + NetErr("IP to Socket Address failed: Invalid Address Family."); return -1; } @@ -314,7 +314,7 @@ U8 *NetworkToPresentation(I64 address_family, CIPAddressStorage *source) break; default: - ZenithErr("Socket Address to IP failed: Invalid Address Family.\n"); + NetErr("Socket Address to IP failed: Invalid Address Family."); break; } @@ -367,7 +367,7 @@ U0 SocketStateErr(U8 *request, U8 state) state_string = StrNew("CLOSED"); break; } - ZenithErr("Socket attempted %s while in %s state.\n", request, state_string); + NetErr("Socket attempted %s while in %s state.", request, state_string); } U0 SocketAccept(CSocket *socket) diff --git a/src/Home/Net/Tests/DHCPSendTrash1.CC b/src/Home/Net/Tests/DHCPSendTrash1.CC index 26cff95f..593d1abe 100755 --- a/src/Home/Net/Tests/DHCPSendTrash1.CC +++ b/src/Home/Net/Tests/DHCPSendTrash1.CC @@ -3,19 +3,20 @@ U8 dst_mac[6] = {0xF0, 0x0D, 0xBE, 0xAD, 0xDE, 0xAF}; U32 dst_ip = 0x01020304; U0 DHCPSendTrash() -{ // DHCPConfigure, then send UDP trash. +{ // DHCPConfigure (if not already configured), then send UDP trash. U8 *udp_payload; I64 de_index; ARPCachePut(dst_ip, dst_mac); // Force entry into ARP Cache so IPV4 can match it with GetMACAddressForIP - DHCPConfigure; + if (ipv4_globals.local_ip == 0) + DHCPConfigure; while (TRUE) { - de_index = UDPPacketAllocate(&udp_payload, arp_globals.local_ipv4, 0xDEAD, dst_ip, 0xBEEF, 8); + de_index = UDPPacketAllocate(&udp_payload, ipv4_globals.local_ip, 0xDEAD, dst_ip, 0xBEEF, 8); *(udp_payload(U64 *)) = EndianU64(0xDEADBEEFC0DEFADE); diff --git a/src/Home/Net/Tests/DHCPSendTrash2.CC b/src/Home/Net/Tests/DHCPSendTrash2.CC index 4e964576..f38c54f7 100755 --- a/src/Home/Net/Tests/DHCPSendTrash2.CC +++ b/src/Home/Net/Tests/DHCPSendTrash2.CC @@ -11,6 +11,12 @@ U0 DHCPSendTrash() U8 *packet_buffer; I64 de_index; + if (ipv4_globals.local_ip != 0) + { + "\nThis test will only work on unconfigured network.\n"; + "To force for testing, comment out $FG,0$NetConfigure;$FG$ in $LK,"NetStart",A="FF:C:/Home/Net/NetStart.CC,NetConfigure"$.\n\n"; + return; + } DHCPConfigureInner(udp_socket, &your_ip, &dns_ip, &router_ip, &subnet_mask); diff --git a/src/Home/Net/Tests/DNSSendTrash.CC b/src/Home/Net/Tests/DNSSendTrash.CC index 5ce21172..f0734c9a 100755 --- a/src/Home/Net/Tests/DNSSendTrash.CC +++ b/src/Home/Net/Tests/DNSSendTrash.CC @@ -9,8 +9,11 @@ U0 DNSSendTrash() U8 **l = labels; CDNSQuestion *q = CAlloc(sizeof(CDNSQuestion)); - ARPCachePut(dns_ip, dns_mac); // Force entry into ARP Cache so IPV4 can match it with GetMACAddressForIP - DNSSetResolverIPV4(dns_ip); // Forcing so DNSSendQuestion succeeds + if (dns_globals.addr_family == AF_UNSPEC) + { + ARPCachePut(dns_ip, dns_mac); // Force entry into ARP Cache so IPV4 can match it with GetMACAddressForIP + DNSSetResolverIPV4(dns_ip); // Forcing so DNSSendQuestion succeeds + } q->q_name.labels = labels; q->q_name.num_labels = 4; diff --git a/src/Home/Net/Tests/HostTest1.CC b/src/Home/Net/Tests/HostTest1.CC index ecb84315..0b0892df 100755 --- a/src/Home/Net/Tests/HostTest1.CC +++ b/src/Home/Net/Tests/HostTest1.CC @@ -5,11 +5,12 @@ U32 dns_ip = 0x51525354; U0 HostTest() { - ARPCachePut(dns_ip, dns_mac); // Force entry into ARP Cache so IPV4 can match it with GetMACAddressForIP - DNSSetResolverIPV4(dns_ip); // Forcing so DNSSendQuestion succeeds + if (dns_globals.addr_family == AF_UNSPEC) + { + ARPCachePut(dns_ip, dns_mac); // Force entry into ARP Cache so IPV4 can match it with GetMACAddressForIP + DNSSetResolverIPV4(dns_ip); // Forcing so DNSSendQuestion succeeds + } - - "\n$BG,8$Type $FG,0$G2;$FG$ if it crashes$BG$\n\n"; Host("zenithos.org"); } diff --git a/src/Home/Net/Tests/Old/Test.CC b/src/Home/Net/Tests/Old/Test.CC index cd813b3f..e0dcb919 100755 --- a/src/Home/Net/Tests/Old/Test.CC +++ b/src/Home/Net/Tests/Old/Test.CC @@ -48,7 +48,7 @@ I64 IPV4AddressParse(U8 *string, U32 destination) break; default: - ZenithErr("IPV4 Parse Failure: Unexpected char.\n"); + NetErr("IPV4 Parse Failure: Unexpected char.\n"); parse_state = IP_PARSE_STATE_ERROR; break; @@ -59,7 +59,7 @@ I64 IPV4AddressParse(U8 *string, U32 destination) "%s, %X\n", digit_buffer, Str2I64(digit_buffer); if (Str2I64(digit_buffer) > 255) { - ZenithErr("IPV4 Parse Failure: Chunk exceeds 0 - 255 range.\n"); + NetErr("IPV4 Parse Failure: Chunk exceeds 0 - 255 range.\n"); parse_state = IP_PARSE_STATE_ERROR; break; } @@ -73,7 +73,7 @@ I64 IPV4AddressParse(U8 *string, U32 destination) current_chunk_index++; if (current_chunk_index > 3) { - ZenithErr("IPV4 Parse Failure: Too many dots in address string.\n"); + NetErr("IPV4 Parse Failure: Too many dots in address string.\n"); parse_state = IP_PARSE_STATE_ERROR; break; } @@ -83,7 +83,7 @@ I64 IPV4AddressParse(U8 *string, U32 destination) break; case IP_PARSE_STATE_ERROR: - ZenithErr("IPV4 Parse Failure: Invalid Address String.\n"); + NetErr("IPV4 Parse Failure: Invalid Address String.\n"); return -1; // error state! } } diff --git a/src/Home/Net/Tests/Old/Test2.CC b/src/Home/Net/Tests/Old/Test2.CC index 90028739..7434b48e 100755 --- a/src/Home/Net/Tests/Old/Test2.CC +++ b/src/Home/Net/Tests/Old/Test2.CC @@ -70,12 +70,12 @@ Bool IPV4AddressParse(U8 *string, U32* destination) case TK_I64: if (cc->cur_i64 > 255 || cc->cur_i64 < 0) { - ZenithErr("Invalid value, must be 0 - 255.\n"); + NetErr("Invalid value, must be 0 - 255.\n"); return FALSE; } if (current_section > 3) { - ZenithErr("IP Address can only have 4 sections.\n"); + NetErr("IP Address can only have 4 sections.\n"); return FALSE; } @@ -87,7 +87,7 @@ Bool IPV4AddressParse(U8 *string, U32* destination) break; default: - ZenithErr("Expected decimal. \n"); + NetErr("Expected decimal. \n"); return FALSE; } break; @@ -100,7 +100,7 @@ Bool IPV4AddressParse(U8 *string, U32* destination) break; default: - ZenithErr("Expected dot. \n"); + NetErr("Expected dot. \n"); return FALSE; } break; @@ -174,7 +174,7 @@ I64 IPV4AddressParseOOOOOOOOOOPS(U8 *string, U32 destination) break; default: - ZenithErr("IPV4 Parse Failure: Unexpected char.\n"); + NetErr("IPV4 Parse Failure: Unexpected char.\n"); parse_state = IP_PARSE_STATE_ERROR; break; @@ -185,7 +185,7 @@ I64 IPV4AddressParseOOOOOOOOOOPS(U8 *string, U32 destination) "%s, %X\n", digit_buffer, Str2I64(digit_buffer); if (Str2I64(digit_buffer) > 255) { - ZenithErr("IPV4 Parse Failure: Chunk exceeds 0 - 255 range.\n"); + NetErr("IPV4 Parse Failure: Chunk exceeds 0 - 255 range.\n"); parse_state = IP_PARSE_STATE_ERROR; break; } @@ -199,7 +199,7 @@ I64 IPV4AddressParseOOOOOOOOOOPS(U8 *string, U32 destination) current_chunk_index++; if (current_chunk_index > 3) { - ZenithErr("IPV4 Parse Failure: Too many dots in address string.\n"); + NetErr("IPV4 Parse Failure: Too many dots in address string.\n"); parse_state = IP_PARSE_STATE_ERROR; break; } @@ -209,7 +209,7 @@ I64 IPV4AddressParseOOOOOOOOOOPS(U8 *string, U32 destination) break; case IP_PARSE_STATE_ERROR: - ZenithErr("IPV4 Parse Failure: Invalid Address String.\n"); + NetErr("IPV4 Parse Failure: Invalid Address String.\n"); return -1; // error state! } } diff --git a/src/Home/Net/Tests/UDPSendTrash1.CC b/src/Home/Net/Tests/UDPSendTrash1.CC index 8d72ba44..a2cdbac2 100755 --- a/src/Home/Net/Tests/UDPSendTrash1.CC +++ b/src/Home/Net/Tests/UDPSendTrash1.CC @@ -13,7 +13,7 @@ U0 UDPSendTrash() error = DNSGetAddressInfo("zenithos.org", NULL, &result); if (error < 0) { - ZenithErr("failed at DNS Get Address Info.\n"); + NetErr("failed at DNS Get Address Info."); } else { diff --git a/src/Home/Net/UDP.CC b/src/Home/Net/UDP.CC index 7d2a74e9..ca1be310 100755 --- a/src/Home/Net/UDP.CC +++ b/src/Home/Net/UDP.CC @@ -254,12 +254,12 @@ CUDPTreeQueue *UDPTreeNodeQueueIPV4Find(U32 address, CUDPTreeNode *node) if (temp_queue->socket->receive_address.family == AF_INET) { temp_ip = &temp_queue->socket->receive_address; - ZenithLog("UDPTreeNodeQueueIPV4Find: addr, nodequeue addr: %08X, %08X\n", + NetLog("UDPTreeNodeQueueIPV4Find: addr, nodequeue addr: %08X, %08X", address, temp_ip->address.address); if (temp_ip->address.address == address || temp_ip->address.address == INADDR_ANY) { - ZenithLog("UDPTreeNodeQueueIPV4Find: Address match: addr, nodequeue: %08X, %08X \n", + NetLog("UDPTreeNodeQueueIPV4Find: Address match: addr, nodequeue: %08X, %08X ", address, temp_ip->address.address); return temp_queue; } @@ -348,7 +348,7 @@ I64 UDPPacketAllocate(U8 **frame_out, sizeof(CUDPHeader) + length); if (de_index < 0) { - ZenithLog("UDP PACKET ALLOCATE: Ethernet Frame Allocate failed.\n"); + NetLog("UDP PACKET ALLOCATE: Ethernet Frame Allocate failed."); return de_index; } @@ -421,13 +421,13 @@ I64 UDPSocketBind(CUDPSocket *udp_socket, CSocketAddressStorage *address_source) break; default: - ZenithErr("UDP SOCKET BIND: Failed, Socket state-machine must be in READY state.\n"); + NetErr("UDP SOCKET BIND: Failed, Socket state-machine must be in READY state."); return -1; } if (udp_socket->bound_to) { - ZenithErr("UDP SOCKET BIND: UDP Socket currently Bound.\n"); + NetErr("UDP SOCKET BIND: UDP Socket currently Bound."); return -1; } @@ -437,7 +437,7 @@ I64 UDPSocketBind(CUDPSocket *udp_socket, CSocketAddressStorage *address_source) if (udp_socket->receive_address.family == AF_INET6) { - ZenithErr("UDP SOCKET BIND: Incompatible Address type.\n"); + NetErr("UDP SOCKET BIND: Incompatible Address type."); return -1; } @@ -455,7 +455,7 @@ I64 UDPSocketBind(CUDPSocket *udp_socket, CSocketAddressStorage *address_source) if (udp_socket->receive_address.family == AF_INET) { - ZenithErr("UDP SOCKET BIND: Incompatible Address type.\n"); + NetErr("UDP SOCKET BIND: Incompatible Address type."); return -1; } @@ -491,7 +491,7 @@ I64 UDPSocketBind(CUDPSocket *udp_socket, CSocketAddressStorage *address_source) // TODO: will any INADDR_ANY sockets bound at the port break this? if (UDPTreeNodeQueueIPV4Find(ipv4_receive->address.address, temp_node)) { - ZenithErr("UDP SOCKET BIND: Address already in Bound Socket Tree !\n"); + NetErr("UDP SOCKET BIND: Address already in Bound Socket Tree !"); return -1; } else @@ -532,7 +532,7 @@ I64 UDPSocketBind(CUDPSocket *udp_socket, CSocketAddressStorage *address_source) break; default: - ZenithErr("UDP SOCKET BIND: Failed, Misconfigured Socket state-machine.\n"); + NetErr("UDP SOCKET BIND: Failed, Misconfigured Socket state-machine."); return -1; } @@ -593,7 +593,7 @@ I64 UDPSocketReceiveFrom(CUDPSocket *udp_socket, U8 *buffer, I64 len, CSocketAdd break; default: - ZenithErr("UDP SOCKET RECEIVE FROM: Socket state-machine must be in OPEN or BOUND state.\n"); + NetErr("UDP SOCKET RECEIVE FROM: Socket state-machine must be in OPEN or BOUND state."); return -1; } @@ -603,13 +603,13 @@ I64 UDPSocketReceiveFrom(CUDPSocket *udp_socket, U8 *buffer, I64 len, CSocketAdd if (udp_socket->receive_timeout_ms != 0) udp_socket->receive_max_timeout = counts.jiffies + udp_socket->receive_timeout_ms * JIFFY_FREQ / 1000; - ZenithLog("UDP SOCKET RECEIVE FROM: udp_socket->receive_buffer: 0x%0X.\n", udp_socket->receive_buffer); + NetLog("UDP SOCKET RECEIVE FROM: udp_socket->receive_buffer: 0x%0X.", udp_socket->receive_buffer); while (udp_socket->receive_buffer != NULL) { // 'Check for timeout' if (udp_socket->receive_timeout_ms != 0 && counts.jiffies > udp_socket->receive_max_timeout) { // Shrine has TODO: 'seterror(EWOULDBLOCK)' investigate this udp_socket->receive_len = -1; // ? - ZenithErr("UDP SOCKET RECEIVE FROM: Timed out.\n"); + NetErr("UDP SOCKET RECEIVE FROM: Timed out."); break; } @@ -632,7 +632,7 @@ I64 UDPSocketReceiveFrom(CUDPSocket *udp_socket, U8 *buffer, I64 len, CSocketAdd MemCopy(ipv6_socket_addr, &udp_socket->from_address, sizeof(CSocketAddressIPV6)); break; case AF_UNSPEC: - Debug("TODO: UDP Receive From Error AF_UNSPEC UDPSocket Address Family\n"); + NetWarn("UDP Receive From AF_UNSPEC UDPSocket Address Family\n"); break; } } @@ -658,13 +658,13 @@ I64 UDPSocketSendTo(CUDPSocket *udp_socket, U8 *buffer, I64 len, CSocketAddressS break; // and use stored address as send address. case SOCKET_STATE_READY: // If socket state is initial, attempt to bind it to destination. - ZenithLog("UDP SOCKET SEND TO: Socket unbound. Attempting Bind at address parameter.\n"); + NetLog("UDP SOCKET SEND TO: Socket unbound. Attempting Bind at address parameter."); UDPSocketBind(udp_socket, destination_addr); dest = destination_addr; break; default: - ZenithErr("UDP SOCKET SEND TO: Socket state-machine must be in OPEN, BOUND or READY state.\n"); + NetErr("UDP SOCKET SEND TO: Socket state-machine must be in OPEN, BOUND or READY state."); return -1; } @@ -712,13 +712,13 @@ I64 UDPHandler(CIPV4Packet *packet) CSocketAddressIPV4 *ipv4_addr; I64 num_receive; - ZenithLog("UDP HANDLER: Beginning handling UDP Packet.\n"); + NetLog("UDP HANDLER: Beginning handling UDP Packet."); I64 error = UDPParsePacket(&source_port, &destination_port, &data, &length, packet); if (error < 0) { - ZenithErr("UDP HANDLER: Packet Parse Error.\n"); + NetErr("UDP HANDLER: Packet Parse Error."); return error; } @@ -731,38 +731,38 @@ I64 UDPHandler(CIPV4Packet *packet) if (queue) { udp_socket = queue->socket; - ZenithLog("UDP HANDLER: Port and Address are in bound tree.\n"); + NetLog("UDP HANDLER: Port and Address are in bound tree."); } else { - ZenithWarn("UDP HANDLER: Found node for port, but address is not in node queue.\n"); - ZenithWarn(" UDP packet dest ip: 0x%0X.\n", packet->destination_ip_address); + NetWarn("UDP HANDLER: Found node for port, but address is not in node queue."); + NetWarn(" UDP packet dest ip: 0x%0X.", packet->destination_ip_address); return -1; } } else { - ZenithWarn("UDP HANDLER: Node for Port is not in tree.\n"); + NetWarn("UDP HANDLER: Node for Port is not in tree."); return -1; } } else { - ZenithWarn("UDP HANDLER: Socket tree is currently empty.\n"); + NetWarn("UDP HANDLER: Socket tree is currently empty."); return -1; } - ZenithLog("UDP HANDLER: Checking if UDP Socket's Receive-Buffer exists. UDPSocket at: 0x%0X \n", udp_socket); - ZenithLog(" It probably exists, wtf going on ? udp_socket->receive_buffer: 0x%0X.\n", udp_socket->receive_buffer); + NetLog("UDP HANDLER: Checking if UDP Socket's Receive-Buffer exists. UDPSocket at: 0x%0X ", udp_socket); + NetLog(" It probably exists, wtf going on ? udp_socket->receive_buffer: 0x%0X.", udp_socket->receive_buffer); // at this point, udp_socket is set, otherwise has already returned -1. if (udp_socket->receive_buffer) { - ZenithLog("UDP HANDLER: Saw UDP Socket receive buffer exists, about to copy data into it.\n"); + NetLog("UDP HANDLER: Saw UDP Socket receive buffer exists, about to copy data into it."); num_receive = udp_socket->receive_len; if (num_receive > length) { - ZenithWarn("UDP HANDLER: Truncating UDP socket receive length. num_receive , len : %d, %d\n", + NetWarn("UDP HANDLER: Truncating UDP socket receive length. num_receive , len : %d, %d", num_receive, length); num_receive = length; } @@ -783,14 +783,14 @@ I64 UDPHandler(CIPV4Packet *packet) ipv4_addr->family = AF_INET; ipv4_addr->port = EndianU16(source_port); ipv4_addr->address.address = EndianU32(packet->source_ip_address); - ZenithLog("UDP HANDLER: Copying packet source IP (BE) to FROM_ADDRESS of UDP Socket: %08X \n", ipv4_addr->address.address); + NetLog("UDP HANDLER: Copying packet source IP (BE) to FROM_ADDRESS of UDP Socket: %08X ", ipv4_addr->address.address); } return error; } // the socket functions just act on the socket state machine. -// ZenithErr and return fail vals if socket FSM improperly used. +// NetErr and return fail vals if socket FSM improperly used. // Careful with Free()'s. UDPGlobalsInit; \ No newline at end of file