diff --git a/apis/flowcollector/v1beta1/flowcollector_types.go b/apis/flowcollector/v1beta1/flowcollector_types.go
index 5683a712a..820d06eb9 100644
--- a/apis/flowcollector/v1beta1/flowcollector_types.go
+++ b/apis/flowcollector/v1beta1/flowcollector_types.go
@@ -249,6 +249,10 @@ type EBPFFlowFilter struct {
// ICMPCode defines the ICMP code to filter flows by.
// +optional
ICMPCode *int `json:"icmpCode,omitempty"`
+
+ // `pktDrops`, to filter flows with packet drops
+ // +optional
+ PktDrops *bool `json:"pktDrops,omitempty"`
}
// `FlowCollectorEBPF` defines a FlowCollector that uses eBPF to collect the flows information
diff --git a/apis/flowcollector/v1beta1/zz_generated.conversion.go b/apis/flowcollector/v1beta1/zz_generated.conversion.go
index d606c634f..d46dbe91c 100644
--- a/apis/flowcollector/v1beta1/zz_generated.conversion.go
+++ b/apis/flowcollector/v1beta1/zz_generated.conversion.go
@@ -498,6 +498,7 @@ func autoConvert_v1beta1_EBPFFlowFilter_To_v1beta2_EBPFFlowFilter(in *EBPFFlowFi
out.PeerIP = in.PeerIP
out.ICMPType = (*int)(unsafe.Pointer(in.ICMPType))
out.ICMPCode = (*int)(unsafe.Pointer(in.ICMPCode))
+ out.PktDrops = (*bool)(unsafe.Pointer(in.PktDrops))
return nil
}
@@ -519,6 +520,7 @@ func autoConvert_v1beta2_EBPFFlowFilter_To_v1beta1_EBPFFlowFilter(in *v1beta2.EB
out.PeerIP = in.PeerIP
out.ICMPCode = (*int)(unsafe.Pointer(in.ICMPCode))
out.ICMPType = (*int)(unsafe.Pointer(in.ICMPType))
+ out.PktDrops = (*bool)(unsafe.Pointer(in.PktDrops))
return nil
}
diff --git a/apis/flowcollector/v1beta1/zz_generated.deepcopy.go b/apis/flowcollector/v1beta1/zz_generated.deepcopy.go
index 9fea5bb51..2bc3a04b9 100644
--- a/apis/flowcollector/v1beta1/zz_generated.deepcopy.go
+++ b/apis/flowcollector/v1beta1/zz_generated.deepcopy.go
@@ -143,6 +143,11 @@ func (in *EBPFFlowFilter) DeepCopyInto(out *EBPFFlowFilter) {
*out = new(int)
**out = **in
}
+ if in.PktDrops != nil {
+ in, out := &in.PktDrops, &out.PktDrops
+ *out = new(bool)
+ **out = **in
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EBPFFlowFilter.
diff --git a/apis/flowcollector/v1beta2/flowcollector_types.go b/apis/flowcollector/v1beta2/flowcollector_types.go
index 27256500c..8dfea7ac3 100644
--- a/apis/flowcollector/v1beta2/flowcollector_types.go
+++ b/apis/flowcollector/v1beta2/flowcollector_types.go
@@ -273,6 +273,10 @@ type EBPFFlowFilter struct {
// `icmpType`, for ICMP traffic, defines the ICMP type to filter flows by.
// +optional
ICMPType *int `json:"icmpType,omitempty"`
+
+ // `pktDrops`, to filter flows with packet drops
+ // +optional
+ PktDrops *bool `json:"pktDrops,omitempty"`
}
// `FlowCollectorEBPF` defines a FlowCollector that uses eBPF to collect the flows information
diff --git a/apis/flowcollector/v1beta2/zz_generated.deepcopy.go b/apis/flowcollector/v1beta2/zz_generated.deepcopy.go
index efd6da675..f4dc8658f 100644
--- a/apis/flowcollector/v1beta2/zz_generated.deepcopy.go
+++ b/apis/flowcollector/v1beta2/zz_generated.deepcopy.go
@@ -302,6 +302,11 @@ func (in *EBPFFlowFilter) DeepCopyInto(out *EBPFFlowFilter) {
*out = new(int)
**out = **in
}
+ if in.PktDrops != nil {
+ in, out := &in.PktDrops, &out.PktDrops
+ *out = new(bool)
+ **out = **in
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EBPFFlowFilter.
diff --git a/bundle/manifests/flows.netobserv.io_flowcollectors.yaml b/bundle/manifests/flows.netobserv.io_flowcollectors.yaml
index b095a89dd..dac8798d1 100644
--- a/bundle/manifests/flows.netobserv.io_flowcollectors.yaml
+++ b/bundle/manifests/flows.netobserv.io_flowcollectors.yaml
@@ -199,6 +199,10 @@ spec:
PeerIP defines the IP address to filter flows by.
Example: 10.10.10.10
type: string
+ pktDrops:
+ description: '`pktDrops`, to filter flows with packet
+ drops'
+ type: boolean
ports:
anyOf:
- type: integer
@@ -3792,6 +3796,10 @@ spec:
`peerIP` defines the IP address to filter flows by.
Example: `10.10.10.10`.
type: string
+ pktDrops:
+ description: '`pktDrops`, to filter flows with packet
+ drops'
+ type: boolean
ports:
anyOf:
- type: integer
diff --git a/config/crd/bases/flows.netobserv.io_flowcollectors.yaml b/config/crd/bases/flows.netobserv.io_flowcollectors.yaml
index ba0500585..ce5d63409 100644
--- a/config/crd/bases/flows.netobserv.io_flowcollectors.yaml
+++ b/config/crd/bases/flows.netobserv.io_flowcollectors.yaml
@@ -178,6 +178,9 @@ spec:
PeerIP defines the IP address to filter flows by.
Example: 10.10.10.10
type: string
+ pktDrops:
+ description: '`pktDrops`, to filter flows with packet drops'
+ type: boolean
ports:
anyOf:
- type: integer
@@ -3499,6 +3502,9 @@ spec:
`peerIP` defines the IP address to filter flows by.
Example: `10.10.10.10`.
type: string
+ pktDrops:
+ description: '`pktDrops`, to filter flows with packet drops'
+ type: boolean
ports:
anyOf:
- type: integer
diff --git a/controllers/ebpf/agent_controller.go b/controllers/ebpf/agent_controller.go
index 3dffad04a..f83d84600 100644
--- a/controllers/ebpf/agent_controller.go
+++ b/controllers/ebpf/agent_controller.go
@@ -81,6 +81,7 @@ const (
envFilterICMPCode = "FILTER_ICMP_CODE"
envFilterPeerIPAddress = "FILTER_PEER_IP"
envFilterTCPFlags = "FILTER_TCP_FLAGS"
+ envFilterPktDrops = "FILTER_DROPS"
envListSeparator = ","
)
@@ -573,6 +574,9 @@ func (c *AgentController) configureFlowFilter(filter *flowslatest.EBPFFlowFilter
})
}
+ if filter.PktDrops != nil && *filter.PktDrops {
+ config = append(config, corev1.EnvVar{Name: envFilterPktDrops, Value: "true"})
+ }
return config
}
diff --git a/docs/FlowCollector.md b/docs/FlowCollector.md
index fdeee6571..f87848390 100644
--- a/docs/FlowCollector.md
+++ b/docs/FlowCollector.md
@@ -496,6 +496,13 @@ To filter two ports, use a "port1,port2" in string format. For example, `ports:
Example: 10.10.10.10