@@ -473,6 +473,103 @@ void pp_info_clear(pp_info_t *pp_info)
473473 memset (pp_info , 0 , sizeof (* pp_info ));
474474}
475475
476+ /*****************************************************************/
477+ /* */
478+ /* CRC LOOKUP TABLE */
479+ /* ================ */
480+ /* The following CRC lookup table was generated automagically */
481+ /* by the Rocksoft^tm Model CRC Algorithm Table Generation */
482+ /* Program V1.0 using the following model parameters: */
483+ /* */
484+ /* Width : 4 bytes. */
485+ /* Poly : 0x1EDC6F41L */
486+ /* Reverse : TRUE. */
487+ /* */
488+ /* For more information on the Rocksoft^tm Model CRC Algorithm, */
489+ /* see the document titled "A Painless Guide to CRC Error */
490+ /* Detection Algorithms" by Ross Williams */
491+ /* (ross@guest.adelaide.edu.au.). This document is likely to be */
492+ /* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */
493+ /* */
494+ /*****************************************************************/
495+
496+ static uint32_t crctable [256 ] = {
497+ 0x00000000L , 0xF26B8303L , 0xE13B70F7L , 0x1350F3F4L ,
498+ 0xC79A971FL , 0x35F1141CL , 0x26A1E7E8L , 0xD4CA64EBL ,
499+ 0x8AD958CFL , 0x78B2DBCCL , 0x6BE22838L , 0x9989AB3BL ,
500+ 0x4D43CFD0L , 0xBF284CD3L , 0xAC78BF27L , 0x5E133C24L ,
501+ 0x105EC76FL , 0xE235446CL , 0xF165B798L , 0x030E349BL ,
502+ 0xD7C45070L , 0x25AFD373L , 0x36FF2087L , 0xC494A384L ,
503+ 0x9A879FA0L , 0x68EC1CA3L , 0x7BBCEF57L , 0x89D76C54L ,
504+ 0x5D1D08BFL , 0xAF768BBCL , 0xBC267848L , 0x4E4DFB4BL ,
505+ 0x20BD8EDEL , 0xD2D60DDDL , 0xC186FE29L , 0x33ED7D2AL ,
506+ 0xE72719C1L , 0x154C9AC2L , 0x061C6936L , 0xF477EA35L ,
507+ 0xAA64D611L , 0x580F5512L , 0x4B5FA6E6L , 0xB93425E5L ,
508+ 0x6DFE410EL , 0x9F95C20DL , 0x8CC531F9L , 0x7EAEB2FAL ,
509+ 0x30E349B1L , 0xC288CAB2L , 0xD1D83946L , 0x23B3BA45L ,
510+ 0xF779DEAEL , 0x05125DADL , 0x1642AE59L , 0xE4292D5AL ,
511+ 0xBA3A117EL , 0x4851927DL , 0x5B016189L , 0xA96AE28AL ,
512+ 0x7DA08661L , 0x8FCB0562L , 0x9C9BF696L , 0x6EF07595L ,
513+ 0x417B1DBCL , 0xB3109EBFL , 0xA0406D4BL , 0x522BEE48L ,
514+ 0x86E18AA3L , 0x748A09A0L , 0x67DAFA54L , 0x95B17957L ,
515+ 0xCBA24573L , 0x39C9C670L , 0x2A993584L , 0xD8F2B687L ,
516+ 0x0C38D26CL , 0xFE53516FL , 0xED03A29BL , 0x1F682198L ,
517+ 0x5125DAD3L , 0xA34E59D0L , 0xB01EAA24L , 0x42752927L ,
518+ 0x96BF4DCCL , 0x64D4CECFL , 0x77843D3BL , 0x85EFBE38L ,
519+ 0xDBFC821CL , 0x2997011FL , 0x3AC7F2EBL , 0xC8AC71E8L ,
520+ 0x1C661503L , 0xEE0D9600L , 0xFD5D65F4L , 0x0F36E6F7L ,
521+ 0x61C69362L , 0x93AD1061L , 0x80FDE395L , 0x72966096L ,
522+ 0xA65C047DL , 0x5437877EL , 0x4767748AL , 0xB50CF789L ,
523+ 0xEB1FCBADL , 0x197448AEL , 0x0A24BB5AL , 0xF84F3859L ,
524+ 0x2C855CB2L , 0xDEEEDFB1L , 0xCDBE2C45L , 0x3FD5AF46L ,
525+ 0x7198540DL , 0x83F3D70EL , 0x90A324FAL , 0x62C8A7F9L ,
526+ 0xB602C312L , 0x44694011L , 0x5739B3E5L , 0xA55230E6L ,
527+ 0xFB410CC2L , 0x092A8FC1L , 0x1A7A7C35L , 0xE811FF36L ,
528+ 0x3CDB9BDDL , 0xCEB018DEL , 0xDDE0EB2AL , 0x2F8B6829L ,
529+ 0x82F63B78L , 0x709DB87BL , 0x63CD4B8FL , 0x91A6C88CL ,
530+ 0x456CAC67L , 0xB7072F64L , 0xA457DC90L , 0x563C5F93L ,
531+ 0x082F63B7L , 0xFA44E0B4L , 0xE9141340L , 0x1B7F9043L ,
532+ 0xCFB5F4A8L , 0x3DDE77ABL , 0x2E8E845FL , 0xDCE5075CL ,
533+ 0x92A8FC17L , 0x60C37F14L , 0x73938CE0L , 0x81F80FE3L ,
534+ 0x55326B08L , 0xA759E80BL , 0xB4091BFFL , 0x466298FCL ,
535+ 0x1871A4D8L , 0xEA1A27DBL , 0xF94AD42FL , 0x0B21572CL ,
536+ 0xDFEB33C7L , 0x2D80B0C4L , 0x3ED04330L , 0xCCBBC033L ,
537+ 0xA24BB5A6L , 0x502036A5L , 0x4370C551L , 0xB11B4652L ,
538+ 0x65D122B9L , 0x97BAA1BAL , 0x84EA524EL , 0x7681D14DL ,
539+ 0x2892ED69L , 0xDAF96E6AL , 0xC9A99D9EL , 0x3BC21E9DL ,
540+ 0xEF087A76L , 0x1D63F975L , 0x0E330A81L , 0xFC588982L ,
541+ 0xB21572C9L , 0x407EF1CAL , 0x532E023EL , 0xA145813DL ,
542+ 0x758FE5D6L , 0x87E466D5L , 0x94B49521L , 0x66DF1622L ,
543+ 0x38CC2A06L , 0xCAA7A905L , 0xD9F75AF1L , 0x2B9CD9F2L ,
544+ 0xFF56BD19L , 0x0D3D3E1AL , 0x1E6DCDEEL , 0xEC064EEDL ,
545+ 0xC38D26C4L , 0x31E6A5C7L , 0x22B65633L , 0xD0DDD530L ,
546+ 0x0417B1DBL , 0xF67C32D8L , 0xE52CC12CL , 0x1747422FL ,
547+ 0x49547E0BL , 0xBB3FFD08L , 0xA86F0EFCL , 0x5A048DFFL ,
548+ 0x8ECEE914L , 0x7CA56A17L , 0x6FF599E3L , 0x9D9E1AE0L ,
549+ 0xD3D3E1ABL , 0x21B862A8L , 0x32E8915CL , 0xC083125FL ,
550+ 0x144976B4L , 0xE622F5B7L , 0xF5720643L , 0x07198540L ,
551+ 0x590AB964L , 0xAB613A67L , 0xB831C993L , 0x4A5A4A90L ,
552+ 0x9E902E7BL , 0x6CFBAD78L , 0x7FAB5E8CL , 0x8DC0DD8FL ,
553+ 0xE330A81AL , 0x115B2B19L , 0x020BD8EDL , 0xF0605BEEL ,
554+ 0x24AA3F05L , 0xD6C1BC06L , 0xC5914FF2L , 0x37FACCF1L ,
555+ 0x69E9F0D5L , 0x9B8273D6L , 0x88D28022L , 0x7AB90321L ,
556+ 0xAE7367CAL , 0x5C18E4C9L , 0x4F48173DL , 0xBD23943EL ,
557+ 0xF36E6F75L , 0x0105EC76L , 0x12551F82L , 0xE03E9C81L ,
558+ 0x34F4F86AL , 0xC69F7B69L , 0xD5CF889DL , 0x27A40B9EL ,
559+ 0x79B737BAL , 0x8BDCB4B9L , 0x988C474DL , 0x6AE7C44EL ,
560+ 0xBE2DA0A5L , 0x4C4623A6L , 0x5F16D052L , 0xAD7D5351L
561+ };
562+
563+ static uint32_t crc32c (const uint8_t * buf , uint32_t len )
564+ {
565+ uint32_t crc = 0xffffffff ;
566+ while (len -- > 0 )
567+ {
568+ crc = (crc >> 8 ) ^ crctable [(crc ^ (* buf ++ )) & 0xFF ];
569+ }
570+ return crc ^ 0xffffffff ;
571+ }
572+
476573uint8_t * pp2_create_hdr (const pp_info_t * pp_info , uint16_t * pp2_hdr_len , int32_t * error )
477574{
478575 proxy_hdr_v2_t proxy_hdr_v2 = { .sig = PP2_SIG , .ver_cmd = '\x21' };
@@ -540,6 +637,7 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
540637
541638 proxy_hdr_v2 .fam = pp_info -> address_family << 4 | pp_info -> transport_protocol ;
542639
640+ /* Calculate the total length */
543641 uint16_t len = proxy_addr_len ;
544642 const tlv_array_t * tlv_array = & pp_info -> pp2_info .tlv_array ;
545643 uint32_t i ;
@@ -548,6 +646,10 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
548646 uint16_t tlv_len = sizeof_pp2_tlv_t + (tlv_array -> tlvs [i ]-> length_hi << 8 | tlv_array -> tlvs [i ]-> length_lo );
549647 len += tlv_len ;
550648 }
649+ if (pp_info -> pp2_info .crc32c )
650+ {
651+ len += sizeof_pp2_tlv_t + sizeof (uint32_t );
652+ }
551653 proxy_hdr_v2 .len = htons (len );
552654
553655 /* Create the PROXY protocol header */
@@ -563,12 +665,23 @@ uint8_t *pp2_create_hdr(const pp_info_t *pp_info, uint16_t *pp2_hdr_len, int32_t
563665 index += sizeof (proxy_hdr_v2_t );
564666 memcpy (pp2_hdr + index , & proxy_addr , proxy_addr_len );
565667 index += proxy_addr_len ;
668+
669+ /* Append the TLVs */
566670 for (i = 0 ; i < tlv_array -> len ; i ++ )
567671 {
568672 uint16_t tlv_len = sizeof_pp2_tlv_t + (tlv_array -> tlvs [i ]-> length_hi << 8 | tlv_array -> tlvs [i ]-> length_lo );
569673 memcpy (pp2_hdr + index , tlv_array -> tlvs [i ], tlv_len );
570674 index += tlv_len ;
571675 }
676+ if (pp_info -> pp2_info .crc32c )
677+ {
678+ pp2_tlv_t tlv = { .type = PP2_TYPE_CRC32C , .length_lo = sizeof (uint32_t ) };
679+ memcpy (pp2_hdr + index , & tlv , sizeof_pp2_tlv_t );
680+ index += sizeof_pp2_tlv_t ;
681+ memset (pp2_hdr + index , 0 , sizeof (uint32_t ));
682+ uint32_t crc32c_calculated = crc32c (pp2_hdr , * pp2_hdr_len );
683+ memcpy (pp2_hdr + index , & crc32c_calculated , sizeof (uint32_t ));
684+ }
572685
573686 * error = ERR_NULL ;
574687 return pp2_hdr ;
@@ -629,13 +742,13 @@ static uint8_t *pp1_create_hdr(const pp_info_t *pp_info, uint16_t *pp1_hdr_len,
629742
630743uint8_t * pp_create_hdr (uint8_t version , const pp_info_t * pp_info , uint16_t * pp_hdr_len , int32_t * error )
631744{
632- if (version == 1 )
745+ if (version == 2 )
633746 {
634- return pp1_create_hdr (pp_info , pp_hdr_len , error );
747+ return pp2_create_hdr (pp_info , pp_hdr_len , error );
635748 }
636- else if (version == 2 )
749+ else if (version == 1 )
637750 {
638- return pp2_create_hdr (pp_info , pp_hdr_len , error );
751+ return pp1_create_hdr (pp_info , pp_hdr_len , error );
639752 }
640753 else
641754 {
@@ -644,107 +757,10 @@ uint8_t *pp_create_hdr(uint8_t version, const pp_info_t *pp_info, uint16_t *pp_h
644757 }
645758}
646759
647- /*****************************************************************/
648- /* */
649- /* CRC LOOKUP TABLE */
650- /* ================ */
651- /* The following CRC lookup table was generated automagically */
652- /* by the Rocksoft^tm Model CRC Algorithm Table Generation */
653- /* Program V1.0 using the following model parameters: */
654- /* */
655- /* Width : 4 bytes. */
656- /* Poly : 0x1EDC6F41L */
657- /* Reverse : TRUE. */
658- /* */
659- /* For more information on the Rocksoft^tm Model CRC Algorithm, */
660- /* see the document titled "A Painless Guide to CRC Error */
661- /* Detection Algorithms" by Ross Williams */
662- /* (ross@guest.adelaide.edu.au.). This document is likely to be */
663- /* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */
664- /* */
665- /*****************************************************************/
666-
667- static uint32_t crctable [256 ] = {
668- 0x00000000L , 0xF26B8303L , 0xE13B70F7L , 0x1350F3F4L ,
669- 0xC79A971FL , 0x35F1141CL , 0x26A1E7E8L , 0xD4CA64EBL ,
670- 0x8AD958CFL , 0x78B2DBCCL , 0x6BE22838L , 0x9989AB3BL ,
671- 0x4D43CFD0L , 0xBF284CD3L , 0xAC78BF27L , 0x5E133C24L ,
672- 0x105EC76FL , 0xE235446CL , 0xF165B798L , 0x030E349BL ,
673- 0xD7C45070L , 0x25AFD373L , 0x36FF2087L , 0xC494A384L ,
674- 0x9A879FA0L , 0x68EC1CA3L , 0x7BBCEF57L , 0x89D76C54L ,
675- 0x5D1D08BFL , 0xAF768BBCL , 0xBC267848L , 0x4E4DFB4BL ,
676- 0x20BD8EDEL , 0xD2D60DDDL , 0xC186FE29L , 0x33ED7D2AL ,
677- 0xE72719C1L , 0x154C9AC2L , 0x061C6936L , 0xF477EA35L ,
678- 0xAA64D611L , 0x580F5512L , 0x4B5FA6E6L , 0xB93425E5L ,
679- 0x6DFE410EL , 0x9F95C20DL , 0x8CC531F9L , 0x7EAEB2FAL ,
680- 0x30E349B1L , 0xC288CAB2L , 0xD1D83946L , 0x23B3BA45L ,
681- 0xF779DEAEL , 0x05125DADL , 0x1642AE59L , 0xE4292D5AL ,
682- 0xBA3A117EL , 0x4851927DL , 0x5B016189L , 0xA96AE28AL ,
683- 0x7DA08661L , 0x8FCB0562L , 0x9C9BF696L , 0x6EF07595L ,
684- 0x417B1DBCL , 0xB3109EBFL , 0xA0406D4BL , 0x522BEE48L ,
685- 0x86E18AA3L , 0x748A09A0L , 0x67DAFA54L , 0x95B17957L ,
686- 0xCBA24573L , 0x39C9C670L , 0x2A993584L , 0xD8F2B687L ,
687- 0x0C38D26CL , 0xFE53516FL , 0xED03A29BL , 0x1F682198L ,
688- 0x5125DAD3L , 0xA34E59D0L , 0xB01EAA24L , 0x42752927L ,
689- 0x96BF4DCCL , 0x64D4CECFL , 0x77843D3BL , 0x85EFBE38L ,
690- 0xDBFC821CL , 0x2997011FL , 0x3AC7F2EBL , 0xC8AC71E8L ,
691- 0x1C661503L , 0xEE0D9600L , 0xFD5D65F4L , 0x0F36E6F7L ,
692- 0x61C69362L , 0x93AD1061L , 0x80FDE395L , 0x72966096L ,
693- 0xA65C047DL , 0x5437877EL , 0x4767748AL , 0xB50CF789L ,
694- 0xEB1FCBADL , 0x197448AEL , 0x0A24BB5AL , 0xF84F3859L ,
695- 0x2C855CB2L , 0xDEEEDFB1L , 0xCDBE2C45L , 0x3FD5AF46L ,
696- 0x7198540DL , 0x83F3D70EL , 0x90A324FAL , 0x62C8A7F9L ,
697- 0xB602C312L , 0x44694011L , 0x5739B3E5L , 0xA55230E6L ,
698- 0xFB410CC2L , 0x092A8FC1L , 0x1A7A7C35L , 0xE811FF36L ,
699- 0x3CDB9BDDL , 0xCEB018DEL , 0xDDE0EB2AL , 0x2F8B6829L ,
700- 0x82F63B78L , 0x709DB87BL , 0x63CD4B8FL , 0x91A6C88CL ,
701- 0x456CAC67L , 0xB7072F64L , 0xA457DC90L , 0x563C5F93L ,
702- 0x082F63B7L , 0xFA44E0B4L , 0xE9141340L , 0x1B7F9043L ,
703- 0xCFB5F4A8L , 0x3DDE77ABL , 0x2E8E845FL , 0xDCE5075CL ,
704- 0x92A8FC17L , 0x60C37F14L , 0x73938CE0L , 0x81F80FE3L ,
705- 0x55326B08L , 0xA759E80BL , 0xB4091BFFL , 0x466298FCL ,
706- 0x1871A4D8L , 0xEA1A27DBL , 0xF94AD42FL , 0x0B21572CL ,
707- 0xDFEB33C7L , 0x2D80B0C4L , 0x3ED04330L , 0xCCBBC033L ,
708- 0xA24BB5A6L , 0x502036A5L , 0x4370C551L , 0xB11B4652L ,
709- 0x65D122B9L , 0x97BAA1BAL , 0x84EA524EL , 0x7681D14DL ,
710- 0x2892ED69L , 0xDAF96E6AL , 0xC9A99D9EL , 0x3BC21E9DL ,
711- 0xEF087A76L , 0x1D63F975L , 0x0E330A81L , 0xFC588982L ,
712- 0xB21572C9L , 0x407EF1CAL , 0x532E023EL , 0xA145813DL ,
713- 0x758FE5D6L , 0x87E466D5L , 0x94B49521L , 0x66DF1622L ,
714- 0x38CC2A06L , 0xCAA7A905L , 0xD9F75AF1L , 0x2B9CD9F2L ,
715- 0xFF56BD19L , 0x0D3D3E1AL , 0x1E6DCDEEL , 0xEC064EEDL ,
716- 0xC38D26C4L , 0x31E6A5C7L , 0x22B65633L , 0xD0DDD530L ,
717- 0x0417B1DBL , 0xF67C32D8L , 0xE52CC12CL , 0x1747422FL ,
718- 0x49547E0BL , 0xBB3FFD08L , 0xA86F0EFCL , 0x5A048DFFL ,
719- 0x8ECEE914L , 0x7CA56A17L , 0x6FF599E3L , 0x9D9E1AE0L ,
720- 0xD3D3E1ABL , 0x21B862A8L , 0x32E8915CL , 0xC083125FL ,
721- 0x144976B4L , 0xE622F5B7L , 0xF5720643L , 0x07198540L ,
722- 0x590AB964L , 0xAB613A67L , 0xB831C993L , 0x4A5A4A90L ,
723- 0x9E902E7BL , 0x6CFBAD78L , 0x7FAB5E8CL , 0x8DC0DD8FL ,
724- 0xE330A81AL , 0x115B2B19L , 0x020BD8EDL , 0xF0605BEEL ,
725- 0x24AA3F05L , 0xD6C1BC06L , 0xC5914FF2L , 0x37FACCF1L ,
726- 0x69E9F0D5L , 0x9B8273D6L , 0x88D28022L , 0x7AB90321L ,
727- 0xAE7367CAL , 0x5C18E4C9L , 0x4F48173DL , 0xBD23943EL ,
728- 0xF36E6F75L , 0x0105EC76L , 0x12551F82L , 0xE03E9C81L ,
729- 0x34F4F86AL , 0xC69F7B69L , 0xD5CF889DL , 0x27A40B9EL ,
730- 0x79B737BAL , 0x8BDCB4B9L , 0x988C474DL , 0x6AE7C44EL ,
731- 0xBE2DA0A5L , 0x4C4623A6L , 0x5F16D052L , 0xAD7D5351L
732- };
733-
734- static uint32_t crc32c (const uint8_t * buf , uint32_t len )
735- {
736- uint32_t crc = 0xffffffff ;
737- while (len -- > 0 )
738- {
739- crc = (crc >> 8 ) ^ crctable [(crc ^ (* buf ++ )) & 0xFF ];
740- }
741- return crc ^0xffffffff ;
742- }
743-
744760/* Verifies and parses a version 2 PROXY protocol header */
745761static int32_t pp2_parse_hdr (uint8_t * buffer , uint32_t buffer_length , pp_info_t * pp_info )
746762{
747- const uint8_t * ppv2_hdr = buffer ;
763+ const uint8_t * pp2_hdr = buffer ;
748764 const proxy_hdr_v2_t * proxy_hdr_v2 = (proxy_hdr_v2_t * ) buffer ;
749765
750766 /* The next byte (the 13th one) is the protocol version and command */
@@ -904,7 +920,7 @@ static int32_t pp2_parse_hdr(uint8_t *buffer, uint32_t buffer_length, pp_info_t
904920
905921 /* Calculate the CRC32c checksum value of the whole PROXY header */
906922 memset (pp2_tlv -> value , 0 , pp2_tlv_len );
907- uint32_t crc32c_calculated = crc32c (ppv2_hdr , sizeof (proxy_hdr_v2_t ) + len );
923+ uint32_t crc32c_calculated = crc32c (pp2_hdr , sizeof (proxy_hdr_v2_t ) + len );
908924
909925 /* Verify that the calculated CRC32c checksum is the same as the received CRC32c checksum*/
910926 if (memcmp (& crc32c_chksum , & crc32c_calculated , 4 ))
@@ -916,6 +932,7 @@ static int32_t pp2_parse_hdr(uint8_t *buffer, uint32_t buffer_length, pp_info_t
916932 {
917933 return - ERR_HEAP_ALLOC ;
918934 }
935+ pp_info -> pp2_info .crc32c = 1 ;
919936 break ;
920937 }
921938 case PP2_TYPE_NOOP :
0 commit comments