diff --git a/.github/workflows/pr-tests.yaml b/.github/workflows/pr-tests.yaml index 2c67fde..9188f43 100644 --- a/.github/workflows/pr-tests.yaml +++ b/.github/workflows/pr-tests.yaml @@ -19,7 +19,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: "1.20" + go-version: "1.23" - name: Set up tools run: | go install golang.org/x/lint/golint@latest @@ -46,7 +46,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: "1.20" + go-version: "1.23" - name: Set up BPF run: | sudo apt-get install libbpf-dev diff --git a/go.mod b/go.mod index 4ee9665..c93474d 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,26 @@ module github.com/aws/aws-ebpf-sdk-go -go 1.19 +go 1.22.0 + +toolchain go1.22.7 require ( github.com/golang/mock v1.6.0 github.com/stretchr/testify v1.9.0 - github.com/vishvananda/netlink v1.1.0 + github.com/vishvananda/netlink v1.3.0 go.uber.org/zap v1.27.0 - golang.org/x/sys v0.24.0 + golang.org/x/sys v0.26.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df // indirect + github.com/vishvananda/netns v0.0.4 // indirect go.uber.org/multierr v1.10.0 // indirect + golang.org/x/mod v0.21.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/tools v0.26.0 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index aa5a4b5..dfa50fd 100644 --- a/go.sum +++ b/go.sum @@ -6,10 +6,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netlink v1.3.0 h1:X7l42GfcV4S6E4vHTsw48qbrV+9PVojNfIhZcwQdrZk= +github.com/vishvananda/netlink v1.3.0/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= +github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= +github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= @@ -19,25 +19,32 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/elfparser/elf.go b/pkg/elfparser/elf.go index 21e8c3d..1fd700d 100644 --- a/pkg/elfparser/elf.go +++ b/pkg/elfparser/elf.go @@ -201,12 +201,20 @@ func (e *elfLoader) loadMap(parsedMapData []ebpf_maps.CreateEBPFMapInput) (map[s } //Fill ID - mapInfo, err := (e.bpfMapApi).GetMapFromPinPath(pinPath) - if err != nil { - return nil, fmt.Errorf("map '%s' doesn't exist", mapNameStr) + if loadedMaps.PinOptions.Type == constdef.PIN_NONE.Index() { + mapInfo, err := (e.bpfMapApi).GetBPFmapInfo(bpfMap.MapFD) + if err != nil { + return nil, fmt.Errorf("failed to get map info '%s'", mapNameStr) + } + bpfMap.MapID = uint32(mapInfo.Id) + } else { + mapInfo, err := (e.bpfMapApi).GetMapFromPinPath(pinPath) + if err != nil { + return nil, fmt.Errorf("map '%s' doesn't exist", mapNameStr) + } + mapID := uint32(mapInfo.Id) + bpfMap.MapID = mapID } - mapID := uint32(mapInfo.Id) - bpfMap.MapID = mapID programmedMaps[loadedMaps.Name] = bpfMap @@ -279,9 +287,9 @@ func (e *elfLoader) loadProg(loadedProgData map[string]ebpf_progs.CreateEBPFProg for _, pgmInput := range loadedProgData { bpfData := BpfData{} - progFD, _ := e.bpfProgApi.LoadProg(pgmInput) + progFD, errno := e.bpfProgApi.LoadProg(pgmInput) if progFD == -1 { - log.Infof("Failed to load prog") + log.Infof("Failed to load prog", "error", errno) return nil, fmt.Errorf("failed to Load the prog") } log.Infof("loaded prog with %d", progFD) diff --git a/pkg/elfparser/elf_test.go b/pkg/elfparser/elf_test.go index b28b0a8..d68c6d3 100644 --- a/pkg/elfparser/elf_test.go +++ b/pkg/elfparser/elf_test.go @@ -17,11 +17,14 @@ package elfparser import ( "debug/elf" "errors" + "fmt" "os" "sort" "strings" "testing" + ebpf_maps "github.com/aws/aws-ebpf-sdk-go/pkg/maps" + constdef "github.com/aws/aws-ebpf-sdk-go/pkg/constants" mock_ebpf_maps "github.com/aws/aws-ebpf-sdk-go/pkg/maps/mocks" mock_ebpf_progs "github.com/aws/aws-ebpf-sdk-go/pkg/progs/mocks" @@ -668,3 +671,87 @@ func TestProgType(t *testing.T) { }) } } + +func TestLoadMap(t *testing.T) { + tests := []struct { + name string + pinType uint32 + mapFD uint32 + mapInfo ebpf_maps.BpfMapInfo + wantMapID uint32 + wantErr bool + getInfoErr error + pinPath string + }{ + { + name: "Successful retrieval of map info", + pinType: constdef.PIN_NONE.Index(), + mapFD: 10, + mapInfo: ebpf_maps.BpfMapInfo{Id: 12345}, + wantMapID: 12345, + wantErr: false, + }, + { + name: "Map retrieval error", + pinType: constdef.PIN_NONE.Index(), + mapFD: 20, + getInfoErr: fmt.Errorf("failed to get map info"), + wantErr: true, + }, + { + name: "Pinned map retrieval from path", + pinType: constdef.PIN_GLOBAL_NS.Index(), + mapFD: 30, + mapInfo: ebpf_maps.BpfMapInfo{Id: 54321}, + wantMapID: 54321, + wantErr: false, + pinPath: "/sys/fs/bpf/globals/aws/maps/test_map", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockBpfMapAPI := mock_ebpf_maps.NewMockBpfMapAPIs(ctrl) + mockBpfProgAPI := mock_ebpf_progs.NewMockBpfProgAPIs(ctrl) + + // Mock CreateBPFMap to return a BpfMap with MapFD set to tt.mapFD + mockBpfMapAPI.EXPECT().CreateBPFMap(gomock.Any()).Return(ebpf_maps.BpfMap{MapFD: tt.mapFD}, nil).AnyTimes() + + // Mock GetBPFmapInfo or GetMapFromPinPath based on the pin type and error expectation + if tt.getInfoErr != nil { + mockBpfMapAPI.EXPECT().GetBPFmapInfo(tt.mapFD).Return(ebpf_maps.BpfMapInfo{}, tt.getInfoErr) + } else if tt.pinType == constdef.PIN_NONE.Index() { + mockBpfMapAPI.EXPECT().GetBPFmapInfo(tt.mapFD).Return(tt.mapInfo, nil) + } else { + mockBpfMapAPI.EXPECT().GetMapFromPinPath(tt.pinPath).Return(tt.mapInfo, nil) + } + + // Set up the loader and the map input + elfLoader := &elfLoader{ + bpfMapApi: mockBpfMapAPI, + bpfProgApi: mockBpfProgAPI, + } + parsedMapData := []ebpf_maps.CreateEBPFMapInput{ + { + Name: "test_map", + PinOptions: &ebpf_maps.BpfMapPinOptions{Type: tt.pinType, PinPath: tt.pinPath}, + }, + } + + loadedMaps, err := elfLoader.loadMap(parsedMapData) + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + if loadedMap, exists := loadedMaps["test_map"]; exists { + assert.Equal(t, tt.wantMapID, loadedMap.MapID) + } else { + t.Errorf("Expected map 'test_map' to be loaded") + } + } + }) + } +} diff --git a/pkg/maps/loader.go b/pkg/maps/loader.go index 13a1541..36f3979 100644 --- a/pkg/maps/loader.go +++ b/pkg/maps/loader.go @@ -175,6 +175,8 @@ type BpfMapAPIs interface { BulkRefreshMapEntries(newMapContents map[string][]byte) error // Retrieve map info from pin path GetMapFromPinPath(pinPath string) (BpfMapInfo, error) + // Retrieve map info without pin path + GetBPFmapInfo(mapFD uint32) (BpfMapInfo, error) } func (m *BpfMap) CreateBPFMap(MapMetaData CreateEBPFMapInput) (BpfMap, error) { @@ -542,6 +544,10 @@ func GetIDFromFD(mapFD int) (int, error) { return int(mapInfo.Id), nil } +func (m *BpfMap) GetBPFmapInfo(mapFD uint32) (BpfMapInfo, error) { + return GetBPFmapInfo(int(mapFD)) +} + func GetBPFmapInfo(mapFD int) (BpfMapInfo, error) { var bpfMapInfo BpfMapInfo objInfo := BpfObjGetInfo{ diff --git a/pkg/maps/mocks/ebpf_mocks.go b/pkg/maps/mocks/ebpf_mocks.go index 1586b3c..ca81986 100644 --- a/pkg/maps/mocks/ebpf_mocks.go +++ b/pkg/maps/mocks/ebpf_mocks.go @@ -133,6 +133,21 @@ func (mr *MockBpfMapAPIsMockRecorder) DeleteMapEntry(arg0 interface{}) *gomock.C return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteMapEntry", reflect.TypeOf((*MockBpfMapAPIs)(nil).DeleteMapEntry), arg0) } +// GetBPFmapInfo mocks base method. +func (m *MockBpfMapAPIs) GetBPFmapInfo(arg0 uint32) (maps.BpfMapInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBPFmapInfo", arg0) + ret0, _ := ret[0].(maps.BpfMapInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBPFmapInfo indicates an expected call of GetBPFmapInfo. +func (mr *MockBpfMapAPIsMockRecorder) GetBPFmapInfo(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBPFmapInfo", reflect.TypeOf((*MockBpfMapAPIs)(nil).GetBPFmapInfo), arg0) +} + // GetFirstMapEntry mocks base method. func (m *MockBpfMapAPIs) GetFirstMapEntry(arg0 uintptr) error { m.ctrl.T.Helper() diff --git a/pkg/tc/tc.go b/pkg/tc/tc.go index 6380db2..0600c9f 100644 --- a/pkg/tc/tc.go +++ b/pkg/tc/tc.go @@ -91,7 +91,7 @@ func (m *bpfTc) TCIngressAttach(interfaceName string, progFD int, funcName strin intf, err := netlink.LinkByName(interfaceName) if err != nil { - log.Errorf("failed to find device by name %s: %w", interfaceName, err) + log.Errorf("failed to find device by name %s: %v", interfaceName, err) return err } @@ -143,7 +143,7 @@ func (m *bpfTc) TCIngressDetach(interfaceName string) error { intf, err := netlink.LinkByName(interfaceName) if err != nil { - log.Errorf("failed to find device by name %s: %w", interfaceName, err) + log.Errorf("failed to find device by name %s: %v", interfaceName, err) return err } diff --git a/test/go.mod b/test/go.mod index bc8b2dd..aae0fab 100644 --- a/test/go.mod +++ b/test/go.mod @@ -1,6 +1,8 @@ module github.com/jayanthvn/pure-gobpf/test -go 1.19 +go 1.22.0 + +toolchain go1.22.7 require ( github.com/aws/aws-ebpf-sdk-go v0.0.0-20230616053809-009e64b9692e @@ -10,11 +12,11 @@ require ( require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect - github.com/vishvananda/netlink v1.1.0 // indirect + github.com/vishvananda/netlink v1.3.0 // indirect github.com/vishvananda/netns v0.0.4 // indirect go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/sys v0.24.0 // indirect + golang.org/x/sys v0.26.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect ) diff --git a/test/go.sum b/test/go.sum index 0840237..c7ad807 100644 --- a/test/go.sum +++ b/test/go.sum @@ -1,28 +1,34 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/vishvananda/netlink v1.3.0 h1:X7l42GfcV4S6E4vHTsw48qbrV+9PVojNfIhZcwQdrZk= +github.com/vishvananda/netlink v1.3.0/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=