windows-nt/Source/XPSP1/NT/net/rras/ip/igmp/packet.h
2020-09-26 16:20:57 +08:00

268 lines
6.1 KiB
C

//=============================================================================
// Copyright (c) 1997 Microsoft Corporation
//
// File: packet.c
//
// Abstract:
// This module contains declarations for packet.c
//
// Author: K.S.Lokesh (lokeshs@) 11-1-97
//
// Revision History:
//=============================================================================
#ifndef _PACKET_H_
#define _PACKET_H_
DWORD
SendPacket (
PIF_TABLE_ENTRY pite,
PGI_ENTRY pgie,
DWORD PacketType, //MSG_GEN_QUERY, MSG_GROUP_QUERY_V2(v3),SOURCES_Q
DWORD Group //destination McastGrp
);
DWORD
JoinMulticastGroup (
SOCKET Sock,
DWORD dwGroup,
DWORD IfIndex,
DWORD dwIpAddr,
IPADDR Source
);
DWORD
LeaveMulticastGroup (
SOCKET Sock,
DWORD dwGroup,
DWORD IfIndex,
DWORD dwIpAddr,
IPADDR Source
);
DWORD
BlockSource (
SOCKET Sock,
DWORD dwGroup,
DWORD IfIndex,
IPADDR IpAddr,
IPADDR Source
);
DWORD
UnBlockSource (
SOCKET Sock,
DWORD dwGroup,
DWORD IfIndex,
IPADDR IpAddr,
IPADDR Source
);
DWORD
McastSetTtl(
SOCKET sock,
UCHAR ttl
);
//
// packet context struct
//
typedef struct _PACKET_CONTEXT {
DWORD IfIndex;
DWORD DstnMcastAddr;
DWORD InputSrc;
DWORD Length;
DWORD Flags;
BYTE Packet[1];
} PACKET_CONTEXT, *PPACKET_CONTEXT;
#define CREATE_PACKET_CONTEXT(ptr, pktLen, Error) {\
ptr = IGMP_ALLOC(sizeof(PACKET_CONTEXT)+(pktLen)-1,0xa0000,0xaaaa);\
if (ptr==NULL) { \
Error = GetLastError(); \
Trace2(ANY, "Error %d allocating %d bytes for Work context", \
Error, sizeof(PACKET_CONTEXT)+(pktLen)-1); \
Logerr0(HEAP_ALLOC_FAILED, Error); \
} \
}
#pragma pack(1)
// Structure of an IGMP header.
typedef struct _IGMP_HEADER {
UCHAR Vertype; // Type of igmp message
UCHAR ResponseTime; // max. resp. time for igmpv2 messages; will be 0
USHORT Xsum;
union {
DWORD Group;
struct {
USHORT Reserved;
USHORT NumGroupRecords;
};
};
} IGMP_HEADER, *PIGMP_HEADER;
#define MIN_PACKET_SIZE sizeof(IGMP_HEADER)
#define INPUT_PACKET_SZ 1000
#define IPVERSION 4
typedef struct _IGMP_HEADER_V3_EXT {
BYTE QRV :3;
BYTE SFlag :1;
BYTE Reserved :4;
BYTE QQIC;
USHORT NumSources;
IPADDR Sources[0];
} IGMP_HEADER_V3_EXT, *PIGMP_HEADER_V3_EXT;
#define GET_QQIC_FROM_CODE(qqic) qqic <= 127? qqic : ((qqic&0x0f) + 16) << ((qqic&0x70) + 3)
//
// GROUP_RECORD
//
typedef struct _GROUP_RECORD {
UCHAR RecordType;
UCHAR AuxDataLength;
USHORT NumSources;
IPADDR Group;
IPADDR Sources[0];
} GROUP_RECORD, *PGROUP_RECORD;
#define GET_GROUP_RECORD_SIZE(pGroupRecord) \
(pGroupRecord->NumSources+2)*sizeof(IPADDR))
#define GET_FIRST_GROUP_RECORD(pHdr) \
(PGROUP_RECORD)((PCHAR)(pHdr)+MIN_PACKET_SIZE)
#define GET_NEXT_GROUP_RECORD(pGroupRecord) \
((PGROUP_RECORD) ((UCHAR)pGroupRecord + \
GET_GROUP_RECORD_SIZE(pGroupRecord)))
#define IS_IN 1
#define IS_EX 2
#define TO_IN 3
#define TO_EX 4
#define ALLOW 5
#define BLOCK 6
typedef struct _IP_HEADER {
UCHAR Hl; // Version and length.
UCHAR Tos; // Type of service.
USHORT Len; // Total length of datagram.
USHORT Id; // Identification.
USHORT Offset; // Flags and fragment offset.
UCHAR Ttl; // Time to live.
UCHAR Protocol; // Protocol.
USHORT Xsum; // Header checksum.
struct in_addr Src; // Source address.
struct in_addr Dstn; // Destination address.
} IP_HEADER, *PIP_HEADER;
#pragma pack()
//
// MACROS
//
//
// message types// work types
//
#define MSG_GEN_QUERY 1
#define MSG_GROUP_QUERY_V2 2
#define MSG_REPORT 3
#define MSG_LEAVE 4
#define MSG_SOURCES_QUERY 5
#define MSG_GROUP_QUERY_V3 6
#define DELETE_MEMBERSHIP 11
#define DELETE_SOURCE 12
#define SHIFT_TO_V3 13
#define MOVE_SOURCE_TO_EXCL 14
#define PROXY_PRUNE 100
#define PROXY_JOIN 101
//
// igmp type field
//
#define IGMP_QUERY 0x11 //Membership query
#define IGMP_REPORT_V1 0x12 //Version 1 membership report
#define IGMP_REPORT_V2 0x16 //Version 2 membership report
#define IGMP_LEAVE 0x17 //Leave Group
#define IGMP_REPORT_V3 0x22 //Version 3 membership report
//
// igmp version
//
#define IGMPV1 2 //IGMP version 1
#define IGMPV2 3 //IGMP version 2
//
// igmp multicast groups
//
#define ALL_HOSTS_MCAST 0x010000E0
#define ALL_ROUTERS_MCAST 0x020000E0
#define ALL_IGMP_ROUTERS_MCAST 0x160000E0
//
// message macros
//
#define SEND_GEN_QUERY(pite) \
SendPacket(pite, NULL, MSG_GEN_QUERY, 0)
#define SEND_GROUP_QUERY_V2(pite, Group) \
SendPacket(pite, NULL, MSG_GROUP_QUERY_V2, Group)
#define SEND_GROUP_QUERY_V3(pite, pgie, Group) \
SendPacket(pite, pgie, MSG_GROUP_QUERY_V3, Group)
#define SEND_SOURCES_QUERY(pgie) \
SendPacket((pgie)->pIfTableEntry, pgie, MSG_SOURCES_QUERY, (pgie)->pGroupTableEntry->Group)
// 224.0.0.0 < group <240.0.0.0
//
#define IS_MCAST_ADDR(Group) \
( (0x000000E0!=(Group)) \
&& (0x000000E0 <= ((Group)&0x000000FF) ) \
&& (0x000000F0 > ((Group)&0x000000FF) ) )
//
// is the group 224.0.0.x
//
#define LOCAL_MCAST_GROUP(Group) \
(((Group)&0x00FFFFFF) == 0x000000E0)
#define SSM_MCAST_GROUP(Group) \
(((Group)&0x000000FF) == 0x000000E8)
USHORT
xsum(
PVOID Buffer,
INT Size
);
#endif //_PACKET_H_