DOSBox-X
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
include/ipx.h
00001 /*
00002  *  Copyright (C) 2002-2020  The DOSBox Team
00003  *
00004  *  This program is free software; you can redistribute it and/or modify
00005  *  it under the terms of the GNU General Public License as published by
00006  *  the Free Software Foundation; either version 2 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  This program is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU General Public License along
00015  *  with this program; if not, write to the Free Software Foundation, Inc.,
00016  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00017  */
00018 
00019 
00020 #ifndef DOSBOX_IPX_H
00021 #define DOSBOX_IPX_H
00022 
00023 // Uncomment this for a lot of debug messages:
00024 //#define IPX_DEBUGMSG 
00025 
00026 #ifdef IPX_DEBUGMSG
00027 #define LOG_IPX LOG_MSG
00028 #else
00029 #if defined (_MSC_VER)
00030 #define LOG_IPX
00031 #else
00032 #define LOG_IPX(...)
00033 #endif
00034 #endif
00035 
00036 #ifndef DOSBOX_DOSBOX_H
00037 #include "dosbox.h"
00038 #endif
00039 #ifndef DOSBOX_MEM_H
00040 #include "mem.h"
00041 #endif
00042 
00043 // In Use Flag codes
00044 #define USEFLAG_AVAILABLE  0x00
00045 #define USEFLAG_AESTEMP    0xe0
00046 #define USEFLAG_IPXCRIT    0xf8
00047 #define USEFLAG_SPXLISTEN  0xf9
00048 #define USEFLAG_PROCESSING 0xfa
00049 #define USEFLAG_HOLDING    0xfb
00050 #define USEFLAG_AESWAITING 0xfc
00051 #define USEFLAG_AESCOUNT   0xfd
00052 #define USEFLAG_LISTENING  0xfe
00053 #define USEFLAG_SENDING    0xff
00054 
00055 // Completion codes
00056 #define COMP_SUCCESS          0x00
00057 #define COMP_REMOTETERM       0xec
00058 #define COMP_DISCONNECT       0xed
00059 #define COMP_INVALIDID        0xee
00060 #define COMP_SPXTABLEFULL     0xef
00061 #define COMP_EVENTNOTCANCELED 0xf9
00062 #define COMP_NOCONNECTION     0xfa
00063 #define COMP_CANCELLED        0xfc
00064 #define COMP_MALFORMED        0xfd
00065 #define COMP_UNDELIVERABLE    0xfe
00066 #define COMP_HARDWAREERROR    0xff
00067 
00068 #ifdef _MSC_VER
00069 #pragma pack(1)
00070 #endif
00071 
00072 // For Uint8 type
00073 #include "SDL_net.h"
00074 
00075 struct PackedIP {
00076         Uint32 host;
00077         Uint16 port;
00078 } GCC_ATTRIBUTE(packed);
00079 
00080 struct nodeType {
00081         Uint8 node[6];
00082 } GCC_ATTRIBUTE(packed) ;
00083 
00084 struct IPXHeader {
00085         Uint8 checkSum[2];
00086         Uint8 length[2];
00087         Uint8 transControl; // Transport control
00088         Uint8 pType; // Packet type
00089 
00090         struct transport {
00091                 Uint8 network[4];
00092                 union addrtype {
00093                         nodeType byNode;
00094                         PackedIP byIP ;
00095                 } GCC_ATTRIBUTE(packed) addr;
00096                 Uint8 socket[2];
00097         } dest, src;
00098 } GCC_ATTRIBUTE(packed);
00099 
00100 struct fragmentDescriptor {
00101         Bit16u offset;
00102         Bit16u segment;
00103         Bit16u size;
00104 };
00105 
00106 #define IPXBUFFERSIZE 1424
00107 
00108 class ECBClass {
00109 public:
00110         RealPt ECBAddr;
00111         bool isInESRList;
00112         ECBClass *prevECB;      // Linked List
00113         ECBClass *nextECB;
00114         
00115         Bit8u iuflag;           // Need to save data since we are not always in
00116         Bit16u mysocket;        // real mode
00117 
00118         Bit8u* databuffer;      // received data is stored here until we get called
00119         Bitu buflen;            // by Interrupt
00120 
00121 #ifdef IPX_DEBUGMSG 
00122         Bitu SerialNumber;
00123 #endif
00124 
00125         ECBClass(Bit16u segment, Bit16u offset);
00126         Bit16u getSocket(void);
00127 
00128         Bit8u getInUseFlag(void);
00129 
00130         void setInUseFlag(Bit8u flagval);
00131 
00132         void setCompletionFlag(Bit8u flagval);
00133 
00134         Bit16u getFragCount(void);
00135 
00136         bool writeData();
00137         void writeDataBuffer(Bit8u* buffer, Bit16u length);
00138 
00139         void getFragDesc(Bit16u descNum, fragmentDescriptor *fragDesc);
00140         RealPt getESRAddr(void);
00141 
00142         void NotifyESR(void);
00143 
00144         void setImmAddress(Bit8u *immAddr);
00145         void getImmAddress(Bit8u* immAddr);
00146 
00147         ~ECBClass();
00148 };
00149 
00150 // The following routines may not be needed on all systems.  On my build of SDL the IPaddress structure is 8 octects 
00151 // and therefore screws up my IPXheader structure since it needs to be packed.
00152 
00153 void UnpackIP(PackedIP ipPack, IPaddress * ipAddr);
00154 void PackIP(IPaddress ipAddr, PackedIP *ipPack);
00155 
00156 #ifdef _MSC_VER
00157 #pragma pack()
00158 #endif
00159 
00160 #endif