/*++ 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_ /////////////////////////////////////////////////////////////////////////////////// // 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 } 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. }; 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 // // NOTE: // 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. // // // 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. } 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; /////////////////////////////////////////////////////////////////////////////////// // 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 { // The Reserved field must be set to 0. // USHORT Reserved; // 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; #define OID_1394_ISSUE_BUS_RESET 0x0C010201 #endif // _NIC1394_H_