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
def pad_udp(packet): if UDP in packet: # get layers after udp layer_after = packet[UDP].payload.copy() # build a padding layer pad = Padding() pad.load = '\x00' * 12 layer_before = packet.copy() layer_before[UDP].remove_payload() packet = layer_before / pad / layer_after return packet return packet
def pad_udp(packet): if UDP in packet: # get layers after udp layer_after = packet[UDP].payload.copy() print("packet: ", packet) print("udp: ", packet[UDP]) print("payload: ", packet[UDP].payload) # build a padding layer pad = Padding() pad.load = '\x00' * 12 print("pad:", pad.load) layer_before = packet.copy() layer_before[UDP].remove_payload() print("remove udp payload:", layer_before) packet = layer_before / pad / layer_after return packet return packet