@@ -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 ,
0 commit comments