Cisco Express Forwarding

Cisco Express ForwardingCisco Express Forwarding (CEF ) — технология высокоскоростной маршрутизации/коммутации пакетов, использующаяся в маршрутизаторах и коммутаторах третьего уровня фирмы Cisco Systems, и позволяющая добиться более быстрой и эффективной обработки транзитного трафика.

Функционал, который поддерживает CEF:

CEF не работает в следующих случаях:

  • Включен ACL Logging (в конце ACL добавлено слово log. например deny ip any any log )
  • Пакеты предназначены для самого маршрутизатора/коммутатора.
  • Нет L2 Adjacency.

[править] FIB

Forwarding Information Base (FIB) или CEF Table — таблица для быстрой пересылки пакетов. Строится на основе Routing Table и Adjacency Table. Adjacency Table в свою очередь строится на основе ARP Table. Различают 2 вида CEF — Software CEF (можно увидеть на ISR G1/G2 и 7200) и Hardware CEF (можно увидеть на 6500/7600, Nexus 7000 и ASR9000). Hardware CEF — это когда построенная FIB хранится в быстрой памяти TCAM (Ternary Content Addressable Memory). Итого FIB — это таблица, содержащая маршрут, исходящий интерфейс и L2 destination.

Вывод и параметры команд, которые относятся к CEF, могут отличаться в зависимости от версии IOS и модели оборудования.

Но, как правило, команды просмотра начинаются на show cef, show ip cef, show adjacency

Строка CA0111480008CA00114800080800 читается следующим образом:

  • CA0011480008 — это source мак-адрес интерфейса, через который будет отправляться пакет на 100.0.0.2:
  • CA0111480008 — это destenation мак-адрес ca01.1148.0008:
  • 0800 — это EtherType (в данному случае у нас это IPv4 0x0800).

В FIB и adjacency table есть понятие версии, которая называется epoch. Диапазон значений epoch от 0 до 255.

Значение epoch увеличивается, при инициации перестроения таблицы. Это можно сделать вручную, очистив информацию CEF.

На практике epoch используется, например, при переключении между supervisor engine в технологии NSF:

  1. Во время переключения, в таблицах CEF увеличивается значение epoch.
  2. После того как протоколы маршрутизации обновили информацию в RIB, соответственно обновляются и записи в таблицах CEF. Обновленным записям назначается новое значение epoch.
  3. После завершения обновления, все записи в FIB и adjacency table, у которых значение epoch меньше текущего, удаляются.

[править] Просмотр значения epoch для FIB

Например, текущее значение epoch равно 0:

При корректной работе, значение epoch для всех префиксов должно быть равным этому глобальному значению. Отображение значения epoch для конкретного префикса на примере маршрута по умолчанию:

Когда в FIB добавляется новая запись, то значение epoch для нее устанавливается равным текущему глобальному значению. То есть, значение epoch не увеличивается, когда добавляется какой-то префикс в FIB:

[править] Обновление значения epoch для FIB

С помощью команды clear cef table ipv4 можно вручную обновить FIB и, соответственно, изменится значение epoch(в некоторых IOS также может быть команда clear ip cef epoch full):

[править] Просмотр значения epoch для adjacency table

Суммарная информация об adjacency table отображает и значение epoch:

В текущей таблице adjacency есть 4 записи со значением epoch 3, которое соответствует глобальной версии таблицы. И одна запись со значением 2.

Также в суммарной информации видно, что одна запись в состоянии incomplete: 1 incomplete adjacency. Посмотрим более подробную информацию о записях в таблице adjacency:

В более подробном выводе можно увидеть значение epoch для каждой записи в adjacency table. А также теперь мы видим у какой записи значение epoch 2:

Эта запись находится в состоянии incomplete, так как не известно какой MAC-адрес соответствует next-hop 10.0.12.10.

[править] Обновление значения epoch для adjacency table

[править] Информация о таблице CEF

Очистить Cisco Express Forwarding adjacency table:

На коммутаторе (hardware Layer 3-switching adjacency node):

Кумир святого Исидора

Chromium Embedded Framework. Интеграция с MFC

Я уже очень плотно подсел на интернет, потому совсем не удивителен тот факт, что предпочитаю веб-интерфейсы даже в настольных приложениях. На мой взгляд, разработка интерфейса на javascript существенно проще, чем аналогичная работа на C++.

Несколько лет назад я столкнулся с необходимостью сделать grid, в котором можно объеденять ячейки и не нашел ни одного решения, которое можно быстро интегрировать в MFC проект. Тогда я начал искать решение и обнаружил его в связке HTML + javascript, которая отлично справляется с отрисовкой интерфейса, в то время как C++ приложение обеспечивает связь с БД и работу с файловой системой.

В 2007 году мой выбор пал на InternetExplorer, по той причине, что для него есть MFC API в виде класса CHtmlView. За две ночи, остававшиеся до демонстрации проекта был сверстан интерфейс, которой в дальнейшем стал основным в программе. В то время мы еще использовали C++ классы для отображения, но позде отказались от них в пользу jQuery UI.

Ни разу не пришлось жалеть о принятом решении, но все чаще приходилось сталкиваться с особенностями IE и реализации IWebBrowser. Все чаще находились вещи, которые невозможно организовать и все чаще звучали слова о необходимости переходить на другой браузерный движок. Наконец это случилось.

Выбор пал на Chromium, а точнее на CEF. Вряд ли я смогу объяснить причину, даже сейчас. Позже придумаю какое-нибудь грамотное объяснений, но в общем-то выбор достаточно случаен. Может всему виной телевизионная реклама Google Chrome?

Документация по проекту достаочно скудна, и содержит немало ошибок. Информацию по крупицам приходится выбирать с форума по Chromium Embedded Framework и из исходников демонстрационного проекта.

В своем блоге я буду описывать шаги по интеграции CEF в свои проекты, проблемы с которыми придется столкнуться на этом пути и способы их решения. Итак, серия первая:

Интеграция Chromium Embedded Framework в MFC-Приложение

Сначала надо скачать framework. По ссылке архив, который содержит библиотеку CEF в бинарном виде и включает пример использования библиотеки с использованием WINAPI

Тeперь создаем MFC-проект. Так как бинарники библиотеки созданы с флагом компиляции /MD, то использовать статическую линковку библиотеки не выйдет. К счастью разработчики позаботились о страждущих и написали необходимую обертку, которая позволяет подключать CEF динамически. Обертка (libcef_dll_wrapper) так же будет в загруженном архиве

Для подключения libcef_dll_wrapper его нужно построить с теми же настройками, с которыми вы собираетесь строить собственный проект. То есть, если в своем проекте вы подключаете MFC Shared Library статически, то и к врапперу ее надо подключать так же. В противном случае получите изрядное количество ошибок на этапе линковки. Подробнее об этом можно почитать в wiki проекта: Linking Different RunTime Libraries

Ниже будет приведен код, который необходим для запуска фреймворка. Он же присутствует в тестовом проекте, который можно скачать прямо здесь.

Содержимое архива надо распаковать в ту же папку, где находится CEF, добавить проект в VisualStudio и построить его. Приложение содержит минимальнонеобходимое количество кода для подключения фреймвока. Оно лишь отображает стартовую странцу Google, не предоставляя дополнительных средств навигации. Единственное реализованное взаимодействие с CEF в рамках проекта — это согласованное изменение размеров браузера при изменении размерок окна приложения.

Запуск Cromium Embedded Framework в MFC

Для взаимодействия с браузером нам потребуется класс-handler, наследник от CefClient, который может быть практически пустым, но должен реализовать некоторое количество абстрактных функций базового класса. Для этого используется следующий макрос:

Теперь запустим CEF, для чего переопределим метод OnInitialUpdate у представления

Этого вполне достаточно для того чтбы увидеть первые плоды интеграции. Запущенный в таком виде проект отобразит окно браузера и загрузит стартовую страницу. Однако при изменнии размеров окна браузер не будет растягиваться и сжиматься, сохраняя размер заданый ему при инициализации. Для реализации согласованного ресайза потребуется переопределить метод OnSize, но сначала необходимо получить ссылку на созданный экземпляр браузера.

Изменение размеров CEF-браузера

Изменим класс ClientHandler и «подпишемся» на уведомление о создании браузера, для чего унаследуемся от CefLifeSpanHandler и реализуем 2 метода GetLifeSpanHandler и OnAfterCreated

В реализации OnAfterCreated сохраним ссылку на созданный браузер

Теперь осталось изменить размер браузера при получении сообщения WM_SIZE

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

P. S. 2012.03.26 Как выяснилось в приложенном проекте есть пара ошибок, связанных с освобождением ресурсов. Архив оставлю здесь для истории, а актуальную версию с исправлениями теперь можно найти на githab https://github. com/VladimirRybakov/cef-mfc

This entry was posted in Cisco что это за папка and tagged , , , . Bookmark the <a href="http://ollitehnika.ru/cisco-express-forwarding/" title="Permalink to Cisco Express Forwarding" rel="bookmark">permalink</a>.

Comments are closed.