/*++ 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 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_