diff options
author | Arisotura <thetotalworm@gmail.com> | 2019-03-05 01:09:23 +0100 |
---|---|---|
committer | Arisotura <thetotalworm@gmail.com> | 2019-03-05 01:09:23 +0100 |
commit | a88f0b679250473dd9456036fd54cb5c1514459d (patch) | |
tree | 8960f9c78df9661e183fdd3326b725797052d393 /src | |
parent | 909b29042c0419a7ce8a11db85f988828e5bffe8 (diff) |
start work on DNS
Diffstat (limited to 'src')
-rw-r--r-- | src/libui_sdl/LAN_Socket.cpp | 87 |
1 files changed, 63 insertions, 24 deletions
diff --git a/src/libui_sdl/LAN_Socket.cpp b/src/libui_sdl/LAN_Socket.cpp index 2927a6a..b894417 100644 --- a/src/libui_sdl/LAN_Socket.cpp +++ b/src/libui_sdl/LAN_Socket.cpp @@ -225,7 +225,7 @@ void DeInit() } }*/ -bool HandleDHCPFrame(u8* data, int len) +void HandleDHCPFrame(u8* data, int len) { u8 type = 0xFF; @@ -252,7 +252,7 @@ bool HandleDHCPFrame(u8* data, int len) if (type == 0xFF) { printf("DHCP: bad frame\n"); - return false; + return; } printf("DHCP: frame type %d, transid %08X\n", type, transid); @@ -371,14 +371,55 @@ bool HandleDHCPFrame(u8* data, int len) PacketLen = framelen; memcpy(PacketBuffer, resp, PacketLen); RXNum = 1; - - return true; } +} - return false; +void HandleDNSFrame(u8* data, int len) +{ + u8* ipheader = &data[0xE]; + u8* udpheader = &data[0x22]; + u8* dnsbody = &data[0x2A]; + + u16 id = ntohs(*(u16*)&dnsbody[0]); + u16 flags = ntohs(*(u16*)&dnsbody[2]); + u16 numquestions = ntohs(*(u16*)&dnsbody[4]); + u16 numanswers = ntohs(*(u16*)&dnsbody[6]); + u16 numauth = ntohs(*(u16*)&dnsbody[8]); + u16 numadd = ntohs(*(u16*)&dnsbody[10]); + + printf("DNS: ID=%04X, flags=%04X, Q=%d, A=%d, auth=%d, add=%d\n", + id, flags, numquestions, numanswers, numauth, numadd); + + u32 curoffset = 12; + for (u16 i = 0; i < numquestions; i++) + { + // Assemble the requested domain name + u8 bitlength = 0; + char domainname[256] = ""; int o = 0; + while ((bitlength = dnsbody[curoffset++]) != 0) + { + if ((o+bitlength) >= 255) break; + + strncpy(&domainname[o], (const char *)&dnsbody[curoffset], bitlength); + o += bitlength; + + curoffset += bitlength; + if (dnsbody[curoffset] != 0) + { + domainname[o++] = '.'; + } + } + + printf("- q%d: %s", i, domainname); + + // TODO: get answer + + printf("\n"); + curoffset += 4; + } } -bool HandleIPFrame(u8* data, int len) +void HandleIPFrame(u8* data, int len) { u8 protocol = data[0x17]; @@ -468,7 +509,7 @@ bool HandleIPFrame(u8* data, int len) if (sockid == -1) { printf("LANMAGIC: !! TCP SOCKET LIST FULL\n"); - return true; + return; } printf("LANMAGIC: opening TCP socket #%d to %d.%d.%d.%d:%d\n", @@ -500,7 +541,7 @@ bool HandleIPFrame(u8* data, int len) if (sockid == -1) { printf("LANMAGIC: bad TCP packet\n"); - return true; + return; } if (flags & 0x001) // FIN @@ -528,14 +569,12 @@ bool HandleIPFrame(u8* data, int len) if (tmp == 0) tmp = 0xFFFF; *(u16*)&protoheader[16] = htons(tmp); } - - return false; } -bool HandleARPFrame(u8* data, int len) +void HandleARPFrame(u8* data, int len) { u16 protocol = ntohs(*(u16*)&data[0x10]); - if (protocol != 0x0800) return false; + if (protocol != 0x0800) return; u16 op = ntohs(*(u16*)&data[0x14]); u32 targetip = ntohl(*(u32*)&data[0x26]); @@ -554,7 +593,7 @@ bool HandleARPFrame(u8* data, int len) const u8* targetmac; if (targetip == kServerIP) targetmac = kServerMAC; else if (targetip == kDNSIP) targetmac = kDNSMAC; - else return false; + else return; u8 resp[64]; u8* out = &resp[0]; @@ -583,14 +622,14 @@ bool HandleARPFrame(u8* data, int len) PacketLen = framelen; memcpy(PacketBuffer, resp, PacketLen); RXNum = 1; - - return true; } - - return false; + else + { + printf("wat??\n"); + } } -bool HandlePacket(u8* data, int len) +void HandlePacket(u8* data, int len) { u16 ethertype = ntohs(*(u16*)&data[0xC]); @@ -606,6 +645,11 @@ bool HandlePacket(u8* data, int len) printf("LANMAGIC: DHCP packet\n"); return HandleDHCPFrame(data, len); } + else if (dstport == 53) // DNS + { + printf("LANMAGIC: DNS packet\n"); + return HandleDNSFrame(data, len); + } } printf("LANMAGIC: IP packet\n"); @@ -616,8 +660,6 @@ bool HandlePacket(u8* data, int len) printf("LANMAGIC: ARP packet\n"); return HandleARPFrame(data, len); } - - return false; } int SendPacket(u8* data, int len) @@ -628,10 +670,7 @@ int SendPacket(u8* data, int len) return 0; } - // TODO: blarg - if (HandlePacket(data, len)) - return len; - + HandlePacket(data, len); return len; } |