Windows-Server-2003/net/nwlink/fwd/send.h

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