268 lines
6.1 KiB
C
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_
|
|
|