540 lines
15 KiB
C
540 lines
15 KiB
C
/********************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1990-2000 **/
|
|
/********************************************************************/
|
|
/* :ts=4 */
|
|
|
|
//** LLIPIF.H - Lower layer IP interface definitions.
|
|
//
|
|
// This file contains the definitions defining the interface between IP
|
|
// and a lower layer, such as ARP or SLIP.
|
|
|
|
/*
|
|
This file defines a new and improved IP to ARP Module interface definition and will replace llipif.h.
|
|
This will also retire the IOCTL method of registering ARP interfaces. The main points are:
|
|
|
|
- It simplifies setup such that the ARP Modules do not have their own bindings in addition to IP bindings.
|
|
- Lets ARP Modules expose multiple IP interfaces per binding.
|
|
- Adds version numbering for future compatibility.
|
|
- Adds Multi-send capability to ARP
|
|
- Lets ARP indicate a packet up in NDIS 4.0 style and IP hang onto the packet and avoid copying.
|
|
|
|
The flow today is:
|
|
------------------
|
|
|
|
ARP gets a bind indication from NDIS.
|
|
ARP calls IPAddInterface
|
|
IP calls ARP_REGISTER
|
|
|
|
The proposed flow is:
|
|
---------------------
|
|
|
|
ARP Registers itself with IP via IPRegisterARP(). The ARP is identified by its Name which is case insensitive.
|
|
|
|
IP gets a bind indication from NDIS. It opens the config section and read the ARP name. Empty name implies
|
|
built in ARP as usual.
|
|
IP calls ARP's bind handler passing in the config handle.
|
|
ARP then opens the adapter and adds one or more IP interfaces via IP_ADD_INTERFACE. For each of up-call ARP
|
|
passes in the config-handle for that interface to IP. In most cases it is the same handle which IP passed
|
|
to ARP. In case of multiple IP interfaces per adapter it is not.
|
|
Calls IPBindComplete() when done.
|
|
*/
|
|
|
|
#pragma once
|
|
#ifndef LLIPIF_INCLUDED
|
|
#define LLIPIF_INCLUDED
|
|
|
|
#define IP_ARP_BIND_VERSION 0x50000
|
|
|
|
//
|
|
// IP Interface routines called by the ARP interface.
|
|
//
|
|
typedef
|
|
void
|
|
(__stdcall *IPRcvRtn)(
|
|
IN void * IpInterfaceContext,
|
|
IN void * Data,
|
|
IN uint DataSize,
|
|
IN uint TotalSize,
|
|
IN NDIS_HANDLE LinkContext1,
|
|
IN uint LinkContext2,
|
|
IN uint Bcast,
|
|
IN void * LinkCtxt
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *IPRcvPktRtn)(
|
|
void *,
|
|
void *,
|
|
uint ,
|
|
uint ,
|
|
NDIS_HANDLE ,
|
|
uint,
|
|
uint,
|
|
uint,
|
|
PMDL,
|
|
uint *,
|
|
void *
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *IPRcvCmpltRtn)(void);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *IPTxCmpltRtn)(
|
|
IN void * IpInterfaceContext,
|
|
IN PNDIS_PACKET Packet,
|
|
IN NDIS_STATUS CompletionStatus
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *IPTDCmpltRtn)(
|
|
IN void * IpInterfaceContext,
|
|
PNDIS_PACKET DestinationPacket,
|
|
NDIS_STATUS Status,
|
|
uint BytesCopied
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *IPStatusRtn)(
|
|
IN void * IpInterfaceContext,
|
|
IN uint StatusCode,
|
|
IN void * Buffer,
|
|
IN uint BufferSize,
|
|
IN void * LinkCtxt
|
|
);
|
|
|
|
typedef
|
|
NDIS_STATUS
|
|
(__stdcall *IP_PNP)(
|
|
IN void * IpInterfaceContext,
|
|
IN PNET_PNP_EVENT NetPnPEvent
|
|
);
|
|
typedef
|
|
void
|
|
(__stdcall *IPAddAddrCmpltRtn)(
|
|
IN IPAddr Address,
|
|
IN void *Context,
|
|
IN IP_STATUS Status
|
|
);
|
|
|
|
typedef struct _IP_HANDLERS
|
|
{
|
|
IPRcvRtn IpRcvHandler;
|
|
IPRcvCmpltRtn IpRcvCompleteHandler;
|
|
IPTxCmpltRtn IpTxCompleteHandler;
|
|
IPTDCmpltRtn IpTransferCompleteHandler;
|
|
IPStatusRtn IpStatusHandler;
|
|
IP_PNP IpPnPHandler;
|
|
IPRcvPktRtn IpRcvPktHandler;
|
|
IPAddAddrCmpltRtn IpAddAddrCompleteRtn; // called when arp detects address conflicts.
|
|
} IP_HANDLERS, *PIP_HANDLERS;
|
|
|
|
|
|
|
|
#define LLIP_ADDR_LOCAL 0
|
|
#define LLIP_ADDR_MCAST 1
|
|
#define LLIP_ADDR_BCAST 2
|
|
#define LLIP_ADDR_PARP 4
|
|
|
|
//
|
|
// ARP Handlers passed to IP when IP_ADD_INTERFACE is called.
|
|
//
|
|
typedef
|
|
NDIS_STATUS
|
|
(__stdcall *ARP_TRANSMIT)(
|
|
IN void * ARPInterfaceContext,
|
|
#ifdef NT
|
|
IN PNDIS_PACKET * PacketArray,
|
|
IN uint NumberOfPackets,
|
|
#else
|
|
IN PNDIS_PACKET Packet,
|
|
#endif
|
|
IN IPAddr IpAddr,
|
|
IN RouteCacheEntry * Rce OPTIONAL,
|
|
IN void * ArpCtxt
|
|
);
|
|
|
|
typedef
|
|
NDIS_STATUS
|
|
(__stdcall *ARP_TRANSFER)(
|
|
IN void * ARPInterfaceContext,
|
|
IN NDIS_HANDLE TransferContext,
|
|
IN uint HdrOffset,
|
|
IN uint ProtocolOffset,
|
|
IN uint BytesNeeded,
|
|
IN PNDIS_PACKET DestinationPacket,
|
|
OUT uint * BytesCopied
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *ARP_RETURN_PKT)(
|
|
IN void * ARPInterfaceContext,
|
|
IN PNDIS_PACKET Packet
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *ARP_CLOSE)(
|
|
IN void * ArpInterfaceContext
|
|
);
|
|
|
|
typedef
|
|
uint
|
|
(__stdcall *ARP_ADDADDR)(
|
|
IN void * ArpInterfaceContext,
|
|
IN uint AddressType,
|
|
IN IPAddr IpAddress,
|
|
IN IPMask IpMask,
|
|
IN void * Context
|
|
);
|
|
|
|
typedef
|
|
uint
|
|
(__stdcall *ARP_DELADDR)(
|
|
IN void * ArpInterfaceContext,
|
|
IN uint AddressType,
|
|
IN IPAddr IpAddress,
|
|
IN IPMask IpMask
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *ARP_INVALIDATE)(
|
|
IN void * ArpInterfaceContext,
|
|
IN RouteCacheEntry * Rce
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *ARP_OPEN)(
|
|
IN void * ArpInterfaceContext
|
|
);
|
|
|
|
typedef
|
|
int
|
|
(__stdcall *ARP_QINFO)(
|
|
IN void * ArpInterfaceContext,
|
|
IN struct TDIObjectID * pId,
|
|
IN PNDIS_BUFFER Buffer,
|
|
IN OUT uint * BufferSize,
|
|
IN void * QueryContext
|
|
);
|
|
|
|
typedef
|
|
int
|
|
(__stdcall *ARP_SETINFO)(
|
|
IN void * ArpInterfaceContext,
|
|
IN struct TDIObjectID * pId,
|
|
IN void * Buffer,
|
|
IN uint BufferSize
|
|
);
|
|
|
|
typedef
|
|
int
|
|
(__stdcall *ARP_GETELIST)(
|
|
IN void * ArpInterfaceContext,
|
|
IN void * pEntityList,
|
|
IN OUT PUINT pEntityListSize
|
|
);
|
|
|
|
typedef
|
|
NDIS_STATUS
|
|
(__stdcall *ARP_DONDISREQ)(
|
|
IN void * ArpInterfaceContext,
|
|
IN NDIS_REQUEST_TYPE RT,
|
|
IN NDIS_OID OID,
|
|
IN void * Info,
|
|
IN uint Length,
|
|
IN uint * Needed,
|
|
IN BOOLEAN Blocking
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *ARP_CANCEL)(
|
|
IN void * ArpInterfaceContext,
|
|
IN void * CancelCtxt
|
|
);
|
|
|
|
//
|
|
// Structure of information returned from ARP register call.
|
|
//
|
|
struct LLIPBindInfo {
|
|
PVOID lip_context; // LL context handle.
|
|
uint lip_mss; // Maximum segment size.
|
|
uint lip_speed; // Speed of this i/f.
|
|
uint lip_index; // Interface index ID.
|
|
uint lip_txspace; // Space required in the packet header for ARP use
|
|
ARP_TRANSMIT lip_transmit;
|
|
ARP_TRANSFER lip_transfer;
|
|
ARP_RETURN_PKT lip_returnPkt;
|
|
ARP_CLOSE lip_close;
|
|
ARP_ADDADDR lip_addaddr;
|
|
ARP_DELADDR lip_deladdr;
|
|
ARP_INVALIDATE lip_invalidate;
|
|
ARP_OPEN lip_open;
|
|
ARP_QINFO lip_qinfo;
|
|
ARP_SETINFO lip_setinfo;
|
|
ARP_GETELIST lip_getelist;
|
|
ARP_DONDISREQ lip_dondisreq;
|
|
uint lip_flags; // Flags for this interface.
|
|
uint lip_addrlen; // Length in bytes of address.
|
|
uchar * lip_addr; // Pointer to interface address.
|
|
uint lip_OffloadFlags; // IP offload capabilities flag
|
|
uint lip_IPSecOffloadFlags; // IPSec offload capabilities flag
|
|
ulong lip_ffpversion; // Version of FFP Supported or 0
|
|
ULONG_PTR lip_ffpdriver; // Corr. NDIS driver handle for IF
|
|
|
|
NDIS_STATUS (__stdcall *lip_setndisrequest)(void *, NDIS_OID, uint);
|
|
NDIS_STATUS (__stdcall *lip_dowakeupptrn)(void *, PNET_PM_WAKEUP_PATTERN_DESC, USHORT, BOOLEAN);
|
|
void (__stdcall *lip_pnpcomplete)(void *, NDIS_STATUS, PNET_PNP_EVENT);
|
|
NDIS_STATUS (__stdcall *lip_arpresolveip)(void *, IPAddr, void *);
|
|
|
|
uint lip_MaxOffLoadSize;
|
|
uint lip_MaxSegments;
|
|
|
|
BOOLEAN (__stdcall *lip_arpflushate)(void *, IPAddr );
|
|
void (__stdcall *lip_arpflushallate)(void *);
|
|
|
|
void (__stdcall *lip_closelink)(void *, void *);
|
|
|
|
uint lip_pnpcap;
|
|
|
|
#if !MILLEN
|
|
ARP_CANCEL lip_cancelpackets;
|
|
#endif
|
|
};
|
|
|
|
|
|
|
|
#define LIP_COPY_FLAG 1 // Copy lookahead flag.
|
|
#define LIP_P2P_FLAG 2 // Interface is point to point
|
|
#define LIP_NOIPADDR_FLAG 4 // Unnumbered interface
|
|
#define LIP_P2MP_FLAG 8 // P2MP interface
|
|
#define LIP_NOLINKBCST_FLAG 0x10 // No link bcast
|
|
#define LIP_UNI_FLAG 0x20 // Uni-direction adapter.
|
|
|
|
typedef struct LLIPBindInfo LLIPBindInfo;
|
|
|
|
//* Status codes from the lower layer.
|
|
#define LLIP_STATUS_MTU_CHANGE 1
|
|
#define LLIP_STATUS_SPEED_CHANGE 2
|
|
#define LLIP_STATUS_ADDR_MTU_CHANGE 3
|
|
|
|
//* The LLIP_STATUS_MTU_CHANGE passed a pointer to this structure.
|
|
struct LLIPMTUChange {
|
|
uint lmc_mtu; // New MTU.
|
|
}; /* LLIPMTUChange */
|
|
|
|
typedef struct LLIPMTUChange LLIPMTUChange;
|
|
|
|
//* The LLIP_STATUS_SPEED_CHANGE passed a pointer to this structure.
|
|
struct LLIPSpeedChange {
|
|
uint lsc_speed; // New speed.
|
|
}; /* LLIPSpeedChange */
|
|
|
|
typedef struct LLIPSpeedChange LLIPSpeedChange;
|
|
|
|
//* The LLIP_STATUS_ADDR_MTU_CHANGE passed a pointer to this structure.
|
|
struct LLIPAddrMTUChange {
|
|
uint lam_mtu; // New MTU.
|
|
uint lam_addr; // Address that changed.
|
|
}; /* LLIPAddrMTUChange */
|
|
|
|
typedef struct LLIPAddrMTUChange LLIPAddrMTUChange;
|
|
|
|
typedef
|
|
int
|
|
(__stdcall *LLIPRegRtn)(
|
|
IN PNDIS_STRING InterfaceName,
|
|
IN void * IpInterfaceContext,
|
|
IN struct _IP_HANDLERS * IpHandlers,
|
|
OUT struct LLIPBindInfo * ARPBindInfo,
|
|
IN uint InterfaceNumber
|
|
);
|
|
//
|
|
// ARP Module interface prototypes used during IP <-> ARP interface initialization.
|
|
//
|
|
typedef
|
|
IP_STATUS
|
|
(__stdcall *IP_ADD_INTERFACE)(
|
|
|
|
IN PNDIS_STRING DeviceName,
|
|
IN PNDIS_STRING IfName, OPTIONAL
|
|
|
|
IN PNDIS_STRING ConfigurationHandle,
|
|
IN void * PNPContext,
|
|
IN void * ARPInterfaceContext,
|
|
IN LLIPRegRtn RegRtn,
|
|
IN struct LLIPBindInfo * ARPBindInfo,
|
|
IN UINT RequestedIndex,
|
|
IN ULONG MediaType,
|
|
IN UCHAR AccessType,
|
|
IN UCHAR ConnectionType
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *IP_DEL_INTERFACE)(
|
|
IN void * IPInterfaceContext,
|
|
IN BOOLEAN DeleteIndex
|
|
);
|
|
|
|
typedef
|
|
void
|
|
(__stdcall *IP_BIND_COMPLETE)(
|
|
IN IP_STATUS BindStatus,
|
|
IN void * BindContext
|
|
);
|
|
|
|
typedef
|
|
int
|
|
(__stdcall *ARP_BIND)(
|
|
IN PNDIS_STATUS RetStatus,
|
|
IN NDIS_HANDLE BindContext,
|
|
IN PNDIS_STRING AdapterName,
|
|
IN PVOID SS1,
|
|
IN PVOID SS2
|
|
);
|
|
|
|
typedef
|
|
IP_STATUS
|
|
(__stdcall *IP_ADD_LINK)(
|
|
IN void *IpIfCtxt,
|
|
IN IPAddr NextHop,
|
|
IN void *ArpLinkCtxt,
|
|
OUT void **IpLnkCtxt,
|
|
IN uint mtu
|
|
);
|
|
|
|
typedef
|
|
IP_STATUS
|
|
(__stdcall *IP_DELETE_LINK)(
|
|
IN void *IpIfCtxt,
|
|
IN void *LnkCtxt
|
|
);
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(__stdcall *IP_RESERVE_INDEX)(
|
|
IN ULONG ulNumIndices,
|
|
OUT PULONG pulStartIndex,
|
|
OUT PULONG pulLongestRun
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(__stdcall *IP_DERESERVE_INDEX)(
|
|
IN ULONG ulNumIndices,
|
|
IN ULONG ulStartIndex
|
|
);
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(__stdcall *IP_CHANGE_INDEX)(
|
|
IN PVOID pvContext,
|
|
IN ULONG ulNewIndex,
|
|
IN PUNICODE_STRING pusNewName OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Exported IP interface used by the ARP modules
|
|
//
|
|
NTSTATUS
|
|
__stdcall
|
|
IPRegisterARP(
|
|
IN PNDIS_STRING ARPName,
|
|
IN uint Version, /* Suggested value of 0x50000 for NT 5.0 and memphis */
|
|
IN ARP_BIND ARPBindHandler,
|
|
OUT IP_ADD_INTERFACE * IpAddInterfaceHandler,
|
|
OUT IP_DEL_INTERFACE * IpDeleteInterfaceHandler,
|
|
OUT IP_BIND_COMPLETE * IpBindCompleteHandler,
|
|
OUT IP_ADD_LINK * IpAddLinkHandler,
|
|
OUT IP_DELETE_LINK * IpDeleteLinkHandler,
|
|
OUT IP_CHANGE_INDEX * IpChangeIndex,
|
|
OUT IP_RESERVE_INDEX * IpReserveIndex,
|
|
OUT IP_DERESERVE_INDEX * IpDereserveIndex,
|
|
OUT HANDLE * ARPRegisterHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
__stdcall
|
|
IPDeregisterARP(
|
|
IN HANDLE ARPRegisterHandle
|
|
);
|
|
|
|
//
|
|
// exported via Dll entrypoints.
|
|
//
|
|
extern IP_STATUS
|
|
IPAddInterface(
|
|
PNDIS_STRING DeviceName,
|
|
PNDIS_STRING IfName, OPTIONAL
|
|
PNDIS_STRING ConfigName,
|
|
void *PNP,
|
|
void *Context,
|
|
LLIPRegRtn RegRtn,
|
|
LLIPBindInfo *BindInfo,
|
|
UINT RequestedIndex,
|
|
ULONG MediaType,
|
|
UCHAR AccessType,
|
|
UCHAR ConnectionType
|
|
);
|
|
|
|
|
|
extern void IPDelInterface(void *Context , BOOLEAN DeleteIndex);
|
|
|
|
extern IP_STATUS IPAddLink(void *IpIfCtxt, IPAddr NextHop, void *ArpLinkCtxt, void **IpLnkCtxt, uint mtu);
|
|
|
|
extern IP_STATUS IPDeleteLink(void *IpIfCtxt, void *LnkCtxt);
|
|
|
|
|
|
//
|
|
// Registration IOCTL code definition -
|
|
//
|
|
// This IOCTL is issued to a lower layer driver to retrieve the address
|
|
// of its registration function. There is no input buffer. The output
|
|
// buffer will contain a LLIPIF_REGISTRATION_DATA structure. This
|
|
// buffer is pointed to by Irp->AssociatedIrp.SystemBuffer and should be
|
|
// filled in before completion.
|
|
//
|
|
|
|
//
|
|
// structure passed in the registration IOCTL.
|
|
//
|
|
typedef struct llipif_registration_data {
|
|
LLIPRegRtn RegistrationFunction;
|
|
} LLIPIF_REGISTRATION_DATA;
|
|
|
|
|
|
|
|
typedef IP_ADD_INTERFACE IPAddInterfacePtr;
|
|
typedef IP_DEL_INTERFACE IPDelInterfacePtr;
|
|
|
|
//* Structure used in IOCTL_IP_GET_PNP_ARP_POINTERS ioctl sent to \device\ip by ARP modules
|
|
//
|
|
typedef struct ip_get_arp_pointers {
|
|
IPAddInterfacePtr IPAddInterface ; // Pointer to IP's add interface routine
|
|
IPDelInterfacePtr IPDelInterface ; // Pointer to IP's del interface routine
|
|
} IP_GET_PNP_ARP_POINTERS, *PIP_GET_PNP_ARP_POINTERS ;
|
|
|
|
|
|
#define FSCTL_LLIPIF_BASE FILE_DEVICE_NETWORK
|
|
|
|
#define _LLIPIF_CTL_CODE(function, method, access) \
|
|
CTL_CODE(FSCTL_LLIPIF_BASE, function, method, access)
|
|
|
|
|
|
#define IOCTL_LLIPIF_REGISTER \
|
|
_LLIPIF_CTL_CODE(0, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
|
|
#endif // LLIPIF_INCLUDED
|