1
0
Fork 0

ipx changes by hal

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2514
This commit is contained in:
Peter Veenstra 2006-02-26 13:46:31 +00:00
parent bd5c4bcd84
commit e93325eeaf
3 changed files with 36 additions and 22 deletions

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: ipx.h,v 1.8 2006-02-09 11:47:47 qbix79 Exp $ */
/* $Id: ipx.h,v 1.9 2006-02-26 13:46:31 qbix79 Exp $ */
#ifndef DOSBOX_IPX_H
#define DOSBOX_IPX_H
@ -94,6 +94,8 @@ struct fragmentDescriptor {
Bit16u size;
};
#define IPXBUFFERSIZE 1424
class ECBClass {
public:
RealPt ECBAddr;
@ -123,6 +125,7 @@ public:
void NotifyESR(void);
void setImmAddress(Bit8u *immAddr);
void getImmAddress(Bit8u* immAddr);
~ECBClass();
};

View file

@ -33,7 +33,6 @@ struct packetBuffer {
};
#define SOCKETTABLESIZE 16
#define IPXBUFFERSIZE 1024
#define CONVIP(hostvar) hostvar & 0xff, (hostvar >> 8) & 0xff, (hostvar >> 16) & 0xff, (hostvar >> 24) & 0xff
#define CONVIPX(hostvar) hostvar[0], hostvar[1], hostvar[2], hostvar[3], hostvar[4], hostvar[5]

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: ipx.cpp,v 1.9 2006-02-09 11:47:49 qbix79 Exp $ */
/* $Id: ipx.cpp,v 1.10 2006-02-26 13:46:31 qbix79 Exp $ */
#include "dosbox.h"
@ -199,7 +199,12 @@ void ECBClass::NotifyESR(void) {
void ECBClass::setImmAddress(Bit8u *immAddr) {
for(Bitu i=0;i<6;i++)
real_writeb(RealSeg(ECBAddr), RealOff(ECBAddr)+28, immAddr[i]);
real_writeb(RealSeg(ECBAddr), RealOff(ECBAddr)+28+i, immAddr[i]);
}
void ECBClass::getImmAddress(Bit8u* immAddr) {
for(Bitu i=0;i<6;i++)
immAddr[i] = real_readb(RealSeg(ECBAddr), RealOff(ECBAddr)+28+i);
}
ECBClass::~ECBClass() {
@ -325,7 +330,14 @@ static void handleIpxRequest(void) {
CloseSocket();
break;
case 0x0002: // get local target
reg_al=0xfa; // fail
// es:si
// Currently no support for multiple networks
for(Bitu i = 0; i < 6; i++)
real_writeb(SegValue(es),reg_di+i,real_readb(SegValue(es),reg_si+i+4));
reg_cx=1; // time ticks expected
reg_al=0x00;//success
break;
case 0x0003: // Send packet
@ -401,11 +413,21 @@ static void handleIpxRequest(void) {
case 0x000a: // Relinquish control
// Idle thingy
break;
case 0x000b: // Disconnect from Target
// We don't even connect
break;
case 0x0010: // SPX install check
{
reg_al=0; // SPX not installed
break;
}
case 0x001a: // get driver maximum packet size
{
reg_cx=0; // retry count
reg_ax=IPXBUFFERSIZE; // max packet size
break;
}
default:
LOG_MSG("Unhandled IPX function: %4x", reg_bx);
break;
@ -552,13 +574,9 @@ static void IPX_ClientLoop(void) {
inPacket.maxlen = IPXBUFFERSIZE;
inPacket.channel = UDPChannel;
//do
//{
// Its amazing how much simpler UDP is than TCP
numrecv = SDLNet_UDP_Recv(ipxClientSocket, &inPacket);
if(numrecv) receivePacket(inPacket.data, inPacket.len);
//}while(numrecv>0);
// Its amazing how much simpler UDP is than TCP
numrecv = SDLNet_UDP_Recv(ipxClientSocket, &inPacket);
if(numrecv) receivePacket(inPacket.data, inPacket.len);
}
@ -620,15 +638,10 @@ static void sendPacket(ECBClass* sendecb) {
// Source socket
wordptr[14] = swapByte(sendecb->getSocket());
Bit8u immedAddr[6];
sendecb->getImmAddress(immedAddr);
// filter out broadcasts and local loopbacks
// ok, the situation is:
// Warcraft1 is allergic to having broadcast packets looped back.
// C&C1 is allergic to not having broadcast packets looped back.
// Warcraft1 broadcasts to 00 00 00 00 : FF FF FF FF FF FF
// C&C1 broadcasts to FF FF FF FF : FF FF FF FF FF FF
// Some other games don't care.
// I assume FF... does local loopback, 00... doesn't.
// Let's hope the bug isn't somewhere else..
// Real implementation uses the ImmedAddr to check wether this is a broadcast
bool islocalbroadcast=true;
bool isloopback=true;
@ -638,12 +651,11 @@ static void sendPacket(ECBClass* sendecb) {
addrptr = (Bit8u *)&localIpxAddr.netnum;
for(Bitu m=0;m<4;m++) {
if(addrptr[m]!=outbuffer[m+0x6])isloopback=false;
if(outbuffer[m+0x6]!=0xff) islocalbroadcast=false;
}
addrptr = (Bit8u *)&localIpxAddr.netnode;
for(Bitu m=0;m<6;m++) {
if(addrptr[m]!=outbuffer[m+0xa])isloopback=false;
if(outbuffer[m+0xa]!=0xff) islocalbroadcast=false;
if(immedAddr[m]!=0xff) islocalbroadcast=false;
}
if(!isloopback) {