221 lines
5.2 KiB
C
221 lines
5.2 KiB
C
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ntos\tdi\isn\fwd\send.c
|
|
|
|
Abstract:
|
|
Send routines
|
|
|
|
Author:
|
|
|
|
Vadim Eydelman
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#ifndef IPXFWD_SEND
|
|
#define IPXFWD_SEND
|
|
|
|
typedef struct _INTERNAL_PACKET_TAG {
|
|
LIST_ENTRY IPT_QueueLink;
|
|
PNDIS_PACKET IPT_Packet;
|
|
PUCHAR IPT_DataPtr;
|
|
ULONG IPT_Length;
|
|
PINTERFACE_CB IPT_InterfaceReference;
|
|
IPX_LOCAL_TARGET IPT_Target;
|
|
} INTERNAL_PACKET_TAG, *PINTERNAL_PACKET_TAG;
|
|
|
|
|
|
#define DEF_SPOOFING_TIMEOUT (120*60) // Seconds
|
|
extern ULONG SpoofingTimeout;
|
|
extern LIST_ENTRY SpoofingQueue;
|
|
extern KSPIN_LOCK SpoofingQueueLock;
|
|
extern WORK_QUEUE_ITEM SpoofingWorker;
|
|
extern BOOLEAN SpoofingWorkerActive;
|
|
extern ULONG DontSuppressNonAgentSapAdvertisements;
|
|
VOID
|
|
Spoofer (
|
|
PVOID Context
|
|
);
|
|
|
|
#define InitializeSendQueue() { \
|
|
InitializeListHead (&SpoofingQueue); \
|
|
KeInitializeSpinLock (&SpoofingQueueLock); \
|
|
ExInitializeWorkItem (&SpoofingWorker, Spoofer, NULL); \
|
|
SpoofingWorkerActive = FALSE; \
|
|
}
|
|
|
|
#define DeleteSendQueue() { \
|
|
while (!IsListEmpty (&SpoofingQueue)) { \
|
|
PPACKET_TAG pktTag = CONTAINING_RECORD (SpoofingQueue.Flink, \
|
|
PACKET_TAG, \
|
|
PT_QueueLink); \
|
|
RemoveEntryList (&pktTag->PT_QueueLink); \
|
|
if (pktTag->PT_InterfaceReference!=NULL) \
|
|
ReleaseInterfaceReference (pktTag->PT_InterfaceReference); \
|
|
FreePacket (pktTag); \
|
|
} \
|
|
}
|
|
|
|
|
|
/*++
|
|
*******************************************************************
|
|
S e n d P a c k e t
|
|
|
|
Routine Description:
|
|
Enqueues packets to be sent by IPX stack
|
|
Arguments:
|
|
dstIf - over which interface to send
|
|
pktTag - packet to send
|
|
Return Value:
|
|
None
|
|
|
|
*******************************************************************
|
|
--*/
|
|
VOID
|
|
SendPacket (
|
|
PINTERFACE_CB dstIf,
|
|
PPACKET_TAG pktTag
|
|
);
|
|
|
|
/*++
|
|
*******************************************************************
|
|
F w S e n d C o m p l e t e
|
|
|
|
Routine Description:
|
|
Called by IPX stack when send completes asynchronously
|
|
Arguments:
|
|
pktDscr - descriptor of the completed packet
|
|
status - result of send operation
|
|
Return Value:
|
|
None
|
|
|
|
*******************************************************************
|
|
--*/
|
|
VOID
|
|
IpxFwdSendComplete (
|
|
PNDIS_PACKET pktDscr,
|
|
NDIS_STATUS NdisStatus
|
|
);
|
|
|
|
/*++
|
|
*******************************************************************
|
|
|
|
F w I n t e r n a l S e n d
|
|
|
|
Routine Description:
|
|
Filter and routes packets sent by IPX stack
|
|
Arguments:
|
|
LocalTarget - the NicId and next hop router MAC address
|
|
Context - preferred interface on which to send
|
|
Packet - packet to be sent
|
|
ipxHdr - pointer to ipx header inside the packet
|
|
PacketLength - length of the packet
|
|
fIterate - a flag to indicate if this is a packet for the
|
|
iteration of which the Fwd takes responsibility
|
|
- typically type 20 NetBIOS frames
|
|
|
|
Return Value:
|
|
|
|
STATUS_SUCCESS - if the preferred NIC was OK and packet passed filtering
|
|
STATUS_NETWORK_UNREACHABLE - if the preferred was not OK or packet failed filtering
|
|
STATUS_PENDING - packet was queued until connection is established
|
|
*******************************************************************
|
|
--*/
|
|
NTSTATUS
|
|
IpxFwdInternalSend (
|
|
IN OUT PIPX_LOCAL_TARGET LocalTarget,
|
|
IN ULONG_PTR Context,
|
|
IN PNDIS_PACKET pktDscr,
|
|
IN PUCHAR ipxHdr,
|
|
IN PUCHAR data,
|
|
IN ULONG PacketLength,
|
|
IN BOOLEAN fIterate
|
|
);
|
|
|
|
/*++
|
|
*******************************************************************
|
|
|
|
P r o c e s s I n t e r n a l Q u e u e
|
|
|
|
Routine Description:
|
|
Processes packets in the interface internal queue.
|
|
Called when connection request completes
|
|
Arguments:
|
|
dstIf - interface to process
|
|
Return Value:
|
|
None
|
|
*******************************************************************
|
|
--*/
|
|
VOID
|
|
ProcessInternalQueue (
|
|
PINTERFACE_CB dstIf
|
|
);
|
|
|
|
|
|
/*++
|
|
*******************************************************************
|
|
|
|
P r o c e s s E x t e r n a l Q u e u e
|
|
|
|
Routine Description:
|
|
Processes packets in the interface external queue.
|
|
Called when connection request completes
|
|
Arguments:
|
|
dstIf - interface to process
|
|
Return Value:
|
|
None
|
|
*******************************************************************
|
|
--*/
|
|
VOID
|
|
ProcessExternalQueue (
|
|
PINTERFACE_CB dstIf
|
|
);
|
|
/*++
|
|
*******************************************************************
|
|
D o S e n d
|
|
|
|
Routine Description:
|
|
Prepares and sends packet. Interface lock must be help while
|
|
callin this routine
|
|
Arguments:
|
|
dstIf - over which interface to send
|
|
pktTag - packet to send
|
|
Return Value:
|
|
result returned by IPX
|
|
|
|
*******************************************************************
|
|
--*/
|
|
NDIS_STATUS
|
|
DoSend (
|
|
PINTERFACE_CB dstIf,
|
|
PPACKET_TAG pktTag,
|
|
KIRQL oldIRQL
|
|
);
|
|
|
|
/*++
|
|
*******************************************************************
|
|
P r o c e s s S e n t P a c k e t
|
|
|
|
Routine Description:
|
|
Process completed sent packets
|
|
Arguments:
|
|
dstIf - interface over which packet was sent
|
|
pktTag - completed packet
|
|
status - result of send operation
|
|
Return Value:
|
|
None
|
|
|
|
*******************************************************************
|
|
--*/
|
|
VOID
|
|
ProcessSentPacket (
|
|
PINTERFACE_CB dstIf,
|
|
PPACKET_TAG pktTag,
|
|
NDIS_STATUS status
|
|
);
|
|
#endif
|