...

Source file src/github.com/cilium/ebpf/link/tracing_test.go

Documentation: github.com/cilium/ebpf/link

     1  package link
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/cilium/ebpf"
     7  	"github.com/cilium/ebpf/internal"
     8  	"github.com/cilium/ebpf/internal/testutils"
     9  )
    10  
    11  func TestFreplace(t *testing.T) {
    12  	testutils.SkipOnOldKernel(t, "5.10", "freplace")
    13  
    14  	testutils.Files(t, testutils.Glob(t, "../testdata/freplace-*.elf"), func(t *testing.T, file string) {
    15  		spec, err := ebpf.LoadCollectionSpec(file)
    16  		if err != nil {
    17  			t.Fatal("Can't parse ELF:", err)
    18  		}
    19  
    20  		if spec.ByteOrder != internal.NativeEndian {
    21  			return
    22  		}
    23  
    24  		target, err := ebpf.NewProgram(spec.Programs["sched_process_exec"])
    25  		testutils.SkipIfNotSupported(t, err)
    26  		if err != nil {
    27  			t.Fatal("Can't create target program:", err)
    28  		}
    29  		defer target.Close()
    30  
    31  		// Test attachment specified at load time
    32  		spec.Programs["replacement"].AttachTarget = target
    33  		replacement, err := ebpf.NewProgram(spec.Programs["replacement"])
    34  		testutils.SkipIfNotSupported(t, err)
    35  		if err != nil {
    36  			t.Fatal("Can't create replacement program:", err)
    37  		}
    38  		defer replacement.Close()
    39  
    40  		freplace, err := AttachFreplace(nil, "", replacement)
    41  		if err != nil {
    42  			t.Fatal("Can't create freplace:", err)
    43  		}
    44  
    45  		testLink(t, freplace, replacement)
    46  	})
    47  }
    48  
    49  func TestTracing(t *testing.T) {
    50  	testutils.SkipOnOldKernel(t, "5.11", "BPF_LINK_TYPE_TRACING")
    51  	tests := []struct {
    52  		name        string
    53  		attachTo    string
    54  		programType ebpf.ProgramType
    55  		attachType  ebpf.AttachType
    56  	}{
    57  		{
    58  			name:        "AttachTraceFEntry",
    59  			attachTo:    "inet_dgram_connect",
    60  			programType: ebpf.Tracing,
    61  			attachType:  ebpf.AttachTraceFEntry,
    62  		},
    63  		{
    64  			name:        "AttachTraceFExit",
    65  			attachTo:    "inet_dgram_connect",
    66  			programType: ebpf.Tracing,
    67  			attachType:  ebpf.AttachTraceFExit,
    68  		},
    69  		{
    70  			name:        "AttachModifyReturn",
    71  			attachTo:    "bpf_modify_return_test",
    72  			programType: ebpf.Tracing,
    73  			attachType:  ebpf.AttachModifyReturn,
    74  		},
    75  		{
    76  			name:        "AttachTraceRawTp",
    77  			attachTo:    "kfree_skb",
    78  			programType: ebpf.Tracing,
    79  			attachType:  ebpf.AttachTraceRawTp,
    80  		},
    81  	}
    82  
    83  	for _, tt := range tests {
    84  		t.Run(tt.name, func(t *testing.T) {
    85  			prog := mustLoadProgram(t, tt.programType, tt.attachType, tt.attachTo)
    86  
    87  			link, err := AttachTracing(TracingOptions{Program: prog})
    88  			if err != nil {
    89  				t.Fatal(err)
    90  			}
    91  
    92  			testLink(t, link, prog)
    93  		})
    94  	}
    95  }
    96  
    97  func TestLSM(t *testing.T) {
    98  	testutils.SkipOnOldKernel(t, "5.11", "BPF_LINK_TYPE_TRACING")
    99  
   100  	prog := mustLoadProgram(t, ebpf.LSM, ebpf.AttachLSMMac, "file_mprotect")
   101  
   102  	link, err := AttachLSM(LSMOptions{Program: prog})
   103  	if err != nil {
   104  		t.Fatal(err)
   105  	}
   106  
   107  	testLink(t, link, prog)
   108  }
   109  

View as plain text