/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_NETWORK_TRACE_MODULE_H_
#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_NETWORK_TRACE_MODULE_H_

#include <cstdint>

#include "perfetto/protozero/scattered_heap_buffer.h"
#include "protos/perfetto/trace/android/network_trace.pbzero.h"
#include "protos/perfetto/trace/trace_packet.pbzero.h"
#include "src/trace_processor/importers/common/args_tracker.h"
#include "src/trace_processor/importers/common/parser_types.h"
#include "src/trace_processor/importers/proto/proto_importer_module.h"
#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/types/trace_processor_context.h"

namespace perfetto {
namespace trace_processor {

class NetworkTraceModule : public ProtoImporterModule {
 public:
  explicit NetworkTraceModule(TraceProcessorContext* context);
  ~NetworkTraceModule() override = default;

  // Tokenize and de-intern NetworkPacketBundles so that bundles of multiple
  // packets are sorted appropriately. This splits bundles with per-packet
  // details (packet_timestamps and packet_lengths) into one NetworkTraceEvent
  // per packet. Bundles with aggregates (i.e. total_packets) are forwarded
  // after de-interning the packet context.
  ModuleResult TokenizePacket(
      const protos::pbzero::TracePacket::Decoder& decoder,
      TraceBlobView* packet,
      int64_t ts,
      PacketSequenceState* state,
      uint32_t field_id) override;

  void ParseTracePacketData(const protos::pbzero::TracePacket::Decoder& decoder,
                            int64_t ts,
                            const TracePacketData&,
                            uint32_t field_id) override;

 private:
  void ParseGenericEvent(
      int64_t ts,
      int64_t dur,
      protos::pbzero::NetworkPacketEvent::Decoder& evt,
      std::function<void(ArgsTracker::BoundInserter*)> extra_args);

  void ParseNetworkPacketEvent(int64_t ts, protozero::ConstBytes blob);
  void ParseNetworkPacketBundle(int64_t ts, protozero::ConstBytes blob);

  // Helper to simplify pushing a TracePacket to the sorter. The caller fills in
  // the packet buffer and uses this to push for sorting and reset the buffer.
  void PushPacketBufferForSort(int64_t timestamp, PacketSequenceState* state);

  TraceProcessorContext* context_;
  protozero::HeapBuffered<protos::pbzero::TracePacket> packet_buffer_;

  const StringId net_arg_length_;
  const StringId net_arg_ip_proto_;
  const StringId net_arg_tcp_flags_;
  const StringId net_arg_tag_;
  const StringId net_arg_uid_;
  const StringId net_arg_local_port_;
  const StringId net_arg_remote_port_;
  const StringId net_ipproto_tcp_;
  const StringId net_ipproto_udp_;
  const StringId packet_count_;
};

}  // namespace trace_processor
}  // namespace perfetto

#endif  // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_NETWORK_TRACE_MODULE_H_
