diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/tdi/isn/rip/start.c | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/private/ntos/tdi/isn/rip/start.c b/private/ntos/tdi/isn/rip/start.c new file mode 100644 index 000000000..d9409f1a6 --- /dev/null +++ b/private/ntos/tdi/isn/rip/start.c @@ -0,0 +1,193 @@ +/*******************************************************************/ +/* Copyright(c) 1993 Microsoft Corporation */ +/*******************************************************************/ + +//*** +// +// Filename: start.c +// +// Description: starts the router +// +// Author: Stefan Solomon (stefans) October 5, 1993. +// +// Revision History: +// +//*** + +#include "rtdefs.h" + +KEVENT BcastSndReqEvent; + +//*** +// +// Function: RouterStart +// +// Descr: Starts the router +// +// Parameters: +// +// Returns: STATUS_SUCCESS +// STATUS_INSUFFICIENT_RESOURCES +// +//*** + +NTSTATUS +RouterStart(VOID) +{ + PRIP_SNDREQ sndrqp; + + //*** Send a general RIP bcast to all active nets *** + //*** announcing our routes *** + + if((sndrqp = ExAllocatePool(NonPagedPool, sizeof(RIP_SNDREQ))) == NULL) { + + return STATUS_INSUFFICIENT_RESOURCES; + } + + BroadcastRipGeneralResponse(sndrqp); + + //*** Send a general RIP request to all active nets *** + //*** requesting their routing tables *** + + if((sndrqp = ExAllocatePool(NonPagedPool, sizeof(RIP_SNDREQ))) == NULL) { + + return STATUS_INSUFFICIENT_RESOURCES; + } + + sndrqp->SndReqId = RIP_GEN_REQUEST; + sndrqp->SendOnAllNics = TRUE; // send to everybody + memcpy(sndrqp->DestNode, bcastaddress, IPX_NODE_LEN); + sndrqp->DestSock = IPX_RIP_SOCKET; + sndrqp->DoNotSendNicCbp = NULL; // do no except any nic + sndrqp->SenderNicCbp = NULL; + sndrqp->SndCompleteEventp = NULL; + + RipDispatchSndReq(sndrqp); + + return STATUS_SUCCESS; +} + + +VOID +RouterStop(VOID) +{ + LIST_ENTRY DownRoutesList; + KIRQL oldirql; + PIPX_ROUTE_ENTRY rtep; + UINT seg; + BOOLEAN FirstRoute; + PRIP_SNDREQ sndreqp; + USHORT NicId; + PNICCB niccbp; + USHORT tmp; + PRIP_UPDATE_SNDREQ respcbp = NULL; // ptr to changes response to bcast + + RtPrint(DBG_INIT, ("IpxRouter: RouterStop: Entered\n")); + + KeInitializeEvent(&BcastSndReqEvent, NotificationEvent, FALSE); + + // if configured with a wan global net, send bcast update that it will + // go down now. + if(WanGlobalNetworkEnabled) { + + WanGlobalNetworkEnabled = FALSE; + + seg = IpxGetSegment(WanGlobalNetwork); + + // LOCK THE ROUTING TABLE + ExAcquireSpinLock(&SegmentLocksTable[seg], &oldirql); + + if(rtep = IpxGetRoute(seg, WanGlobalNetwork)) { + + IpxDeleteRoute(seg, rtep); + + // set hop count to "unreachable" + rtep->HopCount = 16; + RtPrint(DBG_INIT, ("IpxRouter: DeleteGlobalWanNet: Deleted wan global net route entry\n")); + } + + // UNLOCK THE ROUTING TABLE + ExReleaseSpinLock(&SegmentLocksTable[seg], oldirql); + + if(rtep == NULL) { + + goto wan_global_done; + } + + // Broadcast the route entry down on all the LAN segments + BroadcastWanNetUpdate(rtep, NULL, &BcastSndReqEvent); + + ExFreePool(rtep); + } + +wan_global_done: + + + // scan the routing table and remove all route entries (except the + // permanent ones). + // For all route entries (permanent or not) make the snd req pkts for + // bcast. + + InitializeListHead(&DownRoutesList); + + for(seg=0; seg<SegmentCount; seg++) { + + FirstRoute = TRUE; + + // LOCK THE ROUTING TABLE + ExAcquireSpinLock(&SegmentLocksTable[seg], &oldirql); + + while((rtep = GetRoute(seg, FirstRoute)) != NULL) { + + FirstRoute = FALSE; + + // check if this is a locally attached route + if(rtep->Flags & IPX_ROUTER_PERMANENT_ENTRY) { + + // local route - do not delete it + + // mark it as down - temporarily + tmp = rtep->HopCount; + rtep->HopCount = 16; + + // add the route to the packets we prepare for bcast + AddRouteToBcastSndReq(&DownRoutesList, rtep); + + // restore the hop count + rtep->HopCount = tmp; + } + else + { + // non local route - delete it + + IpxDeleteRoute(seg, rtep); + + // mark it as down + rtep->HopCount = 16; + + // add the route to the packets we prepare for bcast + AddRouteToBcastSndReq(&DownRoutesList, rtep); + + // finally, free the route entry + ExFreePool(rtep); + } + } + + // UNLOCK THE ROUTING TABLE + ExReleaseSpinLock(&SegmentLocksTable[seg], oldirql); + + } // for all segments + + // broadcast all the deleted routes + while((sndreqp = GetBcastSndReq(&DownRoutesList, &NicId)) != NULL) { + + // get the nic ptr for this snd req + niccbp = NicCbPtrTab[NicId]; + + // set up the request to send a bcast response with the changes + // to all the nics except this one + // The send is made with WAIT ON EVENT option so that we don't download + // until all sends are completed. + BroadcastRipUpdate(sndreqp, niccbp, &BcastSndReqEvent); + } +} |