Skip to content

Commit 465203e

Browse files
committed
Improve IP4 address resolution in IP6 networks, support PM #13
1 parent ba22606 commit 465203e

File tree

2 files changed

+92
-28
lines changed

2 files changed

+92
-28
lines changed

src/geos/geoshost.cpp

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -489,14 +489,30 @@ uint16_t AsyncSocketSend::Init(uint16_t* cmdRec) {
489489
} else {
490490
SocketState& sock = NetSockets[m_socketHandle];
491491

492-
uint32_t dosBuff = static_cast<uint32_t>(G_commandBuffer[2] << 4) +
493-
G_commandBuffer[3];
494492
int size = cmdRec[4];
495493
LOG_MSG("NetSendData data size: %d", size);
496494

497495
char* buffer = new char[size + 1];
498-
for (int i = 0; i < size; i++) {
499-
buffer[i] = mem_readb(dosBuff + i);
496+
497+
if (G_protectedOpMode) {
498+
Descriptor desc;
499+
cpu.gdt.GetDescriptor(G_commandBuffer[2], desc);
500+
501+
uint32_t dosBuff = static_cast<uint32_t>(
502+
desc.GetBase()) +
503+
G_commandBuffer[3];
504+
for (int i = 0; i < size; i++) {
505+
buffer[i] = mem_readb(dosBuff + i);
506+
}
507+
508+
} else {
509+
510+
uint32_t dosBuff = static_cast<uint32_t>(
511+
G_commandBuffer[2] << 4) +
512+
G_commandBuffer[3];
513+
for (int i = 0; i < size; i++) {
514+
buffer[i] = mem_readb(dosBuff + i);
515+
}
500516
}
501517
buffer[size] = 0;
502518

@@ -537,10 +553,24 @@ uint16_t AsyncSocketResolveAddr::Init(uint16_t* cmdRec)
537553
// si:bx = host name address
538554
// cx = address name len
539555
LOG_MSG("\nAsyncSocketResolveAddr::Init: %x %x\n", cmdRec[1], cmdRec[2]);
540-
MEM_StrCopy(static_cast<uint32_t>(cmdRec[1] << 4) + cmdRec[2],
541-
m_hostname,
542-
cmdRec[3]); // 1024 toasts the
543-
// stack
556+
557+
if (G_protectedOpMode) {
558+
Descriptor desc;
559+
cpu.gdt.GetDescriptor(cmdRec[1], desc);
560+
MEM_StrCopy(static_cast<uint32_t>(desc.GetBase()) +
561+
cmdRec[2],
562+
m_hostname,
563+
cmdRec[3]); // 1024 toasts the
564+
// stack
565+
} else {
566+
MEM_StrCopy(static_cast<uint32_t>(
567+
cmdRec[1] << 4) +
568+
cmdRec[2],
569+
m_hostname,
570+
cmdRec[3]); // 1024 toasts the
571+
// stack
572+
}
573+
544574
m_hostname[cmdRec[3]] = 0;
545575

546576
#ifdef USE_SDL3
@@ -1332,6 +1362,7 @@ static void write_baseboxcmd(io_port_t, io_val_t command, io_width_t)
13321362
G_responseOffset = 6;
13331363

13341364
} else if (G_commandBuffer[0] == HIF_SET_EVENT_INTERRUPT) {
1365+
G_protectedOpMode = cpu.pmode;
13351366
G_eventInterrupt =
13361367
0xA0 /* G_commandBuffer[1] & 0xFF*/;
13371368
} else if (G_commandBuffer[0] == HIF_GET_VIDEO_PARAMS) {
@@ -1628,17 +1659,38 @@ static void write_baseboxcmd(io_port_t, io_val_t command, io_width_t)
16281659
LOG_MSG("RECEIVENEXT: %x %x",
16291660
G_commandBuffer[2],
16301661
G_commandBuffer[3]);
1631-
for (int i2 = 0;
1632-
i2 < size;
1633-
i2++) {
1634-
mem_writeb(
1635-
static_cast<uint32_t>(
1636-
G_commandBuffer[2]
1637-
<< 4) +
1638-
G_commandBuffer[3] +
1639-
i2,
1640-
NetSockets[i]
1641-
.recvBuf[i2]);
1662+
if (G_protectedOpMode) {
1663+
1664+
Descriptor desc;
1665+
cpu.gdt.GetDescriptor(
1666+
G_commandBuffer[2],
1667+
desc);
1668+
1669+
for (int i2 = 0;
1670+
i2 < size;
1671+
i2++) {
1672+
mem_writeb(
1673+
static_cast<uint32_t>(desc.GetBase()) +
1674+
G_commandBuffer[3] +
1675+
i2,
1676+
NetSockets[i]
1677+
.recvBuf[i2]);
1678+
}
1679+
1680+
} else {
1681+
1682+
for (int i2 = 0;
1683+
i2 < size;
1684+
i2++) {
1685+
mem_writeb(
1686+
static_cast<uint32_t>(
1687+
G_commandBuffer[2]
1688+
<< 4) +
1689+
G_commandBuffer[3] +
1690+
i2,
1691+
NetSockets[i]
1692+
.recvBuf[i2]);
1693+
}
16421694
}
16431695

16441696
// mark unused,

src/sdl3-net/SDL_net.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -686,16 +686,28 @@ long NET_GetIP4Address(NET_Address* addr) {
686686

687687
if (addr) {
688688
struct addrinfo* ai = addr->ainfo;
689-
if (ai) {
690-
while (ai->ai_addr) {
691-
if (ai->ai_family == AF_INET) {
689+
while (ai && ai->ai_addr) {
690+
if (ai->ai_family == AF_INET) {
692691

693-
struct sockaddr_in* sa = (struct sockaddr_in*)(ai->ai_addr);
694-
return (long)(sa->sin_addr.s_addr);
695-
}
696-
ai = ai->ai_next;
697-
}
698-
}
692+
struct sockaddr_in* sa = (struct sockaddr_in*)(ai->ai_addr);
693+
return (long)(sa->sin_addr.s_addr);
694+
} else if (ai->ai_family == AF_INET6) {
695+
// Prüfen auf IPv4-mapped IPv6-Adresse
696+
struct sockaddr_in6* sa6 =
697+
(struct sockaddr_in6*)(ai->ai_addr);
698+
699+
// IPv4-mapped IPv6 hat Format ::ffff:a.b.c.d
700+
// Die ersten 10 Bytes sind 0, dann 2 Bytes
701+
// 0xff, dann 4 Bytes IPv4
702+
if (IN6_IS_ADDR_V4MAPPED(&sa6->sin6_addr)) {
703+
// Die IPv4-Adresse liegt in den letzten
704+
// 4 Bytes
705+
return (long)(*(
706+
uint32_t*)(&sa6->sin6_addr.s6_addr[12]));
707+
}
708+
}
709+
ai = ai->ai_next;
710+
}
699711
}
700712
return 0;
701713
}

0 commit comments

Comments
 (0)