//=============================================================================
// Copyright (c) 1998 Microsoft Corporation
// File Name: packet.h
// Abstract:
//
// Author: K.S.Lokesh (lokeshs@)   1-1-98
//=============================================================================



//-----------------------------------------------------------------------------
// ASYNC_SOCKET_DATA structure is used to pass / receive back data from an
// asynchronous wait recv from call
//-----------------------------------------------------------------------------

typedef struct _ASYNC_SOCKET_DATA {

    OVERLAPPED      Overlapped;
    WSABUF          WsaBuf;

    SOCKADDR_IN     SrcAddress;
    DWORD           FromLen;
    DWORD           NumBytesReceived;
    DWORD           Flags;
    DWORD           Status;

    PIF_TABLE_ENTRY pite;               //pite is valid as long as recvFrom is pending
    
} ASYNC_SOCKET_DATA, *PASYNC_SOCKET_DATA;


#define PACKET_BUFFER_SIZE  4000


#pragma pack(1)

//-----------------------------------------------------------------------------
// DVMRP_HEADER
//-----------------------------------------------------------------------------

typedef struct _DVMRP_HEADER {

    UCHAR       Vertype;
    UCHAR       Code;
    USHORT      Xsum;
    USHORT      Reserved;
    UCHAR       MinorVersion;
    UCHAR       MajorVersion;

} DVMRP_HEADER, *PDVMRP_HEADER;


#define MIN_PACKET_SIZE     sizeof(DVMRP_HEADER)
#define IPVERSION           4


//-----------------------------------------------------------------------------
// IP_HEADER
//-----------------------------------------------------------------------------

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()


//
// prototypes
//

DWORD
JoinMulticastGroup (
    SOCKET    Sock,
    DWORD    Group,
    DWORD    IfIndex,
    IPADDR   IpAddr
    );

DWORD
PostAsyncRead(
    PIF_TABLE_ENTRY pite
    );

DWORD
McastSetTtl(
    SOCKET sock,
    UCHAR ttl
    );

VOID
ProcessAsyncReceivePacket(
    DWORD           ErrorCode,
    DWORD           NumBytesRecv,
    LPOVERLAPPED    pOverlapped
    );