Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tracepoints: Add support for data_loc params and sock and skb types #2168

Merged
merged 3 commits into from
Feb 29, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions bpf/process/bpf_generic_tracepoint.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,26 +68,30 @@ static inline __attribute__((always_inline)) unsigned long get_ctx_ul(void *src,
case s64_ty:
case u64_ty: {
u64 ret;

probe_read(&ret, sizeof(u64), src);
return ret;
}

case size_type: {
size_t ret;

probe_read(&ret, sizeof(size_t), src);
return (unsigned long)ret;
}

case nop_s32_ty:
case s32_ty: {
s32 ret;

probe_read(&ret, sizeof(u32), src);
return ret;
}

case nop_u32_ty:
case u32_ty: {
u32 ret;

probe_read(&ret, sizeof(u32), src);
return ret;
}
Expand All @@ -99,6 +103,13 @@ static inline __attribute__((always_inline)) unsigned long get_ctx_ul(void *src,
return (unsigned long)buff;
}

case data_loc_type: {
u32 ret;

probe_read(&ret, sizeof(ret), src);
return ret;
}

case const_buf_type: {
return (unsigned long)src;
}
Expand Down
18 changes: 14 additions & 4 deletions bpf/process/types/basic.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ enum {

linux_binprm_type = 37,

data_loc_type = 38,

nop_s64_ty = -10,
nop_u64_ty = -11,
nop_u32_ty = -12,
Expand Down Expand Up @@ -478,15 +480,15 @@ copy_path(char *args, const struct path *arg)
}

static inline __attribute__((always_inline)) long
copy_strings(char *args, unsigned long arg)
copy_strings(char *args, char *arg, int max_size)
{
int *s = (int *)args;
long size;

// probe_read_str() always nul-terminates the string.
// So add one to the length to allow for it. This should
// result in us honouring our MAX_STRING correctly.
size = probe_read_str(&args[4], MAX_STRING + 1, (char *)arg);
// result in us honouring our max_size correctly.
size = probe_read_str(&args[4], max_size + 1, arg);
if (size <= 1)
return invalid_ty;
// Remove the nul character from end.
Expand Down Expand Up @@ -1801,6 +1803,7 @@ selector_arg_offset(__u8 *f, struct msg_generic_kprobe *e, __u32 selidx,
pass &= filter_file_buf(filter, (struct string_buf *)args);
break;
case string_type:
case data_loc_type:
/* for strings, we just encode the length */
pass &= filter_char_buf(filter, args, 4);
break;
Expand Down Expand Up @@ -2586,8 +2589,15 @@ read_call_arg(void *ctx, struct msg_generic_kprobe *e, int index, int type,
}
// fallthrough to copy_string
case string_type:
size = copy_strings(args, arg);
size = copy_strings(args, (char *)arg, MAX_STRING);
break;
case data_loc_type: {
// data_loc: lower 16 bits is offset from ctx; upper 16 bits is length
long dl_len = (arg >> 16) & 0xfff; // masked to 4095 chars
char *dl_loc = ctx + (arg & 0xffff);

size = copy_strings(args, dl_loc, dl_len);
} break;
case syscall64_type:
case size_type:
case s64_ty:
Expand Down
183 changes: 106 additions & 77 deletions pkg/generictypes/generictypes.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

package generictypes

import "fmt"

const (
GenericIntType = 1
GenericCharBuffer = 2
Expand Down Expand Up @@ -51,87 +53,114 @@ const (

GenericLinuxBinprmType = 37

GenericDataLoc = 38

GenericNopType = -1
GenericInvalidType = -2
)

var GenericStringToType = map[string]int{
"string": GenericStringType,
"int": GenericIntType,
"uint64": GenericU64Type,
"unsigned long": GenericU64Type,
"ulong": GenericU64Type,
"uint32": GenericU32Type,
"sint64": GenericS64Type,
"int64": GenericS64Type,
"long": GenericS64Type,
"sint32": GenericS32Type,
"int32": GenericS32Type,
"skb": GenericSkbType,
"sock": GenericSockType,
"size_t": GenericSizeType,
"char_buf": GenericCharBuffer,
"char_iovec": GenericCharIovec,
"filename": GenericFilenameType,
"file": GenericFileType,
"path": GenericPathType,
"fd": GenericFdType,
"cred": GenericCredType,
"const_buf": GenericConstBuffer,
"nop": GenericNopType,
"bpf_attr": GenericBpfAttr,
"perf_event": GenericPerfEvent,
"bpf_map": GenericBpfMap,
"user_namespace": GenericUserNamespace,
"capability": GenericCapability,
"kiocb": GenericKiocb,
"iov_iter": GenericIovIter,
"load_info": GenericLoadModule,
"module": GenericKernelModule,
"syscall64": GenericSyscall64,
"sint16": GenericS16Type,
"int16": GenericS16Type,
"uint16": GenericU16Type,
"sint8": GenericS8Type,
"int8": GenericS8Type,
"uint8": GenericU8Type,
"kernel_cap_t": GenericKernelCap,
"cap_inheritable": GenericCapInheritable,
"cap_permitted": GenericCapPermitted,
"cap_effective": GenericCapEffective,
"linux_binprm": GenericLinuxBinprmType,
"data_loc": GenericDataLoc,
}

var GenericTypeToStringTable = map[int]string{
GenericStringType: "string",
GenericIntType: "int",
GenericU64Type: "uint64",
GenericU32Type: "uint32",
GenericS64Type: "int64",
GenericS32Type: "int32",
GenericSkbType: "skb",
GenericSockType: "sock",
GenericSizeType: "size_t",
GenericCharBuffer: "char_buf",
GenericCharIovec: "char_iovec",
GenericFilenameType: "filename",
GenericFileType: "file",
GenericPathType: "path",
GenericFdType: "fd",
GenericCredType: "cred",
GenericConstBuffer: "const_buf",
GenericNopType: "nop",
GenericBpfAttr: "bpf_attr",
GenericPerfEvent: "perf_event",
GenericBpfMap: "bpf_map",
GenericUserNamespace: "user_namespace",
GenericCapability: "capability",
GenericKiocb: "kiocb",
GenericIovIter: "iov_iter",
GenericLoadModule: "load_info",
GenericKernelModule: "module",
GenericSyscall64: "syscall64",
GenericS16Type: "int16",
GenericU16Type: "uint16",
GenericS8Type: "int8",
GenericU8Type: "uint8",
GenericKernelCap: "kernel_cap_t",
GenericCapInheritable: "cap_inheritable",
GenericCapPermitted: "cap_permitted",
GenericCapEffective: "cap_effective",
GenericLinuxBinprmType: "linux_binprm",
GenericDataLoc: "data_loc",
GenericInvalidType: "",
}

func GenericTypeFromString(arg string) int {
switch arg {
case "string":
return GenericStringType
case "int":
return GenericIntType
case "uint64", "unsigned long", "ulong":
return GenericU64Type
case "uint32":
return GenericU32Type
case "sint64", "int64", "long":
return GenericS64Type
case "sint32", "int32":
return GenericS32Type
case "skb":
return GenericSkbType
case "sock":
return GenericSockType
case "size_t":
return GenericSizeType
case "char_buf":
return GenericCharBuffer
case "char_iovec":
return GenericCharIovec
case "filename":
return GenericFilenameType
case "file":
return GenericFileType
case "path":
return GenericPathType
case "fd":
return GenericFdType
case "cred":
return GenericCredType
case "const_buf":
return GenericConstBuffer
case "nop":
return GenericNopType
case "bpf_attr":
return GenericBpfAttr
case "perf_event":
return GenericPerfEvent
case "bpf_map":
return GenericBpfMap
case "user_namespace":
return GenericUserNamespace
case "capability":
return GenericCapability
case "kiocb":
return GenericKiocb
case "iov_iter":
return GenericIovIter
case "load_info":
return GenericLoadModule
case "module":
return GenericKernelModule
case "syscall64":
return GenericSyscall64
case "sint16", "int16":
return GenericS16Type
case "uint16":
return GenericU16Type
case "sint8", "int8":
return GenericS8Type
case "uint8":
return GenericU8Type
case "kernel_cap_t":
return GenericKernelCap
case "cap_inheritable":
return GenericCapInheritable
case "cap_permitted":
return GenericCapPermitted
case "cap_effective":
return GenericCapEffective
case "linux_binprm":
return GenericLinuxBinprmType
default:
return GenericInvalidType
ty, ok := GenericStringToType[arg]
if !ok {
ty = GenericInvalidType
}
return ty
}

func GenericTypeToString(ty int) (string, error) {
arg, ok := GenericTypeToStringTable[ty]
if !ok {
return "", fmt.Errorf("invalid argument type")
}
return arg, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ spec:
- cap_permitted
- cap_effective
- linux_binprm
- data_loc
type: string
required:
- index
Expand Down Expand Up @@ -227,6 +228,7 @@ spec:
- cap_permitted
- cap_effective
- linux_binprm
- data_loc
type: string
required:
- index
Expand Down Expand Up @@ -876,6 +878,7 @@ spec:
- cap_permitted
- cap_effective
- linux_binprm
- data_loc
type: string
required:
- index
Expand Down Expand Up @@ -1431,6 +1434,7 @@ spec:
- cap_permitted
- cap_effective
- linux_binprm
- data_loc
type: string
required:
- index
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ spec:
- cap_permitted
- cap_effective
- linux_binprm
- data_loc
type: string
required:
- index
Expand Down Expand Up @@ -227,6 +228,7 @@ spec:
- cap_permitted
- cap_effective
- linux_binprm
- data_loc
type: string
required:
- index
Expand Down Expand Up @@ -876,6 +878,7 @@ spec:
- cap_permitted
- cap_effective
- linux_binprm
- data_loc
type: string
required:
- index
Expand Down Expand Up @@ -1431,6 +1434,7 @@ spec:
- cap_permitted
- cap_effective
- linux_binprm
- data_loc
type: string
required:
- index
Expand Down
2 changes: 1 addition & 1 deletion pkg/k8s/apis/cilium.io/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ type KProbeArg struct {
// +kubebuilder:validation:Minimum=0
// Position of the argument.
Index uint32 `json:"index"`
// +kubebuilder:validation:Enum=auto;int;int8;uint8;int16;uint16;uint32;int32;uint64;int64;char_buf;char_iovec;size_t;skb;sock;string;fd;file;filename;path;nop;bpf_attr;perf_event;bpf_map;user_namespace;capability;kiocb;iov_iter;cred;load_info;module;syscall64;kernel_cap_t;cap_inheritable;cap_permitted;cap_effective;linux_binprm
// +kubebuilder:validation:Enum=auto;int;int8;uint8;int16;uint16;uint32;int32;uint64;int64;char_buf;char_iovec;size_t;skb;sock;string;fd;file;filename;path;nop;bpf_attr;perf_event;bpf_map;user_namespace;capability;kiocb;iov_iter;cred;load_info;module;syscall64;kernel_cap_t;cap_inheritable;cap_permitted;cap_effective;linux_binprm;data_loc
// +kubebuilder:default=auto
// Argument type.
Type string `json:"type"`
Expand Down
2 changes: 1 addition & 1 deletion pkg/k8s/apis/cilium.io/v1alpha1/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ package v1alpha1
// Used to determine if CRD needs to be updated in cluster
//
// Developers: Bump patch for each change in the CRD schema.
const CustomResourceDefinitionSchemaVersion = "1.1.6"
const CustomResourceDefinitionSchemaVersion = "1.1.7"
Loading
Loading