mirror of
https://github.com/SDL-Hercules-390/hyperion.git
synced 2026-04-20 02:36:27 +02:00
1392 lines
62 KiB
C
1392 lines
62 KiB
C
/* CTCADPT.H (C) Copyright James A. Pierson, 2002-2012 */
|
|
/* (C) Copyright Roger Bowler, 2000-2012 */
|
|
/* (C) Copyright Willem Konynenberg, 2000-2009 */
|
|
/* (C) Copyright Vic Cross, 2001-2009 */
|
|
/* (C) Copyright David B. Trout, 2002-2009 */
|
|
/* Hercules Channel-to-Channel Emulation Support */
|
|
/* */
|
|
/* Released under "The Q Public License Version 1" */
|
|
/* (http://www.hercules-390.org/herclic.html) as modifications to */
|
|
/* Hercules. */
|
|
|
|
#ifndef __CTCADPT_H_
|
|
#define __CTCADPT_H_
|
|
|
|
#include "netsupp.h" // (Networking Support Functions)
|
|
|
|
// --------------------------------------------------------------------
|
|
// Pack all structures to byte boundary...
|
|
// --------------------------------------------------------------------
|
|
|
|
#undef ATTRIBUTE_PACKED
|
|
#if defined(_MSVC_)
|
|
#pragma pack(push)
|
|
#pragma pack(1)
|
|
#define ATTRIBUTE_PACKED
|
|
#else
|
|
#define ATTRIBUTE_PACKED __attribute__((packed))
|
|
#endif
|
|
|
|
// --------------------------------------------------------------------
|
|
// Definitions for 3088 model numbers
|
|
// --------------------------------------------------------------------
|
|
|
|
#define CTC_3088_01 0x308801 // 3172 XCA
|
|
#define CTC_3088_04 0x308804 // 3088 model 1 CTCA
|
|
#define CTC_3088_08 0x308808 // 3088 model 2 CTCA
|
|
#define CTC_3088_1E 0x30881E // FICON CTC
|
|
#define CTC_3088_1F 0x30881F // 3172 LCS
|
|
#define CTC_3088_60 0x308860 // OSA or 8232 LCS
|
|
#define CTC_3088_61 0x308861 // CLAW device
|
|
|
|
// --------------------------------------------------------------------
|
|
// Media Access Control address (MAC address)
|
|
// --------------------------------------------------------------------
|
|
|
|
#ifndef IFHWADDRLEN // (only predefined on Linux)
|
|
#define IFHWADDRLEN 6 // Ethernet MAC address length
|
|
#endif
|
|
|
|
typedef uint8_t MAC[ IFHWADDRLEN ]; // Data Type for MAC Addresses
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS structure typedefs (actual structures defined further below)
|
|
// --------------------------------------------------------------------
|
|
|
|
#define LCS_MAX_PORTS 4 // Maximum support ports per LCS device
|
|
|
|
struct _LCSBLK; // Common Storage for LCS Emulation
|
|
struct _LCSDEV; // LCS Device
|
|
struct _LCSPORT; // LCS Port (or Relative Adapter)
|
|
struct _LCSRTE; // LCS Routing Entries
|
|
struct _LCSHDR; // LCS Frame Header
|
|
struct _LCSCMDHDR; // LCS Command Frame Header
|
|
struct _LCSSTDFRM; // LCS Standard Command Frame
|
|
struct _LCSSTRTFRM; // LCS Startup & Start LAN Command Frames
|
|
struct _LCSQIPFRM; // LCS Query IP Assists Command Frame
|
|
struct _LCSLSTFRM; // LCS LAN Statistics Command Frame
|
|
struct _LCSLSSFRM; // LCS LAN Statistics SNA Command Frame
|
|
struct _LCSIPMPAIR; // LCS IP Multicast Pair structure
|
|
struct _LCSIPMFRM; // LCS Set IP Multicast Command Frame
|
|
struct _LCSETHFRM; // LCS Ethernet Passthru Frame
|
|
struct _LCSATTN; // LCS Attention Required
|
|
struct _LCSOCTL; // LCS SNA Outbound Control
|
|
struct _LCSICTL; // LCS SNA Inbound Control
|
|
struct _LCSBAF1; // LCS SNA baffle 1
|
|
struct _LCSBAF2; // LCS SNA baffle 2
|
|
struct _LCSIBH; // LCS SNA Inbound Buffer Header
|
|
struct _LCSCONN; // LCS SNA Connection
|
|
|
|
typedef struct _LCSBLK LCSBLK, *PLCSBLK;
|
|
typedef struct _LCSDEV LCSDEV, *PLCSDEV;
|
|
typedef struct _LCSPORT LCSPORT, *PLCSPORT;
|
|
typedef struct _LCSRTE LCSRTE, *PLCSRTE;
|
|
typedef struct _LCSHDR LCSHDR, *PLCSHDR;
|
|
typedef struct _LCSCMDHDR LCSCMDHDR, *PLCSCMDHDR;
|
|
typedef struct _LCSSTDFRM LCSSTDFRM, *PLCSSTDFRM;
|
|
typedef struct _LCSSTRTFRM LCSSTRTFRM, *PLCSSTRTFRM;
|
|
typedef struct _LCSQIPFRM LCSQIPFRM, *PLCSQIPFRM;
|
|
typedef struct _LCSLSTFRM LCSLSTFRM, *PLCSLSTFRM;
|
|
typedef struct _LCSLSSFRM LCSLSSFRM, *PLCSLSSFRM;
|
|
typedef struct _LCSIPMPAIR LCSIPMPAIR, *PLCSIPMPAIR;
|
|
typedef struct _LCSIPMFRM LCSIPMFRM, *PLCSIPMFRM;
|
|
typedef struct _LCSETHFRM LCSETHFRM, *PLCSETHFRM;
|
|
typedef struct _LCSATTN LCSATTN, *PLCSATTN;
|
|
typedef struct _LCSOCTL LCSOCTL, *PLCSOCTL;
|
|
typedef struct _LCSICTL LCSICTL, *PLCSICTL;
|
|
typedef struct _LCSBAF1 LCSBAF1, *PLCSBAF1;
|
|
typedef struct _LCSBAF2 LCSBAF2, *PLCSBAF2;
|
|
typedef struct _LCSIBH LCSIBH, *PLCSIBH;
|
|
typedef struct _LCSCONN LCSCONN, *PLCSCONN;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// External Declarations
|
|
// --------------------------------------------------------------------
|
|
|
|
extern int CTCX_Init( DEVBLK* pDEVBLK, int argc, char *argv[] );
|
|
extern int CTCX_Close( DEVBLK* pDEVBLK );
|
|
extern void CTCX_Query( DEVBLK* pDEVBLK, char** ppszClass,
|
|
int iBufLen, char* pBuffer );
|
|
extern void CTCX_ExecuteCCW( DEVBLK* pDEVBLK, BYTE bCode,
|
|
BYTE bFlags, BYTE bChained,
|
|
U32 sCount, BYTE bPrevCode,
|
|
int iCCWSeq, BYTE* pIOBuf,
|
|
BYTE* pMore, BYTE* pUnitStat,
|
|
U32* pResidual );
|
|
|
|
extern int CTCE_Close( DEVBLK* pDEVBLK );
|
|
extern void CTCE_Query( DEVBLK* pDEVBLK, char** ppszClass,
|
|
int iBufLen, char* pBuffer );
|
|
|
|
extern int CTCI_Init( DEVBLK* pDEVBLK, int argc, char *argv[] );
|
|
extern int CTCI_Close( DEVBLK* pDEVBLK );
|
|
extern void CTCI_Query( DEVBLK* pDEVBLK, char** ppszClass,
|
|
int iBufLen, char* pBuffer );
|
|
extern void CTCI_ExecuteCCW( DEVBLK* pDEVBLK, BYTE bCode,
|
|
BYTE bFlags, BYTE bChained,
|
|
U32 sCount, BYTE bPrevCode,
|
|
int iCCWSeq, BYTE* pIOBuf,
|
|
BYTE* pMore, BYTE* pUnitStat,
|
|
U32* pResidual );
|
|
|
|
extern void CTCI_Read( DEVBLK* pDEVBLK, U32 sCount,
|
|
BYTE* pIOBuf, BYTE* UnitStat,
|
|
U32* pResidual, BYTE* pMore );
|
|
extern void CTCI_Write( DEVBLK* pDEVBLK, U32 sCount,
|
|
BYTE* pIOBuf, BYTE* UnitStat,
|
|
U32* pResidual );
|
|
|
|
extern int LCS_Init( DEVBLK* pDEVBLK, int argc, char *argv[] );
|
|
extern int LCS_Close( DEVBLK* pDEVBLK );
|
|
extern void LCS_Query( DEVBLK* pDEVBLK, char** ppszClass,
|
|
int iBufLen, char* pBuffer );
|
|
extern void LCS_ExecuteCCW( DEVBLK* pDEVBLK, BYTE bCode,
|
|
BYTE bFlags, BYTE bChained,
|
|
U32 sCount, BYTE bPrevCode,
|
|
int iCCWSeq, BYTE* pIOBuf,
|
|
BYTE* pMore, BYTE* pUnitStat,
|
|
U32* pResidual );
|
|
|
|
extern void packet_trace( BYTE *addr, int len, BYTE dir );
|
|
|
|
|
|
|
|
/**********************************************************************\
|
|
**********************************************************************
|
|
** **
|
|
** STANDARD ETHERNET FRAMES LAYOUT **
|
|
** **
|
|
**********************************************************************
|
|
\**********************************************************************/
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// Ethernet Frame Header (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _ETHFRM
|
|
{
|
|
MAC bDestMAC; // +0
|
|
MAC bSrcMAC; // +6
|
|
HWORD hwEthernetType; // +C (see below #defines)
|
|
BYTE bData[FLEXIBLE_ARRAY]; // +E
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
typedef struct _ETHFRM ETHFRM, *PETHFRM;
|
|
|
|
|
|
// To quote Wikipedia "The EtherType field is two octets long
|
|
// and it can be used for two different purposes. Values of 1500
|
|
// and below mean that it is used to indicate the size of the
|
|
// payload in octets, while values of 1536 and above indicate
|
|
// that it is used as an EtherType, to indicate which protocol
|
|
// is encapsulated in the payload of the frame."
|
|
#define ETH_TYPE 0x0600 // 0x0600 = 1536
|
|
|
|
#define ETH_TYPE_IP 0x0800
|
|
#define ETH_TYPE_ARP 0x0806
|
|
#define ETH_TYPE_RARP 0x8035
|
|
#define ETH_TYPE_SNA 0x80D5 // IBM SNA Service over Ethernet
|
|
#define ETH_TYPE_IPV6 0x86dd
|
|
#define ETH_TYPE_VLANTAG 0x8100
|
|
|
|
#define ETH_LLC_SNAP_SIZE 8
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// IP Version 4 Frame Header (Type 0x0800) (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _IP4FRM
|
|
{
|
|
BYTE bVersIHL; // +0 Vers:4, IHL:4
|
|
BYTE bTOS; // +1
|
|
HWORD hwTotalLength; // +2
|
|
HWORD hwIdentification; // +4
|
|
U16 bFlagsFragOffset; // +6 Flags:3, FragOffset:13
|
|
BYTE bTTL; // +8
|
|
BYTE bProtocol; // +9
|
|
HWORD hwChecksum; // +A
|
|
U32 lSrcIP; // +C
|
|
U32 lDstIP; // +10
|
|
BYTE bData[FLEXIBLE_ARRAY]; // +14
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
typedef struct _IP4FRM IP4FRM, *PIP4FRM;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// Address Resolution Protocol Frame (Type 0x0806) (network byte order)
|
|
// Reverse Address Resolution Protocol Frame (Type 0x8035) (network bo)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _ARPFRM
|
|
{
|
|
HWORD hwHardwareType; // +0
|
|
HWORD hwProtocolType; // +2
|
|
BYTE bHardwareSize; // +4
|
|
BYTE bProtocolSize; // +5
|
|
HWORD hwOperation; // +6
|
|
MAC bSendEthAddr; // +8
|
|
U32 lSendIPAddr; // +12
|
|
MAC bTargEthAddr; // +16
|
|
U32 lTargIPAddr; // +1C
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
typedef struct _ARPFRM ARPFRM, *PARPFRM;
|
|
|
|
|
|
#define ARP_REQUEST 0x01
|
|
#define ARP_REPLY 0x02
|
|
#define RARP_REQUEST 0x03
|
|
#define RARP_REPLY 0x04
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// IP Version 6 Frame Header (Type 0x86DD) (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _IP6FRM
|
|
{
|
|
BYTE bVersTCFlow[4]; // +0 Vers:4, TC:8 FlowID:20
|
|
BYTE bPayloadLength[2]; // +4
|
|
BYTE bNextHeader; // +6 (same as IPv4 Protocol)
|
|
BYTE bHopLimit; // +7
|
|
BYTE bSrcAddr[16]; // +8
|
|
BYTE bDstAddr[16]; // +18
|
|
BYTE bPayload[FLEXIBLE_ARRAY]; // +28 The payload
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
typedef struct _IP6FRM IP6FRM, *PIP6FRM;
|
|
|
|
|
|
/**********************************************************************\
|
|
**********************************************************************
|
|
** **
|
|
** CTCI DEVICE CONTROL BLOCKS **
|
|
** **
|
|
**********************************************************************
|
|
\**********************************************************************/
|
|
|
|
|
|
#define MAX_CTCI_FRAME_SIZE( pCTCBLK ) \
|
|
( \
|
|
pCTCBLK->iMaxFrameBufferSize /* (whatever CTCI_Init defined) */ \
|
|
- sizeof( CTCIHDR ) \
|
|
- sizeof( CTCISEG ) \
|
|
- sizeof_member(CTCIHDR,hwOffset) \
|
|
)
|
|
|
|
|
|
#define MAX_LCS_ETH_FRAME_SIZE( pLCSDEV ) \
|
|
( \
|
|
pLCSDEV->iMaxFrameBufferSize /* (whatever LCS_Startup defined) */ \
|
|
- sizeof( LCSETHFRM ) \
|
|
- sizeof_member(LCSHDR,hwOffset) \
|
|
)
|
|
|
|
// PROGRAMMING NOTE: the following frame buffer size should always be
|
|
// no smaller than the maximum frame buffer size possible for an LCS
|
|
// device (currently hard-coded in S390 Linux to be 0x5000 via the
|
|
// #define LCS_IOBUFFERSIZE). Also note that the minimum and maximum
|
|
// frame buffer size, according to IBM documentation, is 16K to 64K.
|
|
|
|
#define CTC_MIN_FRAME_BUFFER_SIZE (0x4000) // Min. frame buffer size
|
|
#define CTC_DEF_FRAME_BUFFER_SIZE (0x5000) // Def. frame buffer size
|
|
#define CTC_MAX_FRAME_BUFFER_SIZE (0xFFFF) // Max. frame buffer size
|
|
|
|
#define CTC_DELAY_USECS (100) // 100 microseconds delay;
|
|
// used mostly by enqueue
|
|
// frame buffer delay loop.
|
|
|
|
struct _CTCBLK;
|
|
struct _CTCIHDR;
|
|
struct _CTCISEG;
|
|
|
|
typedef struct _CTCBLK CTCBLK, *PCTCBLK;
|
|
typedef struct _CTCIHDR CTCIHDR,*PCTCIHDR;
|
|
typedef struct _CTCISEG CTCISEG,*PCTCISEG;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// CTCBLK - (host byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _CTCBLK
|
|
{
|
|
int fd; // TUN/TAP fd
|
|
TID tid; // Read Thread ID
|
|
pid_t pid; // Read Thread pid
|
|
|
|
DEVBLK* pDEVBLK[2]; // 0 - Read subchannel
|
|
// 1 - Write subchannel
|
|
|
|
#define CTC_READ_SUBCHANN 0 // 0 - Read subchannel
|
|
#define CTC_WRITE_SUBCHANN 1 // 1 - Write cubchannel
|
|
|
|
U16 iMaxFrameBufferSize; // Device Buffer Size
|
|
BYTE bFrameBuffer[CTC_DEF_FRAME_BUFFER_SIZE]; // (this really SHOULD be dynamically allocated!)
|
|
U16 iFrameOffset; // Curr Offset into Buffer
|
|
U16 sMTU; // Max MTU
|
|
|
|
LOCK Lock; // Data LOCK
|
|
LOCK EventLock; // Condition LOCK
|
|
COND Event; // Condition signal
|
|
|
|
u_int fDebug:1; // Debugging
|
|
u_int fOldFormat:1; // Old Config Format
|
|
u_int fCreated:1; // Interface Created
|
|
u_int fStarted:1; // Startup Received
|
|
u_int fDataPending:1; // Data is pending for read device
|
|
u_int fCloseInProgress:1; // Close in progress
|
|
u_int fPreconfigured:1; // TUN device pre-configured
|
|
u_int fReadWaiting:1; // CTCI_Read waiting
|
|
u_int fHaltOrClear:1; // HSCH or CSCH issued
|
|
|
|
int iKernBuff; // Kernel buffer in K bytes.
|
|
int iIOBuff; // I/O buffer in K bytes.
|
|
char szGuestIPAddr[32]; // IP Address (Guest OS)
|
|
char szDriveIPAddr[32]; // IP Address (Driver)
|
|
char szNetMask[32]; // Netmask for P2P link
|
|
char szMTU[32];
|
|
char szTUNCharDevName[256]; // TUN/TAP special char device filename (/dev/net/tun)
|
|
char szTUNIfName[IFNAMSIZ]; // Network Interface Name (e.g. tun0)
|
|
char szMACAddress[32]; // MAC Address
|
|
};
|
|
|
|
|
|
|
|
/**********************************************************************\
|
|
**********************************************************************
|
|
** **
|
|
** CTCI DEVICE FRAMES **
|
|
** **
|
|
**********************************************************************
|
|
\**********************************************************************/
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// CTCI Block Header (host byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _CTCIHDR // CTCI Block Header
|
|
{
|
|
HWORD hwOffset; // Offset of next block
|
|
BYTE bData[FLEXIBLE_ARRAY]; // start of data (CTCISEG)
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// CTCI Segment Header (host byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _CTCISEG // CTCI Segment Header
|
|
{
|
|
HWORD hwLength; // Segment length including
|
|
// this header
|
|
HWORD hwType; // Ethernet packet type
|
|
HWORD _reserved; // Unused, set to zeroes
|
|
BYTE bData[FLEXIBLE_ARRAY]; // Start of data (IP pakcet)
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
|
|
/**********************************************************************\
|
|
**********************************************************************
|
|
** **
|
|
** LCS DEVICE CONTROL BLOCKS **
|
|
** **
|
|
**********************************************************************
|
|
\**********************************************************************/
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS SNA Outbound Control (network byte order)
|
|
// Goes from the guest (i.e. VTAM) to the XCA (i.e. LCS)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSOCTL // LCS SNA Outbound Control
|
|
{
|
|
U16 XCNOBUFC;
|
|
BYTE XCNOSTAT;
|
|
#define XCNOXIDF 0x80
|
|
#define XCNOERRF 0x40
|
|
#define XCNORSVD 0x20
|
|
#define XCNOSEGF 0x08
|
|
#define XCNOSGST 0x0C
|
|
#define XCNOSEGL 0x04
|
|
#define XCNOSLOW 0x02
|
|
#define XCNOMAXW 0x01
|
|
BYTE XCNOFMT;
|
|
union _onp
|
|
{
|
|
U16 XCNONUMS;
|
|
U16 XCNOPGCT;
|
|
} np;
|
|
union _onh
|
|
{
|
|
U16 XCNONUMR;
|
|
U16 XCNOHDSZ;
|
|
} nh;
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS SNA Inbound Control (network byte order)
|
|
// Goes from the XCA (i.e. LCS) to the guest (i.e. VTAM)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSICTL // LCS SNA Inbound Control
|
|
{
|
|
U16 XCNIBUFC;
|
|
BYTE XCNISTAT;
|
|
#define XCNIXIDF 0x80
|
|
#define XCNIERRF 0x40
|
|
#define XCNIRSVD 0x08
|
|
#define XCNISLOW 0x02
|
|
#define XCNIMAXW 0x01
|
|
BYTE XCNIFMT;
|
|
union _inp
|
|
{
|
|
U16 XCNINUMS;
|
|
U16 XCNIPGCT;
|
|
} np;
|
|
U16 XCNINUMR;
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// The first 8-bytes of the reply are copied to XCNCB + 2F8
|
|
// SNA Data Areas Volume 1, Cross-Channel Node Control Block (XCNCB)
|
|
//
|
|
// The 8-byte control area that follows is an external
|
|
// interface to other devices connected to VTAM via a channel.
|
|
// Bits should not randomly be added to this structure. Also,
|
|
// bits added to the input structure (XCNICTL) should be
|
|
// duplicated in the output structure (XCNOCTL).
|
|
// ====================================================================================
|
|
// 760 (2F8) CHARACTER 8 XCNICTL INPUT CONTROL AREA
|
|
// 760 (2F8) UNSIGNED 2 XCNIBUFC Number of buffers received in
|
|
// last WRITE operation (unpacked
|
|
// format) or number of data
|
|
// bytes received in last WRITE
|
|
// operation (packed format)
|
|
// 762 (2FA) BITSTRING 2 XCNISTAT INPUT STATUS AREA - IF 0,
|
|
// NORMAL DATA TRANSFER HAS
|
|
// OCCURRED
|
|
// 1... .... XCNIXIDF + XID TRANSFER (IF XCNIERRF IS <<< ISTTSCXE tests
|
|
// ALSO ON, DISCONTACTING)
|
|
// .1.. .... XCNIERRF + ERROR RETRY OF LAST <<< "
|
|
// TRANSMISSION
|
|
// ..11 .... * NOT USED- AVAILABLE
|
|
// .... 1... * RESERVED <<< "
|
|
// .... .1.. * NOT USED - AVAILABLE
|
|
// .... ..1. XCNISLOW + SLOWDOWN - OUTPUT DATA HAS <<< "
|
|
// NOT BEEN RECEIVED
|
|
// .... ...1 XCNIMAXW + THE NEXT TRANSMISSION <<< "
|
|
// REQUIRES THE MAXIMUM NUMBER OF
|
|
// BUFFERS AVAILABLE IN THIS SIDE
|
|
// OF THE ADAPTER
|
|
// 763 (2FB) UNSIGNED 1 XCNIFMT + CONTROL FORMAT (VALID ONLY
|
|
// DURING XID EXCHANGE)
|
|
// 764 (2FC) SIGNED 2 XCNINUMS INCREMENTAL COUNT OF NUMBER OF
|
|
// BUFFERS SENT (USED FOR DATA
|
|
// LINK CONTROL INTEGRITY)
|
|
// 764 (2FC) SIGNED 2 XCNIPGCT DURING XID EXCHANGE, THIS
|
|
// FIELD WILL REPRESENT THE
|
|
// NUMBER OF PAGES TO BE
|
|
// ALLOCATED FOR THE CTC BUFFER.
|
|
// AFTER XID IS COMPLETE, IT WILL
|
|
// BE CLEARED FOR BEGINNING DATA
|
|
// TRANSFER
|
|
// 766 (2FE) SIGNED 2 XCNINUMR INCREMENTAL COUNT OF NUMBER OF
|
|
// BUFFERS RECEIVED (USED FOR
|
|
// DATA LINK CONTROL INTEGRITY)
|
|
//
|
|
//
|
|
// The 8-byte control area that follows is an external
|
|
// interface to other devices connected to VTAM via a channel.
|
|
// See XCNICTL for additional information.
|
|
// ====================================================================================
|
|
// 768 (300) CHARACTER 8 XCNOCTL OUTPUT CONTROL AREA
|
|
// 768 (300) UNSIGNED 2 XCNOBUFC Number of buffers transmitted
|
|
// in last WRITE operation when
|
|
// unpacked format is used (the
|
|
// number of READ buffers which
|
|
// will be used by the other side
|
|
// of the adapter), or number of
|
|
// data bytes transmitted in last
|
|
// WRITE operation when packed
|
|
// format is used
|
|
// 770 (302) BITSTRING 2 XCNOSTAT OUTPUT STATUS AREA - IF 0,
|
|
// NORMAL DATA TRANSFER WILL
|
|
// OCCUR
|
|
// 1... .... XCNOXIDF + XID TRANSFER (IF XCNOERRF IS
|
|
// ALSO ON, DISCONTACTING)
|
|
// .1.. .... XCNOERRF + ERROR RETRY OF LAST
|
|
// TRANSMISSION
|
|
// ..1. .... * RESERVED
|
|
// ...1 .... * NOT USED - AVAILABLE
|
|
// .... 11.. XCNOSGST OUTPUT SEGMENTATION STATE
|
|
// .... 1... XCNOSEGF FIRST SEGMENT
|
|
// .... .1.. XCNOSEGL LAST SEGMENT
|
|
// .... ..1. XCNOSLOW + SLOWDOWN - INPUT DATA HAS
|
|
// NOT BEEN RECEIVED
|
|
// .... ...1 XCNOMAXW + THE NEXT TRANSMISSION
|
|
// REQUIRES THE MAXIMUM NUMBER OF
|
|
// BUFFERS AVAILABLE IN THE OTHER
|
|
// SIDE OF THE ADAPTER
|
|
// 771 (303) UNSIGNED 1 XCNOFMT + CONTROL FORMAT (VALID ONLY
|
|
// DURING XID EXCHANGE)
|
|
// 772 (304) SIGNED 2 XCNONUMS INCREMENTAL COUNT OF NUMBER OF
|
|
// BUFFERS SENT (USED FOR DATA
|
|
// LINK CONTROL INTEGRITY)
|
|
// 772 (304) SIGNED 2 XCNOPGCT DURING XID EXCHANGE, THIS
|
|
// FIELD WILL REPRESENT THE
|
|
// NUMBER OF PAGES TO BE
|
|
// ALLOCATED FOR THE CTC BUFFER.
|
|
// AFTER XID IS COMPLETE, IT WILL
|
|
// BE CLEARED FOR BEGINNING DATA
|
|
// TRANSFER
|
|
// 774 (306) SIGNED 2 XCNONUMR INCREMENTAL COUNT OF NUMBER OF
|
|
// BUFFERS RECEIVED (USED FOR
|
|
// DATA LINK CONTROL INTEGRITY)
|
|
// 774 (306) SIGNED 2 XCNOHDSZ DURING XID EXCHANGE, THIS
|
|
// FIELD WILL REPRESENT THE SIZE
|
|
// OF THE SMS HEADER IN USE BY
|
|
// THIS HOST. AFTER XID IS
|
|
// COMPLETE, IT WILL BE CLEARED
|
|
// FOR DATA TRANSFER
|
|
//
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// - baffle 1 and baffle 2 are always seen together.
|
|
// - baffle 1 seems to have a minimum length of 12 bytes, but is often
|
|
// longer, with a maximum seen length of 34 bytes. Seen length has
|
|
// always been a even number.
|
|
// - baffle 2 seems to have a minimum length of 3 bytes, but is often
|
|
// longer, with a maximum seen length of 44 bytes.
|
|
// - The seen total length of baffle 1 and baffle 2 has always been an
|
|
// even number, a multiple of 2.
|
|
// --------------------------------------------------------------------
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS SNA baffle 1 (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSBAF1 // LCS SNA baffle 1
|
|
{
|
|
HWORD hwLenBaf1; // 0 Length of baffle 1
|
|
HWORD hwTypeBaf; // 2 Type of baffle
|
|
HWORD hwLenBaf2; // 4 Length of baffle 2
|
|
BYTE bByte06; // 6 bit value
|
|
BYTE bByte07; // 7 byte value
|
|
BYTE bTokenA[4]; // 8
|
|
BYTE bTokenB[4]; // C
|
|
BYTE bByte16; // 10
|
|
BYTE bByte17; // 11
|
|
BYTE bByte18[2]; // 12
|
|
BYTE bByte20[4]; // 14
|
|
BYTE bTokenC[4]; // 18
|
|
BYTE bByte28[4]; // 1C
|
|
BYTE bByte32[2]; // 20
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS SNA baffle 2 (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSBAF2 // LCS SNA baffle 2
|
|
{
|
|
BYTE bByte00; // 0 Always seems to contain 0x01.
|
|
HWORD hwSeqNum; // 1 Sequence number
|
|
BYTE bByte03[2]; // 3
|
|
BYTE bByte05; // 5
|
|
BYTE bByte06; // 6
|
|
BYTE bByte07; // 7
|
|
BYTE bByte08; // 8
|
|
BYTE bByte09; // 9
|
|
BYTE bByte10; // A
|
|
BYTE bByte11; // B
|
|
BYTE bByte12[5]; // C
|
|
BYTE bByte17; // 11
|
|
BYTE bByte18[5]; // 12
|
|
BYTE bByte23; // 17
|
|
BYTE bByte24; // 18
|
|
BYTE bByte25; // 19
|
|
BYTE bByte26; // 1A
|
|
BYTE bByte27; // 1B
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS SNA Inbound Buffer Header
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSIBH // LCS SNA Inbound Buffer Header
|
|
{
|
|
PLCSIBH pNextLCSIBH; // Pointer to next LCSIBH
|
|
int iAreaLen; // Data area length
|
|
int iDataLen; // Data length
|
|
BYTE bData[FLEXIBLE_ARRAY]; //
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS SNA Connection
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSCONN // LCS SNA Connection
|
|
{
|
|
PLCSCONN pNextLCSCONN; // Pointer to next LCSCONN
|
|
BYTE bInToken[4]; // Inbound Token. VTAM tells LCS that
|
|
// it will use this token for inbound.
|
|
BYTE bOutToken[4]; // Outbound Token. LCS tells VTAM that
|
|
// it will use this token for outbound.
|
|
MAC bLocalMAC; // Local MAC address
|
|
MAC bRemoteMAC; // Remote MAC address
|
|
U16 hwCreated; //
|
|
#define LCSCONN_CREATED_INBOUND 1
|
|
#define LCSCONN_CREATED_OUTBOUND 2
|
|
U16 hwNotUsed; //
|
|
U16 hwXIDSeqNum; // XID Exchange Sequence number
|
|
U16 hwDataSeqNum; // Data Sequence number
|
|
U16 hwLocalNS; // Local NS
|
|
U16 hwLocalNR; // Local NR
|
|
U16 hwRemoteNS; // Remote NS
|
|
U16 hwRemoteNR; // Remote NR
|
|
u_int fIframe:1; // I-frame received
|
|
|
|
};
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Device (host byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSDEV
|
|
{
|
|
PLCSDEV pNext; // -> Next device LSCDEV
|
|
|
|
PLCSBLK pLCSBLK; // -> LCSBLK
|
|
DEVBLK* pDEVBLK[2]; // 0 - Read subchannel
|
|
// 1 - Write cubchannel
|
|
|
|
#define LCS_READ_SUBCHANN 0 // 0 - Read subchannel
|
|
#define LCS_WRITE_SUBCHANN 1 // 1 - Write cubchannel
|
|
|
|
U16 sAddr; // Device Base Address
|
|
BYTE bMode; // (see below #defines)
|
|
BYTE bPort; // Relative Adapter No.
|
|
BYTE bType; // (see below #defines)
|
|
char* pszIPAddress; // IP Address (string)
|
|
|
|
U32 lIPAddress; // IP Address (binary)
|
|
// (network byte order)
|
|
|
|
LOCK DevEventLock; // Condition LOCK
|
|
COND DevEvent; // Condition signal
|
|
|
|
u_int fDevCreated:1; // DEVBLK(s) Created
|
|
u_int fDevStarted:1; // Device Started
|
|
u_int fRouteAdded:1; // Routing Added
|
|
u_int fReplyPending:1; // Cmd Reply is Pending
|
|
u_int fDataPending:1; // Data is Pending
|
|
u_int fReadWaiting:1; // LCS_Read waiting
|
|
u_int fHaltOrClear:1; // HSCH or CSCH issued
|
|
|
|
U16 hwOctlSize; // SNA
|
|
LCSOCTL Octl; // SNA Outbound Control
|
|
// (network byte order)
|
|
U16 hwIctlSize; // SNA
|
|
LCSICTL Ictl; // SNA Inbound Control
|
|
// (network byte order)
|
|
|
|
U16 hwTypeBaf; // SNA LCSBAF1 type
|
|
U16 hwSeqNumBaf; // SNA LCSBAF2 sequence number
|
|
u_int fChanProgActive:1; // SNA Channel Program Active
|
|
u_int fAttnRequired:1; // SNA Attention Required
|
|
u_int fPendingIctl:1; // SNA Pending has LCSICTL structure
|
|
u_int fReceiveFrames:1; // SNA Receive Frames from Network
|
|
u_int fTuntapError:1; // SNA TUNTAP_Write error
|
|
int iTuntapErrno; // SNA TUNTAP_Write error number
|
|
BYTE bFlipFlop; // SNA
|
|
|
|
U16 hwInXIDSeqNum; // SNA XID Exchange Sequence number
|
|
U16 hwInDataSeqNum; // SNA Data Sequence number
|
|
|
|
LOCK LCSIBHChainLock; // SNA LCSIBH Chain LOCK
|
|
PLCSIBH pFirstLCSIBH; // SNA First LCSIBH in chain
|
|
PLCSIBH pLastLCSIBH; // SNA Last LCSIBH in chain
|
|
|
|
LOCK LCSCONNChainLock; // SNA LCSCONN Chain LOCK
|
|
PLCSCONN pFirstLCSCONN; // SNA First LCSCONN in chain
|
|
|
|
LOCK InOutLock; // SNA Inbound Outbound LOCK
|
|
|
|
LOCK DevDataLock; // Data LOCK. This lock is used to
|
|
// serialize data being added to or
|
|
// removed from bFrameBuffer.
|
|
|
|
U16 iFrameOffset; // Curr Offset into Buffer
|
|
U16 iMaxFrameBufferSize; // Device Buffer Size
|
|
BYTE bFrameBuffer[CTC_DEF_FRAME_BUFFER_SIZE]; // (this really SHOULD be dynamically allocated!)
|
|
};
|
|
|
|
|
|
#define LCSDEV_MODE_IP 0x01
|
|
#define LCSDEV_MODE_SNA 0x02
|
|
|
|
|
|
#define LCSDEV_TYPE_NONE 0x00
|
|
#define LCSDEV_TYPE_PRIMARY 0x01
|
|
#define LCSDEV_TYPE_SECONDARY 0x02
|
|
|
|
|
|
#define WCTL 0x17 // Write Control
|
|
#define SCB 0x14 // Sense Command Byte
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Port (or Relative Adapter) (host byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSPORT
|
|
{
|
|
BYTE bPort; // Relative Adapter No
|
|
BYTE nMCastCount; // Active MACTAB entries
|
|
MAC MAC_Address; // MAC Address of Adapter
|
|
PLCSRTE pRoutes; // -> Routes chain
|
|
PLCSBLK pLCSBLK; // -> LCSBLK
|
|
MACTAB MCastTab[ MACTABMAX ]; // Multicast table
|
|
|
|
U16 sIPAssistsSupported; // (See #defines below)
|
|
U16 sIPAssistsEnabled; // (See #defines below)
|
|
|
|
LOCK PortDataLock; // Data LOCK
|
|
LOCK PortEventLock; // Condition LOCK
|
|
COND PortEvent; // Condition signal
|
|
|
|
u_int fUsed:1; // Port is used
|
|
u_int fLocalMAC:1; // MAC is specified in OAT
|
|
u_int fPortCreated:1; // Interface Created
|
|
u_int fPortStarted:1; // Startup Received
|
|
u_int fRouteAdded:1; // Routing Added
|
|
u_int fCloseInProgress:1; // Close in progress
|
|
u_int fPreconfigured:1; // TAP device pre-configured
|
|
u_int fDoCkSumOffload:1; // Do manual CSUM Offload
|
|
u_int fDoMCastAssist:1; // Do manual MCAST Assist
|
|
|
|
int fd; // TUN/TAP fd
|
|
TID tid; // Read Thread ID
|
|
pid_t pid; // Read Thread pid
|
|
int icDevices; // Device count
|
|
char szNetIfName[IFNAMSIZ]; // Network Interface Name (e.g. tap0)
|
|
char szMACAddress[32]; // MAC Address
|
|
char szGWAddress[32]; // Gateway for W32
|
|
};
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Assists flags
|
|
// --------------------------------------------------------------------
|
|
|
|
#define LCS_ARP_PROCESSING 0x0001
|
|
#define LCS_INBOUND_CHECKSUM_SUPPORT 0x0002
|
|
#define LCS_OUTBOUND_CHECKSUM_SUPPORT 0x0004
|
|
#define LCS_IP_FRAG_REASSEMBLY 0x0008
|
|
#define LCS_IP_FILTERING 0x0010
|
|
#define LCS_IP_V6_SUPPORT 0x0020
|
|
#define LCS_MULTICAST_SUPPORT 0x0040
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCSRTE - Routing Entries (host byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSRTE
|
|
{
|
|
char* pszNetAddr;
|
|
char* pszNetMask;
|
|
PLCSRTE pNext;
|
|
};
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Attention Required (host byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSATTN // LCS Attention Required
|
|
{
|
|
PLCSATTN pNext; // -> Next in chain
|
|
PLCSDEV pDevice; // -> Device
|
|
};
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCSBLK - Common Storage for LCS Emulation (host byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSBLK
|
|
{
|
|
char* pszTUNDevice; // TUN/TAP char device
|
|
char* pszOATFilename; // OAT Filename
|
|
char* pszIPAddress; // IP Address
|
|
|
|
u_int fDebug:1;
|
|
u_int fCloseInProgress:1; // Close in progress
|
|
#if defined( OPTION_W32_CTCI )
|
|
u_int fNoMultiWrite:1; // CTCI-WIN v3.3+ WinPCap v4.1+
|
|
#endif
|
|
int icDevices; // Number of devices
|
|
int iKernBuff; // Kernel buffer in K bytes.
|
|
int iIOBuff; // I/O buffer in K bytes.
|
|
int iTraceLen; // Maximum data to be traced in bytes.
|
|
#define LCS_TRACE_LEN_ZERO 0
|
|
#define LCS_TRACE_LEN_MINIMUM 64
|
|
#define LCS_TRACE_LEN_DEFAULT 128
|
|
#define LCS_TRACE_LEN_MAXIMUM 65535
|
|
int iDiscTrace; // Maximum discard to be traced in bytes.
|
|
#define LCS_DISC_TRACE_ZERO 0
|
|
#define LCS_DISC_TRACE_MINIMUM 16
|
|
#define LCS_DISC_TRACE_MAXIMUM 65535
|
|
|
|
LOCK AttnLock; // Attention LOCK
|
|
PLCSATTN pAttns; // -> Attention chain
|
|
|
|
LOCK AttnEventLock; // Attention event LOCK
|
|
COND AttnEvent; // Attention event signal
|
|
|
|
TID AttnTid; // Attention Thread ID
|
|
pid_t AttnPid; // Attention Thread pid
|
|
|
|
PLCSDEV pDevices; // -> Device chain
|
|
LCSPORT Port[LCS_MAX_PORTS]; // Port Blocks
|
|
};
|
|
|
|
|
|
/**********************************************************************\
|
|
**********************************************************************
|
|
** **
|
|
** LCS DEVICE FRAMES **
|
|
** **
|
|
**********************************************************************
|
|
\**********************************************************************/
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Frame Header (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSHDR // *ALL* LCS Frames start with the following header
|
|
{
|
|
HWORD hwOffset; // +0 Offset to next frame or 0
|
|
BYTE bType; // +2 (see below #defines)
|
|
BYTE bSlot; // +3 (i.e. port)
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
#define LCS_FRMTYP_CMD 0x00 // LCS command mode
|
|
#define LCS_FRMTYP_ENET 0x01 // Ethernet Passthru
|
|
#define LCS_FRMTYP_TR 0x02 // Token Ring
|
|
#define LCS_FRMTYP_FDDI 0x07 // FDDI
|
|
#define LCS_FRMTYP_AUTO 0xFF // auto-detect
|
|
|
|
#define LCS_FRMTYP_SNA 0x04 // SNA ?
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Command Frame Header (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSCMDHDR // All LCS *COMMAND* Frames start with this header
|
|
{
|
|
LCSHDR bLCSHdr; // +0 LCS Frame header
|
|
|
|
BYTE bCmdCode; // +4 (see below #defines)
|
|
BYTE bInitiator; // +5 (see below #defines)
|
|
HWORD hwSequenceNo; // +6
|
|
HWORD hwReturnCode; // +8
|
|
|
|
BYTE bLanType; // +A usually LCS_FRMTYP_ENET
|
|
BYTE bRelAdapterNo; // +B (i.e. port)
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
#define LCS_CMD_TIMING 0x00 // Timing request
|
|
#define LCS_CMD_STRTLAN 0x01 // Start LAN
|
|
#define LCS_CMD_STOPLAN 0x02 // Stop LAN
|
|
#define LCS_CMD_GENSTAT 0x03 // Generate Stats
|
|
#define LCS_CMD_LANSTAT 0x04 // LAN Stats
|
|
#define LCS_CMD_LISTLAN 0x06 // List LAN
|
|
#define LCS_CMD_STARTUP 0x07 // Start Host
|
|
#define LCS_CMD_SHUTDOWN 0x08 // Shutdown Host
|
|
#define LCS_CMD_LISTLAN2 0x0B // List LAN (another version)
|
|
#define LCS_CMD_QIPASSIST 0xB2 // Query IP Assists
|
|
#define LCS_CMD_SETIPM 0xB4 // Set IP Multicast
|
|
#define LCS_CMD_DELIPM 0xB5 // Delete IP Multicast
|
|
|
|
#define LCS_CMD_STRTLAN_SNA 0x41 // Start LAN SNA
|
|
#define LCS_CMD_STOPLAN_SNA 0x42 // Stop LAN SNA
|
|
#define LCS_CMD_LANSTAT_SNA 0x44 // LAN Stats SNA
|
|
|
|
#define LCS_INITIATOR_TCPIP 0x00 // TCP/IP
|
|
#define LCS_INITIATOR_LGW 0x01 // LAN Gateway
|
|
|
|
#define LCS_INITIATOR_SNA 0x80 // SNA
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Standard Command Frame (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSSTDFRM
|
|
{
|
|
LCSCMDHDR bLCSCmdHdr; // LCS Command Frame header
|
|
|
|
HWORD hwParameterCount; // +C
|
|
BYTE bOperatorFlags[3]; // +E
|
|
BYTE _reserved[3]; // +11
|
|
BYTE bData[FLEXIBLE_ARRAY]; // +14
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Startup & Start LAN Command Frames (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSSTRTFRM
|
|
{
|
|
LCSCMDHDR bLCSCmdHdr; // +0 LCS Command Frame header
|
|
|
|
HWORD hwBufferSize; // +C For IP this is a buffer
|
|
// size that comes from the
|
|
// stack. For SNA it is
|
|
// something unknown that
|
|
// goes to VTAM (which checks
|
|
// for >= 0x0200, or == 0x02FF).
|
|
BYTE _unused[6]; // +E
|
|
FWORD fwReadLength; // +14 Length for Read CCW (0x0800 to 0xFFFF).
|
|
} ATTRIBUTE_PACKED; // +18
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Query IP Assists Command Frame (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSQIPFRM
|
|
{
|
|
LCSCMDHDR bLCSCmdHdr; // LCS Command Frame header
|
|
|
|
HWORD hwNumIPPairs;
|
|
HWORD hwIPAssistsSupported; // (See "LCS Assists" above)
|
|
HWORD hwIPAssistsEnabled; // (See "LCS Assists" above)
|
|
HWORD hwIPVersion;
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS LAN Statistics Command Frames (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSLSTFRM // LAN Statistics for IP
|
|
{
|
|
LCSCMDHDR bLCSCmdHdr; // +0 LCS Command Frame header
|
|
|
|
BYTE _unused1[10]; // +C
|
|
MAC MAC_Address; // +16 MAC Address of Adapter
|
|
FWORD fwPacketsDeblocked; // +1C
|
|
FWORD fwPacketsBlocked; // +20
|
|
FWORD fwTX_Packets; // +24
|
|
FWORD fwTX_Errors; // +28
|
|
FWORD fwTX_PacketsDiscarded; // +2C
|
|
FWORD fwRX_Packets; // +30
|
|
FWORD fwRX_Errors; // +34
|
|
FWORD fwRX_DiscardedNoBuffs; // +38
|
|
U32 fwRX_DiscardedTooLarge; // +3C
|
|
} ATTRIBUTE_PACKED; // +40
|
|
|
|
struct _LCSLSSFRM // LAN Statistics for SNA
|
|
{
|
|
LCSCMDHDR bLCSCmdHdr; // +0 LCS Command Frame header
|
|
|
|
BYTE bUnknown1; // +C The bytes from +D to +19 are
|
|
// probably a structure, and
|
|
// this byte contains a count
|
|
// of the structures.
|
|
BYTE bUnknown2; // +D Adaptor type? 0x04 = Ethernet 0x02 = Token Ring
|
|
BYTE bUnknown3; // +E Adaptor number? i.e. port
|
|
BYTE bUnknown4; // +F
|
|
BYTE _unused1[2]; // +10
|
|
BYTE bMACsize; // +12 Length of MAC Address.
|
|
MAC MAC_Address; // +13 MAC Address.
|
|
BYTE _unused2[1]; // +19
|
|
} ATTRIBUTE_PACKED; // +1A
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Set IP Multicast Command Frame (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSIPMPAIR
|
|
{
|
|
U32 IP_Addr;
|
|
MAC MAC_Address; // MAC Address of Adapter
|
|
BYTE _reserved[2];
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
#define MAX_IP_MAC_PAIRS 32
|
|
|
|
struct _LCSIPMFRM
|
|
{
|
|
LCSCMDHDR bLCSCmdHdr; // LCS Command Frame header
|
|
|
|
HWORD hwNumIPPairs;
|
|
U16 hwIPAssistsSupported;
|
|
U16 hwIPAssistsEnabled;
|
|
U16 hwIPVersion;
|
|
LCSIPMPAIR IP_MAC_Pair[MAX_IP_MAC_PAIRS];
|
|
U32 fwResponseData;
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// LCS Ethernet Passthru Frame (network byte order)
|
|
// --------------------------------------------------------------------
|
|
|
|
struct _LCSETHFRM
|
|
{
|
|
LCSHDR bLCSHdr; // LCS Frame header
|
|
BYTE bData[FLEXIBLE_ARRAY]; // Ethernet Frame
|
|
} ATTRIBUTE_PACKED;
|
|
|
|
|
|
|
|
/**********************************************************************\
|
|
**********************************************************************
|
|
** **
|
|
** Non-device specific structures **
|
|
** **
|
|
**********************************************************************
|
|
\**********************************************************************/
|
|
|
|
//
|
|
// The LLC layer provides connectionless and conection-oriented data
|
|
// transfer.
|
|
//
|
|
// Connectionless data transfer is commonly referred to as LLC type 1,
|
|
// or LLC1. Connectionless service does not require you to establish
|
|
// data links or link stations. After a Service Access Point (SAP) has
|
|
// been enabled, the SAP can send and receive information to and from
|
|
// a remote SAP that also uses connectionless service. Connectionless
|
|
// service does not have any mode setting commands (such as SABME) and
|
|
// does not require that state information is maintained.
|
|
//
|
|
// Connection-oriented data transfer is referred to as LLC type 2, or
|
|
// LLC2. Connection-oriented service requires the establishment of
|
|
// link stations. When the link station is established, a mode setting
|
|
// command is necessary. Thereafter, each link station is responsible
|
|
// to maintain link state information.
|
|
//
|
|
// LLC2 is implemented whenever Systems Network Architecture (SNA)
|
|
// runs over a LAN or virtual LAN.
|
|
//
|
|
// Problems are rare in LLC1. In LLC2, two categories of problems can
|
|
// occur:
|
|
// 1. Sessions that do not establish
|
|
// 2. Established sessions that intermittently fail
|
|
//
|
|
// An LLC frame is called an LLC Protocol Data Unit (LPDU), and is
|
|
// formatted as follows:
|
|
// DSAP (1 byte)
|
|
// SSAP (1 byte)
|
|
// Control Field (1 or 2 bytes)
|
|
// Information Field (0 or more bytes)
|
|
//
|
|
// The LPDU includes two eight-bit address fields, called service
|
|
// access points (SAP), or collectively LSAP in the OSI terminology.
|
|
// Although the LSAP fields are 8 bits long, the low-order bit is
|
|
// reserved for special purposes, leaving only 128 values available
|
|
// for most purposes.
|
|
//
|
|
// DSAP (Destination SAP) is an 8-bit long field that represents the
|
|
// logical addresses of the network layer entity intended to receive
|
|
// the message. The low-order bit of the DSAP indicates whether it
|
|
// contains an individual or a group address:
|
|
// - if the low-order bit is 0, the remaining 7 bits of the DSAP
|
|
// specify an individual address, which refers to a single local
|
|
// service access point (LSAP) to which the packet should be
|
|
// delivered.
|
|
// - if the low-order bit is 1, the remaining 7 bits of the DSAP
|
|
// specify a group address, which refers to a group of LSAPs to
|
|
// which the packet should be delivered.
|
|
//
|
|
// SSAP (Source SAP) is an 8-bit long field that represents the
|
|
// logical address of the network layer entity that has created the
|
|
// message. The low-order bit of the SSAP indicates whether the packet
|
|
// is a command or response packet:
|
|
// - if it's 0, the packet is a command packet, and
|
|
// - if it's 1, the packet is a response packet.
|
|
// The remaining 7 bits of the SSAP specify the LSAP (always an
|
|
// individual address) from which the packet was transmitted.
|
|
//
|
|
// LSAP numbers are globally assigned by the IEEE to uniquely identify
|
|
// well established international standards.
|
|
//
|
|
|
|
struct _LPDU;
|
|
struct _LLC;
|
|
|
|
typedef struct _LPDU LPDU, *PLPDU;
|
|
typedef struct _LLC LLC, *PLLC;
|
|
|
|
struct _LPDU
|
|
{
|
|
BYTE bDSAP[1];
|
|
BYTE bSSAP[1];
|
|
BYTE bControl[2];
|
|
};
|
|
|
|
struct _LLC
|
|
{
|
|
LPDU bLpdu; // LLC PDU DSAP, SSAP & Control
|
|
BYTE bInfo[6]; // LLC PDU Information
|
|
U16 hwLpduSize; // Size = 3 or 4
|
|
U16 hwInfoSize; // Size = 0 or 5.
|
|
U16 hwDSAP; // DSAP (Destination Service Access Point)
|
|
U16 hwIG; // Individual or Group bit
|
|
U16 hwSSAP; // SSAP (Source Service Access Point)
|
|
U16 hwCR; // Command or Response bit
|
|
U16 hwNS; // NS count
|
|
U16 hwNR; // NR count
|
|
U16 hwPF; // Poll or Final bit
|
|
U16 hwSS; // S bits, i.e. type of Supervisory
|
|
U16 hwM; // M bits, i.e. type of Unnumbered
|
|
U16 hwV; // FRMR V bit
|
|
U16 hwZ; // FRMR Z bit
|
|
U16 hwY; // FRMR Y bit
|
|
U16 hwX; // FRMR X bit
|
|
U16 hwW; // FRMR W bit
|
|
U16 hwCF; // FRMR Control Field that caused reject
|
|
U16 hwType;
|
|
};
|
|
#define SS_Receiver_Ready 0 // B'00'
|
|
#define SS_Receiver_Not_Ready 1 // B'01'
|
|
#define SS_Reject 2 // B'10'
|
|
#define M_DM_Response 3 // B'00011' = DM Response (0x1F)
|
|
#define M_DISC_Command 8 // B'01000' = DISC Command (0x53)
|
|
#define M_UA_Response 12 // B'01100' = UA Response (0x73)
|
|
#define M_SABME_Command 15 // B'01111' = SABME Command (0x7F)
|
|
#define M_FRMR_Response 17 // B'10001' = FRMR Response (0x87)
|
|
#define M_XID_Command_or_Response 23 // B'10111' XID Command or Response
|
|
#define M_TEST_Command_or_Response 28 // B'11100' TEST Command or Response
|
|
|
|
#define LSAP_Null 0x00 //
|
|
#define LSAP_SNA_Path_Control 0x04 //
|
|
#define LSAP_SNAP 0xAA // Sub-Network Access Protocol
|
|
|
|
#define Type_Information_Frame 1 //
|
|
#define Type_Supervisory_Frame 2 //
|
|
#define Type_Unnumbered_Frame 3 //
|
|
|
|
|
|
|
|
/**********************************************************************\
|
|
**********************************************************************
|
|
** **
|
|
** SNA structures **
|
|
** **
|
|
**********************************************************************
|
|
\**********************************************************************/
|
|
|
|
struct _XID3;
|
|
union _CVhdr;
|
|
struct _NNcv;
|
|
struct _PSIDcv;
|
|
struct _TGDcv;
|
|
struct _CSVcv;
|
|
struct _HPRcv;
|
|
|
|
typedef struct _XID3 XID3, *PXID3;
|
|
typedef union _CVhdr CVhdr, *PCVhdr;
|
|
typedef struct _NNcv NNcv, *PNNcv;
|
|
typedef struct _PSIDcv PSIDcv, *PPSIDcv;
|
|
typedef struct _TGDcv TGDcv, *PTGDcv;
|
|
// typedef struct _CSVcv CSVcv, *PCSVcv;
|
|
typedef struct _HPRcv HPRcv, *PHPRcv;
|
|
|
|
struct _XID3 /* XID3 */
|
|
{ /* */
|
|
/* Note: The first 31-bytes */
|
|
/* of the XID3 are an XID3, */
|
|
/* defined in SNA Formats. */
|
|
/* */
|
|
/*000*/ BYTE Format : 4; /* Format of XID (4-bits), */
|
|
BYTE Sending : 4; /* Type XID-sending node (4-bits) */
|
|
/*001*/ BYTE Length; /* Length of the XID3 */
|
|
/*002*/ BYTE NodeID[4]; /* Node identification: */
|
|
/* Block number (12 bits), */
|
|
/* ID number (20-bits) */
|
|
/*006*/ BYTE Reserved1[2]; /* Reserved */
|
|
/*008*/ BYTE CharSend[2]; /* Characteristics of XID sender */
|
|
/*00A*/ BYTE Byte10; /* */
|
|
/*00B*/ BYTE Byte11; /* */
|
|
/*00C*/ BYTE Byte12; /* */
|
|
/*00D*/ BYTE Reserved2[2]; /* Reserved */
|
|
/*00F*/ BYTE Byte15; /* */
|
|
/*010*/ BYTE TG; /* Transmission Group Number */
|
|
/*011*/ BYTE DLC; /* DLC type */
|
|
/*012*/ BYTE DepSectionLength; /* Dependant Section Length */
|
|
/* (including this length field) */
|
|
/*013*/ BYTE DepSection[FLEXIBLE_ARRAY]; /* Dependant Section */
|
|
} ATTRIBUTE_PACKED; /* */
|
|
|
|
/* Control Vector header */
|
|
union _CVhdr /* */
|
|
{ /* */
|
|
/* KL: The Key field precedes the Length field and the length */
|
|
/* is the number of bytes, in binary, of the substructure's */
|
|
/* Data field (e.g., Vector Data field). The Length field */
|
|
/* value does not include the length of the substructure */
|
|
/* Vector Header field (consisting of the Length and Key */
|
|
/* fields). */
|
|
struct { /* */
|
|
/*000*/ BYTE Key; /* Vector key */
|
|
/*001*/ BYTE Length; /* Vector length */
|
|
} KL; /* */
|
|
/* LT: The Length field precedes the Key field (also called the */
|
|
/* "type" field hence "LT") and the length is the number of */
|
|
/* bytes, in binary, of the substructure including both the */
|
|
/* Vector Header field (consisting of the Length and Key */
|
|
/* fields) and the Data field. */
|
|
struct { /* */
|
|
/*000*/ BYTE Length; /* Vector length */
|
|
/*001*/ BYTE Key; /* Vector key */
|
|
} LT; /* */
|
|
} ATTRIBUTE_PACKED; /* */
|
|
|
|
/* Network Name Control Vector */
|
|
struct _NNcv /* NNcv */
|
|
{ /* */
|
|
/*000*/ CVhdr Header; /* Vector header */
|
|
/*002*/ BYTE Type; /* Name type */
|
|
/*003*/ BYTE Value[FLEXIBLE_ARRAY]; /* */
|
|
} ATTRIBUTE_PACKED; /* */
|
|
#define KEY_NNcv 0x0E /* NNcv key */
|
|
#define TYPE_PU_NAME 0xF1 /* PU Name */
|
|
#define TYPE_CP_NAME 0xF4 /* CP Name */
|
|
#define TYPE_LS_NAME 0xF7 /* Link Station Name */
|
|
|
|
/* Product Set ID Control Vector */
|
|
struct _PSIDcv /* PSIDcv */
|
|
{ /* */
|
|
/*000*/ CVhdr Header; /* Vector header */
|
|
/*002*/ BYTE Data[FLEXIBLE_ARRAY]; /* */
|
|
} ATTRIBUTE_PACKED; /* */
|
|
#define KEY_PSIDcv 0x10 /* PSIDcv key */
|
|
|
|
/* TG Description Control Vector */
|
|
struct _TGDcv /* TGDcv */
|
|
{ /* */
|
|
/*000*/ CVhdr Header; /* Vector header */
|
|
/*002*/ BYTE Data[FLEXIBLE_ARRAY]; /* */
|
|
} ATTRIBUTE_PACKED; /* */
|
|
#define KEY_TGDcv 0x46 /* TGDcv key */
|
|
|
|
// /* Call Security Verification Control Vector */
|
|
// struct _CSVcv /* CSVcv */
|
|
// { /* */
|
|
// /*000*/ CVhdr Header; /* Vector header */
|
|
// /*002*/ BYTE Reserved; /* Reserved */
|
|
// /*003*/ BYTE LenSIDs; /* Length of Security IDs */
|
|
// /* (including this length field) */
|
|
// /*004*/ BYTE SID1[8]; /* First 8-byte Security ID */
|
|
// /* (random data or */
|
|
// /* enciphered random data) */
|
|
// /*00C*/ BYTE SID2[8]; /* Second 8-byte Security ID */
|
|
// /* (random data or */
|
|
// /* enciphered random data or */
|
|
// /* space characters) */
|
|
// } ATTRIBUTE_PACKED; /* */
|
|
// #define KEY_CSVcv 0x56 /* CSVcv key */
|
|
|
|
/* HPR Capabilities Control Vector */
|
|
struct _HPRcv /* HPRcv */
|
|
{ /* */
|
|
/*000*/ CVhdr Header; /* Vector header */
|
|
/*002*/ BYTE Data[FLEXIBLE_ARRAY]; /* */
|
|
} ATTRIBUTE_PACKED; /* */
|
|
#define KEY_HPRcv 0x61 /* HPRcv key */
|
|
|
|
|
|
|
|
|
|
/**********************************************************************\
|
|
**********************************************************************
|
|
** **
|
|
** INLINE FUNCTIONS **
|
|
** **
|
|
**********************************************************************
|
|
\**********************************************************************/
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// Set SenseID Information
|
|
// --------------------------------------------------------------------
|
|
|
|
static inline void SetSIDInfo( DEVBLK* pDEVBLK,
|
|
U16 wCUType,
|
|
BYTE bCUMod,
|
|
U16 wDevType,
|
|
BYTE bDevMod )
|
|
{
|
|
BYTE* pSIDInfo = pDEVBLK->devid;
|
|
|
|
memset( pSIDInfo, 0, sizeof(pDEVBLK->devid) );
|
|
|
|
*pSIDInfo++ = 0x0FF;
|
|
*pSIDInfo++ = (BYTE)(( wCUType >> 8 ) & 0x00FF );
|
|
*pSIDInfo++ = (BYTE)( wCUType & 0x00FF );
|
|
*pSIDInfo++ = bCUMod;
|
|
*pSIDInfo++ = (BYTE)(( wDevType >> 8 ) & 0x00FF );
|
|
*pSIDInfo++ = (BYTE)( wDevType & 0x00FF );
|
|
*pSIDInfo++ = bDevMod;
|
|
*pSIDInfo++ = 0x00;
|
|
|
|
pDEVBLK->numdevid = 7;
|
|
}
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
// Set SenseID CIW Information
|
|
// --------------------------------------------------------------------
|
|
|
|
static inline void SetCIWInfo( DEVBLK* pDEVBLK,
|
|
U16 bOffset,
|
|
BYTE bCIWType,
|
|
BYTE bCIWOp,
|
|
U16 wCIWCount )
|
|
{
|
|
BYTE* pSIDInfo = pDEVBLK->devid;
|
|
|
|
pSIDInfo += 8;
|
|
pSIDInfo += ( bOffset * 4 );
|
|
|
|
*pSIDInfo++ = bCIWType | 0x40;
|
|
*pSIDInfo++ = bCIWOp;
|
|
*pSIDInfo++ = (BYTE)(( wCIWCount >> 8 ) & 0x00FF );
|
|
*pSIDInfo++ = (BYTE)( wCIWCount & 0x00FF );
|
|
|
|
pDEVBLK->numdevid += pDEVBLK->numdevid == 7 ? 5 : 4;
|
|
}
|
|
|
|
|
|
// --------------------------------------------------------------------
|
|
|
|
#if defined(_MSVC_)
|
|
#pragma pack(pop)
|
|
#endif
|
|
|
|
#endif // __CTCADPT_H_
|