6.6.2. Обработка полученных опций
Для каждого признака конечная точка DCCP может находиться в одном из трех состояний.
Стабильное состояние (STABLE) является нормальным состоянием каждого признака — обе конечные точки знают значение признака и считают, что другая сторона согласна с этим значением. Конечная точка переходит в состояние CHANGING после передачи первой опции Change для признака и возвращается в состояние STABLE после получения соответствующей опции Confirm. Нестабильное состояние (UNSTABLE) показывает, что конечная точка, находящаяся в состоянии CHANGING, изменила свой список предпочтений, но еще не передала опцию Change с новым списком.
timeout/ rcv Confirm R app/protocol evt : snd Change L rcv non-ack : ignore +---------------------------------------+ : snd Change L +----+ | | +----+ | v | rcv Change R v | v +------------+ rcv Confirm R : calc new value, +------------+ | | : accept value snd Confirm L | | | STABLE |<-----------------------------------| CHANGING | | | rcv empty Confirm R | | +------------+ : revert to old value +------------+ | ^ | ^ +----+ pref list | | snd rcv Change R changes | | Change L : calc new value, snd Confirm L v | +------------+ +---| | rcv Confirm/Change R | | UNSTABLE | : ignore +-->| | +------------+
Смена состояния признака в точке его реализации (feature location) происходит в соответствии с приведенным выше рисунком. На этой схеме не учитываются вопросы корректности порядковых номеров и опций — они отдельно описываются приведенным ниже псевдокодом.
Поддерживающей признак стороне (feature location) следует использовать приведенный здесь псевдокод, который соответствует диаграмме состояний, для реагирования на каждую корректную опцию согласования признаков, полученную в корректном пакете, не относящемся к непосредственной передаче данных (non-Data). Псевдокод содержит обозначения P.seqno и P.ackno, относящиеся к свойствам пакета, O.type и O.len, относящиеся к свойствам опции, FGSR и FGSS, относящиеся к свойствам соединения и обеспечивающие обработку случаев нарушения порядка доставки в соответствии с параграфом 6.6.4. F.state обозначает состояние признака (STABLE, CHANGING, UNSTABLE), а F.value — его значение.
Сначала проверяется, что данный признак известен (параграф 6.6.7).
Если F неизвестно Если опция помечена, как Mandatory, /* параграф 6.6.9 */ Сброс соединения (Reset) и возврат Иначе, если O.type == Change R Передача пустой опции Confirm L в будущем пакете Возврат
Далее проверяется порядок доставки (параграф 6.6.4).
Если F.state == UNSTABLE или P.seqno <= FGSR или (O.type == Confirm R и P.ackno < FGSS) Игнорировать опцию и вернуться
После этого проверяется опция Change R.
Если O.type == Change R Если значение опции корректно /* параграф 6.6.8 */ Рассчитать новое значение Передать опцию Confirm L в будущем пакете Установить F.state := STABLE Иначе, если опция была помечена, как Mandatory Сброс соединения (Reset) и возврат Иначе Передача пустой опции Confirm L в будущем пакете /* Сохраняется существующее состояние. Если состояние CHANGING, данная конечная точка позднее будет повторять передачу своей опции Change L. */
Далее обрабатывается опция Confirm R (только в состоянии CHANGING).
Если F.state == CHANGING и O.type == Confirm R Если O.len > 3 /* непустая опция */ Если значение опции корректно Установить F.value := новое значение Иначе Сброс соединения (Reset) и возврат Установить F.state := STABLE
Варианты этой диаграммы состояний и псевдокода используются также для feature remote — в этом случае просто меняются местами обозначения L и R, чтобы они относились к опциям Change R и Confirm L.