LINUX.ORG.RU

вопрос по выравниванию (32-bit alignment)

 ,


0

1

Работаю над небольшим протоколом, где атрибуты передаются в TLV:

[TotalLength][T|L|Payload][T|L|Payload][T|L|Payload]...

Длина поля TotalLength 2 байта, T и L тоже по два байта.TotalLength считается как сумма длин всех TLV + 2байта. Кроме того TLV должны быть выровнены по 32-bit границе. Означает ли это, что значение (TotalLength -2) всегда должно быьт 32-bit aligned?

★★

Ответ на: комментарий от anonymous

Так aligned или multiple-of

Вы имеете в виду, что alignement скорее больше применимо к адресам памяти?

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Он имеет в виду, что TotalLength у тебя всегда по 0 смещению относительно блока данных находится. Поэтому совершенно непонятна твоя головная боль и такое странное требование (тому, кто его придумал передай, что я его нанавижу).

И если, всеж выравнивание должно быть относительно начала блока, то либо у тебя TotalLength должен быть на +2, либо после него должно быть выравнивание 2 байта, либо не парить моск и сделать его 32 битным.

anonymous
()
Ответ на: комментарий от anonymous

Ну как-то так, да.

Вангую: этим попытались сказать, что каждый [T|L|Payload]-блок должен быть кратен 4м байтам, таким образом в конце каждого пейлоада возможен паддинг.

anonymous
()
Ответ на: комментарий от anonymous

каждый [T|L|Payload]-блок должен быть кратен 4м байтам, таким образом в конце каждого пейлоада возможен паддинг.

Мне тоже непонятно, почему rfc говорит про 32-битное выравнивание, а не кратность 4-м. Наверное исходят из того, что пакет в конечном счете будет лежать в памяти по выравненным адресам.

Перефразируя исходный вопрос - если размеры всех tlv (TLV_header + payload) кратны 4, то и TotalLength будет кратна 4?

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Привел бы ты ссылку на rfc чтоли.

если размеры всех tlv (TLV_header + payload) кратны 4, то и TotalLength будет кратна 4?

Очевидно же.

anonymous
()
Ответ на: комментарий от cruz7

Дык вот же оно: https://tools.ietf.org/html/rfc5810#section-6.2

   Padding is required when the length is
   not a multiple of 32 bits, and is the minimum number of octets
   required to bring the TLV to a multiple of 32 bits.  The length of
   the value before padding is indicated by the TLV Length field.
Как я и ванговал, речь идет о паддинге.

А по твоей ссылке aligned означает «относительно начала пакета», что правда: все TLV (даже пустые) кратны 4м байтам и первый TLV начинается с оффсета 16 байт от начала пакета.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.