Aktualisieren einer route in place mit rtmUpdateAndUnlockRoute

Das folgende Verfahren beschreibt die Schritte, die zum Aktualisieren einer aktuellen Route verwendet werden. Der folgende Beispielcode zeigt, wie die Prozedur implementiert wird.

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

  1. Sperren Sie die Route, indem Sie RtmLockRouteaufrufen. Derzeit sperrt diese Funktion 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 geändert werden, wenn ein Update durchgeführt wird. Zu diesen Membern gehören: 12, PrefInfo, EntitySpecificInfo, BelongsToViews und NextHopsList.

    Hinweis

    Wenn der Client informationen entweder den Membern "Zulauf" oder "NextHopsList" hinzufügt, muss der Client RtmReferenceHandles aufrufen, um den Verweiszähler explizit zu erhöhen, den der Routingtabellen-Manager für das Objekt des nächsten Hops beibehält. Wenn der Client Informationen aus dem NextHopsList-Member entfernt, muss der Client rtmReleaseNextHops aufrufen, um den Verweiszähler zu dekrementieren.

  3. Rufen Sie RtmUpdateAndUnlockRoute auf, um den Routingtabellen-Manager über eine Änderung zu informieren. Der Routingtabellen-Manager führt einen Commit für die Änderungen aus, aktualisiert das Ziel, um die neuen Informationen widerzuspiegeln, und entsperrt dann die Route.

Der folgende Beispielcode zeigt, wie eine Route mithilfe eines Zeigers auf die tatsächlichen Routeninformationen in der Routingtabelle direkt aktualisiert wird.

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);
}