/*++

Copyright (c) 1991  Microsoft Corporation

Module Name:

    ipinip\ioctl.h

Abstract:

    header for ioctl.c

Author:

    Amritansh Raghav

Revision History:

    AmritanR    Created

Notes:

--*/

//
// Notification events
//

typedef struct _PENDING_MESSAGE
{
    LIST_ENTRY          leMessageLink;

    IPINIP_NOTIFICATION inMsg;

}PENDING_MESSAGE, *PPENDING_MESSAGE;

//++
//
//  PPENDING_MESSAGE
//  AllocateMessage(
//      VOID
//      )
//
//  Allocate a Message blob 
//
//--

#define AllocateMessage()              \
            RtAllocate(NonPagedPool, sizeof(PENDING_MESSAGE), MESSAGE_TAG)

//++
//
//  VOID
//  FreeMessage(
//      PPENDING_MESSAGE   pMsg
//      )
//
//  Free a Message blob
//
//--

#define FreeMessage(n)     RtFree((n))

//
// List of pending Messages
//

LIST_ENTRY  g_lePendingMessageList;

//
// List of pending IRPs
//

LIST_ENTRY  g_lePendingIrpList;

NTSTATUS
AddTunnelInterface(
    IN  PIRP   pIrp,
    IN  ULONG  ulInLength,
    IN  ULONG  ulOutLength
    );

NTSTATUS
DeleteTunnelInterface(
    IN  PIRP   pIrp,
    IN  ULONG  ulInLength,
    IN  ULONG  ulOutLength
    );

NTSTATUS
SetTunnelInfo(
    IN  PIRP   pIrp,
    IN  ULONG  ulInLength,
    IN  ULONG  ulOutLength
    );

NTSTATUS
GetTunnelTable(
    IN  PIRP   pIrp,
    IN  ULONG  ulInLength,
    IN  ULONG  ulOutLength
    );

NTSTATUS
ProcessNotification(
    PIRP    pIrp,
    ULONG   ulInLength,
    ULONG   ulOutLength
    );

VOID
CancelNotificationIrp(
    PDEVICE_OBJECT  pDeviceObject,
    PIRP            pIrp
    );

VOID
CompleteNotificationIrp(
    PPENDING_MESSAGE    pMessage
    );

PADDRESS_BLOCK
GetAddressBlock(
    DWORD   dwAddress
    );

VOID
UpdateMtuAndReachability(
    PTUNNEL pTunnel
    );