windows-nt/Source/XPSP1/NT/net/atm/arp/atmarps/mars.h

424 lines
12 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1992-1996 Microsoft Corporation
Module Name:
mars.h
Abstract:
This file contains the definitions for Multicast Address Resolution Server (MARS).
Author:
Jameel Hyder (jameelh@microsoft.com) January 1997
Environment:
Kernel mode
Revision History:
--*/
#ifndef _MARS_
#define _MARS_
//
// IP Address values that can be used in comparisons:
//
#define MIN_CLASSD_IPADDR_VALUE ((IPADDR)0xE0000000) // 224.0.0.0
#define MAX_CLASSD_IPADDR_VALUE ((IPADDR)0xEFFFFFFF) // 239.255.255.255
#define IP_BROADCAST_ADDR_VALUE ((IPADDR)0xFFFFFFFF) // 255.255.255.255
//
// IP Address value we use to represent the "full multicast+broadcast range"
//
#define IPADDR_FULL_RANGE ((IPADDR)0x00000000)
//
// MARS_OP - Define these in network byte order
//
#define OP_MARS_REQUEST 0x0100
#define OP_MARS_MULTI 0x0200
#define OP_MARS_MSERV 0x0300
#define OP_MARS_JOIN 0x0400
#define OP_MARS_LEAVE 0x0500
#define OP_MARS_NAK 0x0600
#define OP_MARS_UNSERV 0x0700
#define OP_MARS_SJOIN 0x0800
#define OP_MARS_SLEAVE 0x0900
#define OP_MARS_MIGRATE 0x0D00
#define OP_MARS_GROUPLIST_REQUEST 0x0000
#define OP_MARS_GROUPLIST_REPLY 0x0000
#define OP_MARS_REDIRECT_MAP 0x0C00
#define MARS_HWTYPE 0x0F00
#define LAST_MULTI_FLAG 0x8000
//
// The layout of a MARS_JOIN and MARS_LEAVE request packets
//
typedef struct _MARS_HDR
{
LLC_SNAP_HDR LlcSnapHdr; // LLC SNAP Header
USHORT HwType; // Must be 0x0F00 (0x000F on the wire)
USHORT Protocol; // 16 bits
UCHAR ProtocolSnap[5]; // 40 bits
UCHAR Reserved[3]; // 24-bits
USHORT CheckSum;
USHORT ExtensionOffset;
USHORT Opcode; // MARS_XXX above
ATM_ADDR_TL SrcAddressTL;
ATM_ADDR_TL SrcSubAddrTL;
//
// This is followed by variable length fields and is dictated by the value of Opcode.
// The structures below define fixed part of individual MARS_XXX messages. The variable
// part of each of these depends on the TL fields.
//
} MARS_HEADER, *PMARS_HEADER;
//
// Defines the structure of the MARS_REQUEST, MARS_MULTI, MARS_MIGRATE and MARS_NAK messages
//
typedef struct _MARS_REQUEST
{
MARS_HEADER;
UCHAR SrcProtoAddrLen; // Src protocol addr length
ATM_ADDR_TL TgtAddressTL;
ATM_ADDR_TL TgtSubAddrTL;
UCHAR TgtGroupAddrLen; // Target protocol addr length
union
{
UCHAR Padding[8]; // For MARS_REQUEST and MARS_NAK
struct
{ // For MARS_MULTI and MARS_MIGRATE
USHORT NumTgtGroupAddr; // Should be converted to wire-format
union
{
USHORT FlagSeq; // Should be converted to wire-format
USHORT Reservedx; // For MARS_MIGRATE
};
ULONG SequenceNumber; // Should be converted to wire-format
};
};
} MARS_REQUEST, MARS_MULTI, MARS_NAK, *PMARS_REQUEST, *PMARS_MULTI, *PMARS_NAK;
typedef struct _MCAST_ADDR_PAIR
{
IPADDR MinAddr;
IPADDR MaxAddr;
} MCAST_ADDR_PAIR, *PMCAST_ADDR_PAIR;
//
// Defines the structure of the MARS_JOIN and MARS_LEAVE messages
//
typedef struct _MARS_JOIN_LEAVE
{
MARS_HEADER;
UCHAR SrcProtoAddrLen; // Src protocol addr length
UCHAR GrpProtoAddrLen; // Grp protocol addr length
USHORT NumGrpAddrPairs; // # of group address pairs
// Should be converted to wire-format
USHORT Flags; // layer 3 frp copy & register flags
// Should be converted to wire-format
USHORT ClusterMemberId; // Should be converted to wire-format
ULONG MarsSequenceNumber; // Should be converted to wire-format
//
// This is followed by Src ATM address/sub-address, src protocol address and N pairs of multicast addresses
//
} MARS_JOIN_LEAVE, *PMARS_JOIN_LEAVE;
//
// Definitions of flags masks
//
#define JL_FLAGS_L3GRP 0x8000
#define JL_FLAGS_COPY 0x4000
#define JL_FLAGS_REGISTER 0x2000
#define JL_FLAGS_PUNCHED 0x1000
#define JL_FLAGS_RESERVED 0x0F00
#define JL_FLAGS_SEQUENCE 0x00FF
//
// Defines the structure of the MARS_GROUPLIST_REQUEST and MARS_GROUPLIST_REPLY messages
//
typedef struct _MARS_GROUPLIST_REPLY
{
MARS_HEADER;
UCHAR SrcProtoAddrLen; // Src protocol addr length
UCHAR Reserved1;
UCHAR Reserved2;
UCHAR TgtGroupAddrLen; // Target protocol addr length
USHORT NumTgtGroupAddr; // Should be converted to wire-format
USHORT FlagSeq; // Should be converted to wire-format
ULONG SequenceNumber; // Should be converted to wire-format
} MARS_GROUPLIST_REPLY, *PMARS_GROUPLIST_REPLY;
//
// Defines the structure of the MARS_REDIRECT_MAP messages
//
typedef struct _MARS_REDIRECT_MAP
{
MARS_HEADER;
UCHAR SrcProtoAddrLen; // Src protocol addr length
ATM_ADDR_TL TgtAddressTL;
ATM_ADDR_TL TgtSubAddrTL;
UCHAR Flags;
USHORT NumTgtAddr; // Should be converted to wire-format
USHORT FlagSeq; // Should be converted to wire-format
ULONG SequenceNumber; // Should be converted to wire-format
} MARS_REDIRECT_MAP, *PMARS_REDIRECT_MAP;
//
// Defines the structure of a MARS TLV header
//
typedef struct _MARS_TLV_HEADER
{
USHORT Type;
USHORT Length;
} MARS_TLV_HEADER;
typedef MARS_TLV_HEADER UNALIGNED * PMARS_TLV_HEADER;
//
// Defines the structure of a MARS MULTI is MCS header. This TLV is appended
// to any MULTI message we send out with our address as the MCS address.
//
typedef struct _MARS_TLV_MULTI_IS_MCS
{
MARS_TLV_HEADER;
} MARS_TLV_MULTI_IS_MCS;
typedef MARS_TLV_MULTI_IS_MCS UNALIGNED * PMARS_TLV_MULTI_IS_MCS;
//
// TLV Type value for MULTI is MCS TLV.
//
#define MARS_TLVT_MULTI_IS_MCS 0x003a // on-the-wire form
//
// Defines the structure of a NULL TLV, which is used to terminate
// a list of TLVs.
//
typedef struct _MARS_TLV_NULL
{
MARS_TLV_HEADER;
} MARS_TLV_NULL;
typedef MARS_TLV_NULL UNALIGNED * PMARS_TLV_NULL;
//
// Forward references
//
struct _CLUSTER_MEMBER ;
struct _GROUP_MEMBER ;
struct _MARS_ENTRY ;
struct _MCS_ENTRY ;
struct _MARS_VC ;
//
// This represents a cluster-member, or an endstation that has registered
// with MARS. A single cluster-member can be associated with many groups.
//
typedef struct _CLUSTER_MEMBER
{
ENTRY_HDR; // Must be the first entry
HW_ADDR HwAddr; // HWADDR MUST FOLLOW ENTRY_HDR
PINTF pIntF; // Back pointer to the interface
USHORT Flags;
USHORT CMI; // Cluster-Member-Id
NDIS_HANDLE NdisPartyHandle; // Leaf-node for ClusterControlVc
struct _GROUP_MEMBER * pGroupList; // List of groups this CM has JOINed
// This is sorted in ascending order
// of Group Address
INT NumGroups; // Size of above list
} CLUSTER_MEMBER, *PCLUSTER_MEMBER;
#define NULL_PCLUSTER_MEMBER ((PCLUSTER_MEMBER)NULL)
#define CM_CONN_FLAGS 0x000f
#define CM_CONN_IDLE 0x0000 // No connection
#define CM_CONN_SETUP_IN_PROGRESS 0x0001 // Sent MakeCall/AddParty
#define CM_CONN_ACTIVE 0x0002 // Participating in ClusterControlVc
#define CM_CONN_CLOSING 0x0004 // Sent CloseCall/DropParty
#define CM_INVALID 0x8000 // Invalidated entry
#define CM_GROUP_FLAGS 0x0010
#define CM_GROUP_ACTIVE 0x0000 // Ok to add groups
#define CM_GROUP_DISABLED 0x0010 // Don't add any more groups.
//
// This represents a member of a multicast address. There is one
// of this for every node that joins a class-D address. That is,
// this structure represents a <MulticastGroup, ClusterMember> relation.
//
typedef struct _GROUP_MEMBER
{
ENTRY_HDR; // Must be the first entry
struct _MARS_ENTRY * pMarsEntry; // Pointer to group info
PCLUSTER_MEMBER pClusterMember; // Cluster Member Joining this group
struct _GROUP_MEMBER * pNextGroup; // Next group this CM has JOINed
ULONG Flags;
} GROUP_MEMBER, *PGROUP_MEMBER;
#define NULL_PGROUP_MEMBER ((PGROUP_MEMBER)NULL)
//
// This represents a multi-cast IP address. These are linked to the IntF.
// It contains a list of all cluster members who have Joined the group
// identified by the address.
//
// A special entry is one with IPAddress set to 0. This entry is used to
// represent the "All multicast and broadcast" range. Cluster Members who
// Join this range are linked here.
//
typedef struct _MARS_ENTRY
{
ENTRY_HDR; // Must be the first entry
IPADDR IPAddress; // Class D IP Addr (0 means entire
// multicast+broadcast range)
PGROUP_MEMBER pMembers; // List of group-members (Join list)
UINT NumMembers; // Size of above list
PINTF pIntF; // Back pointer to the interface
} MARS_ENTRY, *PMARS_ENTRY;
#define NULL_PMARS_ENTRY ((PMARS_ENTRY)NULL)
//
// This is used to represent an address range served by MCS. These
// structures are linked to the IntF.
//
typedef struct _MCS_ENTRY
{
ENTRY_HDR; // Must be the first entry
MCAST_ADDR_PAIR GrpAddrPair; // The range served by MCS
PINTF pIntF; // Back pointer to the interface
} MCS_ENTRY, *PMCS_ENTRY;
#define NULL_PMCS_ENTRY ((PMCS_ENTRY)NULL)
//
// This represents a PMP uni-directional VC. MARS creates one for
// ClusterControl and one for ServerControl (if and when external MCS'
// are supported).
//
typedef struct _MARS_VC
{
ULONG VcType;
ULONG Flags;
LONG RefCount;
NDIS_HANDLE NdisVcHandle;
UINT NumParties;
PINTF pIntF;
} MARS_VC, *PMARS_VC;
#define NULL_PMARS_VC ((PMARS_VC)NULL)
#define MVC_CONN_FLAGS 0x0000000f
#define MVC_CONN_IDLE 0x00000000
#define MVC_CONN_SETUP_IN_PROGRESS 0x00000001 // Sent MakeCall
#define MVC_CONN_ACTIVE 0x00000002 // MakeCall success
#define MVC_CONN_NEED_CLOSE 0x00000004 // Need to CloseCall when the penultimate
// party is gone
#define MVC_CONN_CLOSING 0x00000008 // Sent CloseCall
#define MVC_CONN_CLOSE_RECEIVED 0x00000010 // Seen IncomingCloseCall
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a, b) (((a) > (b)) ? (b) : (a))
#endif
//
// Be a little generous and use 256 as space for incoming requests
//
#if 0
#define PKT_SPACE MAX(sizeof(ARPS_HEADER) + sizeof(ARPS_VAR_HDR), \
sizeof(MARS_REQUEST) + sizeof(ARPS_VAR_HDR))
#else
#define PKT_SPACE 256
#endif
#define BYTES_TO_CELLS(_b) ((_b)/48)
//
// Rounded-off size of generic Q.2931 IE header
//
#define ROUND_OFF(_size) (((_size) + 3) & ~0x4)
#define SIZEOF_Q2931_IE ROUND_OFF(sizeof(Q2931_IE))
#define SIZEOF_AAL_PARAMETERS_IE ROUND_OFF(sizeof(AAL_PARAMETERS_IE))
#define SIZEOF_ATM_TRAFFIC_DESCR_IE ROUND_OFF(sizeof(ATM_TRAFFIC_DESCRIPTOR_IE))
#define SIZEOF_ATM_BBC_IE ROUND_OFF(sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE))
#define SIZEOF_ATM_BLLI_IE ROUND_OFF(sizeof(ATM_BLLI_IE))
#define SIZEOF_ATM_QOS_IE ROUND_OFF(sizeof(ATM_QOS_CLASS_IE))
//
// Total space required for Information Elements in an outgoing call.
//
#define MARS_MAKE_CALL_IE_SPACE ( \
SIZEOF_Q2931_IE + SIZEOF_AAL_PARAMETERS_IE + \
SIZEOF_Q2931_IE + SIZEOF_ATM_TRAFFIC_DESCR_IE + \
SIZEOF_Q2931_IE + SIZEOF_ATM_BBC_IE + \
SIZEOF_Q2931_IE + SIZEOF_ATM_BLLI_IE + \
SIZEOF_Q2931_IE + SIZEOF_ATM_QOS_IE )
//
// Total space required for Information Elements in an outgoing AddParty.
//
#define MARS_ADD_PARTY_IE_SPACE ( \
SIZEOF_Q2931_IE + SIZEOF_AAL_PARAMETERS_IE + \
SIZEOF_Q2931_IE + SIZEOF_ATM_BLLI_IE )
//
// Some macros to set/get state
//
#define MARS_GET_CM_CONN_STATE(_pCm) ((_pCm)->Flags & CM_CONN_FLAGS)
#define MARS_SET_CM_CONN_STATE(_pCm, _St) \
{ (_pCm)->Flags = ((_pCm)->Flags & ~CM_CONN_FLAGS) | (_St); }
#define MARS_GET_CM_GROUP_STATE(_pCm) ((_pCm)->Flags & CM_GROUP_FLAGS)
#define MARS_SET_CM_GROUP_STATE(_pCm, _St) \
{ (_pCm)->Flags = ((_pCm)->Flags & ~CM_GROUP_FLAGS) | (_St); }
#define MARS_GET_VC_CONN_STATE(_pVc) ((_pVc)->Flags & MVC_CONN_FLAGS)
#define MARS_SET_VC_CONN_STATE(_pVc, _St) \
{ (_pVc)->Flags = ((_pVc)->Flags & ~MVC_CONN_FLAGS) | (_St); }
#endif // _MARS_