"Столкнулся недавно с интересной особенностью при настройке оборудования у клиента. Система хранения IBM (LSI) ни в какую не виделась коммутатором Brocade, а инициаторы работали нестабильно, т.е. порты коммутатора то "видели" их, то нет. Ошибка явно была связана с потерей синхронизации в линке. Причем ручные настройки портов ни к чему не приводили. Оказалось, что в новых версиях прошивки FOS значения примитивов заполнителей на каждом порту по умолчанию стоят в ARB. Помогает в этой ситуации смена значения на IDLE при помощи команды portCfgFillWord. Смена значения по умолчанию производителем тоже была не случайна. Дело в том, что по стандарту FC-FS-3 действительно должен использоваться примитив ARBff. Вот выдержка из указанного стандарта:
10.3.5 Emission Lowering Protocol
An FC-0 standard (e.g., FC-PI-3) may specify the use of Emission Lowering Protocol when using the 8B/10B transmission code.
When Emission Lowering Protocol is used, the Fill Word shall be the ARBff Ordered Set.
When Emission Lowering Protocol is not used, the Fill Word shall be the Idle Ordered Set.
Причина кроется в интерференции волн при использовании слов заполнителей IDLE. Таким образом на частотах 8,5GHz использование ARBff строго рекомендовано. Источники ниже:
Почему же порты некоторых оконечных устройств продолжают работать в несовместимом формате? Ответ думаю прост – несоблюдение стандартов. Хотя вопрос может быть тонким и рекомендация все равно остается рекомендацией. Поэтому именно для возможности гибкой настройки примитивов в FOS и была добавлена команда portCfgFillWord."
Я честно говоря не предполагал, что использование ARB дает заметные преимущества еще и с точки зрения уменьшения EMI (в документах по ссылкам даны графики). Интересно.
На всякий случай напомню, что изначально примитивы ARB() применялись только для арбитража доступа устройств в топологии FC_AL. Однако Brocade нашла еще одно применение для них. Они используются для идентификации Virtual Channels (VC). Коммутатор следит за адресом AL_PA заполнителя ARB(). Фрейм, идущий за ARB() с неким AL_PA, считается принадлежащим соответствующему VC. Соответствие AL_PA и номера виртуального канала показано в таблице.
Тип порта | Кол-во VC | VC | Приоритет | AL_PA | Описание |
F | 1 | VC7 | 2 или 3 (по умолчанию 3) | 0xda | Подключение к N-порту |
FL | 1 | VC7 | 2 или 3 (по умолчанию 3) | 0xda | Подключение к NL-порту |
E FC_SW2 | 1 | VC0 | 0 | 0xef | Подключение к E-порту в режиме совместимости (InterOp) |
E | 8 | VC0 | 0 | 0xef | Служебный трафик (класса F) |
VC1 | 1 | 0xe8 | Служебный трафик (F_BSY и F_RJT, опционально контроль линка трафика класса 2) | ||
VC2 | 2 или 3 (по умолчанию 2) | 0xe4 | Данные оконечных устройств (класса 2 или 3) | ||
VC3 | 2 или 3 (по умолчанию 2) | 0xe2 | Данные оконечных устройств (класса 2 или 3) | ||
VC4 | 2 или 3 (по умолчанию 2) | 0xe1 | Данные оконечных устройств (класса 2 или 3) | ||
VC5 | 2 или 3 (по умолчанию 2) | 0xe0 | Данные оконечных устройств (класса 2 или 3) | ||
VC6 | 2 или 3 (по умолчанию 3) | 0xdc | Multicast трафик (класса 3) | ||
VC7 | 2 или 3 (по умолчанию 3) | 0xda | Multicast и broadcast трафик (класса 3) | ||
C | 17 | Используется только при прямом соединении ASIC Condor друг с другом. |
FOS 6.3.1+ и 6.4.0+ поддерживают универсальный режим - сначала пробуют ARB/ARB, потом IDLE/ARB. Для этого нужно установить portCfgFillword в значение 3.
ОтветитьУдалитьпростенький скрипт:
DCX:
for ((i=0;i<48;i++)); do (echo 1/$i;portcfgfillword 1/$i 3); done
for ((i=0;i<48;i++)); do (echo 2/$i;portcfgfillword 2/$i 3); done
for ((i=0;i<48;i++)); do (echo 3/$i;portcfgfillword 3/$i 3); done
for ((i=0;i<48;i++)); do (echo 4/$i;portcfgfillword 4/$i 3); done
for ((i=0;i<48;i++)); do (echo 9/$i;portcfgfillword 9/$i 3); done
for ((i=0;i<48;i++)); do (echo 10/$i;portcfgfillword 10/$i 3); done
for ((i=0;i<48;i++)); do (echo 11/$i;portcfgfillword 11/$i 3); done
for ((i=0;i<48;i++)); do (echo 12/$i;portcfgfillword 12/$i 3); done
DCX-4S:
for ((i=0;i<48;i++)); do (echo 1/$i;portcfgfillword 1/$i 3); done
for ((i=0;i<48;i++)); do (echo 2/$i;portcfgfillword 2/$i 3); done
for ((i=0;i<48;i++)); do (echo 7/$i;portcfgfillword 7/$i 3); done
for ((i=0;i<48;i++)); do (echo 8/$i;portcfgfillword 8/$i 3); done
5300:
for ((i=0;i<80;i++)); do (echo $i;portcfgfillword $i 3); done
5100:
for ((i=0;i<40;i++)); do (echo $i;portcfgfillword $i 3); done
Я про универсальный режим не знал. Григорий, спасибо.
ОтветитьУдалить