Direktes Aktualisieren einer Route mithilfe von RtmUpdateAndUnlockRoute

Im folgenden Verfahren werden die Schritte beschrieben, die zum Aktualisieren einer Route verwendet werden. Der folgende Beispielcode zeigt, wie die Prozedur implementiert wird.

Um eine Route zu aktualisieren, sollte der Client die folgenden Schritte ausführen:

  1. Sperren Sie die Route, indem Sie RtmLockRoute aufrufen. Derzeit sperrt diese Funktion tatsächlich das Ziel der Route. Der Routingtabellen-Manager gibt einen Zeiger auf die Route zurück.

  2. Verwenden Sie den Zeiger auf die in Schritt 1 abgerufene RTM_ROUTE_INFO-Struktur des Routingtabellen-Managers, um die erforderlichen Änderungen an der Route vorzunehmen. Nur bestimmte Member der RTM_ROUTE_INFO-Struktur können bei der Aktualisierung geändert werden. Diese Member sind: Neighbor, PrefInfo, EntitySpecificInfo, BelongsToViews und NextHopsList.

    Hinweis

    Wenn der Client Informationen zu den Neighbor - oder NextHopsList-Membern hinzufügt, muss der Client RtmReferenceHandles aufrufen, um die Verweisanzahl explizit zu erhöhen, die der Routingtabellen-Manager für das Next-Hop-Objekt behält. Wenn der Client Informationen aus dem NextHopsList-Element entfernt, muss der Client RtmReleaseNextHops aufrufen, um die Verweisanzahl zu verringern.

     

  3. Rufen Sie RtmUpdateAndUnlockRoute auf, um den Routingtabellen-Manager zu benachrichtigen, dass eine Änderung erfolgt ist. Der Routingtabellen-Manager committet die Änderungen, aktualisiert das Ziel, um die neuen Informationen widerzuspiegeln, und entsperrt dann die Route.

Der folgende Beispielcode zeigt, wie Sie eine Route direkt aktualisieren, indem Sie einen Zeiger auf die tatsächlichen Routeninformationen in der Routingtabelle verwenden.

Status = RtmLockRoute(RtmRegHandle,
                      RouteHandle,
                      TRUE,
                      TRUE,
                      &RoutePointer);

if (Status == NO_ERROR)
{
        // Update route parameters in place (i.e., directly on 
// the routing table manager's copy)
    
    // Update the metric and views of the route
    RoutePointer->PrefInfo.Metric = 16;

    // Change the views so that the route belongs to only the multicast view
    RoutePointer->BelongsToViews = RTM_VIEW_MASK_MCAST;

    // Set the entity-specific information to X
    RoutePointer->EntitySpecificInfo = X;

    // Note that the following manipulation of
    // next-hop references is not needed when
    // using RtmAddRouteToDest, as it is done
    // by the routing table manager automatically
    
    // Change next hop from NextHop1 to NextHop2
    NextHop1 = RoutePointer->NextHopsList.NextHop[0];

    // Explicitly dereference the old next hop
    RtmReleaseNextHops(RtmRegHandle, 1, &NextHop1);

    RoutePointer->NextHopsList.NextHop[0] = NextHop2;

    // Explicitly reference next hop being added
    RtmReferenceHandles(RtmRegHandle, 1, &NextHop2);

    // Call the routing table manager to indicate that route information
    // has changed, and that its position might
    // have to be rearranged and the corresponding destination
    // needs to be updated to reflect this change.
    
    Status = RtmUpdateAndUnlockRoute(RtmRegHandle,
                                     RouteHandle,
                                     INFINITE, // Keep forever
                                     NULL,
                                     0,
                                     NULL,
                                     &ChangeFlags);
    ASSERT(Status == NO_ERROR);
}