424 lines
12 KiB
C
424 lines
12 KiB
C
/*++
|
|
|
|
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_
|
|
|