Mettre à jour un itinéraire en place à l’aide de RtmUpdateAndUnlockRoute
La procédure suivante décrit les étapes utilisées pour mettre à jour un itinéraire en place. L’exemple de code qui suit montre comment implémenter la procédure.
Pour mettre à jour un itinéraire en place, le client doit effectuer les étapes suivantes
Verrouillez l’itinéraire en appelant RtmLockRoute. Actuellement, cette fonction verrouille la destination de l’itinéraire. Le gestionnaire de table de routage retourne un pointeur vers l’itinéraire.
Utilisez le pointeur vers la structure RTM_ROUTE_INFO du gestionnaire de table de routage, obtenue à l’étape 1, pour apporter les modifications nécessaires à l’itinéraire. Seuls certains membres de la structure RTM_ROUTE_INFO peuvent être modifiés lors de la mise à jour sur place. Ces membres sont : Neighbor, PrefInfo, EntitySpecificInfo, BelongsToViews et NextHopsList.
Notes
Si le client ajoute des informations aux membres Neighbor ou NextHopsList , le client doit appeler RtmReferenceHandles pour incrémenter explicitement le nombre de références que le gestionnaire de table de routage conserve sur l’objet de tronçon suivant. De même, si le client supprime des informations du membre NextHopsList , le client doit appeler RtmReleaseNextHops pour décrémenter le nombre de références.
Appelez RtmUpdateAndUnlockRoute pour informer le gestionnaire de table de routage qu’une modification a eu lieu. Le gestionnaire de tables de routage valide les modifications, met à jour la destination pour refléter les nouvelles informations, puis déverrouille l’itinéraire.
L’exemple de code suivant montre comment mettre à jour un itinéraire directement, à l’aide d’un pointeur vers les informations de routage réelles dans la table de routage.
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);
}