docs: def split_for_transport(orig_pkt, transport_proto):
      """
      Split an IP(v6) packet in the correct location to insert an ESP or AH
      header.
  
      @param orig_pkt: the packet to split. Must be an IP or IPv6 packet
      @param transport_proto: the IPsec protocol number that will be inserted
                              at the split position.
      @return: a tuple (header, nh, payload) where nh is the protocol number of
               payload.
      """
      # force resolution of default fields to avoid padding errors
      header = orig_pkt.__class__(raw(orig_pkt))
      next_hdr = header.payload
      nh = None
  
      if header.version == 4:
          nh = header.proto
          header.proto = transport_proto
          header.remove_payload()
          del header.chksum
          del header.len
  
          return header, nh, next_hdr
      else:
          found_rt_hdr = False
          prev = header
  
          # Since the RFC 4302 is vague about where the ESP/AH headers should be
          # inserted in IPv6, I chose to follow the linux implementation.
          while isinstance(next_hdr, (IPv6ExtHdrHopByHop, IPv6ExtHdrRouting, IPv6ExtHdrDestOpt)):  # noqa: E501
              if isinstance(next_hdr, IPv6ExtHdrHopByHop):
                  pass
              if isinstance(next_hdr, IPv6ExtHdrRouting):
                  found_rt_hdr = True
              elif isinstance(next_hdr, IPv6ExtHdrDestOpt) and found_rt_hdr:
                  break
  
              prev = next_hdr
              next_hdr = next_hdr.payload
  
          nh = prev.nh
          prev.nh = transport_proto
          prev.remove_payload()
          del header.plen
  
          return header, nh, next_hdr