/*++ Copyright (c) 1996 Microsoft Corporation Module Name: marspkt.h Abstract: Definitions for MARS packets. Revision History: Who When What -------- -------- ---------------------------------------------- arvindm 12-12-96 Created Notes: --*/ #ifndef _MARS_PKT__H #define _MARS_PKT__H #include "arppkt.h" #include // // LLC and OUI values for all (control and data) Multicast packets. // #define MC_LLC_SNAP_LLC0 ((UCHAR)0xAA) #define MC_LLC_SNAP_LLC1 ((UCHAR)0xAA) #define MC_LLC_SNAP_LLC2 ((UCHAR)0x03) #define MC_LLC_SNAP_OUI0 ((UCHAR)0x00) #define MC_LLC_SNAP_OUI1 ((UCHAR)0x00) #define MC_LLC_SNAP_OUI2 ((UCHAR)0x5E) // // "EtherType" (i.e. PID) values for MARS control and multicast data // #define AA_PKT_ETHERTYPE_MARS_CONTROL ((USHORT)0x003) #define AA_PKT_ETHERTYPE_MARS_CONTROL_NS ((USHORT)0x0300) #define AA_PKT_ETHERTYPE_MC_TYPE1 ((USHORT)0x001) // Type #1 data #define AA_PKT_ETHERTYPE_MC_TYPE1_NS ((USHORT)0x0100) // Type #1 data (Net format) #define AA_PKT_ETHERTYPE_MC_TYPE2 ((USHORT)0x004) // Type #2 data // // Address Family value for MARS control packets. // #define AA_MC_MARS_HEADER_AFN ((USHORT)0x000F) #define AA_MC_MARS_HEADER_AFN_NS ((USHORT)0x0F00) // // Common preamble for all packets: control, type #1 data and type #2 data. // This is the same as for ATMARP packets. The OUI bytes dictate whether // a packet is destined to a Unicast IP/ATM entity or to the Multicast IP/ATM // entity. // typedef AA_PKT_LLC_SNAP_HEADER AA_MC_MARS_PKT_HEADER; typedef AA_MC_MARS_PKT_HEADER UNALIGNED *PAA_MC_MARS_PKT_HEADER; // // Short form encapsulation for Type #1 Multicast data packets. // typedef struct _AA_MC_PKT_TYPE1_SHORT_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x001 USHORT cmi; // Cluster Member ID USHORT pro; // Protocol type } AA_MC_PKT_TYPE1_SHORT_HEADER; typedef AA_MC_PKT_TYPE1_SHORT_HEADER UNALIGNED *PAA_MC_PKT_TYPE1_SHORT_HEADER; // // Long form encapsulation for Type #1 Multicast data packets. // typedef struct _AA_MC_PKT_TYPE1_LONG_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x001 USHORT cmi; // Cluster Member ID USHORT pro; // Protocol type UCHAR snap[5]; UCHAR padding[3]; } AA_MC_PKT_TYPE1_LONG_HEADER; typedef AA_MC_PKT_TYPE1_LONG_HEADER UNALIGNED *PAA_MC_PKT_TYPE1_LONG_HEADER; // // Short form encapsulation for Type #2 Multicast data packets. // typedef struct _AA_MC_PKT_TYPE2_SHORT_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x004 UCHAR sourceID[8]; // Ignored USHORT pro; // Protocol type UCHAR padding[2]; } AA_MC_PKT_TYPE2_SHORT_HEADER; typedef AA_MC_PKT_TYPE2_SHORT_HEADER UNALIGNED *PAA_MC_PKT_TYPE2_SHORT_HEADER; // // Long form encapsulation for Type #2 Multicast data packets. // typedef struct _AA_MC_PKT_TYPE2_LONG_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x004 UCHAR sourceID[8]; // Ignored USHORT pro; // Protocol type UCHAR snap[5]; UCHAR padding[1]; } AA_MC_PKT_TYPE2_LONG_HEADER; typedef AA_MC_PKT_TYPE2_LONG_HEADER UNALIGNED *PAA_MC_PKT_TYPE2_LONG_HEADER; // // The Fixed header part of every MARS control packet. // typedef struct _AA_MARS_PKT_FIXED_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x003 USHORT afn; // Address Family (0x000F) UCHAR pro[7]; // Protocol Identification UCHAR hdrrsv[3]; // Reserved. USHORT chksum; // Checksum across entire MARS message USHORT extoff; // Extensions offset USHORT op; // Operation code UCHAR shtl; // Type & Length of source ATM number UCHAR sstl; // Type & Length of source ATM subaddress } AA_MARS_PKT_FIXED_HEADER; typedef AA_MARS_PKT_FIXED_HEADER UNALIGNED *PAA_MARS_PKT_FIXED_HEADER; // // MARS control packet types // #define AA_MARS_OP_TYPE_REQUEST ((USHORT)1) #define AA_MARS_OP_TYPE_MULTI ((USHORT)2) #define AA_MARS_OP_TYPE_JOIN ((USHORT)4) #define AA_MARS_OP_TYPE_LEAVE ((USHORT)5) #define AA_MARS_OP_TYPE_NAK ((USHORT)6) #define AA_MARS_OP_TYPE_GROUPLIST_REQUEST ((USHORT)10) #define AA_MARS_OP_TYPE_GROUPLIST_REPLY ((USHORT)11) #define AA_MARS_OP_TYPE_REDIRECT_MAP ((USHORT)12) #define AA_MARS_OP_TYPE_MIGRATE ((USHORT)13) // // Format of MARS JOIN and LEAVE message headers. // typedef struct _AA_MARS_JOIN_LEAVE_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x003 USHORT afn; // Address Family (0x000F) UCHAR pro[7]; // Protocol Identification UCHAR hdrrsv[3]; // Reserved. USHORT chksum; // Checksum across entire MARS message USHORT extoff; // Extensions offset USHORT op; // Operation code (JOIN/LEAVE) UCHAR shtl; // Type & Length of source ATM number UCHAR sstl; // Type & Length of source ATM subaddress UCHAR spln; // Source protocol address length UCHAR tpln; // Length of group address USHORT pnum; // Number of group address pairs USHORT flags; // LAYER3GRP, COPY and REGISTER bits USHORT cmi; // Cluster Member ID ULONG msn; // MARS Sequence Number } AA_MARS_JOIN_LEAVE_HEADER; typedef AA_MARS_JOIN_LEAVE_HEADER UNALIGNED *PAA_MARS_JOIN_LEAVE_HEADER; // // Bit definitions for flags in JOIN/LEAVE messages // #define AA_MARS_JL_FLAG_LAYER3_GROUP NET_SHORT((USHORT)0x8000) #define AA_MARS_JL_FLAG_COPY NET_SHORT((USHORT)0x4000) #define AA_MARS_JL_FLAG_REGISTER NET_SHORT((USHORT)0x2000) #define AA_MARS_JL_FLAG_PUNCHED NET_SHORT((USHORT)0x1000) #define AA_MARS_JL_FLAG_SEQUENCE_MASK NET_SHORT((USHORT)0x00ff) // // Format of MARS REQUEST and MARS NAK message header. // typedef struct _AA_MARS_REQ_NAK_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x003 USHORT afn; // Address Family (0x000F) UCHAR pro[7]; // Protocol Identification UCHAR hdrrsv[3]; // Reserved. USHORT chksum; // Checksum across entire MARS message USHORT extoff; // Extensions offset USHORT op; // Operation code (REQUEST/NAK) UCHAR shtl; // Type & Length of source ATM number UCHAR sstl; // Type & Length of source ATM subaddress UCHAR spln; // Source protocol address length UCHAR thtl; // Type & Length of target ATM number UCHAR tstl; // Type & Length of target ATM subaddress UCHAR tpln; // Length of target group address UCHAR pad[8]; } AA_MARS_REQ_NAK_HEADER; typedef AA_MARS_REQ_NAK_HEADER UNALIGNED *PAA_MARS_REQ_NAK_HEADER; // // Format of MARS MULTI message header. // typedef struct _AA_MARS_MULTI_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x003 USHORT afn; // Address Family (0x000F) UCHAR pro[7]; // Protocol Identification UCHAR hdrrsv[3]; // Reserved. USHORT chksum; // Checksum across entire MARS message USHORT extoff; // Extensions offset USHORT op; // Operation code (MULTI) UCHAR shtl; // Type & Length of source ATM number UCHAR sstl; // Type & Length of source ATM subaddress UCHAR spln; // Source protocol address length UCHAR thtl; // Type & Length of target ATM number UCHAR tstl; // Type & Length of target ATM subaddress UCHAR tpln; // Length of target group address USHORT tnum; // Number of target ATM addresses returned USHORT seqxy; // Boolean X and sequence number Y ULONG msn; // MARS Sequence Number } AA_MARS_MULTI_HEADER; typedef AA_MARS_MULTI_HEADER UNALIGNED *PAA_MARS_MULTI_HEADER; // // Format of MARS MIGRATE message header. // typedef struct _AA_MARS_MIGRATE_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x003 USHORT afn; // Address Family (0x000F) UCHAR pro[7]; // Protocol Identification UCHAR hdrrsv[3]; // Reserved. USHORT chksum; // Checksum across entire MARS message USHORT extoff; // Extensions offset USHORT op; // Operation code (MIGRATE) UCHAR shtl; // Type & Length of source ATM number UCHAR sstl; // Type & Length of source ATM subaddress UCHAR spln; // Source protocol address length UCHAR thtl; // Type & Length of target ATM number UCHAR tstl; // Type & Length of target ATM subaddress UCHAR tpln; // Length of target group address USHORT tnum; // Number of Target ATM addresses returned USHORT resv; // Reserved ULONG msn; // MARS Sequence Number } AA_MARS_MIGRATE_HEADER; typedef AA_MARS_MIGRATE_HEADER UNALIGNED *PAA_MARS_MIGRATE_HEADER; // // Format of MARS REDIRECT MAP message header. // typedef struct _AA_MARS_REDIRECT_MAP_HEADER { UCHAR LLC[3]; UCHAR OUI[3]; USHORT PID; // 0x003 USHORT afn; // Address Family (0x000F) UCHAR pro[7]; // Protocol Identification UCHAR hdrrsv[3]; // Reserved. USHORT chksum; // Checksum across entire MARS message USHORT extoff; // Extensions offset USHORT op; // Operation code (REDIRECT MAP) UCHAR shtl; // Type & Length of source ATM number UCHAR sstl; // Type & Length of source ATM subaddress UCHAR spln; // Source protocol address length UCHAR thtl; // Type & Length of target ATM number UCHAR tstl; // Type & Length of target ATM subaddress UCHAR redirf; // Flag controlling redirect behaviour USHORT tnum; // Number of MARS addresses returned USHORT seqxy; // Boolean flag x and seq number y ULONG msn; // MARS Sequence Number } AA_MARS_REDIRECT_MAP_HEADER; typedef AA_MARS_REDIRECT_MAP_HEADER UNALIGNED *PAA_MARS_REDIRECT_MAP_HEADER; // // Bit assignments for Boolean flag X and sequence number Y in // "seqxy" fields in MARS messages. // #define AA_MARS_X_MASK ((USHORT)0x8000) #define AA_MARS_Y_MASK ((USHORT)0x7fff) // // Initial value for sequence number Y // #define AA_MARS_INITIAL_Y ((USHORT)1) // // Structure of a MARS packet extension element (TLV = Type, Length, Value) // typedef struct _AA_MARS_TLV_HDR { USHORT Type; USHORT Length; // Number of significant octets in Value } AA_MARS_TLV_HDR; typedef AA_MARS_TLV_HDR UNALIGNED *PAA_MARS_TLV_HDR; // // Our experimental TLV that we use in MARS MULTI messages to // indicate that the returned target address is that of an MCS. // typedef struct _AA_MARS_TLV_MULTI_IS_MCS { AA_MARS_TLV_HDR; } AA_MARS_TLV_MULTI_IS_MCS; typedef AA_MARS_TLV_MULTI_IS_MCS UNALIGNED *PAA_MARS_TLV_MULTI_IS_MCS; #define AAMC_TLVT_MULTI_IS_MCS ((USHORT)0x3a00) // // Type of a NULL TLV // #define AAMC_TLVT_NULL ((USHORT)0x0000) // // Bit definitions for the Type field in a MARS TLV. // // // The Least significant 14 bits indicate the actual type. // #define AA_MARS_TLV_TYPE_MASK ((USHORT)0x3fff) // // The most significant 2 bits define the action to be taken // when we receive a TLV type that we don't recognize. // #define AA_MARS_TLV_ACTION_MASK ((USHORT)0xc000) #define AA_MARS_TLV_TA_SKIP ((USHORT)0x0000) #define AA_MARS_TLV_TA_STOP_SILENT ((USHORT)0x1000) #define AA_MARS_TLV_TA_STOP_LOG ((USHORT)0x2000) #define AA_MARS_TLV_TA_RESERVED ((USHORT)0x3000) #include // // TLV List, internal representation. This stores information about // all TLVs sent/received in a packet. For each TLV, there is a // BOOLEAN that says whether it is present or not. // typedef struct _AA_MARS_TLV_LIST { // // MULTI_IS_MCS TLV: // BOOLEAN MultiIsMCSPresent; BOOLEAN MultiIsMCSValue; // // Add other TLVs... // } AA_MARS_TLV_LIST, *PAA_MARS_TLV_LIST; /*++ BOOLEAN AAMC_PKT_IS_TYPE1_DATA( IN PAA_MC_PKT_TYPE1_SHORT_HEADER pH ) --*/ #define AAMC_PKT_IS_TYPE1_DATA(pH) \ (((pH)->LLC[0] == MC_LLC_SNAP_LLC0) && \ ((pH)->LLC[1] == MC_LLC_SNAP_LLC1) && \ ((pH)->LLC[2] == MC_LLC_SNAP_LLC2) && \ ((pH)->OUI[0] == MC_LLC_SNAP_OUI0) && \ ((pH)->OUI[1] == MC_LLC_SNAP_OUI1) && \ ((pH)->OUI[2] == MC_LLC_SNAP_OUI2) && \ ((pH)->PID == NET_SHORT(AA_PKT_ETHERTYPE_MC_TYPE1)) && \ ((pH)->pro == NET_SHORT(AA_PKT_ETHERTYPE_IP))) /*++ BOOLEAN AAMC_PKT_IS_TYPE2_DATA( IN PAA_MC_PKT_TYPE2_SHORT_HEADER pH ) --*/ #define AAMC_PKT_IS_TYPE2_DATA(pH) \ (((pH)->LLC[0] == MC_LLC_SNAP_LLC0) && \ ((pH)->LLC[1] == MC_LLC_SNAP_LLC1) && \ ((pH)->LLC[2] == MC_LLC_SNAP_LLC2) && \ ((pH)->OUI[0] == MC_LLC_SNAP_OUI0) && \ ((pH)->OUI[1] == MC_LLC_SNAP_OUI1) && \ ((pH)->OUI[2] == MC_LLC_SNAP_OUI2) && \ ((pH)->PID == NET_SHORT(AA_PKT_ETHERTYPE_MC_TYPE2)) && \ ((pH)->pro == NET_SHORT(AA_PKT_ETHERTYPE_IP))) /*++ BOOLEAN AAMC_PKT_IS_CONTROL( IN PAA_MARS_PKT_FIXED_HEADER pH ) --*/ #define AAMC_PKT_IS_CONTROL(pH) \ (((pH)->LLC[0] == MC_LLC_SNAP_LLC0) && \ ((pH)->LLC[1] == MC_LLC_SNAP_LLC1) && \ ((pH)->LLC[2] == MC_LLC_SNAP_LLC2) && \ ((pH)->OUI[0] == MC_LLC_SNAP_OUI0) && \ ((pH)->OUI[1] == MC_LLC_SNAP_OUI1) && \ ((pH)->OUI[2] == MC_LLC_SNAP_OUI2) && \ ((pH)->PID == NET_SHORT(AA_PKT_ETHERTYPE_MARS_CONTROL))) /*++ USHORT AAMC_GET_TLV_TYPE( IN USHORT _Type ) --*/ #define AAMC_GET_TLV_TYPE(_Type) NET_TO_HOST_SHORT((_Type) & AA_MARS_TLV_TYPE_MASK) /*++ USHORT AAMC_GET_TLV_ACTION( IN USHORT _Type ) --*/ #define AAMC_GET_TLV_ACTION(_Type) NET_TO_HOST_SHORT((_Type) & AA_MARS_TLV_ACTION_MASK) /*++ SHORT AAMC_GET_TLV_TOTAL_LENGTH( IN SHORT _TlvLength ) Given the value stored in the Length field of a TLV, return the total (rounded-off) length of the TLV. This is just the length of the TLV header plus the given length rounded off to the nearest multiple of 4. --*/ #define AAMC_GET_TLV_TOTAL_LENGTH(_TlvLength) \ (sizeof(AA_MARS_TLV_HDR) + \ (_TlvLength) + \ ((4 - ((_TlvLength) & 3)) % 4)) /*++ BOOLEAN AAMC_IS_NULL_TLV( IN PAA_MARS_TLV_HDR _pTlv ) Return TRUE iff the given TLV is a NULL TLV, meaning end of list. --*/ #define AAMC_IS_NULL_TLV(_pTlv) \ (((_pTlv)->Type == 0x0000) && ((_pTlv)->Length == 0x0000)) #endif _MARS_PKT__H