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.