Skip to content

Commit e63a875

Browse files
Merge pull request #14 from kosmas-valianos/alignment
Fix alignment calculations
2 parents c417fa8 + a4b83d2 commit e63a875

3 files changed

Lines changed: 21 additions & 14 deletions

File tree

src/proxy_protocol.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -656,14 +656,21 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
656656
len += sizeof_pp2_tlv_t + sizeof(uint32_t);
657657
}
658658
*pp2_hdr_len = sizeof(proxy_hdr_v2_t) + len;
659-
if (pp_info->pp2_info.align_padding > 1)
659+
if (pp_info->pp2_info.alignment_power > 1)
660660
{
661-
uint16_t pow = 1 << pp_info->pp2_info.align_padding;
662-
if (*pp2_hdr_len % pow)
661+
uint16_t alignment = 1 << pp_info->pp2_info.alignment_power;
662+
if (*pp2_hdr_len % alignment)
663663
{
664-
padding_bytes = (*pp2_hdr_len - sizeof_pp2_tlv_t) % pow;
665-
len += sizeof_pp2_tlv_t + padding_bytes;
666-
*pp2_hdr_len = sizeof(proxy_hdr_v2_t) + len;
664+
uint16_t pp2_hdr_len_padded = (*pp2_hdr_len / alignment + 1) * alignment;
665+
/* The NOOP TLV needs to be at least 3 bytes because a TLV can not be smaller than that */
666+
if (pp2_hdr_len_padded - *pp2_hdr_len < 3)
667+
{
668+
pp2_hdr_len_padded += alignment;
669+
}
670+
padding_bytes = pp2_hdr_len_padded - sizeof(proxy_hdr_v2_t) - len - sizeof_pp2_tlv_t;
671+
672+
*pp2_hdr_len = pp2_hdr_len_padded;
673+
len = pp2_hdr_len_padded - sizeof(proxy_hdr_v2_t);
667674
}
668675
}
669676
proxy_hdr_v2.len = htons(len);
@@ -688,7 +695,7 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
688695
memcpy(pp2_hdr + index, tlv_array->tlvs[i], tlv_len);
689696
index += tlv_len;
690697
}
691-
if (pp_info->pp2_info.align_padding > 1)
698+
if (pp_info->pp2_info.alignment_power > 1)
692699
{
693700
pp2_tlv_t tlv = {
694701
.type = PP2_TYPE_NOOP,

src/proxy_protocol.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ typedef struct
8989
* In parsing:
9090
* Ignored
9191
*/
92-
uint8_t align_padding;
92+
uint8_t alignment_power;
9393
pp2_ssl_info_t pp2_ssl_info;
9494
tlv_array_t tlv_array;
9595
/*

tests/test.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ int main()
435435
.src_port = 42332,
436436
.dst_port = 8080,
437437
.pp2_info = {
438-
.align_padding = 2,
438+
.alignment_power = 2,
439439
.pp2_ssl_info = {
440440
.ssl = 1,
441441
.cert_in_connection = 1,
@@ -474,13 +474,13 @@ int main()
474474
{
475475
.type = PP2_TYPE_AWS,
476476
.subtype = PP2_SUBTYPE_AWS_VPCE_ID,
477-
.value_len = 23,
478-
.value = (uint8_t*) "vpce-24d8ezjk38bchilm4"
477+
.value_len = 24,
478+
.value = (uint8_t*) "vpce-24d8ezjk38bchilm4m"
479479
},
480480
{
481481
.type = PP2_TYPE_CRC32C,
482482
.value_len = 4,
483-
.value = (uint8_t*) "\x75\x40\xf1\x2f"
483+
.value = (uint8_t*) "\x43\x84\x86\x4e"
484484
},
485485
},
486486
.pp_info_out_expected = tests[9].pp_info_in,
@@ -560,7 +560,7 @@ int main()
560560
else
561561
{
562562
uint16_t pp_hdr_len;
563-
uint16_t pow = 1 << tests[i].pp_info_in.pp2_info.align_padding;
563+
uint16_t alignment = 1 << tests[i].pp_info_in.pp2_info.alignment_power;
564564
int32_t error;
565565

566566
if (tests[i].add_tlvs[0].type)
@@ -578,7 +578,7 @@ int main()
578578
pp_info_clear(&tests[i].pp_info_in);
579579
if (!pp_hdr
580580
|| error != ERR_NULL
581-
|| (pow > 1 && pp_hdr_len % pow))
581+
|| (alignment > 1 && pp_hdr_len % alignment))
582582
{
583583
printf("FAILED\n");
584584
pp_info_clear(&pp_info_out);

0 commit comments

Comments
 (0)