trace_processor: support kfree_skb event

kfree_skb ftrace events indicates that the packet was discarded due to
some error. This patch shows the kfree skb count on the global counter
tracker.

Bug: 221349557

Test: ui/run-dev-server & manaul check the UI behavior

Test: tools/diff_test_trace_processor.py <trace_processor_shell> \
      --query-metric-filter='kfree_skb'
Change-Id: I0f9135c24553bfb024b9c87e70f626a108199200
diff --git a/Android.bp b/Android.bp
index ff943ad..03cd439 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4173,6 +4173,7 @@
         "protos/perfetto/trace/ftrace/scm.proto",
         "protos/perfetto/trace/ftrace/sde.proto",
         "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/skb.proto",
         "protos/perfetto/trace/ftrace/sock.proto",
         "protos/perfetto/trace/ftrace/sync.proto",
         "protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4395,6 +4396,7 @@
         "protos/perfetto/trace/ftrace/scm.proto",
         "protos/perfetto/trace/ftrace/sde.proto",
         "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/skb.proto",
         "protos/perfetto/trace/ftrace/sock.proto",
         "protos/perfetto/trace/ftrace/sync.proto",
         "protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4451,6 +4453,7 @@
         "external/perfetto/protos/perfetto/trace/ftrace/scm.gen.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sde.gen.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/signal.gen.cc",
+        "external/perfetto/protos/perfetto/trace/ftrace/skb.gen.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sock.gen.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sync.gen.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/synthetic.gen.cc",
@@ -4507,6 +4510,7 @@
         "protos/perfetto/trace/ftrace/scm.proto",
         "protos/perfetto/trace/ftrace/sde.proto",
         "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/skb.proto",
         "protos/perfetto/trace/ftrace/sock.proto",
         "protos/perfetto/trace/ftrace/sync.proto",
         "protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4563,6 +4567,7 @@
         "external/perfetto/protos/perfetto/trace/ftrace/scm.gen.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sde.gen.h",
         "external/perfetto/protos/perfetto/trace/ftrace/signal.gen.h",
+        "external/perfetto/protos/perfetto/trace/ftrace/skb.gen.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sock.gen.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sync.gen.h",
         "external/perfetto/protos/perfetto/trace/ftrace/synthetic.gen.h",
@@ -4623,6 +4628,7 @@
         "protos/perfetto/trace/ftrace/scm.proto",
         "protos/perfetto/trace/ftrace/sde.proto",
         "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/skb.proto",
         "protos/perfetto/trace/ftrace/sock.proto",
         "protos/perfetto/trace/ftrace/sync.proto",
         "protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4678,6 +4684,7 @@
         "external/perfetto/protos/perfetto/trace/ftrace/scm.pb.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sde.pb.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/signal.pb.cc",
+        "external/perfetto/protos/perfetto/trace/ftrace/skb.pb.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sock.pb.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sync.pb.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/synthetic.pb.cc",
@@ -4734,6 +4741,7 @@
         "protos/perfetto/trace/ftrace/scm.proto",
         "protos/perfetto/trace/ftrace/sde.proto",
         "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/skb.proto",
         "protos/perfetto/trace/ftrace/sock.proto",
         "protos/perfetto/trace/ftrace/sync.proto",
         "protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4789,6 +4797,7 @@
         "external/perfetto/protos/perfetto/trace/ftrace/scm.pb.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sde.pb.h",
         "external/perfetto/protos/perfetto/trace/ftrace/signal.pb.h",
+        "external/perfetto/protos/perfetto/trace/ftrace/skb.pb.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sock.pb.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sync.pb.h",
         "external/perfetto/protos/perfetto/trace/ftrace/synthetic.pb.h",
@@ -4849,6 +4858,7 @@
         "protos/perfetto/trace/ftrace/scm.proto",
         "protos/perfetto/trace/ftrace/sde.proto",
         "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/skb.proto",
         "protos/perfetto/trace/ftrace/sock.proto",
         "protos/perfetto/trace/ftrace/sync.proto",
         "protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4905,6 +4915,7 @@
         "external/perfetto/protos/perfetto/trace/ftrace/scm.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sde.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/signal.pbzero.cc",
+        "external/perfetto/protos/perfetto/trace/ftrace/skb.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sock.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/sync.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/ftrace/synthetic.pbzero.cc",
@@ -4961,6 +4972,7 @@
         "protos/perfetto/trace/ftrace/scm.proto",
         "protos/perfetto/trace/ftrace/sde.proto",
         "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/skb.proto",
         "protos/perfetto/trace/ftrace/sock.proto",
         "protos/perfetto/trace/ftrace/sync.proto",
         "protos/perfetto/trace/ftrace/synthetic.proto",
@@ -5017,6 +5029,7 @@
         "external/perfetto/protos/perfetto/trace/ftrace/scm.pbzero.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sde.pbzero.h",
         "external/perfetto/protos/perfetto/trace/ftrace/signal.pbzero.h",
+        "external/perfetto/protos/perfetto/trace/ftrace/skb.pbzero.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sock.pbzero.h",
         "external/perfetto/protos/perfetto/trace/ftrace/sync.pbzero.h",
         "external/perfetto/protos/perfetto/trace/ftrace/synthetic.pbzero.h",
diff --git a/BUILD b/BUILD
index 7e47fd9..2d41c88 100644
--- a/BUILD
+++ b/BUILD
@@ -2841,6 +2841,7 @@
         "protos/perfetto/trace/ftrace/scm.proto",
         "protos/perfetto/trace/ftrace/sde.proto",
         "protos/perfetto/trace/ftrace/signal.proto",
+        "protos/perfetto/trace/ftrace/skb.proto",
         "protos/perfetto/trace/ftrace/sock.proto",
         "protos/perfetto/trace/ftrace/sync.proto",
         "protos/perfetto/trace/ftrace/synthetic.proto",
diff --git a/protos/perfetto/trace/ftrace/all_protos.gni b/protos/perfetto/trace/ftrace/all_protos.gni
index 7d43696..9ec8cf5 100644
--- a/protos/perfetto/trace/ftrace/all_protos.gni
+++ b/protos/perfetto/trace/ftrace/all_protos.gni
@@ -55,6 +55,7 @@
   "scm.proto",
   "sde.proto",
   "signal.proto",
+  "skb.proto",
   "sock.proto",
   "sync.proto",
   "synthetic.proto",
diff --git a/protos/perfetto/trace/ftrace/ftrace_event.proto b/protos/perfetto/trace/ftrace/ftrace_event.proto
index 13b3acb..d73dec4 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event.proto
@@ -55,6 +55,7 @@
 import "protos/perfetto/trace/ftrace/scm.proto";
 import "protos/perfetto/trace/ftrace/sde.proto";
 import "protos/perfetto/trace/ftrace/signal.proto";
+import "protos/perfetto/trace/ftrace/skb.proto";
 import "protos/perfetto/trace/ftrace/sock.proto";
 import "protos/perfetto/trace/ftrace/sync.proto";
 import "protos/perfetto/trace/ftrace/synthetic.proto";
@@ -460,5 +461,6 @@
     CrosEcSensorhubDataFtraceEvent cros_ec_sensorhub_data = 364;
     NapiGroReceiveEntryFtraceEvent napi_gro_receive_entry = 365;
     NapiGroReceiveExitFtraceEvent napi_gro_receive_exit = 366;
+    KfreeSkbFtraceEvent kfree_skb = 367;
   }
 }
diff --git a/protos/perfetto/trace/ftrace/skb.proto b/protos/perfetto/trace/ftrace/skb.proto
new file mode 100644
index 0000000..b77f871
--- /dev/null
+++ b/protos/perfetto/trace/ftrace/skb.proto
@@ -0,0 +1,12 @@
+// Autogenerated by:
+// ../../tools/ftrace_proto_gen/ftrace_proto_gen.cc
+// Do not edit.
+
+syntax = "proto2";
+package perfetto.protos;
+
+message KfreeSkbFtraceEvent {
+  optional uint64 location = 1;
+  optional uint32 protocol = 2;
+  optional uint64 skbaddr = 3;
+}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 5b04757..c066c5c 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -5471,6 +5471,16 @@
 
 // End of protos/perfetto/trace/ftrace/signal.proto
 
+// Begin of protos/perfetto/trace/ftrace/skb.proto
+
+message KfreeSkbFtraceEvent {
+  optional uint64 location = 1;
+  optional uint32 protocol = 2;
+  optional uint64 skbaddr = 3;
+}
+
+// End of protos/perfetto/trace/ftrace/skb.proto
+
 // Begin of protos/perfetto/trace/ftrace/sock.proto
 
 message InetSockSetStateFtraceEvent {
@@ -6009,6 +6019,7 @@
     CrosEcSensorhubDataFtraceEvent cros_ec_sensorhub_data = 364;
     NapiGroReceiveEntryFtraceEvent napi_gro_receive_entry = 365;
     NapiGroReceiveExitFtraceEvent napi_gro_receive_exit = 366;
+    KfreeSkbFtraceEvent kfree_skb = 367;
   }
 }
 
diff --git a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
index e397165..2ac0e3c 100644
--- a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
@@ -24,7 +24,7 @@
 namespace trace_processor {
 namespace {
 
-std::array<MessageDescriptor, 367> descriptors{{
+std::array<MessageDescriptor, 368> descriptors{{
     {nullptr, 0, {}},
     {nullptr, 0, {}},
     {nullptr, 0, {}},
@@ -3952,6 +3952,16 @@
             {"ret", ProtoSchemaType::kInt32},
         },
     },
+    {
+        "kfree_skb",
+        3,
+        {
+            {},
+            {"location", ProtoSchemaType::kUint64},
+            {"protocol", ProtoSchemaType::kUint32},
+            {"skbaddr", ProtoSchemaType::kUint64},
+        },
+    },
 }};
 
 }  // namespace
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index 1008761..b1f5c17 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -55,6 +55,7 @@
 #include "protos/perfetto/trace/ftrace/scm.pbzero.h"
 #include "protos/perfetto/trace/ftrace/sde.pbzero.h"
 #include "protos/perfetto/trace/ftrace/signal.pbzero.h"
+#include "protos/perfetto/trace/ftrace/skb.pbzero.h"
 #include "protos/perfetto/trace/ftrace/sock.pbzero.h"
 #include "protos/perfetto/trace/ftrace/systrace.pbzero.h"
 #include "protos/perfetto/trace/ftrace/task.pbzero.h"
@@ -111,6 +112,7 @@
       cpu_freq_name_id_(context->storage->InternString("cpufreq")),
       gpu_freq_name_id_(context->storage->InternString("gpufreq")),
       cpu_idle_name_id_(context->storage->InternString("cpuidle")),
+      kfree_skb_name_id_(context->storage->InternString("Kfree Skb")),
       ion_total_id_(context->storage->InternString("mem.ion")),
       ion_change_id_(context->storage->InternString("mem.ion_change")),
       ion_buffer_id_(context->storage->InternString("mem.ion_buffer")),
@@ -680,6 +682,10 @@
         ParseCpuFrequencyLimits(ts, data);
         break;
       }
+      case FtraceEvent::kKfreeSkbFieldNumber: {
+        ParseKfreeSkb(ts, data);
+        break;
+      }
       default:
         break;
     }
@@ -1880,5 +1886,16 @@
       timestamp, static_cast<double>(evt.min_freq()), min_track);
 }
 
+void FtraceParser::ParseKfreeSkb(int64_t timestamp,
+                                 protozero::ConstBytes blob) {
+  protos::pbzero::KfreeSkbFtraceEvent::Decoder evt(blob.data, blob.size);
+
+  num_of_kfree_skb_ += 1;
+  TrackId track =
+      context_->track_tracker->InternGlobalCounterTrack(kfree_skb_name_id_);
+  context_->event_tracker->PushCounter(
+      timestamp, static_cast<double>(num_of_kfree_skb_), track);
+}
+
 }  // namespace trace_processor
 }  // namespace perfetto
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.h b/src/trace_processor/importers/ftrace/ftrace_parser.h
index 934bb07..611c980 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.h
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.h
@@ -168,6 +168,7 @@
                                int64_t timestamp,
                                protozero::ConstBytes);
   void ParseCpuFrequencyLimits(int64_t timestamp, protozero::ConstBytes);
+  void ParseKfreeSkb(int64_t timestamp, protozero::ConstBytes);
 
   TraceProcessorContext* context_;
   RssStatTracker rss_stat_tracker_;
@@ -178,6 +179,7 @@
   const StringId cpu_freq_name_id_;
   const StringId gpu_freq_name_id_;
   const StringId cpu_idle_name_id_;
+  const StringId kfree_skb_name_id_;
   const StringId ion_total_id_;
   const StringId ion_change_id_;
   const StringId ion_buffer_id_;
@@ -246,6 +248,9 @@
   // Record number of transmitted bytes to the network interface card.
   std::unordered_map<StringId, uint64_t> nic_transmitted_bytes_;
 
+  // Record number of kfree_skb.
+  uint64_t num_of_kfree_skb_ = 0;
+
   // Keep sock to stream number mapping.
   std::unordered_map<uint64_t, uint32_t> skaddr_to_stream_;
 
diff --git a/src/traced/probes/ftrace/event_info.cc b/src/traced/probes/ftrace/event_info.cc
index baf5468..bd88df6 100644
--- a/src/traced/probes/ftrace/event_info.cc
+++ b/src/traced/probes/ftrace/event_info.cc
@@ -6549,6 +6549,22 @@
        kUnsetFtraceId,
        325,
        kUnsetSize},
+      {"kfree_skb",
+       "skb",
+       {
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "location", 1, ProtoSchemaType::kUint64,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "protocol", 2, ProtoSchemaType::kUint32,
+            TranslationStrategy::kInvalidTranslationStrategy},
+           {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+            "skbaddr", 3, ProtoSchemaType::kUint64,
+            TranslationStrategy::kInvalidTranslationStrategy},
+       },
+       kUnsetFtraceId,
+       367,
+       kUnsetSize},
       {"inet_sock_set_state",
        "sock",
        {
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/skb/kfree_skb/format b/src/traced/probes/ftrace/test/data/synthetic/events/skb/kfree_skb/format
new file mode 100644
index 0000000..5f55e20
--- /dev/null
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/skb/kfree_skb/format
@@ -0,0 +1,13 @@
+name: kfree_skb
+ID: 925
+format:
+	field:unsigned short common_type;	offset:0;	size:2;	signed:0;
+	field:unsigned char common_flags;	offset:2;	size:1;	signed:0;
+	field:unsigned char common_preempt_count;	offset:3;	size:1;	signed:0;
+	field:int common_pid;	offset:4;	size:4;	signed:1;
+
+	field:void * skbaddr;	offset:8;	size:8;	signed:0;
+	field:void * location;	offset:16;	size:8;	signed:0;
+	field:unsigned short protocol;	offset:24;	size:2;	signed:0;
+
+print fmt: "skbaddr=%p protocol=%u location=%p", REC->skbaddr, REC->protocol, REC->location
diff --git a/test/trace_processor/network/index b/test/trace_processor/network/index
index 3f8fa33..01ad31b 100644
--- a/test/trace_processor/network/index
+++ b/test/trace_processor/network/index
@@ -5,3 +5,4 @@
 inet_sock_set_state.textproto inet_sock_set_state.sql inet_sock_set_state.out
 tcp_retransmit_skb.textproto tcp_retransmit_skb.sql tcp_retransmit_skb.out
 napi_gro_receive.textproto napi_gro_receive.sql napi_gro_receive.out
+kfree_skb.textproto kfree_skb.sql kfree_skb.out
\ No newline at end of file
diff --git a/test/trace_processor/network/kfree_skb.out b/test/trace_processor/network/kfree_skb.out
new file mode 100644
index 0000000..b565496
--- /dev/null
+++ b/test/trace_processor/network/kfree_skb.out
@@ -0,0 +1,5 @@
+"ts"
+10000
+10020
+20000
+20020
diff --git a/test/trace_processor/network/kfree_skb.sql b/test/trace_processor/network/kfree_skb.sql
new file mode 100644
index 0000000..b985091
--- /dev/null
+++ b/test/trace_processor/network/kfree_skb.sql
@@ -0,0 +1,10 @@
+SELECT
+  ts
+FROM
+  counter AS c
+  LEFT JOIN
+  counter_track AS t
+  ON c.track_id = t.id
+WHERE
+  name GLOB "Kfree Skb"
+ORDER BY ts;
\ No newline at end of file
diff --git a/test/trace_processor/network/kfree_skb.textproto b/test/trace_processor/network/kfree_skb.textproto
new file mode 100644
index 0000000..bda1c2b
--- /dev/null
+++ b/test/trace_processor/network/kfree_skb.textproto
@@ -0,0 +1,44 @@
+packet {
+  ftrace_events {
+    cpu: 2
+    event {
+      timestamp: 10000
+      pid: 200
+      kfree_skb {
+      }
+    }
+  }
+}
+packet {
+  ftrace_events {
+    cpu: 2
+    event {
+      timestamp: 10020
+      pid: 300
+      kfree_skb {
+      }
+    }
+  }
+}
+packet {
+  ftrace_events {
+    cpu: 2
+    event {
+      timestamp: 20000
+      pid: 200
+      kfree_skb {
+      }
+    }
+  }
+}
+packet {
+  ftrace_events {
+    cpu: 2
+    event {
+      timestamp: 20020
+      pid: 300
+      kfree_skb {
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/tools/ftrace_proto_gen/event_list b/tools/ftrace_proto_gen/event_list
index 948eb11..698528a 100644
--- a/tools/ftrace_proto_gen/event_list
+++ b/tools/ftrace_proto_gen/event_list
@@ -361,3 +361,4 @@
 cros_ec/cros_ec_sensorhub_data
 net/napi_gro_receive_entry
 net/napi_gro_receive_exit
+skb/kfree_skb