Atualizar uma rota em vigor usando RtmUpdateAndUnlockRoute
O procedimento a seguir descreve as etapas usadas para atualizar uma rota em vigor. O código de exemplo a seguir mostra como implementar o procedimento.
Para atualizar uma rota em vigor, o cliente deve seguir as etapas a seguir
Bloqueie a rota chamando RtmLockRoute. Atualmente, essa função realmente bloqueia o destino da rota. O gerenciador de tabelas de roteamento retorna um ponteiro para a rota.
Use o ponteiro para a estrutura RTM_ROUTE_INFO do gerenciador de tabelas de roteamento, obtida na etapa 1, para fazer as alterações necessárias na rota. Somente determinados membros da estrutura RTM_ROUTE_INFO podem ser modificados ao atualizar em vigor. Esses membros são: Neighbor, PrefInfo, EntitySpecificInfo, BelongsToViews e NextHopsList.
Observação
Se o cliente adicionar informações aos membros Neighbor ou NextHopsList , o cliente deverá chamar RtmReferenceHandles para incrementar explicitamente a contagem de referência que o gerenciador de tabelas de roteamento mantém no objeto de próximo salto. Da mesma forma, se o cliente remover informações do membro NextHopsList , o cliente deverá chamar RtmReleaseNextHops para diminuir a contagem de referência.
Chame RtmUpdateAndUnlockRoute para notificar o gerente de tabela de roteamento de que ocorreu uma alteração. O gerenciador de tabelas de roteamento confirma as alterações, atualiza o destino para refletir as novas informações e desbloqueia a rota.
O código de exemplo a seguir mostra como atualizar uma rota diretamente, usando um ponteiro para as informações de rota reais na tabela de roteamento.
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);
}