/*++ Copyright(c) 1999-2000 Microsoft Corporation Module Name: brdgctl.h Abstract: Ethernet MAC bridge. IOCTL interface definitions Author: Mark Aiken Environment: Kernel mode driver Revision History: Apr 2000 - Original version --*/ // =========================================================================== // // CONSTANTS / TYPES // // =========================================================================== // The bridge's device name when using it from user-mode #define BRIDGE_DOS_DEVICE_NAME "\\\\.\\BRIDGE" // Opaque handle uniquely identifying an adapter typedef ULONG_PTR BRIDGE_ADAPTER_HANDLE, *PBRIDGE_ADAPTER_HANDLE; // Length of an Ethernet MAC address #define ETH_LENGTH_OF_ADDRESS 6 // No reported physical medium (assume 802.3) #define BRIDGE_NO_MEDIUM (NDIS_PHYSICAL_MEDIUM)-1 // Types of notifications typedef enum { BrdgNotifyEnumerateAdapters, BrdgNotifyAddAdapter, BrdgNotifyRemoveAdapter, BrdgNotifyLinkSpeedChange, BrdgNotifyMediaStateChange, BrdgNotifyAdapterStateChange // This only occurs when the STA is active } BRIDGE_NOTIFICATION_TYPE; // // Possible states for an adapter. If the STA is not compiled in, adapters are // always in the Forwarding state. // typedef enum _PORT_STATE { Disabled, // The STA is disabled on this adapter. This happens when the adapter's // media is disconnected. Blocking, // Not learning or relaying Listening, // Transitory Learning, // Learning but not relaying Forwarding // Learning and relaying } PORT_STATE; // // STA types and constants // // Time values are exchanged between bridges as 16-bit unsigned values // in units of 1/256th of a second typedef USHORT STA_TIME; // Path costs are 32-bit unsigned values typedef ULONG PATH_COST; // Port identifiers are 2-byte unsigned values typedef USHORT PORT_ID; // Size of bridge identifiers #define BRIDGE_ID_LEN 8 #if( BRIDGE_ID_LEN < ETH_LENGTH_OF_ADDRESS ) #error "BRIDGE_ID_LEN must be >= ETH_LENGTH_OF_ADDRESS" #endif // =========================================================================== // // STRUCTURES // // =========================================================================== // // Common notification header // typedef struct _BRIDGE_NOTIFY_HEADER { // // If NotifyType == BrdgNotifyRemoveAdapter, there is no further data. // // If NotifyType != BrdgNotifyRemoveAdapter, the header is followed by // a BRIDGE_ADAPTER_INFO structure. // BRIDGE_NOTIFICATION_TYPE NotifyType; BRIDGE_ADAPTER_HANDLE Handle; } BRIDGE_NOTIFY_HEADER, *PBRIDGE_NOTIFY_HEADER; // // Data provided with adapter notifications // typedef struct _BRIDGE_ADAPTER_INFO { // These fields can be the subject of a specific change notification ULONG LinkSpeed; NDIS_MEDIA_STATE MediaState; PORT_STATE State; // These fields are never the subject of a change notification UCHAR MACAddress[ETH_LENGTH_OF_ADDRESS]; NDIS_PHYSICAL_MEDIUM PhysicalMedium; } BRIDGE_ADAPTER_INFO, *PBRIDGE_ADAPTER_INFO; // // Data provided in response to // typedef struct _BRIDGE_STA_ADAPTER_INFO { PORT_ID ID; ULONG PathCost; UCHAR DesignatedRootID[BRIDGE_ID_LEN]; PATH_COST DesignatedCost; UCHAR DesignatedBridgeID[BRIDGE_ID_LEN]; PORT_ID DesignatedPort; } BRIDGE_STA_ADAPTER_INFO, *PBRIDGE_STA_ADAPTER_INFO; // // Data provided with BrdgNotifySTAGlobalInfoChange // typedef struct _BRIDGE_STA_GLOBAL_INFO { UCHAR OurID[BRIDGE_ID_LEN]; UCHAR DesignatedRootID[BRIDGE_ID_LEN]; PATH_COST RootCost; BRIDGE_ADAPTER_HANDLE RootAdapter; BOOLEAN bTopologyChangeDetected; BOOLEAN bTopologyChange; STA_TIME MaxAge; STA_TIME HelloTime; STA_TIME ForwardDelay; } BRIDGE_STA_GLOBAL_INFO, *PBRIDGE_STA_GLOBAL_INFO; // // This structure is used to report statistics relating to the bridge's packet handling. // typedef struct _BRIDGE_PACKET_STATISTICS { // Local-source frames LARGE_INTEGER TransmittedFrames; // Local-source frames whose transmission failed because of errors LARGE_INTEGER TransmittedErrorFrames; // Local-source bytes LARGE_INTEGER TransmittedBytes; // Breakdown of transmitted frames LARGE_INTEGER DirectedTransmittedFrames; LARGE_INTEGER MulticastTransmittedFrames; LARGE_INTEGER BroadcastTransmittedFrames; // Breakdown of transmitted bytes LARGE_INTEGER DirectedTransmittedBytes; LARGE_INTEGER MulticastTransmittedBytes; LARGE_INTEGER BroadcastTransmittedBytes; // Frames indicated to the local machine LARGE_INTEGER IndicatedFrames; // Frames that should have been indicated to the local machine but // were not due to errors LARGE_INTEGER IndicatedDroppedFrames; // Bytes indicated to the local machine LARGE_INTEGER IndicatedBytes; // Breakdown of indicated frames LARGE_INTEGER DirectedIndicatedFrames; LARGE_INTEGER MulticastIndicatedFrames; LARGE_INTEGER BroadcastIndicatedFrames; // Breakdown of indicated bytes LARGE_INTEGER DirectedIndicatedBytes; LARGE_INTEGER MulticastIndicatedBytes; LARGE_INTEGER BroadcastIndicatedBytes; // Total received frames / bytes, including frames not indicated LARGE_INTEGER ReceivedFrames; LARGE_INTEGER ReceivedBytes; // Breakdown of how many frames were received with/without copying LARGE_INTEGER ReceivedCopyFrames ; LARGE_INTEGER ReceivedCopyBytes; LARGE_INTEGER ReceivedNoCopyFrames; LARGE_INTEGER ReceivedNoCopyBytes; } BRIDGE_PACKET_STATISTICS, *PBRIDGE_PACKET_STATISTICS; // // This structure is used to report the packet-handling statistics for a particular // adapter // typedef struct _BRIDGE_ADAPTER_PACKET_STATISTICS { // These include all sent packets (including relay) LARGE_INTEGER SentFrames; LARGE_INTEGER SentBytes; // These include only packets sent by the local machine LARGE_INTEGER SentLocalFrames; LARGE_INTEGER SentLocalBytes; // These include all received packets (including relay) LARGE_INTEGER ReceivedFrames; LARGE_INTEGER ReceivedBytes; } BRIDGE_ADAPTER_PACKET_STATISTICS, *PBRIDGE_ADAPTER_PACKET_STATISTICS; // // This structure is used to report statistics relating the bridge's internal // buffer management // typedef struct _BRIDGE_BUFFER_STATISTICS { // Packets of each type currently used ULONG UsedCopyPackets; ULONG UsedWrapperPackets; // Size of each pool ULONG MaxCopyPackets; ULONG MaxWrapperPackets; // Size of the safety buffer for each pool ULONG SafetyCopyPackets; ULONG SafetyWrapperPackets; // Number of times alloc requests from each pool have been denied because the // pool was completely full LARGE_INTEGER CopyPoolOverflows; LARGE_INTEGER WrapperPoolOverflows; // Number of times memory allocations have failed unexpectedly (presumably // because of low system resources) LARGE_INTEGER AllocFailures; } BRIDGE_BUFFER_STATISTICS, *PBRIDGE_BUFFER_STATISTICS; // =========================================================================== // // IOCTLS // // =========================================================================== // // This IOCTL will pend until the bridge has a notification to send up to the caller. // // Associated structures: BRIDGE_NOTIFY_HEADER and BRIDGE_ADAPTER_INFO // // The buffer provided with IOCTLs of this type must be at least sizeof(BRIDGE_NOTIFY_HEADER) + // sizeof(BRIDGE_ADAPTER_INFO) large, in order to accomodate notifications that include adapter // information // #define BRIDGE_IOCTL_REQUEST_NOTIFY CTL_CODE(FILE_DEVICE_NETWORK, 0x800, METHOD_BUFFERED, FILE_WRITE_ACCESS) // // This IOCTL causes the bridge driver to send a new notification for every bound adapter, with // BrdgNotifyEnumerateAdapters as the notification type. // #define BRIDGE_IOCTL_GET_ADAPTERS CTL_CODE(FILE_DEVICE_NETWORK, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS) // // These codes retrieve the device name / friendly name for a bound adapter. Input buffer must be the adapter handle. // // As many bytes as possible of the name are read into the supplied buffer. If the buffer is not large enough, // the number of necessary bytes is returned as the number of written bytes. // #define BRIDGE_IOCTL_GET_ADAPT_DEVICE_NAME CTL_CODE(FILE_DEVICE_NETWORK, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS) #define BRIDGE_IOCTL_GET_ADAPT_FRIENDLY_NAME CTL_CODE(FILE_DEVICE_NETWORK, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS) // // This code retrieves the MAC address of the bridge component (which is different from the MAC address // of any particular adapter). // // The associated buffer must be at least ETH_LENGTH_OF_ADDRESS bytes long // #define BRIDGE_IOCTL_GET_MAC_ADDRESS CTL_CODE(FILE_DEVICE_NETWORK, 0x804, METHOD_BUFFERED, FILE_READ_ACCESS) // // This code retrieves packet statistics from the bridge // // Associated structure: BRIDGE_PACKET_STATISTICS // #define BRIDGE_IOCTL_GET_PACKET_STATS CTL_CODE(FILE_DEVICE_NETWORK, 0x805, METHOD_BUFFERED, FILE_READ_ACCESS) // // This code retrieves packet statistics for a particular adapter // // Associated structure: BRIDGE_ADAPTER_PACKET_STATISTICS // #define BRIDGE_IOCTL_GET_ADAPTER_PACKET_STATS CTL_CODE(FILE_DEVICE_NETWORK, 0x806, METHOD_BUFFERED, FILE_READ_ACCESS) // // This code retrieves buffer management statistics from the bridge // // Associated structure: BRIDGE_BUFFER_STATISTICS // #define BRIDGE_IOCTL_GET_BUFFER_STATS CTL_CODE(FILE_DEVICE_NETWORK, 0x807, METHOD_BUFFERED, FILE_READ_ACCESS) // // This code retrieves all forwarding table entries associated with the adapter whose handle // is given in the input buffer // // Data is output as an array of MAC addresses, each ETH_LENGTH_OF_ADDRESS bytes long. // If the provided buffer is too small to handle all entries, as many as possible are copied, the result // status is STATUS_BUFFER_OVERFLOW (a warning value) and the count of written bytes is actually the // required number of bytes to hold all table entries // #define BRIDGE_IOCTL_GET_TABLE_ENTRIES CTL_CODE(FILE_DEVICE_NETWORK, 0x80a, METHOD_BUFFERED, FILE_READ_ACCESS) // // STA IOCTLs // // // This code queries for the STA information for a particular adapter // // Input is an adapter handle. Output is the BRIDGE_STA_ADAPTER_INFO structure. // #define BRIDGE_IOCTL_GET_ADAPTER_STA_INFO CTL_CODE(FILE_DEVICE_NETWORK, 0x80b, METHOD_BUFFERED, FILE_READ_ACCESS) // // This code queries for global STA information // // No data is input. Output is the BRIDGE_STA_GLOBAL_INFO structure. // #define BRIDGE_IOCTL_GET_GLOBAL_STA_INFO CTL_CODE(FILE_DEVICE_NETWORK, 0x80c, METHOD_BUFFERED, FILE_READ_ACCESS)