767 lines
26 KiB
C
767 lines
26 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
mac.h
|
||
|
||
Abstract:
|
||
|
||
This header file defines manifest constants and necessary macros for use
|
||
by transports dealing with multiple MAC cards through the NDIS interface.
|
||
|
||
Author:
|
||
|
||
David Beaver (dbeaver) 02-Oct-1990
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#ifndef _MAC_
|
||
#define _MAC_
|
||
|
||
//
|
||
// MAC-specific definitions, some of which get used below
|
||
//
|
||
|
||
#define MAX_MAC_HEADER_LENGTH 32
|
||
#define MAX_SOURCE_ROUTING 18
|
||
#define MAX_DEFAULT_SR 2
|
||
|
||
#define ETHERNET_ADDRESS_LENGTH 6
|
||
#define ETHERNET_PACKET_LENGTH 1514 // max size of an ethernet packet
|
||
#define ETHERNET_HEADER_LENGTH 14 // size of the ethernet MAC header
|
||
#define ETHERNET_DATA_LENGTH_OFFSET 12
|
||
#define ETHERNET_DESTINATION_OFFSET 0
|
||
#define ETHERNET_SOURCE_OFFSET 6
|
||
|
||
#define TR_ADDRESS_LENGTH 6
|
||
#define TR_ADDRESS_OFFSET 2
|
||
#define TR_SPECIFIC_OFFSET 0
|
||
#define TR_PACKET_LENGTH 1514 // max size of a TR packet
|
||
#define TR_HEADER_LENGTH 36 // size of the MAC header w/o source routing
|
||
#define TR_DATA_LENGTH_OFFSET 0
|
||
#define TR_DESTINATION_OFFSET 2
|
||
#define TR_SOURCE_OFFSET 8
|
||
#define TR_ROUTING_OFFSET 14 // starts at the 14th byte
|
||
#define TR_GR_BCAST_LENGTH 2
|
||
#define TR_GR_BROADCAST 0xC270 // what a general route b'cast looks like
|
||
#define TR_ROUTING_LENGTH_MASK 0x1F // low 5 bits in byte
|
||
#define TR_DIRECTION_MASK 0x80 // returns direction bit
|
||
|
||
#define TR_PREAMBLE_AC 0x10 // how would these be specified?
|
||
#define TR_PREAMBLE_FC 0x40
|
||
|
||
#define TR_HEADER_BYTE_0 0x10
|
||
#define TR_HEADER_BYTE_1 0x40
|
||
|
||
#define FDDI_ADDRESS_LENGTH 6
|
||
#define FDDI_HEADER_BYTE 0x57
|
||
|
||
|
||
|
||
//
|
||
// We need this to define information about the MAC. Note that
|
||
// it is a strange structure in that the first four elements
|
||
// are for use internally by the nbfmac routines, while the
|
||
// DeviceContext knows about and uses the last two.
|
||
//
|
||
|
||
typedef struct _NBF_NDIS_IDENTIFICATION {
|
||
NDIS_MEDIUM MediumType;
|
||
BOOLEAN SourceRouting;
|
||
BOOLEAN MediumAsync;
|
||
BOOLEAN QueryWithoutSourceRouting;
|
||
BOOLEAN AllRoutesNameRecognized;
|
||
ULONG DestinationOffset;
|
||
ULONG SourceOffset;
|
||
ULONG AddressLength;
|
||
ULONG TransferDataOffset;
|
||
ULONG MaxHeaderLength;
|
||
BOOLEAN CopyLookahead;
|
||
BOOLEAN ReceiveSerialized;
|
||
BOOLEAN TransferSynchronous;
|
||
BOOLEAN SingleReceive;
|
||
} NBF_NDIS_IDENTIFICATION, *PNBF_NDIS_IDENTIFICATION;
|
||
|
||
|
||
|
||
VOID
|
||
MacConstructHeader(
|
||
IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
IN PUCHAR Buffer,
|
||
IN PUCHAR DestinationAddress,
|
||
IN PUCHAR SourceAddress,
|
||
IN UINT PacketLength,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength,
|
||
OUT PUINT HeaderLength
|
||
);
|
||
|
||
VOID
|
||
MacReturnMaxDataSize(
|
||
IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
IN PUCHAR SourceRouting,
|
||
IN UINT SourceRoutingLength,
|
||
IN UINT DeviceMaxFrameSize,
|
||
IN BOOLEAN AssumeWorstCase,
|
||
OUT PUINT MaxFrameSize
|
||
);
|
||
|
||
VOID
|
||
MacInitializeMacInfo(
|
||
IN NDIS_MEDIUM MacType,
|
||
IN BOOLEAN UseDix,
|
||
OUT PNBF_NDIS_IDENTIFICATION MacInfo
|
||
);
|
||
|
||
|
||
extern UCHAR SingleRouteSourceRouting[];
|
||
extern UCHAR GeneralRouteSourceRouting[];
|
||
extern ULONG DefaultSourceRoutingLength;
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacReturnDestinationAddress(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PVOID Packet,
|
||
// OUT PVOID * DestinationAddress
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Returns the a pointer to the destination address in the packet.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// Packet - The packet data.
|
||
//
|
||
// DestinationAddress - Returns the start of the destination address.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacReturnDestinationAddress(_MacInfo, _Packet, _DestinationAddress) \
|
||
*(_DestinationAddress) = ((PUCHAR)(_Packet)) + (_MacInfo)->DestinationOffset
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacReturnSourceAddress(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PVOID Packet,
|
||
// OUT PHARDWARE_ADDRESS SourceAddressBuffer,
|
||
// OUT PHARDWARE_ADDRESS * SourceAddress,
|
||
// OUT BOOLEAN * Multicast OPTIONAL
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Copies the source address in the packet into SourceAddress.
|
||
// NOTE THAT IT MAY COPY THE DATA, UNLIKE ReturnDestinationAddress
|
||
// AND ReturnSourceRouting. Optionally, indicates whether the
|
||
// destination address is a multicast address.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// Packet - The packet data.
|
||
//
|
||
// SourceAddressBuffer - A buffer to hold the source address,
|
||
// if needed.
|
||
//
|
||
// SourceAddress - Returns a pointer to the source address.
|
||
//
|
||
// Multicast - Optional pointer to a BOOLEAN to receive indication
|
||
// of whether the destination was a multicast address.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
//
|
||
// NOTE: The default case below handles Ethernet and FDDI.
|
||
//
|
||
|
||
#define MacReturnSourceAddress(_MacInfo, _Packet, _SourceAddressBuffer, \
|
||
_SourceAddress, _Multicast) \
|
||
{ \
|
||
PUCHAR TmpPacket = (PUCHAR)(_Packet); \
|
||
PUCHAR SrcBuffer = (PUCHAR)(_SourceAddressBuffer); \
|
||
\
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_5: \
|
||
if (ARGUMENT_PRESENT(_Multicast)) { \
|
||
*(PBOOLEAN)(_Multicast) = TmpPacket[2] & 0x80; \
|
||
} \
|
||
if (TmpPacket[8] & 0x80) { \
|
||
*(PULONG)SrcBuffer = *(ULONG UNALIGNED *)(&TmpPacket[8]) & ~0x80;\
|
||
SrcBuffer[4] = TmpPacket[12]; \
|
||
SrcBuffer[5] = TmpPacket[13]; \
|
||
*(_SourceAddress) = (PHARDWARE_ADDRESS)SrcBuffer; \
|
||
} else { \
|
||
*(_SourceAddress) = (PHARDWARE_ADDRESS)(TmpPacket + 8); \
|
||
} \
|
||
break; \
|
||
default: \
|
||
if (ARGUMENT_PRESENT(_Multicast)) { \
|
||
*(PBOOLEAN)(_Multicast) = TmpPacket[0] & 0x01; \
|
||
} \
|
||
*(_SourceAddress) = (PHARDWARE_ADDRESS)(TmpPacket + \
|
||
(_MacInfo)->SourceOffset); \
|
||
break; \
|
||
} \
|
||
}
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacReturnSourceRouting(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PVOID Packet,
|
||
// OUT PVOID * SourceRouting
|
||
// OUT PUINT SourceRoutingLength
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Returns the a pointer to the source routing info in the packet.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// Packet - The packet data.
|
||
//
|
||
// SourceRouting - Returns the start of the source routing information,
|
||
// or NULL if none is present.
|
||
//
|
||
// SourceRoutingLength - Returns the length of the source routing
|
||
// information.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacReturnSourceRouting(_MacInfo, _Packet, _SourceRouting, _SourceRoutingLength) \
|
||
{ \
|
||
PUCHAR TmpPacket = (PUCHAR)(_Packet); \
|
||
*(_SourceRoutingLength) = 0; \
|
||
if ((_MacInfo)->SourceRouting) { \
|
||
if (TmpPacket[8] & 0x80) { \
|
||
*(_SourceRouting) = TmpPacket + 14; \
|
||
*(_SourceRoutingLength) = TmpPacket[14] & 0x1f; \
|
||
} else { \
|
||
*(_SourceRouting) = NULL; \
|
||
} \
|
||
} else { \
|
||
*(_SourceRouting) = NULL; \
|
||
} \
|
||
}
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacIsMulticast(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PVOID Packet,
|
||
// OUT PBOOLEAN Multicast
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Returns TRUE if the packet is sent to the multicast address.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// Packet - The packet data.
|
||
//
|
||
// Multicast - Returns the result.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacIsMulticast(_MacInfo, _Packet, _Multicast) \
|
||
{ \
|
||
PUCHAR TmpPacket = (PUCHAR)(_Packet); \
|
||
\
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_5: \
|
||
*(_Multicast) = ((TmpPacket[2] & 0x80) != 0); \
|
||
break; \
|
||
default: \
|
||
*(_Multicast) = ((TmpPacket[0] & 0x01) != 0); \
|
||
break; \
|
||
} \
|
||
}
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacReturnPacketLength(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PVOID Header,
|
||
// IN UINT PacketLength,
|
||
// OUT PUINT DataLength
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Returns the length of data in the packet given the header.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// Header - The packet header.
|
||
//
|
||
// PacketLength - The length of the data (not including header).
|
||
//
|
||
// DataLength - Returns the length of the data. Unchanged if the
|
||
// packet is not recognized. Should be initialized by caller to 0.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacReturnPacketLength(_MacInfo, _Header, _HeaderLength, _PacketLength, _DataLength, _LookaheadBuffer, _LookaheadBufferLength) \
|
||
{ \
|
||
PUCHAR TmpPacket = (PUCHAR)(_Header); \
|
||
UINT TmpLength; \
|
||
\
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_3: \
|
||
if ((_HeaderLength) >= 14) { \
|
||
TmpLength = (TmpPacket[12] << 8) | TmpPacket[13]; \
|
||
if (TmpLength <= 0x600) { \
|
||
if (TmpLength <= (_PacketLength)) { \
|
||
*(_DataLength) = TmpLength; \
|
||
} \
|
||
} \
|
||
} \
|
||
break; \
|
||
case NdisMedium802_5: \
|
||
if (((_HeaderLength) >= 14) && \
|
||
(!(TmpPacket[8] & 0x80) || \
|
||
((_HeaderLength) >= \
|
||
(UINT)(14 + (TmpPacket[14] & 0x1f))))) { \
|
||
*(_DataLength) = (_PacketLength); \
|
||
} \
|
||
break; \
|
||
case NdisMediumFddi: \
|
||
if ((_HeaderLength) >= 13) { \
|
||
*(_DataLength) = (_PacketLength); \
|
||
} \
|
||
break; \
|
||
case NdisMediumDix: \
|
||
if ((TmpPacket[12] == 0x80) && (TmpPacket[13] == 0xd5)) { \
|
||
if (*(_LookaheadBufferLength) >= 3) { \
|
||
TmpPacket = (PUCHAR)(*(_LookaheadBuffer)); \
|
||
TmpLength = (TmpPacket[0] << 8) | TmpPacket[1]; \
|
||
if (TmpLength <= (_PacketLength)-3) { \
|
||
*(_DataLength) = TmpLength; \
|
||
*(_LookaheadBuffer) = (PVOID)(TmpPacket + 3); \
|
||
*(_LookaheadBufferLength) -= 3; \
|
||
} \
|
||
} \
|
||
} \
|
||
break; \
|
||
} \
|
||
}
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacReturnHeaderLength(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PVOID Packet,
|
||
// OUT PVOID HeaderLength,
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Returns the length of the MAC header in a packet (this
|
||
// is used for loopback indications to separate header
|
||
// and data).
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// Header - The packet header.
|
||
//
|
||
// HeaderLength - Returns the length of the header.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacReturnHeaderLength(_MacInfo, _Header, _HeaderLength) \
|
||
{ \
|
||
PUCHAR TmpPacket = (PUCHAR)(_Header); \
|
||
\
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_3: \
|
||
case NdisMediumDix: \
|
||
*(_HeaderLength) = 14; \
|
||
break; \
|
||
case NdisMedium802_5: \
|
||
if (TmpPacket[8] & 0x80) { \
|
||
*(_HeaderLength) = (TmpPacket[14] & 0x1f) + 14; \
|
||
} else { \
|
||
*(_HeaderLength) = 14; \
|
||
} \
|
||
break; \
|
||
case NdisMediumFddi: \
|
||
*(_HeaderLength) = 13; \
|
||
break; \
|
||
} \
|
||
}
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacReturnSingleRouteSR(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// OUT PVOID * SingleRouteSR,
|
||
// OUT PUINT SingleRouteSRLength
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Returns the a pointer to the standard single route broadcast
|
||
// source routing information for the media type. This is used
|
||
// for ADD_NAME_QUERY, DATAGRAM, NAME_IN_CONFLICT, NAME_QUERY,
|
||
// and STATUS_QUERY frames.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// SingleRouteSR - Returns a pointer to the data.
|
||
//
|
||
// SingleRouteSRLength - The length of SingleRouteSR.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacReturnSingleRouteSR(_MacInfo, _SingleRouteSR, _SingleRouteSRLength) \
|
||
{ \
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_5: \
|
||
*(_SingleRouteSR) = SingleRouteSourceRouting; \
|
||
*(_SingleRouteSRLength) = DefaultSourceRoutingLength; \
|
||
break; \
|
||
default: \
|
||
*(_SingleRouteSR) = NULL; \
|
||
break; \
|
||
} \
|
||
}
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacReturnGeneralRouteSR(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// OUT PVOID * GeneralRouteSR,
|
||
// OUT PUINT GeneralRouteSRLength
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Returns the a pointer to the standard general route broadcast
|
||
// source routing information for the media type. This is used
|
||
// for NAME_RECOGNIZED frames.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// GeneralRouteSR - Returns a pointer to the data.
|
||
//
|
||
// GeneralRouteSRLength - The length of GeneralRouteSR.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacReturnGeneralRouteSR(_MacInfo, _GeneralRouteSR, _GeneralRouteSRLength) \
|
||
{ \
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_5: \
|
||
*(_GeneralRouteSR) = GeneralRouteSourceRouting; \
|
||
*(_GeneralRouteSRLength) = DefaultSourceRoutingLength; \
|
||
break; \
|
||
default: \
|
||
*(_GeneralRouteSR) = NULL; \
|
||
break; \
|
||
} \
|
||
}
|
||
|
||
#if 0
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacCreateGeneralRouteReplySR(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PUCHAR ExistingSR,
|
||
// IN UINT ExistingSRLength,
|
||
// OUT PUCHAR * NewSR
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This modifies an existing source routing entry to make
|
||
// it into a general-route source routing entry. The assumption
|
||
// is that is to reply to existing source routing, so the
|
||
// direction bit is also reversed. In addition, if it is
|
||
// determined that no source routing is needed in the reply,
|
||
// then NULL is returned.
|
||
//
|
||
// Note that the information is modified in-place, but a
|
||
// separate pointer is returned (to allow NULL to be returned).
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// ExistingSR - The existing source routing to be modified.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacCreateGeneralRouteReplySR(_MacInfo, _ExistingSR, _ExistingSRLength, _NewSR) \
|
||
{ \
|
||
if (_ExistingSR) { \
|
||
PUCHAR TmpSR = (PUCHAR)(_ExistingSR); \
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_5: \
|
||
TmpSR[0] = (TmpSR[0] & 0x1f) | 0x80; \
|
||
TmpSR[1] = (TmpSR[1] ^ 0x80); \
|
||
*(_NewSR) = (_ExistingSR); \
|
||
break; \
|
||
default: \
|
||
*(_NewSR) = (_ExistingSR); \
|
||
break; \
|
||
} \
|
||
} else { \
|
||
*(_NewSR) = NULL; \
|
||
} \
|
||
}
|
||
#endif
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacCreateNonBroadcastReplySR(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PUCHAR ExistingSR,
|
||
// IN UINT ExistingSRLength,
|
||
// OUT PUCHAR * NewSR
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This modifies an existing source routing entry to make
|
||
// it into a non-broadcast source routing entry. The assumption
|
||
// is that is to reply to existing source routing, so the
|
||
// direction bit is also reversed. In addition, if it is
|
||
// determined that no source routing is needed in the reply,
|
||
// then NULL is returned.
|
||
//
|
||
// Note that the information is modified in-place, but a
|
||
// separate pointer is returned (to allow NULL to be returned).
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// ExistingSR - The existing source routing to be modified.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacCreateNonBroadcastReplySR(_MacInfo, _ExistingSR, _ExistingSRLength, _NewSR) \
|
||
{ \
|
||
if (_ExistingSR) { \
|
||
PUCHAR TmpSR = (PUCHAR)(_ExistingSR); \
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_5: \
|
||
if ((_ExistingSRLength) == 2) { \
|
||
*(_NewSR) = NULL; \
|
||
} else { \
|
||
TmpSR[0] = (TmpSR[0] & 0x1f); \
|
||
TmpSR[1] = (TmpSR[1] ^ 0x80); \
|
||
*(_NewSR) = (_ExistingSR); \
|
||
} \
|
||
break; \
|
||
default: \
|
||
*(_NewSR) = (_ExistingSR); \
|
||
break; \
|
||
} \
|
||
} else { \
|
||
*(_NewSR) = NULL; \
|
||
} \
|
||
}
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacModifyHeader(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PUCHAR Header,
|
||
// IN UINT PacketLength
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Modifies a pre-built packet header to include the
|
||
// packet length. Used for connection-oriented traffic
|
||
// where the header is pre-built.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// Header - The header to modify.
|
||
//
|
||
// PacketLength - Packet length (not including the header).
|
||
// Currently this is the only field that cannot be pre-built.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacModifyHeader(_MacInfo, _Header, _PacketLength) \
|
||
{ \
|
||
switch ((_MacInfo)->MediumType) { \
|
||
case NdisMedium802_3: \
|
||
(_Header)[12] = (UCHAR)((_PacketLength) >> 8); \
|
||
(_Header)[13] = (UCHAR)((_PacketLength) & 0xff); \
|
||
break; \
|
||
case NdisMediumDix: \
|
||
(_Header)[14] = (UCHAR)((_PacketLength) >> 8); \
|
||
(_Header)[15] = (UCHAR)((_PacketLength) & 0xff); \
|
||
break; \
|
||
} \
|
||
}
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// MacReturnMagicAddress(
|
||
// IN PNBF_NDIS_IDENTIFICATION MacInfo,
|
||
// IN PVOID Address,
|
||
// OUT PULARGE_INTEGER Magic
|
||
// );
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// MacReturnMagicAddress returns the link as a 64 bit number.
|
||
// We then find the link in the link trees by doing a large
|
||
// integer comparison.
|
||
//
|
||
// The number is constructed by assigning the last four bytes of
|
||
// the address as the low longword, and the first two bytes as
|
||
// the high one. For 802_5 we need to mask off the source routing
|
||
// bit in byte 0 of the address.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// MacInfo - Describes the MAC we wish to decode.
|
||
//
|
||
// Address - The address we are encoding.
|
||
//
|
||
// Magic - Returns the magic number for this address.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
#define MacReturnMagicAddress(_MacInfo, _Address, _Magic) \
|
||
{ \
|
||
PUCHAR TempAddr = (PUCHAR)(_Address); \
|
||
\
|
||
(_Magic)->LowPart = *((LONG UNALIGNED *)(TempAddr + 2)); \
|
||
if ((_MacInfo)->MediumType == NdisMedium802_5) { \
|
||
(_Magic)->HighPart = ((TempAddr[0] & 0x7f) << 8) + TempAddr[1]; \
|
||
} else { \
|
||
(_Magic)->HighPart = (TempAddr[0] << 8) + TempAddr[1]; \
|
||
} \
|
||
}
|
||
|
||
|
||
VOID
|
||
MacSetNetBIOSMulticast (
|
||
IN NDIS_MEDIUM Type,
|
||
IN PUCHAR Buffer
|
||
);
|
||
|
||
|
||
|
||
// VOID
|
||
// NbfSetNdisPacketLength (
|
||
// IN NDIS_PACKET Packet,
|
||
// IN ULONG Length
|
||
// );
|
||
//
|
||
// NB: This is not a general purpose macro; it assumes that we are setting the
|
||
// length of an NDIS packet with only one NDIS_BUFFER chained. We do
|
||
// this to save time during the sending of short control packets.
|
||
//
|
||
|
||
#define NbfSetNdisPacketLength(_packet,_length) { \
|
||
PNDIS_BUFFER NdisBuffer; \
|
||
NdisQueryPacket((_packet), NULL, NULL, &NdisBuffer, NULL); \
|
||
NdisAdjustBufferLength(NdisBuffer, (_length)); \
|
||
NdisRecalculatePacketCounts(_packet); \
|
||
}
|
||
|
||
#endif // ifdef _MAC_
|
||
|