docs: def post_build(self, pkt, pay):
          """
          need to set the length of the whole PDU manually
          to avoid any bit fiddling use a dummy class to build the layer content
  
          also add padding if frame is < 64 bytes
  
          Note: padding only handles Ether/n*Dot1Q/EtherCat
                (no special mumbo jumbo)
  
          :param pkt: raw string containing the current layer
          :param pay: raw string containing the payload
          :return: <new current layer> + payload
          """
  
          class _EtherCatLengthCalc(Packet):
              """
              dummy class used to generate str representation easily
              """
              fields_desc = [
                  LEBitField('length', None, 11),
                  LEBitField('_reserved', 0, 1),
                  LEBitField('type', 0, 4),
              ]
  
          payload_len = len(pay)
  
          # length field is 11 bit
          if payload_len > 2047:
              raise ValueError('payload size {} exceeds maximum length {} '
                               'of EtherCat message.'.format(payload_len, 2047))
  
          self.length = payload_len
  
          vlan_headers_total_size = 0
          upper_layer = self.underlayer
  
          # add size occupied by VLAN tags
          while upper_layer and isinstance(upper_layer, Dot1Q):
              vlan_headers_total_size += 4
              upper_layer = upper_layer.underlayer
  
          if not isinstance(upper_layer, Ether):
              raise Exception('missing Ether layer')
  
          pad_len = EtherCat.ETHER_FRAME_MIN_LEN - (EtherCat.ETHER_HEADER_LEN +
                                                    vlan_headers_total_size +
                                                    EtherCat.ETHERCAT_HEADER_LEN +  # noqa: E501
                                                    payload_len +
                                                    EtherCat.ETHER_FSC_LEN)
  
          if pad_len > 0:
              pad = Padding()
              pad.load = b'\x00' * pad_len
  
              return raw(_EtherCatLengthCalc(length=self.length,
                                             type=self.type)) + pay + raw(pad)
          return raw(_EtherCatLengthCalc(length=self.length,
                                         type=self.type)) + pay