github.com/cilium/cilium@v1.16.2/pkg/datapath/linux/probes/probes_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package probes
     5  
     6  import (
     7  	"bytes"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/cilium/cilium/pkg/testutils"
    12  )
    13  
    14  func TestSystemConfigProbes(t *testing.T) {
    15  	testCases := []struct {
    16  		systemConfig SystemConfig
    17  		expectErr    bool
    18  	}{
    19  		{
    20  			systemConfig: SystemConfig{
    21  				ConfigBpf:           "y",
    22  				ConfigBpfSyscall:    "y",
    23  				ConfigNetSchIngress: "y",
    24  				ConfigNetClsBpf:     "y",
    25  				ConfigNetClsAct:     "y",
    26  				ConfigBpfJit:        "y",
    27  				ConfigHaveEbpfJit:   "y",
    28  				ConfigCgroupBpf:     "y",
    29  				ConfigLwtunnelBpf:   "y",
    30  				ConfigBpfEvents:     "y",
    31  			},
    32  			expectErr: false,
    33  		},
    34  		{
    35  			systemConfig: SystemConfig{
    36  				ConfigBpf:           "y",
    37  				ConfigBpfSyscall:    "y",
    38  				ConfigNetSchIngress: "m",
    39  				ConfigNetClsBpf:     "m",
    40  				ConfigNetClsAct:     "y",
    41  				ConfigBpfJit:        "y",
    42  				ConfigHaveEbpfJit:   "y",
    43  				ConfigCgroupBpf:     "y",
    44  				ConfigLwtunnelBpf:   "y",
    45  				ConfigBpfEvents:     "y",
    46  			},
    47  			expectErr: false,
    48  		},
    49  		// Disable options which generate errors
    50  		{
    51  			systemConfig: SystemConfig{
    52  				ConfigBpf:           "n",
    53  				ConfigBpfSyscall:    "n",
    54  				ConfigNetSchIngress: "n",
    55  				ConfigNetClsBpf:     "n",
    56  				ConfigNetClsAct:     "n",
    57  				ConfigBpfJit:        "n",
    58  				ConfigHaveEbpfJit:   "n",
    59  				ConfigCgroupBpf:     "n",
    60  				ConfigLwtunnelBpf:   "n",
    61  				ConfigBpfEvents:     "n",
    62  			},
    63  			expectErr: true,
    64  		},
    65  		{
    66  			systemConfig: SystemConfig{
    67  				ConfigBpf:           "n",
    68  				ConfigBpfSyscall:    "y",
    69  				ConfigNetSchIngress: "y",
    70  				ConfigNetClsBpf:     "y",
    71  				ConfigNetClsAct:     "y",
    72  				ConfigBpfJit:        "y",
    73  				ConfigHaveEbpfJit:   "y",
    74  				ConfigCgroupBpf:     "y",
    75  				ConfigLwtunnelBpf:   "y",
    76  				ConfigBpfEvents:     "y",
    77  			},
    78  			expectErr: true,
    79  		},
    80  		{
    81  			systemConfig: SystemConfig{
    82  				ConfigBpf:           "y",
    83  				ConfigBpfSyscall:    "n",
    84  				ConfigNetSchIngress: "y",
    85  				ConfigNetClsBpf:     "y",
    86  				ConfigNetClsAct:     "y",
    87  				ConfigBpfJit:        "y",
    88  				ConfigHaveEbpfJit:   "y",
    89  				ConfigCgroupBpf:     "y",
    90  				ConfigLwtunnelBpf:   "y",
    91  				ConfigBpfEvents:     "y",
    92  			},
    93  			expectErr: true,
    94  		},
    95  		{
    96  			systemConfig: SystemConfig{
    97  				ConfigBpf:           "y",
    98  				ConfigBpfSyscall:    "y",
    99  				ConfigNetSchIngress: "n",
   100  				ConfigNetClsBpf:     "y",
   101  				ConfigNetClsAct:     "y",
   102  				ConfigBpfJit:        "y",
   103  				ConfigHaveEbpfJit:   "y",
   104  				ConfigCgroupBpf:     "y",
   105  				ConfigLwtunnelBpf:   "y",
   106  				ConfigBpfEvents:     "y",
   107  			},
   108  			expectErr: true,
   109  		},
   110  		{
   111  			systemConfig: SystemConfig{
   112  				ConfigBpf:           "y",
   113  				ConfigBpfSyscall:    "y",
   114  				ConfigNetSchIngress: "y",
   115  				ConfigNetClsBpf:     "n",
   116  				ConfigNetClsAct:     "y",
   117  				ConfigBpfJit:        "y",
   118  				ConfigHaveEbpfJit:   "y",
   119  				ConfigCgroupBpf:     "y",
   120  				ConfigLwtunnelBpf:   "y",
   121  				ConfigBpfEvents:     "y",
   122  			},
   123  			expectErr: true,
   124  		},
   125  		{
   126  			systemConfig: SystemConfig{
   127  				ConfigBpf:           "y",
   128  				ConfigBpfSyscall:    "y",
   129  				ConfigNetSchIngress: "y",
   130  				ConfigNetClsBpf:     "y",
   131  				ConfigNetClsAct:     "n",
   132  				ConfigBpfJit:        "y",
   133  				ConfigHaveEbpfJit:   "y",
   134  				ConfigCgroupBpf:     "y",
   135  				ConfigLwtunnelBpf:   "y",
   136  				ConfigBpfEvents:     "y",
   137  			},
   138  			expectErr: true,
   139  		},
   140  		{
   141  			systemConfig: SystemConfig{
   142  				ConfigBpf:           "y",
   143  				ConfigBpfSyscall:    "y",
   144  				ConfigNetSchIngress: "y",
   145  				ConfigNetClsBpf:     "y",
   146  				ConfigNetClsAct:     "y",
   147  				ConfigBpfJit:        "n",
   148  				ConfigHaveEbpfJit:   "y",
   149  				ConfigCgroupBpf:     "y",
   150  				ConfigLwtunnelBpf:   "y",
   151  				ConfigBpfEvents:     "y",
   152  			},
   153  			expectErr: true,
   154  		},
   155  		{
   156  			systemConfig: SystemConfig{
   157  				ConfigBpf:           "y",
   158  				ConfigBpfSyscall:    "y",
   159  				ConfigNetSchIngress: "y",
   160  				ConfigNetClsBpf:     "y",
   161  				ConfigNetClsAct:     "y",
   162  				ConfigBpfJit:        "y",
   163  				ConfigHaveEbpfJit:   "n",
   164  				ConfigCgroupBpf:     "y",
   165  				ConfigLwtunnelBpf:   "y",
   166  				ConfigBpfEvents:     "y",
   167  			},
   168  			expectErr: true,
   169  		},
   170  		// Disable options which generate warnings
   171  		{
   172  			systemConfig: SystemConfig{
   173  				ConfigBpf:           "y",
   174  				ConfigBpfSyscall:    "y",
   175  				ConfigNetSchIngress: "y",
   176  				ConfigNetClsBpf:     "y",
   177  				ConfigNetClsAct:     "y",
   178  				ConfigBpfJit:        "y",
   179  				ConfigHaveEbpfJit:   "y",
   180  				ConfigCgroupBpf:     "n",
   181  				ConfigLwtunnelBpf:   "n",
   182  				ConfigBpfEvents:     "n",
   183  			},
   184  			expectErr: false,
   185  		},
   186  		{
   187  			systemConfig: SystemConfig{
   188  				ConfigBpf:           "y",
   189  				ConfigBpfSyscall:    "y",
   190  				ConfigNetSchIngress: "y",
   191  				ConfigNetClsBpf:     "y",
   192  				ConfigNetClsAct:     "y",
   193  				ConfigBpfJit:        "y",
   194  				ConfigHaveEbpfJit:   "y",
   195  				ConfigCgroupBpf:     "n",
   196  				ConfigLwtunnelBpf:   "y",
   197  				ConfigBpfEvents:     "y",
   198  			},
   199  			expectErr: false,
   200  		},
   201  		{
   202  			systemConfig: SystemConfig{
   203  				ConfigBpf:           "y",
   204  				ConfigBpfSyscall:    "y",
   205  				ConfigNetSchIngress: "y",
   206  				ConfigNetClsBpf:     "y",
   207  				ConfigNetClsAct:     "y",
   208  				ConfigBpfJit:        "y",
   209  				ConfigHaveEbpfJit:   "y",
   210  				ConfigCgroupBpf:     "y",
   211  				ConfigLwtunnelBpf:   "n",
   212  				ConfigBpfEvents:     "y",
   213  			},
   214  			expectErr: false,
   215  		},
   216  		{
   217  			systemConfig: SystemConfig{
   218  				ConfigBpf:           "y",
   219  				ConfigBpfSyscall:    "y",
   220  				ConfigNetSchIngress: "y",
   221  				ConfigNetClsBpf:     "y",
   222  				ConfigNetClsAct:     "y",
   223  				ConfigBpfJit:        "y",
   224  				ConfigHaveEbpfJit:   "y",
   225  				ConfigCgroupBpf:     "y",
   226  				ConfigLwtunnelBpf:   "y",
   227  				ConfigBpfEvents:     "n",
   228  			},
   229  			expectErr: false,
   230  		},
   231  	}
   232  	for _, tc := range testCases {
   233  		manager := &ProbeManager{
   234  			features: Features{SystemConfig: tc.systemConfig},
   235  		}
   236  		err := manager.SystemConfigProbes()
   237  		if tc.expectErr {
   238  			if err == nil {
   239  				t.Error("unexpected nil error")
   240  			}
   241  		} else {
   242  			if err != nil {
   243  				t.Error(err)
   244  			}
   245  		}
   246  	}
   247  }
   248  
   249  func TestWriteFeatureHeader(t *testing.T) {
   250  	testCases := []struct {
   251  		features      map[string]bool
   252  		common        bool
   253  		expectedLines []string
   254  	}{
   255  		{
   256  			features: map[string]bool{
   257  				"HAVE_FEATURE_MACRO": true,
   258  			},
   259  			common: true,
   260  			expectedLines: []string{
   261  				"#define HAVE_FEATURE_MACRO 1",
   262  			},
   263  		},
   264  		{
   265  			features: map[string]bool{
   266  				"HAVE_FEATURE_MACRO": true,
   267  			},
   268  			common: false,
   269  			expectedLines: []string{
   270  				"#include \"features.h\"",
   271  				"#define HAVE_FEATURE_MACRO 1",
   272  			},
   273  		},
   274  	}
   275  
   276  	for _, tc := range testCases {
   277  		buf := new(bytes.Buffer)
   278  		if err := writeFeatureHeader(buf, tc.features, tc.common); err != nil {
   279  			t.Error(err)
   280  		}
   281  		str := buf.String()
   282  
   283  		for _, s := range tc.expectedLines {
   284  			if !strings.Contains(str, s) {
   285  				t.Errorf("expected %s to contain %s", str, s)
   286  			}
   287  		}
   288  	}
   289  }
   290  
   291  func TestExecuteSystemConfigProbes(t *testing.T) {
   292  	testutils.PrivilegedTest(t)
   293  
   294  	if err := NewProbeManager().SystemConfigProbes(); err != nil {
   295  		t.Error(err)
   296  	}
   297  }
   298  
   299  func TestExecuteHeaderProbes(t *testing.T) {
   300  	testutils.PrivilegedTest(t)
   301  
   302  	if ExecuteHeaderProbes() == nil {
   303  		t.Error("expected probes to not be nil")
   304  	}
   305  }
   306  
   307  func TestOuterSourceIPProbe(t *testing.T) {
   308  	testutils.PrivilegedTest(t)
   309  	testutils.SkipOnOldKernel(t, "5.19", "source IP support in struct bpf_tunnel_key")
   310  
   311  	if err := HaveOuterSourceIPSupport(); err != nil {
   312  		t.Fatal(err)
   313  	}
   314  }
   315  
   316  func TestSKBAdjustRoomL2RoomMACSupportProbe(t *testing.T) {
   317  	testutils.PrivilegedTest(t)
   318  	testutils.SkipOnOldKernel(t, "5.2", "BPF_ADJ_ROOM_MAC mode support in bpf_skb_adjust_room")
   319  
   320  	if err := HaveSKBAdjustRoomL2RoomMACSupport(); err != nil {
   321  		t.Fatal(err)
   322  	}
   323  }
   324  
   325  func TestIPv6Support(t *testing.T) {
   326  	if err := HaveIPv6Support(); err != nil {
   327  		t.Fatal(err)
   328  	}
   329  }
   330  
   331  func TestHaveDeadCodeElimSupport(t *testing.T) {
   332  	testutils.PrivilegedTest(t)
   333  
   334  	if err := HaveDeadCodeElim(); err != nil {
   335  		t.Fatal(err)
   336  	}
   337  }
   338  
   339  func TestHaveTCX(t *testing.T) {
   340  	testutils.PrivilegedTest(t)
   341  	testutils.SkipOnOldKernel(t, "6.6", "tcx bpf_link")
   342  
   343  	if err := HaveTCX(); err != nil {
   344  		t.Fatal(err)
   345  	}
   346  }