windows-nt/Source/XPSP1/NT/net/inc/nic1394.h
2020-09-26 16:20:57 +08:00

723 lines
23 KiB
C

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
nic1394.h
Abstract:
This module defines the structures, macros, and manifests available
to IEE1394-aware network components.
Revision History:
09/14/1998 JosephJ Created.
--*/
#ifndef _NIC1394_H_
#define _NIC1394_H_
//
// Define USER_MODE in your user-mode app before including this file.
//
#if USER_MODE
typedef USHORT NODE_ADDRESS;
#endif // USER_MODE
///////////////////////////////////////////////////////////////////////////////////
// ADDRESS FAMILY VERSION INFORMATION
///////////////////////////////////////////////////////////////////////////////////
//
// The current major and minor version, respectively, of the NIC1394 address family.
//
#define NIC1394_AF_CURRENT_MAJOR_VERSION 5
#define NIC1394_AF_CURRENT_MINOR_VERSION 0
///////////////////////////////////////////////////////////////////////////////////
// MEDIA PARAMETERS //
///////////////////////////////////////////////////////////////////////////////////
//
// 1394 FIFO Address, consisting of the 64-bit UniqueID and the
// 48-bit address offset.
//
typedef struct _NIC1394_FIFO_ADDRESS
{
UINT64 UniqueID;
ULONG Off_Low;
USHORT Off_High;
} NIC1394_FIFO_ADDRESS, *PNIC1394_FIFO_ADDRESS;
// enum to identify which of the two modes of transmission on a 1394 is to be used
//
//
typedef enum _NIC1394_ADDRESS_TYPE
{
NIC1394AddressType_Channel, // Indicates this is a channel address
NIC1394AddressType_FIFO, // Indicates this is a FIFO address
NIC1394AddressType_MultiChannel, // Indicates this is multiple-channel address
NIC1394AddressType_Ethernet, // Indicates this is the ethernet emulation VC
} NIC1394_ADDRESS_TYPE, *PNIC1394_ADDRESS_TYPE;
//
// General form of a 1394 destination, which can specify either a 1394 channel or
// a FIFO address. This structure forms part of the 1394 media-specific
// parameters.
//
typedef struct _NIC1394_DESTINATION
{
union
{
UINT Channel; // IEEE1394 channel number.
NIC1394_FIFO_ADDRESS FifoAddress; // IEEE1394 NodeID and address offset.
ULARGE_INTEGER ChannnelMap; // Identifies multiple channels.
};
NIC1394_ADDRESS_TYPE AddressType; // Address- asynch or isoch
} NIC1394_DESTINATION, *PNIC1394_DESTINATION;
//
// Special channels values
//
#define NIC1394_ANY_CHANNEL ((UINT)-1) // miniport should pick channel.
#define NIC1394_BROADCAST_CHANNEL ((UINT)-2) // special broadcast channel.
//
// This is the value of the ParamType field in the CO_SPECIFIC_PARAMETERS structure
// when the Parameters[] field contains IEEE1394 media specific values in the
// structure NIC1394_MEDIA_PARAMETERS.
//
#define NIC1394_MEDIA_SPECIFIC 0x13940000
//
// NOTES:
// The CO_MEDIA_PARAMETERS.Flags field for FIFO vcs must specify either TRANSMIT_VC
// or RECEIVE_VC, not both. If RECEIVE_VC is specified for a FIFO vc, this vc is
// used to receive on a local FIFO. In this case, the Destination.RecvFIFO field
// must be set to all-0s when creating the vc. On activation of the vc,
// this field of the updated media parameters will contain the local nodes unique ID
// and the allocated FIFO address.
//
// Multi-channel VC MUST specify RECEIVE_VC and not TRANSMIT_VC.
// Only one multi-channel VC is supported per adapter.
//
//
// Ethernet VC MUST specify BOTH RECEIVE_VC and TRANSMIT_VC.
// Only one Ethernet VC is supported per adapter.
//
//
// Notes on the Ethernet VC.
// Packets sent and received on this VC are ethernet-style (802.3) packets.
// The nic indicates packets it gets on it's connectionless SEND handler up
// on this VC. The nic indicates packets SENT on this VC up on it's connectionless
// receive handler.
//
//
// 1394 Specific Media parameters - this is the Media specific structure for 1394
// that goes into MediaParameters->MediaSpecific.Parameters.
//
typedef struct _NIC1394_MEDIA_PARAMETERS
{
//
// Identifies destination type (channel or FIFO) and type-specific address.
//
NIC1394_DESTINATION Destination;
//
// Bitmap encoding characteristics of the vc. One or more NIC1394_VCFLAG_*
// values.
//
ULONG Flags;
//
// Maximum size, in bytes, of blocks to be sent on this vc. Must be set to 0
// if this is a recv-only VCs. The miniport will choose a block size that is a
// minimum of this value and the value dictated by the bus speed map.
// Special value (ULONG -1) indicates "maximum possible block size."
UINT MaxSendBlockSize;
//
// One of the SCODE_* constants defined in 1394.h. Indicates
// the maximum speed to be used for blocks sent on this vc. Must be set to 0
// if this is a recv-only VC. The miniport will choose a speed that is a minimum
// of this value and the value dicated by the bus speed map.
// Special value (ULONG -1) indicates "maximum possible speed."
//
// TODO: change to ... MaxSendSpeedCode;
//
UINT MaxSendSpeed;
//
// Size, in bytes, of the largest packet that will be sent or received on
// this VC. The miniport may use this information to set up internal buffers
// for link-layer fragmentation and reassembly. The miniport will
// fail attempts to send packets and will discard received packets if the
// size of these packets is larger than the MTU.
//
UINT MTU;
//
// Amount of bandwidth to reserve, in units of bytes per isochronous frame.
// Applies only for isochronous transmission, and must be set to 0 for
// asynchronous transmission (i.e., if the NIC1394_VCFLAG_ISOCHRONOUS bit is 0).
//
UINT Bandwidth;
//
// One or more NIC1394_FRAMETYPE_* values. The miniport will attempt to send up
// only pkts with these protocols. However it may send other pkts.
// The client should be able to deal with this. Must be set to 0 if
// no framing is used (i.e., if the NIC1394_VCFLAG_FRAMED bit is 0).
//
ULONG RecvFrameTypes;
} NIC1394_MEDIA_PARAMETERS, *PNIC1394_MEDIA_PARAMETERS;
//
// NIC1394_MEDIA_PARAMETERS.Flags bitfield values
//
//
// Indicates VC will be used for isochronous transmission.
//
#define NIC1394_VCFLAG_ISOCHRONOUS (0x1 << 1)
//
// Indicates that the vc is used for framed data. If set, the miniport will
// implement link-level fragmentation and reassembly. If clear, the miniport
// will treat data sent and received on this vc as raw data.
//
#define NIC1394_VCFLAG_FRAMED (0x1 << 2)
//
// Indicates the miniport should allocate the necessary bus resources.
// Currently this only applies for non-broadcast channels, in which case
// the bus resources consist of the network channel number and (for isochronous
// vc's) the bandwidth specified in Bandwidth field.
// This bit does not apply (and should be 0) when creating the broadcast channel
// and either transmit or receive FIFO vcs.
//
#define NIC1394_VCFLAG_ALLOCATE (0x1 << 3)
//
// End of NIC1394_MEDIA_PARAMETERS.Flags bitfield values.
//
//
// NIC1394_MEDIA_PARAMETERS.FrameType bitfield values
//
#define NIC1394_FRAMETYPE_ARP (0x1<<0) // Ethertype 0x806
#define NIC1394_FRAMETYPE_IPV4 (0x1<<1) // Ethertype 0x800
#define NIC1394_FRAMETYPE_IPV4MCAP (0x1<<2) // Ethertype 0x8861
///////////////////////////////////////////////////////////////////////////////////
// INFORMATIONAL OIDs //
///////////////////////////////////////////////////////////////////////////////////
//
// the structure for returning basic information about the miniport
// returned in response to OID_NIC1394_LOCAL_NODE_INFO. Associated with
// the address family handle.
//
typedef struct _NIC1394_LOCAL_NODE_INFO
{
UINT64 UniqueID; // This node's 64-bit Unique ID.
ULONG BusGeneration; // 1394 Bus generation ID.
NODE_ADDRESS NodeAddress; // Local nodeID for the current bus
// generation.
USHORT Reserved; // Padding.
UINT MaxRecvBlockSize; // Maximum size, in bytes, of blocks
// that can be read.
UINT MaxRecvSpeed; // Max speed which can be accepted
// -- minimum
// of the max local link speed and
// the max local PHY speed.
// UNITS: SCODE_XXX_RATE
} NIC1394_LOCAL_NODE_INFO, *PNIC1394_LOCAL_NODE_INFO;
//
// The structure for returning basic information about the specified vc
// returned in response to OID_NIC1394_VC_INFO. Associated with
// a vc handle
//
typedef struct _NIC1394_VC_INFO
{
//
// Channel or (unique-ID,offset). In the case of a recv (local) FIFO vc,
// this will be set to the local node's unique ID and address offset.
//
NIC1394_DESTINATION Destination;
} NIC1394_VC_INFO, *PNIC1394_VC_INFO;
//
// The structure for dynamically changing channel characteristics.
//
typedef struct _NIC1394_CHANNEL_CHARACTERISTICS
{
ULARGE_INTEGER ChannelMap; // Must be zero unless specifying a Multi-channel VC.
ULONG Speed; // Same units as NIC1394_MEDIA_PARAMETERS.MaxSendSpeed.
// Special value -1 means "no change in speed."
} NIC1394_CHANNEL_CHARACTERISTICS, *PNIC1394_CHANNEL_CHARACTERISTICS;
///////////////////////////////////////////////////////////////////////////////////
// INDICATIONS //
///////////////////////////////////////////////////////////////////////////////////
// Bus Reset
// Params: NIC1394_LOCAL_NODE_INFO
///////////////////////////////////////////////////////////////////////////////////
// PACKET FORMATS //
///////////////////////////////////////////////////////////////////////////////////
//
// GASP Header, which prefixes all ip/1394 pkts sent over channels.
// TODO: move this withing NIC1394, because it is not exposed to protocols.
//
typedef struct _NIC1394_GASP_HEADER
{
USHORT source_ID;
USHORT specifier_ID_hi;
UCHAR specifier_ID_lo;
UCHAR version[3];
} NIC1394_GASP_HEADER;
//
// Unfragmented encapsulation header.
//
typedef struct _NIC1394_ENCAPSULATION_HEADER
{
// Set to the 16-bit Node ID of the sending node, in machine-byte order.
// Set to zero if the Node ID of the sender is not known.
//
//
USHORT NodeId;
// The EtherType field is set to the byte-swapped version of one of the
// constants defined immediately below.
//
USHORT EtherType;
// Ethertypes in machine byte order. These values need to be byteswapped
// before they are sent on the wire.
//
#define NIC1394_ETHERTYPE_IP 0x800
#define NIC1394_ETHERTYPE_ARP 0x806
#define NIC1394_ETHERTYPE_MCAP 0x8861
} NIC1394_ENCAPSULATION_HEADER, *PNIC1394_ENCAPSULATION_HEADER;
//
// TODO: get rid of NIC1394_ENCAPSULATION_HEADER
//
typedef
NIC1394_ENCAPSULATION_HEADER
NIC1394_UNFRAGMENTED_HEADER, *PNIC1394_UNFRAGMENTED_HEADER;
//
// FRAGMENTED PACKET FORMATS
//
// TODO: move these to inside NIC1394, because they are only
// used within NIC1394.
//
//
// Fragmented Encapsulation header: first fragment
//
typedef struct _NIC1394_FIRST_FRAGMENT_HEADER
{
// Contains the 2-bit "lf" field and the 12-bit "buffer_size" field.
// Use the macros immediately below to extract the above fields from
// the lfbufsz. This field needs to be byteswapped before it is sent out
// on the wire.
//
USHORT lfbufsz;
#define NIC1394_LF_FROM_LFBUFSZ(_lfbufsz) \
((_lfbufz) >> 14)
#define NIC1394_BUFFER_SIZE_FROM_LFBUFSZ(_lfbufsz) \
((_lfbufz) & 0xfff)
#define NIC1394_MAX_FRAGMENT_BUFFER_SIZE 0xfff
//
// specifies what the packet is - an IPV4, ARP, or MCAP packet
//
USHORT EtherType;
// Opaque datagram label. There is no need to byteswap this field before it
// is sent out on the wire.
//
USHORT dgl;
// Must be set to 0
//
USHORT reserved;
} NIC1394_FIRST_FRAGMENT_HEADER, *PNIC1394_FIRST_FRAGMENT_HEADER;
//
// Fragmented Encapsulation header: second and subsequent fragments
//
typedef struct _NIC1394_FRAGMENT_HEADER
{
#if OBSOLETE
ULONG lf:2; // Bits 0-1
ULONG rsv0:2; // Bits 2-3
ULONG buffer_size:12; // Bits 4-15
ULONG rsv1:4; // Bits 16-19
ULONG fragment_offset:12; // Bits 20-31
ULONG dgl:16; // Bits 0-15
ULONG reserved:16; // Bits 16-32
#endif // OBSOLETE
// Contains the 2-bit "lf" field and the 12-bit "buffer_size" field.
// The format is the same as NIC1394_FIRST_FRAGMENT_HEADER.lfbufsz.
//
USHORT lfbufsz;
// Opaque datagram label. There is no need to byteswap this field before it
// is setn out on the wire.
//
USHORT dgl;
// Fragment offset. Must be less than or equal to NIC1394_MAX_FRAGMENT_OFFSET.
// This field needs to be byteswapped before it is sent out on the wire.
//
USHORT fragment_offset;
#define NIC1394_MAX_FRAGMENT_OFFSET 0xfff
} NIC1394_FRAGMENT_HEADER, *PNIC1394_FRAGMENT_HEADER;
// NIC1394_PACKET_STATS maintains information about either send or receive
// packet transmission.
//
typedef struct
{
UINT TotNdisPackets; // Total number of NDIS packets sent/indicated
UINT NdisPacketsFailures;// Number of NDIS packets failed/discarded
UINT TotBusPackets; // Total number of BUS-level reads/writes
UINT BusPacketFailures; // Number of BUS-level failures(sends)/discards(recv)
} NIC1394_PACKET_STATS;
// Types of structres used in OID OID_1394_NICINFO
//
typedef enum
{
NIC1394_NICINFO_OP_BUSINFO,
NIC1394_NICINFO_OP_REMOTENODEINFO,
NIC1394_NICINFO_OP_CHANNELINFO,
NIC1394_NICINFO_OP_RESETSTATS,
} NIC1394_NICINFO_OP;
#define NIC1394_NICINFO_VERSION 2
#define NIC1394_MAX_NICINFO_NODES 64
#define NIC1394_MAX_NICINFO_CHANNELS 64
//
// The buffer used in OID OID_1394_NICINFO has the following common header.
//
typedef struct
{
UINT Version; // Set to NIC1394_NICINFO_VERSION
NIC1394_NICINFO_OP Op; // One of NIC1394_NICINFO_OP_*
} NIC1394_NICINFO_HEADER, *PNIC1394_NICINFO_HEADER;
// NIC1394_BUSINFO is the structure corresponding to NIC1394_NICINFO_OP_BUSINFO.
// It provides a summary of bus-wide information.
//
typedef struct
{
NIC1394_NICINFO_HEADER Hdr; // Hdr.Op == *OP_BUSINFO
//
// General information
//
UINT NumBusResets;
UINT SecondsSinceBusReset;
UINT NumOutstandingIrps;
UINT Flags; // One or more NIC1394_BUSINFO_*
#define NIC1394_BUSINFO_LOCAL_IS_IRM 0x1 // Local node is the IRM
// Local node caps
//
NIC1394_LOCAL_NODE_INFO LocalNodeInfo;
//
// CHANNEL RELATED INFORMATION
//
struct
{
// The bus channel map register
//
UINT64 BusMap; // LSB bit == channel 0
// Bitmap of locally active channels.
// More information about each of these channels may be queried
// using NIC1394_NICINFO_OP_CHANNELINFO.
//
UINT64 ActiveChannelMap;
// BROADCAST CHANNEL
//
UINT Bcr; // Broadcast channels register.
NIC1394_PACKET_STATS BcSendPktStats; // Send stats
NIC1394_PACKET_STATS BcRecvPktStats; // Recv stats
// Aggregated Channel stats
//
NIC1394_PACKET_STATS SendPktStats; // Send stats
NIC1394_PACKET_STATS RecvPktStats; // Recv stats
} Channel;
//
// FIFO RELATED INFORMATION.
//
struct
{
// Address offset of the receive fifo.
//
ULONG Recv_Off_Low;
USHORT Recv_Off_High;
// Aggregated stats across all fifos
//
NIC1394_PACKET_STATS RecvPktStats;
NIC1394_PACKET_STATS SendPktStats;
// Current number and min number of available (free) receive buffers.
//
UINT NumFreeRecvBuffers;
UINT MinFreeRecvBuffers;
// Number of outstanding reassemblies (receive side)
//
UINT NumOutstandingReassemblies;
UINT MaxOutstandingReassemblies;
UINT NumAbortedReassemblies;
} Fifo;
struct
{
//
// To display private information, place format strings in FormatA and
// Format B. The display program will do the following:
// if (FormatA[0]) printf(FormatA, A0, A1, A2, A3);
// if (FormatB[0]) printf(FormatB, B0, B1, B2, B3);
//
#define NIC1394_MAX_PRIVATE_FORMAT_SIZE 80
char FormatA[NIC1394_MAX_PRIVATE_FORMAT_SIZE+1];
char FormatB[NIC1394_MAX_PRIVATE_FORMAT_SIZE+1];
UINT A0;
UINT A1;
UINT A2;
UINT A3;
UINT B0;
UINT B1;
UINT B2;
UINT B3;
} Private;
//
// Information about remote nodes. More information about each of these nodes
// may be queried using *OP_REMOTE_NODEINFO
//
UINT NumRemoteNodes;
UINT64 RemoteNodeUniqueIDS[NIC1394_MAX_NICINFO_NODES];
} NIC1394_BUSINFO, *PNIC1394_BUSINFO;
//
// NIC1394_REMOTENODEINFO is structure corresponding to
// NIC1394_NICINFO_OP_REMOTENODEINFO.
// The structure contains basic information about a specific remote node.
//
typedef struct
{
NIC1394_NICINFO_HEADER Hdr; // Hdr.Op == *OP_REMOTENODEINFO
UINT64 UniqueID; // This node's 64-bit Unique ID.
// THIS IS AN IN PARAM
USHORT NodeAddress; // Local nodeID for the current bus
// generation.
USHORT Reserved; // Padding.
UINT MaxRec; // Remote node's MaxRec value.
UINT EffectiveMaxBlockSize;// Max block size, in bytes,
// used when writing to this node.
// It is based on the minimum
// of the max speed between devices
// and the local and remote maxrecs.
UINT MaxSpeedBetweenNodes;// Max speed which can be accepted
// in units of SCODE_XXX_RATE.
UINT Flags; // One or more NIC1394_REMOTEINFO* consts
#define NIC1394_REMOTEINFO_ACTIVE (0x1<<0)
#define NIC1394_REMOTEINFO_LOADING (0x1<<1)
#define NIC1394_REMOTEINFO_UNLOADING (0x1<<2)
NIC1394_PACKET_STATS SendFifoPktStats; // Fifo Sends to this node
NIC1394_PACKET_STATS RecvFifoPktStats; // Fifo Recvs from this node
NIC1394_PACKET_STATS RecvChannelPktStats;// Channel receives from this node
} NIC1394_REMOTENODEINFO, *PNIC1394_REMOTENODEINFO;
// NIC1394_CHANNELINFO is structure corresponding to
// NIC1394_NICINFO_OP_CHANNELINFO.
// The structure contains basic information about a specific channel.
//
typedef struct
{
NIC1394_NICINFO_HEADER Hdr; // Hdr.Op == *OP_CHANNELINFO
UINT Channel; // Channel number (IN PARAM)
UINT SendAge; // Age in seconds since it's been activated for sends.
UINT RecvAge; // Age in seconds since it's been activated for recvs.
UINT Flags; // One or more NIC1394_CHANNELINFO_* defines below
#define NIC1394_CHANNELINFO_RECEIVE_ENABLED 0x1 // Enabled for receive
#define NIC1394_CHANNELINFO_SEND_ENABLED 0x2 // Enabled for send
#define NIC1394_CHANNELINFO_OWNER 0x4 // This node is the owner
NIC1394_PACKET_STATS SendPktStats; // Send stats
NIC1394_PACKET_STATS RecvPktStats; // Recv stats
} NIC1394_CHANNELINFO, *PNIC1394_CHANNELINFO;
// NIC1394_RESETSTATS is structure corresponding to
// NIC1394_NICINFO_OP_RESETSTATS.
// The structure doesn't contain anything useful -- this OP is used to
// reset NIC statistics.
//
typedef struct
{
NIC1394_NICINFO_HEADER Hdr; // Hdr.Op == *OP_RESETSTATS
} NIC1394_RESETSTATS, *PNIC1394_RESETSTATS;
//
// NIC1394_NICINFO is a union of all the structures that are used with
// OID_1394_NICINFO.
//
typedef union
{
NIC1394_NICINFO_HEADER Hdr;
NIC1394_BUSINFO BusInfo;
NIC1394_REMOTENODEINFO RemoteNodeInfo;
NIC1394_CHANNELINFO ChannelInfo;
NIC1394_RESETSTATS ResetStats;
} NIC1394_NICINFO, *PNIC1394_NICINFO;
// Issues a 1394 bus reset. Used to test the BCM algorithm
#define OID_1394_ISSUE_BUS_RESET 0xFF00C910
// UnUsed - could be used to change channel characteristics
#define OID_1394_CHANGE_CHANNEL_CHARACTERISTICS 0xFF00C911
// used to query statistics and other information from the nic
#define OID_1394_NICINFO 0xFF00C912
// Used by arp1394 to ask the nic if it knows of any ip1394 nodes on the net
#define OID_1394_IP1394_CONNECT_STATUS 0xFF00C913
//Used by the bridge to state that the bridge has opened an adapter
#define OID_1394_ENTER_BRIDGE_MODE 0xFF00C914
// Used by the bridge to state that the bridge is closing an adapter
#define OID_1394_EXIT_BRIDGE_MODE 0xFF00C915
// Used by arp1394 to query the Euid, Source, Mac Map - used in the bridge
#define OID_1394_QUERY_EUID_NODE_MAP 0xFF00C916
typedef enum
{
NIC1394_EVENT_BUS_RESET
} NIC1394_EVENT_CODE;
//
// This is a struct the miniport uses to indicate an event to the protocols (Arp1394)
// It is used to
// 1. Tell the Arp module that the bus has been reset
// and informs it of the new local node address.
//
typedef struct _NIC1394_STATUS_BUFFER
{
UINT Signature; // == NIC1394_MEDIA_SPECIFIC
NIC1394_EVENT_CODE Event;
union
{
struct
{
NODE_ADDRESS LocalNode;
UINT ulGeneration;
}BusReset;
};
} NIC1394_STATUS_BUFFER, *PNIC1394_STATUS_BUFFER;
#endif // _NIC1394_H_