Поделиться через


Обновление маршрута на месте с помощью RtmUpdateAndUnlockRoute

В следующей процедуре описаны шаги, используемые для обновления маршрута на месте. В следующем примере кода показано, как реализовать процедуру.

Чтобы обновить маршрут на месте, клиент должен выполнить следующие действия.

  1. Заблокируйте маршрут, вызвав RtmLockRoute. В настоящее время эта функция фактически блокирует назначение маршрута. Диспетчер таблиц маршрутизации возвращает указатель на маршрут.

  2. Используйте указатель на структуру RTM_ROUTE_INFO диспетчера таблиц маршрутизации, полученную на шаге 1, чтобы внести необходимые изменения в маршрут. При обновлении на месте можно изменить только определенные элементы структуры RTM_ROUTE_INFO . К ним относятся: Сосед, PrefInfo, EntitySpecificInfo, BelongsToViews и NextHopsList.

    Примечание

    Если клиент добавляет сведения в члены Соседа или NextHopsList , клиент должен вызвать RtmReferenceHandles , чтобы явно увеличить количество ссылок, которое диспетчер таблиц маршрутизации сохраняет в объекте следующего прыжка. Аналогичным образом, если клиент удаляет сведения из элемента NextHopsList , клиент должен вызвать RtmReleaseNextHops для уменьшения количества ссылок.

     

  3. Вызовите rtmUpdateAndUnlockRoute , чтобы уведомить диспетчер таблиц маршрутизации о том, что произошло изменение. Диспетчер таблиц маршрутизации фиксирует изменения, обновляет назначение, чтобы отразить новые сведения, а затем разблокирует маршрут.

В следующем примере кода показано, как обновить маршрут напрямую с помощью указателя на фактические сведения о маршруте в таблице маршрутизации.

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