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

  1. 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.

  2. 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.

     

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