diff --git a/vendor/github.com/iovisor/gobpf/bpffs/COPYRIGHT.txt b/vendor/github.com/iovisor/gobpf/bpffs/COPYRIGHT.txt new file mode 100644 index 000000000..1eae73fb2 --- /dev/null +++ b/vendor/github.com/iovisor/gobpf/bpffs/COPYRIGHT.txt @@ -0,0 +1,14 @@ +Copyright 2016 PLUMgrid +Copyright 2016 Kinvolk + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/iovisor/gobpf/bpffs/LICENSE.txt b/vendor/github.com/iovisor/gobpf/bpffs/LICENSE.txt new file mode 100644 index 000000000..8dada3eda --- /dev/null +++ b/vendor/github.com/iovisor/gobpf/bpffs/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/iovisor/gobpf/bpffs/fs.go b/vendor/github.com/iovisor/gobpf/bpffs/fs.go new file mode 100644 index 000000000..a54681204 --- /dev/null +++ b/vendor/github.com/iovisor/gobpf/bpffs/fs.go @@ -0,0 +1,44 @@ +package bpffs + +import ( + "fmt" + "syscall" + "unsafe" +) + +const BPFFSPath = "/sys/fs/bpf" + +var FsMagicBPFFS int32 + +func init() { + // https://github.com/coreutils/coreutils/blob/v8.27/src/stat.c#L275 + // https://github.com/torvalds/linux/blob/v4.8/include/uapi/linux/magic.h#L80 + magic := uint32(0xCAFE4A11) + // 0xCAFE4A11 overflows an int32, which is what's expected by Statfs_t.Type in 32bit platforms. + // To avoid conditional compilation for all 32bit/64bit platforms, we use an unsafe cast + FsMagicBPFFS = *(*int32)(unsafe.Pointer(&magic)) +} + +// IsMounted checks if the BPF fs is mounted already +func IsMounted() (bool, error) { + var data syscall.Statfs_t + if err := syscall.Statfs(BPFFSPath, &data); err != nil { + return false, fmt.Errorf("cannot statfs %q: %v", BPFFSPath, err) + } + return int32(data.Type) == FsMagicBPFFS, nil +} + +// Mount mounts the BPF fs if not already mounted +func Mount() error { + mounted, err := IsMounted() + if err != nil { + return err + } + if mounted { + return nil + } + if err := syscall.Mount(BPFFSPath, BPFFSPath, "bpf", 0, ""); err != nil { + return fmt.Errorf("error mounting %q: %v", BPFFSPath, err) + } + return nil +} diff --git a/vendor/github.com/iovisor/gobpf/elf/elf.go b/vendor/github.com/iovisor/gobpf/elf/elf.go index 753bdd187..380e0a68e 100644 --- a/vendor/github.com/iovisor/gobpf/elf/elf.go +++ b/vendor/github.com/iovisor/gobpf/elf/elf.go @@ -26,13 +26,18 @@ import ( "fmt" "io" "os" + "path/filepath" "strings" "syscall" "unsafe" + + "github.com/iovisor/gobpf/bpffs" ) /* +#define _GNU_SOURCE #include +#include #include #include #include @@ -51,11 +56,16 @@ import ( // from https://github.com/safchain/goebpf // Apache License, Version 2.0 +#define BUF_SIZE_MAP_NS 256 + typedef struct bpf_map_def { unsigned int type; unsigned int key_size; unsigned int value_size; unsigned int max_entries; + unsigned int map_flags; + unsigned int pinning; + char namespace[BUF_SIZE_MAP_NS]; } bpf_map_def; typedef struct bpf_map { @@ -63,6 +73,8 @@ typedef struct bpf_map { bpf_map_def def; } bpf_map; +extern int bpf_pin_object(int fd, const char *pathname); + __u64 ptr_to_u64(void *ptr) { return (__u64) (unsigned long) ptr; @@ -113,9 +125,25 @@ static int bpf_create_map(enum bpf_map_type map_type, int key_size, return ret; } -static bpf_map *bpf_load_map(bpf_map_def *map_def) +void create_bpf_obj_get(const char *pathname, void *attr) +{ + union bpf_attr *ptr_bpf_attr; + ptr_bpf_attr = (union bpf_attr *)attr; + ptr_bpf_attr->pathname = ptr_to_u64((void *) pathname); +} + +int get_pinned_obj_fd(const char *path) +{ + union bpf_attr attr = {}; + create_bpf_obj_get(path, &attr); + return syscall(__NR_bpf, BPF_OBJ_GET, &attr, sizeof(attr)); +} + +static bpf_map *bpf_load_map(bpf_map_def *map_def, const char *path) { bpf_map *map; + struct stat st; + int ret, do_pin = 0; map = calloc(1, sizeof(bpf_map)); if (map == NULL) @@ -123,14 +151,38 @@ static bpf_map *bpf_load_map(bpf_map_def *map_def) memcpy(&map->def, map_def, sizeof(bpf_map_def)); + switch (map_def->pinning) { + case 1: // PIN_OBJECT_NS + // TODO to be implemented + return 0; + case 2: // PIN_GLOBAL_NS + if (stat(path, &st) == 0) { + ret = get_pinned_obj_fd(path); + if (ret < 0) { + return 0; + } + map->fd = ret; + return map; + } + do_pin = 1; + } + map->fd = bpf_create_map(map_def->type, map_def->key_size, map_def->value_size, map_def->max_entries ); - if (map->fd < 0) + if (map->fd < 0) { return 0; + } + + if (do_pin) { + ret = bpf_pin_object(map->fd, path); + if (ret < 0) { + return 0; + } + } return map; } @@ -203,8 +255,8 @@ static int perf_event_open_map(int pid, int cpu, int group_fd, unsigned long fla attr.size = sizeof(struct perf_event_attr); attr.config = 10; // PERF_COUNT_SW_BPF_OUTPUT - return syscall(__NR_perf_event_open, &attr, pid, cpu, - group_fd, flags); + return syscall(__NR_perf_event_open, &attr, pid, cpu, + group_fd, flags); } */ import "C" @@ -243,40 +295,78 @@ func elfReadVersion(file *elf.File) (uint32, error) { return 0, nil } +func prepareBPFFS(namespace, name string) (string, error) { + err := bpffs.Mount() + if err != nil { + return "", err + } + mapPath := filepath.Join(BPFFSPath, namespace, BPFDirGlobals, name) + err = os.MkdirAll(filepath.Dir(mapPath), syscall.S_IRWXU) + if err != nil { + return "", fmt.Errorf("error creating map directory %q: %v", filepath.Dir(mapPath), err) + } + return mapPath, nil +} + +func validMapNamespace(namespaceRaw *C.char) (string, error) { + namespace := C.GoStringN(namespaceRaw, C.int(C.strnlen(namespaceRaw, C.BUF_SIZE_MAP_NS))) + if namespace == "" || namespace == "." || namespace == ".." { + return "", fmt.Errorf("namespace must not be %q", namespace) + } + if strings.Contains(namespace, "/") { + return "", fmt.Errorf("no '/' allowed in namespace") + } + return namespace, nil +} + func elfReadMaps(file *elf.File) (map[string]*Map, error) { maps := make(map[string]*Map) - for sectionIdx, section := range file.Sections { - if strings.HasPrefix(section.Name, "maps/") { - data, err := section.Data() + for _, section := range file.Sections { + if !strings.HasPrefix(section.Name, "maps/") { + continue + } + + data, err := section.Data() + if err != nil { + return nil, err + } + if len(data) != C.sizeof_struct_bpf_map_def { + return nil, fmt.Errorf("only one map with size %d allowed per section", C.sizeof_struct_bpf_map_def) + } + + name := strings.TrimPrefix(section.Name, "maps/") + + mapDef := (*C.bpf_map_def)(unsafe.Pointer(&data[0])) + + var mapPathC *C.char + if mapDef.pinning > 0 { + namespace, err := validMapNamespace(&mapDef.namespace[0]) if err != nil { return nil, err } - - name := strings.TrimPrefix(section.Name, "maps/") - - mapCount := len(data) / C.sizeof_struct_bpf_map_def - for i := 0; i < mapCount; i++ { - pos := i * C.sizeof_struct_bpf_map_def - cm, err := C.bpf_load_map((*C.bpf_map_def)(unsafe.Pointer(&data[pos]))) - if cm == nil { - return nil, fmt.Errorf("error while loading map %q: %v", section.Name, err) - } - - m := &Map{ - Name: name, - SectionIdx: sectionIdx, - Idx: i, - m: cm, - } - - if oldMap, ok := maps[name]; ok { - return nil, fmt.Errorf("duplicate map: %q (section %q) and %q (section %q)", - oldMap.Name, file.Sections[oldMap.SectionIdx].Name, - name, section.Name) - } - maps[name] = m + mapPath, err := prepareBPFFS(namespace, name) + if err != nil { + return nil, fmt.Errorf("error preparing bpf fs: %v", err) } + mapPathC = C.CString(mapPath) + defer C.free(unsafe.Pointer(mapPathC)) + } else { + mapPathC = nil } + + cm, err := C.bpf_load_map(mapDef, mapPathC) + if cm == nil { + return nil, fmt.Errorf("error while loading map %q: %v", section.Name, err) + } + + if oldMap, ok := maps[name]; ok { + return nil, fmt.Errorf("duplicate map: %q and %q", oldMap.Name, name) + } + maps[name] = &Map{ + Name: name, + m: cm, + } + } return maps, nil } @@ -598,7 +688,7 @@ func (b *Module) initializePerfMaps(parameters map[string]SectionParams) error { return fmt.Errorf("error enabling perf event: %v", err2) } - // assign perf fd tp map + // assign perf fd to map ret, err := C.bpf_update_element(C.int(b.maps[name].m.fd), unsafe.Pointer(&cpu), unsafe.Pointer(&pmuFD), C.BPF_ANY) if ret != 0 { return fmt.Errorf("cannot assign perf fd to map %q: %v (cpu %d)", name, err, cpu) @@ -617,10 +707,8 @@ func (b *Module) initializePerfMaps(parameters map[string]SectionParams) error { // Map represents a eBPF map. An eBPF map has to be declared in the // C file. type Map struct { - Name string - SectionIdx int - Idx int - m *C.bpf_map + Name string + m *C.bpf_map // only for perf maps pmuFDs []C.int @@ -642,3 +730,7 @@ func (b *Module) IterMaps() <-chan *Map { func (b *Module) Map(name string) *Map { return b.maps[name] } + +func (m *Map) Fd() int { + return int(m.m.fd) +} diff --git a/vendor/github.com/iovisor/gobpf/elf/module.go b/vendor/github.com/iovisor/gobpf/elf/module.go index 1bd269255..512258cc3 100644 --- a/vendor/github.com/iovisor/gobpf/elf/module.go +++ b/vendor/github.com/iovisor/gobpf/elf/module.go @@ -25,14 +25,17 @@ import ( "io" "io/ioutil" "os" + "path/filepath" "strconv" "strings" "syscall" + "unsafe" ) /* #include #include +#include #include "include/bpf.h" #include #include @@ -124,14 +127,13 @@ func writeKprobeEvent(probeType, eventName, funcName, maxactiveStr string) (int, kprobeEventsFileName := "/sys/kernel/debug/tracing/kprobe_events" f, err := os.OpenFile(kprobeEventsFileName, os.O_APPEND|os.O_WRONLY, 0666) if err != nil { - return -1, fmt.Errorf("cannot open kprobe_events: %v\n", err) + return -1, fmt.Errorf("cannot open kprobe_events: %v", err) } defer f.Close() cmd := fmt.Sprintf("%s%s:%s %s\n", probeType, maxactiveStr, eventName, funcName) - _, err = f.WriteString(cmd) - if err != nil { - return -1, fmt.Errorf("cannot write %q to kprobe_events: %v\n", cmd, err) + if _, err = f.WriteString(cmd); err != nil { + return -1, fmt.Errorf("cannot write %q to kprobe_events: %v", cmd, err) } kprobeIdFile := fmt.Sprintf("/sys/kernel/debug/tracing/events/kprobes/%s/id", eventName) @@ -140,12 +142,12 @@ func writeKprobeEvent(probeType, eventName, funcName, maxactiveStr string) (int, if os.IsNotExist(err) { return -1, kprobeIDNotExist } - return -1, fmt.Errorf("cannot read kprobe id: %v\n", err) + return -1, fmt.Errorf("cannot read kprobe id: %v", err) } kprobeId, err := strconv.Atoi(strings.TrimSpace(string(kprobeIdBytes))) if err != nil { - return -1, fmt.Errorf("invalid kprobe id: %v\n", err) + return -1, fmt.Errorf("invalid kprobe id: %v", err) } return kprobeId, nil @@ -257,8 +259,115 @@ func (b *Module) AttachCgroupProgram(cgroupProg *CgroupProgram, cgroupPath strin cgroupFd := C.int(f.Fd()) ret, err := C.bpf_prog_attach(progFd, cgroupFd, uint32(attachType)) if ret < 0 { - return fmt.Errorf("failed to attach prog to cgroup %q: %v\n", cgroupPath, err) + return fmt.Errorf("failed to attach prog to cgroup %q: %v", cgroupPath, err) } return nil } + +func (b *Module) Kprobe(name string) *Kprobe { + return b.probes[name] +} + +func (kp *Kprobe) Fd() int { + return kp.fd +} + +func disableKprobe(eventName string) error { + kprobeEventsFileName := "/sys/kernel/debug/tracing/kprobe_events" + f, err := os.OpenFile(kprobeEventsFileName, os.O_APPEND|os.O_WRONLY, 0) + if err != nil { + return fmt.Errorf("cannot open kprobe_events: %v", err) + } + defer f.Close() + cmd := fmt.Sprintf("-:%s\n", eventName) + if _, err = f.WriteString(cmd); err != nil { + pathErr, ok := err.(*os.PathError) + if ok && pathErr.Err == syscall.ENOENT { + // This can happen when for example two modules + // use the same elf object and both call `Close()`. + // The second will encounter the error as the + // probe already has been cleared by the first. + return nil + } else { + return fmt.Errorf("cannot write %q to kprobe_events: %v", cmd, err) + } + } + return nil +} + +func (b *Module) closeProbes() error { + var funcName string + for _, probe := range b.probes { + if err := syscall.Close(probe.efd); err != nil { + return fmt.Errorf("error closing perf event fd: %v", err) + } + if err := syscall.Close(probe.fd); err != nil { + return fmt.Errorf("error closing probe fd: %v", err) + } + name := probe.Name + isKretprobe := strings.HasPrefix(name, "kretprobe/") + var err error + if isKretprobe { + funcName = strings.TrimPrefix(name, "kretprobe/") + err = disableKprobe("r" + funcName) + } else { + funcName = strings.TrimPrefix(name, "kprobe/") + err = disableKprobe("p" + funcName) + } + if err != nil { + return fmt.Errorf("error clearing probe: %v", err) + } + } + return nil +} + +func (b *Module) closeCgroupPrograms() error { + for _, program := range b.cgroupPrograms { + if err := syscall.Close(program.fd); err != nil { + return fmt.Errorf("error closing cgroup program fd: %v", err) + } + } + return nil +} + +func unpinMap(m *Map) error { + if m.m.def.pinning == 0 { + return nil + } + namespace := C.GoString(&m.m.def.namespace[0]) + mapPath := filepath.Join(BPFFSPath, namespace, BPFDirGlobals, m.Name) + return syscall.Unlink(mapPath) +} + +func (b *Module) closeMaps() error { + for _, m := range b.maps { + if m.m.def.pinning > 0 { + unpinMap(m) + } + for _, fd := range m.pmuFDs { + if err := syscall.Close(int(fd)); err != nil { + return fmt.Errorf("error closing perf event fd: %v", err) + } + } + if err := syscall.Close(int(m.m.fd)); err != nil { + return fmt.Errorf("error closing map fd: %v", err) + } + C.free(unsafe.Pointer(m.m)) + } + return nil +} + +// Close takes care of terminating all underlying BPF programs and structures +func (b *Module) Close() error { + if err := b.closeMaps(); err != nil { + return err + } + if err := b.closeProbes(); err != nil { + return err + } + if err := b.closeCgroupPrograms(); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/iovisor/gobpf/elf/module_unsupported.go b/vendor/github.com/iovisor/gobpf/elf/module_unsupported.go index 74765ec7e..5eb391b8a 100644 --- a/vendor/github.com/iovisor/gobpf/elf/module_unsupported.go +++ b/vendor/github.com/iovisor/gobpf/elf/module_unsupported.go @@ -40,6 +40,10 @@ func (b *Module) CgroupProgram(name string) *CgroupProgram { return nil } +func (b *Module) Kprobe(name string) *Kprobe { + return nil +} + func (b *Module) AttachProgram(cgroupProg *CgroupProgram, cgroupPath string, attachType AttachType) error { return fmt.Errorf("not supported") } diff --git a/vendor/github.com/iovisor/gobpf/elf/perf.go b/vendor/github.com/iovisor/gobpf/elf/perf.go index a81d8ed2f..9ca7e805d 100644 --- a/vendor/github.com/iovisor/gobpf/elf/perf.go +++ b/vendor/github.com/iovisor/gobpf/elf/perf.go @@ -173,6 +173,12 @@ func (pm *PerfMap) PollStart() { harvestLoop: for { + select { + case <-pm.pollStop: + return + default: + } + var harvestCount C.int beforeHarvest := nowNanoseconds() for cpu := 0; cpu < cpuCount; cpu++ { diff --git a/vendor/github.com/iovisor/gobpf/elf/pinning.go b/vendor/github.com/iovisor/gobpf/elf/pinning.go new file mode 100644 index 000000000..669c3573e --- /dev/null +++ b/vendor/github.com/iovisor/gobpf/elf/pinning.go @@ -0,0 +1,69 @@ +// +build linux + +package elf + +import ( + "fmt" + "os" + "path/filepath" + "unsafe" + + "github.com/iovisor/gobpf/bpffs" +) + +/* +#include +#include +#include +#include + +extern __u64 ptr_to_u64(void *); + +int bpf_pin_object(int fd, const char *pathname) +{ + union bpf_attr attr = {}; + + attr.pathname = ptr_to_u64((void *)pathname); + attr.bpf_fd = fd; + + return syscall(__NR_bpf, BPF_OBJ_PIN, &attr, sizeof(attr)); +} +*/ +import "C" + +const ( + BPFDirGlobals = "globals" // as in iproute2's BPF_DIR_GLOBALS + BPFFSPath = "/sys/fs/bpf/" +) + +func pinObject(fd int, namespace, object, name string) error { + mounted, err := bpffs.IsMounted() + if err != nil { + return fmt.Errorf("error checking if %q is mounted: %v", BPFFSPath, err) + } + if !mounted { + return fmt.Errorf("bpf fs not mounted at %q", BPFFSPath) + } + mapPath := filepath.Join(BPFFSPath, namespace, object, name) + err = os.MkdirAll(filepath.Dir(mapPath), 0755) + if err != nil { + return fmt.Errorf("error creating map directory %q: %v", filepath.Dir(mapPath), err) + } + err = os.RemoveAll(mapPath) + if err != nil { + return fmt.Errorf("error removing old map file %q: %v", mapPath, err) + } + + mapPathC := C.CString(mapPath) + defer C.free(unsafe.Pointer(mapPathC)) + + ret, err := C.bpf_pin_object(C.int(fd), mapPathC) + if ret != 0 { + return fmt.Errorf("error pinning object to %q: %v", mapPath, err) + } + return nil +} + +func PinObjectGlobal(fd int, namespace, name string) error { + return pinObject(fd, namespace, BPFDirGlobals, name) +} diff --git a/vendor/github.com/weaveworks/tcptracer-bpf/bpf_helpers.h b/vendor/github.com/weaveworks/tcptracer-bpf/bpf_helpers.h index b93c36617..8b123b972 100644 --- a/vendor/github.com/weaveworks/tcptracer-bpf/bpf_helpers.h +++ b/vendor/github.com/weaveworks/tcptracer-bpf/bpf_helpers.h @@ -60,12 +60,16 @@ unsigned long long load_word(void *skb, /* a helper structure used by eBPF C program * to describe map attributes to elf_bpf loader */ +#define BUF_SIZE_MAP_NS 256 + struct bpf_map_def { unsigned int type; unsigned int key_size; unsigned int value_size; unsigned int max_entries; unsigned int map_flags; + unsigned int pinning; + char namespace[BUF_SIZE_MAP_NS]; }; static int (*bpf_skb_store_bytes)(void *ctx, int off, void *from, int len, int flags) = diff --git a/vendor/github.com/weaveworks/tcptracer-bpf/pkg/tracer/tcptracer-ebpf.go b/vendor/github.com/weaveworks/tcptracer-bpf/pkg/tracer/tcptracer-ebpf.go index 8ead42277..c01247837 100644 --- a/vendor/github.com/weaveworks/tcptracer-bpf/pkg/tracer/tcptracer-ebpf.go +++ b/vendor/github.com/weaveworks/tcptracer-bpf/pkg/tracer/tcptracer-ebpf.go @@ -68,7 +68,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _tcptracerEbpfO = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x5c\x7d\x6c\x5b\xd7\x75\xbf\x8f\x1f\x16\x25\xd7\x93\xe2\x84\x89\xcc\x26\x9d\xdc\x04\xad\xc6\xa5\x09\xf5\x61\x89\x61\xb2\x56\x73\x9a\x44\xd3\xdc\x4a\x70\xad\x56\x30\x10\xd0\x0c\x2d\x5b\x32\x15\x9b\x16\xe9\x48\x4f\x0c\x50\xb7\x49\x06\x47\xc8\x1f\x72\x92\x61\x5a\xe6\x75\xa2\x2c\x27\xca\xb0\x0d\x1e\xb0\xc2\x42\xd7\x95\x46\x97\x02\x06\x56\x0c\xc2\x90\x0d\xc6\xe0\x0d\xfa\x23\xcd\xb4\xad\x45\xb5\xc5\xcb\xb4\xd6\x08\x07\xde\xf3\x7b\x7c\xef\x9d\x77\xdf\x23\x25\xa7\x2d\x81\xf4\xfa\x9c\x77\xcf\xc7\xbd\xf7\xdc\x73\x7f\xe7\xbe\xa7\x7e\xfd\x89\x03\x4f\xfa\x34\x4d\x18\x3f\x4d\xfc\xaf\x30\x29\xf3\x37\xfd\x84\xf9\xef\x3e\xfc\xef\x5e\xa1\x89\xd2\xdd\xc4\x7b\x49\x08\xf1\x6b\x42\x88\x42\xd3\x46\xb9\x42\xeb\xa9\xac\xe4\x17\x22\x9b\x92\x2e\x2d\x52\xbf\x06\x9f\x10\x1b\xe5\x72\xb9\x74\x11\xb4\x5f\x88\xcd\x72\xb9\xdc\xca\x8c\x5e\x09\x98\x7a\x7d\x15\x1a\xfc\xdf\x47\xab\xdf\x33\xc4\xec\xf6\x4b\x3b\x57\xa0\xa7\x10\xe9\x73\xd8\xed\x57\xd8\x79\x49\x8e\x59\x88\xb0\xd8\x29\x9f\xe8\x3b\x88\x5f\x8f\x9c\x5f\x08\x71\xbc\x41\x88\x36\x21\xc4\x14\xda\xe1\x06\x9f\xc6\xe5\xfb\x3c\xec\x96\x1a\x88\x0e\x37\xfc\x9c\xc6\x75\x1a\xb4\xf6\x7f\x44\x17\x31\x2e\x1f\xc6\x15\x8d\xd1\xfc\xe6\xd0\xcf\xff\x65\xe9\xc7\xb0\xff\x03\xa9\x4f\x9f\x0c\x49\xfe\xd3\xbb\xff\x8b\xe6\xb1\x11\x72\x6f\xac\x97\xa9\x5d\x43\x7b\x1d\xed\x2a\xda\x6b\x68\xaf\xa2\x5d\x41\x7b\x19\xed\x32\xda\x05\xb4\xf3\x55\xbf\x7c\xd2\xaf\x31\xe2\x47\xb2\xe4\xdf\xe9\x16\xac\xc3\x34\xd1\x93\xad\xf0\xbf\x9d\xfa\x45\xcf\x82\xdf\x06\x7e\x1b\xf8\xe7\x88\x9f\x6d\x27\x7e\xd3\x1c\xd1\x67\x62\x44\x1f\x26\xbb\x7a\x3e\x4e\xf3\x33\x4d\xd1\x58\x98\x85\x7f\x03\xe4\x9f\x3e\xdd\x4f\xcf\x27\x87\xa0\x1f\xe3\x99\xbd\x6c\x1b\x67\x6a\x32\x2f\x9f\xa7\xa3\x37\xe0\xcf\x34\x68\x9a\xa7\xd2\x6f\xd0\xfc\x4d\x35\xd2\xfa\x66\xde\x78\x4f\xf2\xa7\x7c\x42\x54\x3c\xca\x44\xdf\x87\x9e\x2c\xe4\x68\x5e\xc7\x27\xcf\x4a\x3a\x13\x5d\xc7\xf3\xa3\x92\x3e\xee\x23\x3d\x29\xfd\x88\xa4\x07\x5f\x25\xfd\x29\x7d\x8c\xda\xdc\x04\xf5\xf3\x53\xbf\xc1\xd7\xb0\x7e\x09\xac\x53\x94\xd6\x69\x54\x4b\xc9\x79\x0f\x6b\xcf\x23\x5e\x5e\xa5\x38\xd6\x34\xc9\x0f\x8a\xbf\xa4\xf5\x47\xdc\x65\x22\x07\xa5\x5c\xf3\xef\x11\x5d\x2a\x22\x3e\x35\x21\x0e\x96\xcb\x65\x63\x1d\x4b\x69\x33\x3e\x2b\x5b\x70\xbc\x48\x72\x99\x08\x8d\x23\x28\xbe\x85\x71\x8e\x94\xa9\xbd\x45\xcf\xa3\x87\xd0\x7e\x08\x3f\xc7\xf0\x7c\x13\xf1\x40\xeb\x6f\xe8\x6f\xbe\xd3\xe9\xc7\x08\xfc\x08\x58\xec\xeb\xa7\xdb\x6a\xca\xdd\x52\xca\xb5\xd7\x94\x3b\x64\x19\xb7\x29\x17\xab\x29\xf7\xa1\x52\x8e\xe2\xb1\xf9\x6e\x67\xff\x31\xf4\x0f\x29\xe6\x57\x3f\x4d\xf1\xab\x5f\xa4\xf9\x52\xd9\xdb\x54\x8c\x2f\xb5\x84\xf9\x1f\xa0\x7c\x90\xba\x48\xeb\x90\x4e\x74\x53\xfc\x2d\x1a\xeb\x11\x27\xba\xf8\x21\xd6\x31\x41\xfd\x2f\xd1\xba\xa4\x0f\x3f\x26\xdb\x70\x20\x63\x8b\xbb\x29\xb4\x61\x3f\xc5\xe5\xd7\x7c\x42\x94\xcb\x42\x84\x7d\xc7\x88\xd6\x40\x6b\x14\xd7\x46\x9e\x2a\x44\xc6\x58\x1e\x9e\xb6\xe5\x05\xeb\xb8\xb2\x18\x57\x0b\xc6\xd5\xc2\xf2\x66\x8c\x9d\x13\x63\x8a\x3c\x1a\x14\x07\x65\x1b\xd6\x3e\x2b\xf3\x60\x58\xfb\x2d\x39\x3f\x95\x7d\x10\x94\xcf\x69\xff\x1b\xfe\xa4\x23\x87\xe0\x0f\xcd\x5f\xf3\x93\xee\x71\xe8\xbd\x5e\x23\xae\xeb\x75\x48\xb1\x5e\xc7\x05\xe6\x15\x6d\x65\x1c\xff\x5d\x2e\x97\x8d\x71\x3c\xdd\xd2\x51\xf5\x53\x93\xfe\x5d\xc5\x7e\x8b\x31\xff\x69\x9d\xf5\x22\xe5\x51\x55\xbc\x59\xf7\x03\xf7\x3f\x55\x44\x9c\x44\x6e\x40\xff\x03\x36\xfd\x99\x08\xc5\x49\xf3\x0e\xa7\xde\x0f\x3d\xf3\x84\x11\x5f\xef\x41\xef\x1e\xe6\x37\xf2\x40\xb1\xcd\xd5\xef\x4d\x4f\xbf\x11\xaf\x91\x35\xe8\xdf\xc5\xfc\x3e\x46\x7a\xbf\xea\xd4\x7b\xcc\xd3\xef\x63\xf0\xfb\x7d\xe8\xa5\x83\x36\x55\x3c\x04\x7b\xd7\x1d\x38\xa2\x9e\xb8\xac\x85\x5f\x7e\x65\xb8\xa9\x95\xe3\xa6\x21\xb6\x5f\xfb\x1d\x76\x87\xbc\xf0\x0b\xe2\x24\xbc\xe3\x96\xa8\x57\xae\xb2\x4f\xf5\x63\xc2\xd1\xdf\x0b\x9f\x99\x38\xe9\xa7\x34\x8e\x2a\x4e\xfa\x09\xd1\x8b\x7c\x1c\x6d\x65\x7b\xbf\x83\x84\x93\xb4\x7f\x23\x9c\x74\x1a\x38\x69\xef\x8f\x84\x5d\x0e\xb8\x28\x82\xf3\x36\x02\x5c\x84\xfd\x58\x88\x00\x47\x44\x80\x23\x22\xc0\x1d\x11\xe0\xa2\xc8\x3c\xda\x39\xb4\x84\x67\xae\xf8\x81\x93\x12\x23\x38\x1f\x8f\x00\x6f\x10\x4e\xd2\x73\xc0\x47\x89\xac\xed\xfc\xd4\x73\x74\xfe\xe9\x79\xe0\xa1\x01\xc2\x4d\x85\x04\x70\x55\x2e\x86\xe7\x71\x3c\x87\xdd\x04\x70\x54\x0e\xf9\x2a\xdf\x8f\xe7\xf0\x33\x01\x1c\x95\x03\x3e\x4a\x2c\xdb\xc6\x95\xca\x03\x17\x0d\xfc\x10\x78\x0b\xb8\x68\x80\xe6\xa5\x84\x7a\x60\x2a\x08\x5c\x74\xf8\x5d\xc2\x45\x01\xe0\xa2\x81\x7f\x82\x1e\xe0\xa2\x01\x9a\xc7\xf1\x3c\x70\xd1\xc0\x75\x3c\x07\xde\x09\x00\x17\x9d\xa1\xf3\x66\xf0\x10\xd6\x63\x00\x38\x2d\x4f\x78\x29\x75\x06\x38\x0a\x76\x07\xe1\x47\xe1\xb0\xb1\x2e\x71\xb4\x74\x2e\x0e\xfb\xde\x16\x95\x10\x2d\xbd\x85\x38\x6b\x10\x62\xa5\x5c\x2e\x37\xf7\x20\xfe\x2c\x79\x22\x66\x39\x8f\x1c\x79\xbf\x08\xbd\xf7\x50\xdc\xe8\xc5\x18\x68\xe8\xb1\xc4\x71\x1b\xdb\xa7\x23\xca\x73\xeb\x75\x1a\x47\x08\xe7\x02\xda\xe1\xd0\x6b\x2c\x1e\x61\x07\xf1\x5c\x88\x6c\xa0\x5d\x47\xde\xfa\x19\xda\x4d\xf0\xd7\x90\xb7\x70\x4e\x9c\xa6\xf5\xe5\x78\xa6\xe2\x57\x8b\xcb\xf8\x43\xb6\xf3\xce\x5d\xbe\x95\xc9\xb7\x6d\x41\xde\x2a\xb7\xb1\x45\xbb\x21\x26\xbf\xae\x94\xaf\x8d\xff\x7e\xb6\x4d\xfc\xb7\xb9\x45\xfc\xb7\x56\x17\x9e\x58\x73\xc5\x13\x4a\x7c\xfb\x36\xe2\xe2\x0d\xca\x27\xfa\x9b\x88\x8f\x13\x94\x57\x4a\x29\x92\x1f\x3c\x4f\xad\xfe\x16\xe2\x66\x06\x79\x65\x19\xf5\xe0\x2c\xe5\x9b\xf1\x25\xc4\xd1\xc0\x34\xf0\xe3\x26\xf0\xe3\x0c\xc3\x97\xcf\x13\x5e\xd4\x3e\x4f\x7e\x7e\x03\x76\xaa\x79\xf6\x51\xe2\xff\x36\xd1\x26\x4e\xa4\xf9\x29\xed\xe5\xfc\x7d\x92\x2e\x0c\x84\x90\x97\x5a\x90\xff\x5a\x59\x3e\xef\xb3\xed\x6f\xbd\x38\x64\xdb\xe7\xd6\xf9\x8a\x2b\x70\xe5\x70\x23\x1d\x54\xc6\xbc\x1c\xd7\xb0\xef\xd0\xb6\xca\x63\xdf\xc4\x63\xf7\xed\xa5\x03\x67\xb8\x61\x8f\x6d\x9c\xb5\xe4\x9e\xde\x4b\x0b\x38\xb5\x83\x9e\xa7\x4f\xd0\xba\x18\xfb\x3b\x3d\xfb\x00\xfc\xa7\xf1\xde\xd0\xc8\xbf\x4c\xa4\x1d\xfc\x56\xc6\x8f\x82\xdf\x82\x7d\xfd\xa0\xe3\x7c\xe6\xf9\x26\xa6\xcc\x37\x18\xbf\x45\x6e\xa4\x0e\xb9\xad\xe0\x98\x90\xc4\x13\x71\xb6\x6e\x94\xe7\xf5\xe3\x94\xd7\xf5\xb1\xac\xc3\x8f\xeb\x5e\xe7\x3e\xee\x2f\xc2\x8d\x94\xc0\x75\xc4\xf3\xb0\x76\x49\x9e\xe7\xa5\xd3\xea\x75\xa9\xe0\xff\x06\xd9\x6f\x41\xea\xe1\x71\x94\xc1\x39\x57\xef\x3d\x4d\x18\xb8\x50\xc7\xf3\xb0\xd6\x24\xed\xdf\xbe\xde\x57\xb0\x3e\x2f\x43\x3f\x9d\xd3\xa5\x17\xa8\x9f\x2a\x1f\x5c\x56\xe4\x9f\xf1\x22\xd9\x1d\xd6\x7e\x52\xf6\xd9\x70\xf7\x65\xc4\xcd\x06\xfc\x5b\x43\x7b\xab\x6c\xf5\x3b\x8d\xf3\x44\x3f\xdf\x5a\xb7\x7d\x5b\x3e\x3a\xdf\x56\x53\x6e\x43\x29\xd7\x5e\x53\x6e\x4d\x95\x6f\xcf\xc7\x6a\xca\xdd\x52\xca\x21\x4f\xb7\x3a\xfb\xf7\x59\xf3\xf4\x0b\xe6\x3a\x91\x9c\x91\xa7\xfb\x5c\xf3\xf4\xba\xb2\x4e\xc7\xfc\x0f\xcc\x23\x8f\x6e\x20\x8f\x5e\x40\x9e\xc5\x7a\x44\x09\x97\x8d\xa3\x3e\xcb\x44\x16\xa9\xff\x25\x5a\x97\xf4\xe1\x25\xca\xbb\x01\x2a\x58\x9d\x75\xfa\xe3\x92\x6f\xd6\xe9\x94\x80\xcd\x3c\xfb\x05\x92\x73\xdc\x57\xd2\x3e\x09\x8a\x2e\xc1\xe3\x76\xde\x33\x6e\x29\x6f\x5f\x01\x2e\x2f\xcc\x00\x1f\xcf\x00\x87\xcd\x5c\x76\xe4\x65\x23\x6e\x24\x6e\xf0\xdb\xe7\xf7\x25\xe9\x43\x25\x7f\xd0\xfc\xea\x17\x29\x8f\xf0\x71\x16\x12\xe6\x3d\xaf\x26\xe3\x96\xce\x81\x54\xf1\xaf\x10\xc7\x87\x40\xcf\x83\x1e\x03\x7d\x01\xf4\x04\x68\x9a\xef\xd2\x6e\xf2\xe3\x06\xce\x8b\x4c\x94\xce\xc3\x29\xe4\x5f\x33\x0f\x4f\x42\x6e\x09\x7a\xf2\xd4\xce\x4c\xa3\x7d\x1e\x79\xda\xa8\x13\x80\xef\x8b\x06\x2e\xa5\x73\xba\xb4\x84\xf9\x08\x50\xbc\x19\xe7\x51\xab\xcf\x3e\xcf\x57\x82\x74\xcf\x5e\x99\x97\x3d\x75\xae\x8b\xdf\x52\xbf\x9a\x79\xca\x47\x79\x0a\xfd\xaa\x75\xe0\x6d\xe7\x99\xff\x29\x37\x29\xcf\xe7\xf9\xed\xe1\xd4\xf3\x43\x4a\x7f\x54\x38\xb5\x4f\x85\xf7\x3c\xe4\x39\x4e\x9d\xdf\x82\x7c\x4d\x9c\xea\x61\xb7\x2e\x9c\x5a\x47\xfe\x53\xe2\xd4\x3a\xf2\x9f\x12\xa7\x7a\xe4\xbf\xb5\xba\xf2\xdf\x16\x71\x6a\xb1\xcf\x56\x57\xea\x97\x10\x1f\xa8\xd7\x06\xc3\x88\x47\xe4\xc5\x42\x82\xf6\x8f\xbe\x04\x7c\x6a\xd4\x8d\x8b\x88\x9f\xe8\x2a\xf2\x24\xf0\x69\xe4\x1f\x68\x5f\x2e\x00\x9f\x36\x51\x1d\x1a\x0e\x16\x49\x7f\x37\xe9\x0f\x07\xfe\x44\xd2\x66\x7e\xfc\x63\xa2\xab\xf9\xf1\x8f\x28\xdf\x38\xf2\xe3\x0e\x99\x1f\xad\xfb\xef\xb2\xe7\xfe\x7b\xd5\x71\xfe\xbb\xf5\xc7\xf9\x4f\xf9\xac\x9a\x47\x51\x87\xcf\xa0\x4e\x9f\x99\x77\xe4\xd1\xf9\x5f\x68\x1e\xbd\x60\xcb\xa3\x3a\xf6\xbb\xbe\x88\x3c\x86\xfc\x68\xdc\xf3\x1a\xf9\x4e\x5f\xc4\x3d\x09\xde\xeb\x54\xdf\xfb\x14\x57\x5d\xf2\x2c\xdd\x4f\x70\xfc\x5c\xba\x8b\xda\x24\x5d\x4b\xca\xfb\x04\x99\x87\xd1\x66\x06\x66\xab\xf9\x59\xe2\xe9\xc8\x2b\xc8\xbf\x73\x68\x5f\x87\xdd\x65\x96\x87\x17\xb6\x9d\x87\x47\x2c\x79\x38\x28\xbe\x47\xf2\xc0\xbd\x1c\xe7\x9a\xf7\x6a\xb1\x2a\x2d\xf7\x53\x08\x71\x3e\xbe\x45\xfc\x5b\xbd\xf7\x7a\x90\xe4\x81\x77\x87\xb5\xa8\x8c\xb7\xc2\x09\xaa\x1b\x4a\x78\xaf\x73\x05\x76\x0a\xb3\xb4\x1e\xe9\x59\xda\x0f\x46\x7d\x5a\xc2\xfb\x24\xd5\xfe\xbd\xa6\xac\xa3\x8d\x7d\x7f\xcd\x75\xdf\xbf\xab\xd8\xf7\x85\x59\x8a\xbb\xcc\xec\x82\x63\x3f\xc4\xb7\x84\xb3\x9b\x09\xe7\x8f\x61\xfe\xde\x6c\x67\xf5\x05\xec\x44\x6e\xd7\xce\x57\xbc\xcf\x49\x8f\x79\x5b\x50\x9e\x93\xf0\x87\xf9\x3d\xac\xad\x33\x7c\x3e\x57\x03\x9f\xc7\xed\xf8\xdc\x78\x8f\xe6\xe1\xcf\x9c\xd7\x7b\x34\x0f\x39\x25\x3e\x37\xee\x51\x3c\xe4\x94\xf8\xdc\xb8\x47\xf1\x90\x53\xe2\x73\xe3\x1e\x65\x8f\xb3\x7f\xdc\x7a\x3e\xbd\x66\xae\xa7\x3d\x4e\xe3\x5b\xc4\xe7\x98\x7f\xdc\x8b\x9a\xf8\x7c\x89\xe1\xf3\x65\x86\xcf\xff\x94\xe1\xf3\x3f\x03\x3e\xa7\x0d\xeb\xc4\xe7\x54\x48\x9b\xe7\x0f\xc5\x9f\x71\xfe\x0c\x6b\xab\xe4\xaf\x25\x7e\x2b\x71\x15\x14\x7f\xfb\xb1\xc4\xe1\xb0\xb6\xc4\xf0\x9a\x71\x4f\x3a\xb7\x3d\xbc\x66\xdc\xcf\x31\x7f\x54\x78\x2d\xee\x75\xbf\xa7\x90\xe7\x78\x6d\x6e\x0b\xf2\x75\xdf\x2b\x2a\xec\x6e\xe9\x5e\xd1\xc3\xae\xe7\xbd\xa2\x87\x9c\xe7\xbd\xa2\x62\x3f\xac\xd5\xb5\x1f\xb6\x88\xd7\x96\x10\x17\xc6\x77\x14\x17\x8d\xf7\x09\xcb\x38\xe7\x11\x27\x51\xe0\x82\x22\x70\x1a\xde\x8b\x8c\x2f\x20\x6e\x9a\x08\x17\x8c\xe3\x3d\x73\xe6\xf0\xf7\x69\xbf\xbc\x05\x9c\x36\xf3\x0e\xe5\xc7\x5e\xf2\x67\xf0\x29\x6a\xc3\x0d\xe3\xe4\x27\xee\xd5\x07\x3f\x6b\xf0\xf1\xde\x19\x68\x21\x2c\xe8\x3d\xc0\xd7\x82\xa0\x83\xcf\x48\x7a\x38\x10\x94\x2d\xdf\x7f\xad\x72\xfb\x59\xee\xf7\x1e\xa7\xfb\xb0\x61\xdf\x2c\xf5\xaf\x79\xaf\xf7\x52\x75\x7e\x83\x96\x7b\x2e\x7e\x7f\x5f\x98\xed\xab\x9e\x4f\x7e\xb9\x5f\xfa\x31\x4f\x31\x86\x5b\x0e\xb0\x73\x0c\xef\x85\x0c\x1c\xb6\x48\xf9\x24\x8d\xf7\x44\xa9\xc5\xef\x82\x3e\x8a\x75\xa0\xf9\x2d\xdd\x4f\xf2\x37\xb0\xef\x32\x09\xc2\x65\xad\x0d\x76\xff\x8d\x7e\x49\x7c\x37\x34\x85\xfe\xa6\xdc\x09\xf2\x0f\xdf\xa7\xa4\xa3\x13\xd8\xef\x59\xb4\x79\x07\x0e\x1d\x52\xdc\xb3\xea\x45\xd4\xdb\x8b\xc0\x87\x17\x71\x1f\x0d\x1c\x3e\x85\xf7\x3c\x25\xda\x0e\x8e\xf7\xe2\x25\xd4\x03\x61\x81\x73\xce\xa0\x03\x04\xb8\x4a\xf4\xba\xac\x1a\x07\x66\xff\xdd\xb6\xe7\xc9\xac\xb0\xcb\x4b\x54\x66\xc7\x7d\x71\x0f\xdc\x67\xd4\x3f\xbc\x0e\x37\xc6\xe7\x3a\xae\xdd\x76\xbb\xe9\x84\x71\xbe\x10\x2e\xbd\x11\xc4\x7c\xe3\x3b\xa6\xe4\x24\xe4\x31\x8f\x26\x3e\x7e\x83\xc5\xcb\x05\x07\xbe\x99\xf3\xac\x43\xde\xff\x88\xf7\x5f\xf0\xec\xbf\xf6\x91\xf8\xa5\xc6\xf7\x02\x8b\xef\x25\x5b\x7c\xa7\x16\x97\x3d\xe3\xdb\x39\x5f\x27\xd8\xbe\xd9\x5e\xfc\xde\x6e\x7c\x04\xc5\x95\x5f\xea\x3c\xea\x8b\x46\x9e\x46\xbd\x83\xf9\xa9\xbe\x5f\x5e\x44\x9e\xbe\x88\xfa\x0d\xef\x8d\x8d\x3a\xce\x3d\x8f\x50\x1d\xd7\x2a\xeb\x4b\x4b\x1e\x41\x5d\x96\xb4\xc4\xbd\xbd\x3e\xfb\x26\xcb\x23\x2f\x62\xfe\xcf\xa1\x7d\xe5\x17\xb6\x0e\x23\x72\xce\xff\x9e\xe6\xab\xfa\xbd\xa4\x81\x5f\x30\xbf\x7b\xec\xdf\x3f\x18\xdf\x2f\xf0\x3a\x2d\xdc\x48\xf7\xa7\xd6\xfd\xa3\xfa\xde\xc2\x59\xa7\x25\x64\x6b\xd6\x69\x71\xaa\xd3\x8c\xf5\x86\xfe\xcc\x2c\xbe\x97\x99\xbd\x09\x3c\x55\x1b\x1f\xdc\xdc\x02\xae\x68\xc0\xf7\x06\xb5\xbe\x5b\x2b\xcc\x02\xbf\xce\x6e\xd4\x5d\x27\xaa\x71\x91\x81\x37\xd6\x5d\xf1\x86\xaa\xbe\x28\xcc\xce\x61\x1e\x86\xea\xce\x6f\xea\xfa\x6d\x17\x7b\x1f\x03\xbd\x91\xdb\xd5\xfb\xa5\x6d\xd7\x85\x32\xae\x43\x78\x6f\xe6\xc0\xe5\x43\xc0\xe5\xff\x5e\xf6\xd9\xf2\x05\xbe\x77\xc5\xbd\x19\xc7\x25\xfc\x9e\x35\x8d\xfa\xda\xac\x27\xbd\xbf\x53\x49\x01\xbf\xa5\xa3\xef\x60\x3f\xe2\x9e\x20\x42\xdf\x79\x98\xef\x2d\x97\x10\x0f\xb5\xeb\xcd\x15\x8f\x7a\x53\x85\x5b\xbf\x6b\xfd\xce\x8b\xe1\x56\xf3\x3b\x32\xe0\xc7\x22\xed\x0f\xf3\x1e\xfe\xfb\x8e\xfc\xb1\xac\xc4\x21\x34\x7e\xe3\x3c\x36\xbe\xbb\x35\xf2\x52\xd8\xf7\x03\xca\x6f\x96\x7c\x52\x99\xc2\xcf\xed\x06\x4e\xc5\xbd\x96\x21\x6f\xd6\x6d\xdf\x53\xae\x0b\xe5\x1b\x4d\x7c\x6e\xf7\x77\x48\xce\x92\xbf\x2a\xf1\x66\x7c\x1f\xc9\xf3\x97\xf1\x3e\x29\x28\x66\x3f\xe6\xb8\x7a\x5b\xd6\x7b\x1f\x5f\x5c\x6d\xef\xbb\x28\x33\xde\x6e\x20\xce\x8c\x3a\xf2\x3d\x97\x78\xab\x5d\xd7\xa9\xef\xa9\xea\xaf\xeb\x56\xb7\x28\xcf\xeb\xd9\x15\x0f\x79\x23\xde\x1b\x1a\x9d\x75\xec\x55\x8f\x7a\xcd\x8c\xfb\xeb\x2e\x71\xff\xcf\x75\xc6\xbd\x71\x1f\x4b\xeb\x31\xec\xc3\x7b\x7f\x8c\xa7\x76\x5d\xd4\x88\xb8\xa4\x75\xd6\x97\x68\x9d\x87\x03\x8f\x90\x9e\x7d\xd0\x83\xef\xaf\x8c\xef\xbf\x28\x4b\x58\xea\xa5\x60\x57\x75\x7c\x14\x7f\xc0\x2b\x6f\x21\xce\x66\x46\xaa\xf1\xe5\x93\xf1\x40\x78\x25\x7d\xe2\x28\xc3\x3b\xf6\xfb\xe6\xd4\x22\xf2\x56\x74\x1a\xf4\xbb\xa0\x9f\x07\x4d\xf3\x97\xc1\x3d\xf4\x54\x15\x1f\x7e\x93\xc5\x63\x6d\x5c\x32\xa6\x9c\xdf\xe9\x1a\x79\x25\xe1\x92\x57\x7a\x91\x57\xce\xba\xe4\x95\xae\x1a\x79\xe5\x61\x47\x5e\x19\xf2\xc8\x2b\x25\xd4\x79\x4e\x7c\xfa\x19\xd9\x7f\x10\xdf\xe1\x84\x35\xfa\x1e\x65\xf0\x71\xd0\xfe\x4f\xc3\xcf\xeb\x2e\x7e\x7e\xaa\x86\x9f\x91\x6d\xe5\x3f\x13\xbf\xfd\x07\xc9\x3b\xbe\x8f\x25\x1c\x67\xd4\x89\xe9\x26\xe0\xa6\xea\xf7\xb2\xeb\x8e\x73\xfe\xa6\xe7\x39\xdf\x24\xe9\x54\xf5\x9c\x27\x60\xc6\xf1\x9e\xf5\xfb\x98\xf5\x8f\xe5\x3b\x5f\xe7\x77\xbd\xf5\xe1\xca\x07\x94\xfe\xb9\xd5\x73\x1c\xcf\x9a\xfb\x70\xc5\xa5\x1e\xb9\x5a\xdd\x77\x01\x0b\x2e\x30\xf7\xa1\xfd\x7e\xd0\xb8\x0f\xe4\xdf\xcb\x9a\xdf\x97\x13\x9e\x48\x01\x07\x1b\xf7\xdb\xaa\x3c\xec\x86\xfb\x57\xb6\x51\x7f\xf1\xf9\x0f\x58\xfe\x13\x01\x77\x9e\x86\xf9\x0a\xd5\xc1\x6b\x31\xf2\x9d\x85\xd7\xae\xe0\x85\x14\x36\xdc\xec\x9e\xc3\xbf\x2b\xbf\xa7\x86\x0e\x88\x8f\x2c\x7f\x1b\xa0\xfa\xdd\x2f\xe5\x83\xa2\x65\x87\x9d\xff\x37\x7e\xe2\x6f\x30\xfe\x41\xf0\x97\x1b\xec\xfc\xbb\xc0\x6f\xf7\xdb\xf9\x7f\xe8\x23\xfe\x10\xeb\x3f\x09\x7e\x28\x64\xe7\x3f\x06\x7e\x8c\xd9\xbd\x13\x7e\x1e\x61\xfd\x3f\x80\xdd\x2c\xe3\xbf\x0b\xfe\x59\xe6\xcf\x41\xe8\x5f\x60\xfd\x1f\x00\xff\x32\xe3\x0f\x48\xf9\x46\x11\x63\xfe\x9f\xf7\x11\x7f\x8c\xf1\x4f\x80\x2f\x98\x9e\x6e\xf0\x63\x8c\xdf\x15\x20\x7e\x1f\xe3\xff\x2e\xfa\xcf\x31\xff\xbf\x2d\xe9\x9d\x62\x95\xf1\x3f\x01\xfe\x58\xd0\xce\x7f\xd9\x47\xfc\x79\xc6\x7f\x06\xfc\x65\xc6\x7f\x10\xfc\x15\xc6\xef\x84\xfe\x75\xe6\xe7\x2d\xf4\x6f\x6d\xb4\xf3\xbf\x85\xfe\xcb\x76\xb6\xf8\x11\xfa\xf3\x3f\x0e\x9d\x01\x7f\x88\xf1\x3f\x29\xe7\x67\x97\x18\x09\xd8\xf9\x3f\xf7\x13\xff\x5c\x93\x9d\x7f\x03\xfc\xeb\x8c\xbf\xdf\xe0\x33\xfd\x01\xf0\xb3\x4c\xff\x4e\xd8\x5d\x66\x7a\xfe\x1c\xfd\xaf\xb1\x75\xbf\xe9\x23\xfe\x26\xe3\xfb\xa1\xa7\x9d\xe9\xf9\x4f\xe8\x69\xfb\x84\x9d\xff\x43\xf0\x5b\x18\xff\x92\x8b\xff\x7f\x60\xf8\xcf\xf8\xf7\x83\x7f\x96\xf1\xff\x15\x7e\xae\x33\x7e\x42\xf6\x6f\x16\x2b\x6c\x1e\x0e\xfb\x88\xdf\xc7\xc6\xf5\x9b\x01\xe2\x9f\x63\xfc\x28\xf4\x84\x58\x3c\xfc\x18\x7a\x5a\x18\xff\x1b\xe0\xb7\x31\xfe\xbd\xd0\xb3\xc9\xfc\xfc\x22\xfa\x0f\xb1\x3c\x7e\x1f\xf8\x47\x18\xff\x07\x52\xcf\x1d\x62\xc5\xce\x16\xef\x49\xfe\x9d\x8e\x79\x0b\xc8\x73\xe4\x53\x82\xff\xbe\x24\xf1\xf3\xaf\x3b\xf8\x39\x89\xeb\xef\x71\xf0\xbf\x23\xf5\xb4\x3a\xf8\x9f\x97\x7a\xee\x75\xf0\x9f\x90\xe7\xc1\x27\x1d\xfc\x09\xd9\xff\x0e\x07\xff\x5f\x24\x7f\x97\x83\xff\x17\x92\xbf\xd3\xc1\xff\x47\xa9\xdf\xef\xe0\x3f\x2b\xf9\x0d\x0e\xfe\x57\xa5\x9e\x3b\x1d\xfc\x06\xd9\xbf\xd9\xc1\xff\x6b\xc9\x0f\x3a\xf8\x5f\x91\xfc\x46\x07\x3f\x29\xe7\x2d\xec\xe0\xbf\x29\xe7\xed\x6e\x07\xbf\x5d\xfa\x73\x9f\x83\xff\xb2\xd4\xb3\xc7\xc1\x5f\x95\x7a\x22\x0e\x7e\x3f\xda\xca\xb2\x57\x2a\x91\x38\xa3\xb3\x8c\xbe\x6c\xa1\x2b\xb2\x9b\x41\x93\xfe\x1d\x21\xc4\x5c\xc8\xfe\xdc\xaa\x3f\xc1\xf4\x27\x98\xfe\x0a\xbd\xc0\xf4\x4f\xfb\xed\xf4\x7a\x83\xdd\x5e\x9b\xc5\xde\x00\xb3\x57\xf9\xf7\x2a\xa3\xdb\x35\x3b\xbd\xe6\xb7\xeb\xeb\xb7\x8c\xe7\xc9\x8a\x7d\x36\xbe\x4d\x66\xaf\xbd\xd1\x4e\xaf\x36\x99\xf4\x53\x42\xe0\xaf\x24\x4d\x7b\x7d\xcc\xfe\x32\xa3\x57\x1b\xed\xf6\xcf\x35\xd9\xed\xaf\x34\xd9\xed\x6d\xec\x64\xfe\xee\xb2\xdb\x1f\x61\xf6\xaf\x31\x7b\x6d\x3e\x3b\x3d\x1f\xb0\xeb\xdb\x08\xd9\xe9\xf9\x46\xbb\x7e\xeb\x7c\x3f\x5a\x79\x6e\xa1\x1f\x03\x7e\xb3\xd2\x47\x18\xdd\xaf\xd9\xf5\x8b\x87\xf2\xa3\xd3\x79\x91\x99\x1c\xcd\x67\x27\x4f\x3d\x33\x9a\x4c\x8e\x9f\x1c\xcd\x27\xd3\xb9\x4c\x32\x95\x4e\x8f\x66\xf3\xe2\xa1\xc9\xd1\x89\xea\xe3\x87\xf9\xd3\x67\x53\xd9\xdc\xc3\xc7\x8e\x8e\x9f\xcc\xe5\x53\x13\x13\xc9\xc9\x51\x9b\xae\x7c\x3a\x9b\x7c\xae\x27\x99\x3e\x75\xf2\xe4\x68\x3a\x2f\x32\x6a\xb6\xdd\x82\xea\xa1\xf2\x09\xb7\xd3\xad\xb6\xd3\xed\x65\xa7\xdb\xd5\x8e\xf9\x44\x0e\x31\x9f\xce\xe6\x27\x53\xe9\xd1\xc9\x64\x2e\x9f\xca\x9f\xc9\xf1\x81\x67\xc7\x8f\xe6\x44\xf2\xb9\xd1\xc9\xdc\xf8\xa9\x93\x56\xd7\x8e\x1d\x4d\xa2\x4f\xd5\x2d\x0b\xcb\xee\x12\x7f\xe0\xe0\x5a\x07\x96\x1b\xcd\x4b\x5f\x46\xb9\xeb\xe6\x03\x6b\xf7\xf4\xc4\xa9\x9c\xa3\x2b\x31\x93\x13\xe3\xe9\xd1\x93\x95\xa7\xb9\xfc\x64\x3e\xf5\x8c\x78\x28\xa7\x3f\x5b\x69\x0f\xec\xdf\xdf\x93\x7c\xa4\xd2\x74\x24\x3b\x65\xdb\x9d\xec\x90\x6d\x17\xda\x0e\xb4\x3d\xc9\x38\xb1\xe3\xe8\x1d\x27\x6e\x47\x1c\x52\x78\xdc\x81\xe7\x06\xbf\x97\xba\x75\xf6\xa2\x5b\x2f\xba\xf5\xa2\x5b\x6f\x75\xf6\x93\xa3\xcf\x8d\x9e\xcc\x27\xc7\xb3\xcf\xf5\x10\x0f\xcb\x93\x3b\x95\xce\x58\xb8\xf9\x33\xd9\x89\xd1\xec\xf8\x51\x62\x1d\xd8\xbf\x7f\x5f\xb2\x87\x74\xf7\xc0\x14\xb8\x9d\x60\x1b\x74\x07\x68\x6a\x3b\xd0\xf6\x24\xf7\xd1\xe3\x7d\x90\xde\x07\x29\xd0\x1d\x78\x4c\x6d\x17\xda\x8e\x4a\xeb\x74\xbc\x5b\xe9\x78\xb7\xd3\xf1\x6e\x52\xda\x4d\xb6\x40\x75\xa1\xed\x04\xbb\xa3\x1b\xa6\x64\xdb\x9b\xec\x42\xb7\x2e\xac\x00\xe8\x0e\xd9\xc6\x93\x9d\x78\xdc\x89\xc7\xa0\x3b\x0c\x7e\x07\xb4\x77\xe0\x39\xe8\x0e\xd0\xd4\xf6\x24\x3b\x63\x34\xd0\x4e\xbc\xf7\xbe\xdd\xdf\x2e\x9f\x50\xa0\x02\x21\xe2\xf8\xbb\xab\x47\x19\x1e\x64\x70\x49\xd2\x95\xff\x58\xb9\x86\xff\x6f\x17\xe7\x2f\xc0\xed\x6b\xde\xf2\xd3\x8c\xcf\xca\x0f\xd1\xa8\x09\x05\xba\x10\x62\x99\xfe\xac\x4c\xe0\x35\xbe\xbc\x9b\xf0\x5b\xe4\x0d\xfe\x86\x8b\xff\x06\x5e\xbc\x1a\xf2\xb6\xff\x63\xa1\xb6\xbf\x02\xfb\x43\x16\xfb\x41\x85\xfd\x4b\x2e\xf6\xa7\xa1\xb4\xd6\xf8\x8b\x2e\xf6\x43\x5f\xb0\xdb\x69\x03\x76\xe3\xf6\xcf\xb9\xd8\xdf\x80\xd2\xa1\x1a\xe3\x7f\xd1\xc5\x7e\x2b\xec\x1f\xb1\xd8\x6f\x54\xd8\xbf\xe6\xb6\xfe\xb8\x2f\xdc\x6c\xf2\xb6\xff\x8e\xcb\xfa\x4f\xc3\xfe\x9c\xc5\xfe\x4e\x85\xfd\x0f\x5c\xec\xc7\x01\x35\x17\x76\x79\xdb\xff\xa9\x8b\xfd\x10\x02\xf8\xac\xc5\xfe\x2e\x85\xfd\xcf\xb8\xcc\xff\xf5\x28\xb5\x57\x1b\xbd\xed\x7f\xda\x65\xfe\xcf\xc1\xbe\x75\xfe\x9b\x15\xf6\x2f\xb8\x8c\x7f\x1e\xef\xe5\xaf\xf1\x71\xf1\x7e\x2e\xe3\x5f\xef\x33\xed\x1a\xed\x1d\x0a\xfb\x2f\xb8\xd8\x3f\x82\xf7\x03\xbc\x7e\xe5\xf6\xbf\xee\x36\xff\xc8\x5f\x31\x8b\xfd\x3b\x15\xf6\x0f\xfb\xc9\x3e\xcf\x81\x6b\xf8\xbb\xee\xbb\x18\x9f\xe7\xaf\xa2\x4f\x2d\x7f\xb3\x4e\xf9\x93\x2e\xf6\x43\xbd\xf5\xc9\x7f\xdb\xc5\xfe\xbd\x75\xca\xbf\xe8\x62\x3f\x56\xa7\xfc\xdf\xb9\xd8\xff\x62\x9d\xf2\x7d\x42\x2d\x3f\x52\xa7\xfc\x23\x9a\x5a\x7e\xa2\x4e\xf9\xfb\x5d\xe4\xcf\xd6\x29\x1f\x74\x19\xff\xeb\xbd\xea\xfe\xfc\xfc\xfc\xb2\x8b\xfd\x79\x17\x79\x4e\x87\xf1\xde\x96\xff\x16\x20\x1f\xb2\xd4\x8f\xbd\x96\xf8\x37\x6e\x26\xfe\x3f\x00\x00\xff\xff\x30\x48\xc9\x24\xb8\x4d\x00\x00") +var _tcptracerEbpfO = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x5c\x6f\x6c\x1c\xc7\x75\x9f\xbd\x3f\xe2\x91\x8a\x4a\x5a\xce\xd9\xd4\x25\x4e\xa9\xd8\x48\xd8\xab\x63\x93\x22\x45\x9e\xce\x8e\xc3\xca\xb5\xcd\xb0\x8a\x49\x28\x62\x42\x08\x30\x4e\xe7\x13\x25\x52\x47\x4b\x27\xde\xc9\xe4\xf2\x0c\x44\x89\xed\x42\x26\xfc\x81\xb2\x53\x94\x75\xd5\x94\x47\x51\x36\x5d\xb4\x85\x0a\x34\x10\x91\xba\x39\x21\x75\x00\x01\x0d\x0a\xa2\x70\x0b\xa2\x50\x0b\x7e\x70\x5c\xb6\x4d\x10\xb6\x76\x5d\x36\x11\x7c\xc5\xcd\xfb\xed\xed\xee\xdb\xd9\xbd\x23\xe5\xa4\x5f\x78\x80\x3c\x7a\x6f\xe6\xcd\x7b\x33\xf3\xe6\xcd\xef\xcd\x8e\xf5\x8d\xc7\x0e\x3d\xee\xd3\x34\x61\xfc\x34\xf1\x3f\xc2\xa4\xcc\xdf\xec\x93\xe6\xdf\x7b\xf0\xdf\xbd\x42\x13\xc5\xbb\x88\xf7\xa2\x10\xe2\xd7\x84\x10\xf9\x86\xf5\x52\x99\xd6\x93\x19\xc9\xcf\x47\x36\x24\x5d\x9c\xa7\x76\x75\x3e\x21\xd6\x4b\xa5\x52\xf1\x32\x68\xbf\x10\x1b\xa5\x52\xa9\x99\x29\xbd\x16\x30\xfb\xf5\x95\x69\xf0\x7f\x0f\xa5\x7e\xf7\x00\xd3\xdb\x2b\xf5\x5c\x43\x3f\xf9\x48\x8f\x43\x6f\xaf\x42\xcf\x8b\x72\xcc\x42\x84\xc5\x4e\x59\xa3\xef\x20\x7e\x2d\x72\x7e\x21\xc4\xc9\x3a\x21\x5a\x84\x10\x13\x28\x07\xeb\x7c\x1a\x97\xef\xf1\xd0\x5b\xac\x23\x3a\x5c\xf7\x0b\x1a\xd7\x59\xd0\xda\xff\x12\x5d\xc0\xb8\x7c\x18\x57\xb4\x8d\xe6\x37\x8b\x76\xfe\x27\xa5\x1d\x83\xfe\xf7\x65\x7f\xfa\x78\x48\xf2\x9f\xda\xfd\x9f\x34\x8f\xf5\x90\x7b\x6d\xad\x44\xe5\x2a\xca\x15\x94\xcb\x28\x6f\xa0\xbc\x8e\x72\x09\xe5\x55\x94\x8b\x28\xe7\x50\xce\x56\xec\xf2\x49\xbb\x46\x88\x1f\xc9\x90\x7d\x67\x9b\xb0\x0e\x93\x44\x8f\x37\xc3\xfe\x56\x6a\x17\x3d\x0f\x7e\x0b\xf8\x2d\xe0\x5f\x20\x7e\xa6\x95\xf8\x0d\x33\x44\x9f\x6b\x23\xfa\x28\xe9\xd5\x73\x31\x9a\x9f\x49\xf2\xc6\xfc\x34\xec\xeb\x23\xfb\xf4\xc9\x5e\xaa\x1f\x1f\x40\xff\x18\xcf\xf4\x55\xdb\x38\x93\xe3\x39\x59\x9f\x8a\xde\x84\x3d\x93\xa0\x69\x9e\x8a\xbf\x41\xf3\x37\x51\x4f\xeb\x9b\x7e\xed\x5d\xc9\x9f\xf0\x09\x51\xb6\x28\x1d\x7d\x0f\xfd\x64\x20\x47\xf3\x3a\x3a\x7e\x5e\xd2\xe9\xe8\x1a\xea\x8f\x4b\xfa\xa4\x8f\xfa\x49\xea\xc7\x24\xdd\xff\x0a\xf5\x9f\xd4\x47\xa8\xcc\x8e\x51\x3b\x3f\xb5\xeb\x7f\x15\xeb\x17\xc7\x3a\x45\x69\x9d\x86\xb5\xa4\x9c\xf7\xb0\xf6\x1c\xfc\xe5\x15\xf2\x63\x4d\x93\xfc\xa0\xf8\x0b\x5a\x7f\xf8\x5d\x3a\x72\x58\xca\x35\xfe\x2e\xd1\xc5\x02\xfc\x53\x13\xe2\x70\xa9\x54\x32\xd6\xb1\x98\x32\xfd\xb3\xbc\x05\x47\x0b\x24\x97\x8e\xd0\x38\x82\xe2\x3b\x18\xe7\x50\x89\xca\x5b\x54\x1f\x3d\x82\xf2\x43\xd8\x39\x82\xfa\x0d\xf8\x03\xad\xbf\xd1\x7f\xe3\x9d\x4e\x3b\x86\x60\x47\xc0\xa2\x5f\x3f\xdb\x52\x55\xee\x96\x52\xae\xb5\xaa\xdc\x11\xcb\xb8\x4d\xb9\xb6\xaa\x72\x1f\x2a\xe5\xc8\x1f\x1b\xef\x72\xb6\x1f\x41\xfb\x90\x62\x7e\xf5\xb3\xe4\xbf\xfa\x65\x9a\x2f\x95\xbe\x0d\xc5\xf8\x92\x0b\x98\xff\x3e\x8a\x07\xc9\xcb\xb4\x0e\xa9\x78\x27\xf9\xdf\xbc\xb1\x1e\x31\xa2\x0b\x1f\x62\x1d\xe3\xd4\xfe\x0a\xad\x4b\xea\xe8\xc3\xb2\x0c\x07\xd2\x36\xbf\x9b\x40\x19\xf6\x93\x5f\x7e\xdd\x27\x44\xa9\x24\x44\xd8\x77\x82\x68\x0d\xb4\x46\x7e\x6d\xc4\xa9\x7c\x64\x84\xc5\xe1\x49\x5b\x5c\xb0\x8e\x2b\x83\x71\x35\x61\x5c\x4d\x2c\x6e\xb6\xb1\x73\x62\x44\x11\x47\x83\xe2\xb0\x2c\xc3\xda\xe7\x65\x1c\x0c\x6b\x5f\x94\xf3\x53\xde\x07\x41\x59\x4f\xfb\xdf\xb0\x27\x15\x39\x02\x7b\x68\xfe\x1a\x1f\x77\xf7\x43\xef\xf5\x1a\x72\x5d\xaf\x23\x8a\xf5\x3a\x29\x30\xaf\x28\xcb\xe3\xf8\xaf\x52\xa9\x64\x8c\xe3\xa9\xa6\xf6\x8a\x9d\x9a\xb4\xef\x3a\xf6\x5b\x1b\xb3\x9f\xd6\x59\x2f\x50\x1c\x55\xf9\x9b\x75\x3f\x70\xfb\x93\x05\xf8\x49\xe4\x26\xfa\xbf\xcf\xd6\x7f\x3a\x42\x7e\xd2\xb8\xc3\xd9\xef\x87\x9e\x71\xc2\xf0\xaf\x77\xd1\xef\x1e\x66\x37\xe2\x40\xa1\xc5\xd5\xee\x0d\x4f\xbb\xe1\xaf\x91\x55\xf4\xbf\x8b\xd9\x7d\x82\xfa\xfd\x9a\xb3\xdf\x13\x9e\x76\x9f\x80\xdd\xef\xa1\x5f\x3a\x68\x93\x85\x23\xd0\xb7\xe2\xc0\x11\xb5\xf8\x65\x35\xfc\xf2\xff\x86\x9b\x9a\x39\x6e\x1a\x60\xfb\xb5\xd7\xa1\x77\xc0\x0b\xbf\xc0\x4f\xc2\x3b\x6e\x89\x5a\xe5\xca\xfb\x54\x3f\x21\x1c\xed\xbd\xf0\x99\x89\x93\x7e\x46\xe3\xa8\xe0\xa4\x9f\x12\x3d\xcf\xc7\xd1\x52\xb2\xb7\x3b\x4c\x38\x49\xfb\x57\xc2\x49\x67\x81\x93\xf6\xfe\x58\xd8\xe5\x80\x8b\x22\x38\x6f\x23\xc0\x45\xd8\x8f\xf9\x08\x70\x44\x04\x38\x22\x02\xdc\x11\x01\x2e\x8a\xcc\xa2\x9c\x41\x49\x78\xe6\x9a\x1f\x38\x29\x3e\x84\xf3\xf1\x18\xf0\x06\xe1\x24\x3d\x0b\x7c\x14\xcf\xd8\xce\x4f\x3d\x4b\xe7\x9f\x9e\x03\x1e\xea\x23\xdc\x94\x8f\x03\x57\x65\xdb\x50\x1f\x43\x3d\xf4\xc6\x81\xa3\xb2\x88\x57\xb9\x5e\xd4\xc3\xce\x38\x70\x54\x16\xf8\x28\xbe\x68\x1b\x57\x32\x07\x5c\xd4\xf7\x23\xe0\x2d\xe0\xa2\x3e\x9a\x97\xe2\x63\x34\x5f\x13\x41\xe0\xa2\xa3\xef\x10\x2e\x0a\x00\x17\xf5\xfd\x23\xfa\x01\x2e\xea\xa3\x79\x1c\xcd\x01\x17\xf5\xad\xa0\x1e\x78\x27\x00\x5c\x74\x8e\xce\x9b\xfe\x23\x58\x8f\x3e\xe0\xb4\x1c\xe1\xa5\xe4\x39\xe0\x28\xe8\xed\x87\x1d\xf9\xa3\xc6\xba\xc4\x50\xd2\xb9\x38\xe8\x7b\x53\x94\x5d\xb4\xf8\x06\xfc\xac\x4e\x88\xa5\x52\xa9\xd4\xd8\x05\xff\xb3\xc4\x89\x36\xcb\x79\xe4\x88\xfb\x05\xf4\x7b\x37\xf9\x8d\x5e\x68\x03\x8d\x7e\x2c\x7e\xdc\xc2\xf6\xe9\x90\xf2\xdc\xfa\x36\x8d\x23\x84\x73\x01\xe5\x60\xe8\x55\xe6\x8f\xd0\x03\x7f\xce\x47\xd6\x51\xae\x21\x6e\xfd\x1c\xe5\x06\xf8\xab\x88\x5b\x38\x27\xce\xd2\xfa\x72\x3c\x53\xb6\xab\xc9\x65\xfc\x21\xdb\x79\xe7\x2e\xdf\xcc\xe4\x5b\x36\x21\x6f\x95\x5b\xdf\xa4\xde\x10\x93\x5f\x53\xca\x57\xc7\x7f\x3f\xdf\x22\xfe\xdb\xd8\x24\xfe\x5b\xad\x09\x4f\xac\xba\xe2\x09\x25\xbe\x7d\x13\x7e\xf1\x1a\xc5\x13\xfd\x75\xf8\xc7\x29\x8a\x2b\xc5\x24\xc9\xf7\x5f\xa4\x52\x7f\x03\x7e\x33\x85\xb8\xb2\x88\x7c\x70\x9a\xe2\xcd\xe8\x02\xfc\xa8\x6f\x12\xf8\x71\x03\xf8\x71\x8a\xe1\xcb\xe7\x08\x2f\x6a\x8f\x90\x9d\xdf\x84\x9e\x4a\x9c\x7d\x88\xf8\xbf\x45\xb4\x89\x13\x69\x7e\x8a\x7b\x39\x7f\xbf\xa4\xf3\x7d\x21\xc4\xa5\x26\xc4\xbf\x66\x16\xcf\x7b\x6c\xfb\x5b\x2f\x0c\xd8\xf6\xb9\x75\xbe\x62\x0a\x5c\x39\x58\x4f\x07\x95\x31\x2f\x27\x35\xec\x3b\x94\xcd\xf2\xd8\x37\xf1\xd8\x3d\x7b\xe9\xc0\x19\xac\xdb\x63\x1b\x67\x35\xb9\xa7\xf6\xd2\x02\x4e\xec\xa0\xfa\xd4\x29\x5a\x17\x63\x7f\xa7\xa6\xef\x83\xfd\x34\xde\x9b\x1a\xd9\x97\x8e\xb4\x82\xdf\xcc\xf8\x51\xf0\x9b\xb0\xaf\xef\x77\x9c\xcf\x3c\xde\xb4\x29\xe3\x0d\xc6\x6f\x91\x1b\xaa\x41\x6e\x33\x38\x26\x24\xf1\x44\x8c\xad\x1b\xc5\x79\xfd\x24\xc5\x75\x7d\x24\xe3\xb0\x63\xc5\xeb\xdc\xc7\xfd\x45\xb8\x9e\x02\xb8\x0e\x7f\x1e\xd4\xae\xc8\xf3\xbc\x78\x56\xbd\x2e\x65\xfc\x5f\x27\xdb\xcd\xc9\x7e\xb8\x1f\xa5\x71\xce\xd5\x7a\x4f\x13\x06\x2e\xd4\x51\x1f\xd6\x1a\xa4\xfe\xdb\xef\xf7\x65\xac\xcf\x4b\xe8\x9f\xce\xe9\xe2\xf3\xd4\x4e\x15\x0f\xae\x2a\xe2\xcf\x68\x81\xf4\x0e\x6a\x3f\x2d\xf9\x6c\xb8\xfb\x2a\xfc\x66\x1d\xf6\xad\xa2\xbc\x55\xb2\xda\x9d\xc2\x79\xa2\x5f\x6c\xae\x59\xbf\x2d\x1e\x5d\x6c\xa9\x2a\xb7\xae\x94\x6b\xad\x2a\xb7\xaa\x8a\xb7\x17\xdb\xaa\xca\xdd\x52\xca\x21\x4e\x37\x3b\xdb\xf7\x58\xe3\xf4\xf3\xe6\x3a\x91\x9c\x11\xa7\x7b\x5c\xe3\xf4\x9a\x32\x4f\xc7\xfc\xf7\xcd\x22\x8e\xae\x23\x8e\x5e\x42\x9c\xc5\x7a\x44\x09\x97\x8d\x22\x3f\x4b\x47\xe6\xa9\xfd\x15\x5a\x97\xd4\xd1\x05\x8a\xbb\x01\x4a\x58\x9d\x79\xfa\xa3\x92\x6f\xe6\xe9\x14\x80\xcd\x38\xfb\x25\x92\x73\xdc\x57\xd2\x3e\x09\x8a\x0e\xc1\xfd\x76\xd6\xd3\x6f\x29\x6e\x5f\x03\x2e\xcf\x4f\x01\x1f\x4f\x01\x87\x4d\x5d\x75\xc4\x65\xc3\x6f\x24\x6e\xf0\xdb\xe7\xf7\x45\x69\x43\x39\x7e\xd0\xfc\xea\x97\x29\x8e\xf0\x71\xe6\xe3\xe6\x3d\xaf\x26\xfd\x96\xce\x81\x64\xe1\x2f\xe1\xc7\x47\x40\xcf\x82\x1e\x01\x7d\x09\xf4\x18\x68\x9a\xef\xe2\x6e\xb2\xe3\x26\xce\x8b\x74\x94\xce\xc3\x09\xc4\x5f\x33\x0e\x8f\x43\x6e\x01\xfd\xe4\xa8\x9c\x9a\x44\xf9\x1c\xe2\xb4\x91\x27\x00\xdf\x17\x0c\x5c\x4a\xe7\x74\x71\x01\xf3\x11\x20\x7f\x33\xce\xa3\x66\x9f\x7d\x9e\xaf\x05\xe9\x9e\xbd\x3c\x2f\x7b\x6a\x5c\x17\xbf\x25\x7f\x35\xe3\x94\x8f\xe2\x14\xda\x55\xf2\xc0\xdb\x8e\x33\xff\x5d\x6a\x50\x9e\xcf\xb3\x5b\xc3\xa9\x17\x07\x94\xf6\xa8\x70\x6a\x8f\x0a\xef\x79\xc8\x73\x9c\x3a\xbb\x09\xf9\xaa\x38\xd5\x43\x6f\x4d\x38\xb5\x86\xf8\xa7\xc4\xa9\x35\xc4\x3f\x25\x4e\xf5\x88\x7f\xab\x35\xc5\xbf\x4d\xe2\xd4\x42\x8f\x2d\xaf\xd4\xaf\xc0\x3f\x90\xaf\xf5\x87\xe1\x8f\x88\x8b\xf9\x38\xed\x1f\x7d\x01\xf8\xd4\xc8\x1b\xe7\xe1\x3f\xd1\x65\xc4\x49\xe0\xd3\xc8\xdf\xd3\xbe\x9c\x03\x3e\x6d\xa0\x3c\x34\x1c\x2c\x50\xff\x9d\xd4\x7f\x38\xf0\xc7\x92\x36\xe3\xe3\x1f\x11\x5d\x89\x8f\x7f\x48\xf1\xc6\x11\x1f\x77\xc8\xf8\x68\xdd\x7f\x57\x3d\xf7\xdf\x2b\x8e\xf3\xdf\xad\x3d\xce\x7f\x8a\x67\x95\x38\x8a\x3c\x7c\x0a\x79\xfa\xd4\xac\x23\x8e\xce\xfe\x52\xe3\xe8\x25\x5b\x1c\xd5\xb1\xdf\xf5\x79\xc4\x31\xc4\x47\xe3\x9e\xd7\x88\x77\xfa\x3c\xee\x49\xf0\x5d\xa7\xf2\xdd\xa7\xb0\xec\x12\x67\xe9\x7e\x82\xe3\xe7\xe2\x27\xa9\x4c\xd0\xb5\xa4\xbc\x4f\x90\x71\x18\x65\xba\x6f\xba\x12\x9f\x25\x9e\x8e\xbc\x8c\xf8\x3b\x83\xf2\xdb\xd0\xbb\xc8\xe2\xf0\xdc\x96\xe3\xf0\x90\x25\x0e\x07\xc5\xf7\x49\x1e\xb8\x97\xe3\x5c\xf3\x5e\xad\xad\x42\xcb\xfd\x14\x82\x9f\x8f\x6e\x12\xff\x56\xee\xbd\xee\x27\x79\xe0\xdd\x41\x2d\x2a\xfd\x2d\x7f\x8a\xf2\x86\x22\xbe\xeb\x5c\x83\x9e\xfc\x34\xad\x47\x6a\x9a\xf6\x83\x91\x9f\x16\xf1\x3d\x49\xb5\x7f\x6f\x28\xf3\x68\x63\xdf\xdf\x70\xdd\xf7\xef\x28\xf6\x7d\x7e\x9a\xfc\x2e\x3d\x3d\xe7\xd8\x0f\xb1\x4d\xe1\xec\x46\xc2\xf9\x23\x98\xbf\xd7\x5b\x59\x7e\x01\x3d\x91\xdb\xd5\xf3\x55\xef\x73\xd2\x63\xde\xe6\x94\xe7\x24\xec\x61\x76\x0f\x6a\x6b\x0c\x9f\xcf\x54\xc1\xe7\x31\x3b\x3e\x37\xbe\xa3\x79\xd8\x33\xe3\xf5\x1d\xcd\x43\x4e\x89\xcf\x8d\x7b\x14\x0f\x39\x25\x3e\x37\xee\x51\x3c\xe4\x94\xf8\xdc\xb8\x47\xd9\xe3\x6c\x1f\xb3\x9e\x4f\xaf\x9a\xeb\x69\xf7\xd3\xd8\x26\xf1\x39\xe6\x1f\xf7\xa2\x26\x3e\x5f\x60\xf8\x7c\x91\xe1\xf3\x3f\x61\xf8\xfc\x4f\x81\xcf\x69\xc3\x3a\xf1\x39\x25\xd2\xe6\xf9\x43\xfe\x67\x9c\x3f\x83\xda\x32\xd9\x6b\xf1\xdf\xb2\x5f\x05\xc5\xdf\x7c\x2c\x7e\x38\xa8\x2d\x30\xbc\x66\xdc\x93\xce\x6c\x0d\xaf\x19\xf7\x73\xcc\x1e\x15\x5e\x8b\x79\xdd\xef\x29\xe4\x39\x5e\x9b\xd9\x84\x7c\xcd\xf7\x8a\x0a\xbd\x9b\xba\x57\xf4\xd0\xeb\x79\xaf\xe8\x21\xe7\x79\xaf\xa8\xd8\x0f\xab\x35\xed\x87\x4d\xe2\xb5\x05\xf8\x85\xf1\x8e\xe2\xb2\xf1\x3d\x61\x11\xe7\x3c\xfc\x24\x0a\x5c\x50\x00\x4e\xc3\x77\x91\xd1\x39\xf8\x4d\x03\xe1\x82\x51\x7c\x67\x4e\x1f\xfd\x01\xed\x97\x37\x80\xd3\xa6\xde\xa6\xf8\xd8\x4d\xf6\xf4\x3f\x41\x65\xb8\x6e\x94\xec\xc4\xbd\x7a\xff\xe7\x0d\x3e\xbe\x3b\x03\x2d\x84\x05\x7d\x07\xf8\x7a\x10\x74\xf0\x69\x49\x0f\x06\x82\xb2\xe4\xfb\xaf\x59\x6e\x3f\xcb\xfd\xde\xa3\x74\x1f\x36\xe8\x9b\xa6\xf6\x55\xef\xf5\x5e\xac\xcc\x6f\xd0\x72\xcf\xc5\xef\xef\xf3\xd3\x3d\x95\xf3\xc9\x2f\xf7\x4b\x2f\xe6\xa9\x8d\xe1\x96\x43\xec\x1c\xc3\x77\x21\x03\x87\xcd\x53\x3c\x49\xe1\x3b\x51\x72\xfe\x2d\xd0\xc7\xb1\x0e\x34\xbf\xc5\x7b\x49\xfe\x26\xf6\x5d\x3a\x4e\xb8\xac\xb9\xce\x6e\xbf\xd1\x2e\x81\x77\x43\x13\x68\x6f\xca\x9d\x22\xfb\xf0\x3e\x25\x15\x1d\xc3\x7e\xcf\xa0\xcc\x39\x70\xe8\x80\xe2\x9e\x55\x2f\x20\xdf\x9e\x07\x3e\xbc\x8c\xfb\x68\xe0\xf0\x09\x7c\xe7\x29\xd2\x76\x70\x7c\x17\x2f\x22\x1f\x08\x0b\x9c\x73\x06\x1d\x20\xc0\x55\xa4\xcf\x65\x15\x3f\x30\xdb\xef\xb6\xd5\x27\x32\xc2\x2e\x2f\x51\x99\x1d\xf7\xc5\x3c\x70\x9f\x91\xff\xf0\x3c\xdc\x18\x9f\xeb\xb8\x76\xdb\xf5\xa6\xe2\xc6\xf9\x42\xb8\xf4\x66\x10\xf3\x8d\x77\x4c\x89\x71\xc8\x63\x1e\x4d\x7c\xfc\x1a\xf3\x97\x4b\x0e\x7c\x33\xe3\x99\x87\xbc\xf7\x11\x6f\x3f\xe7\xd9\x7e\xf5\x23\xf1\x2b\xf5\xef\x39\xe6\xdf\x0b\x36\xff\x4e\xce\x2f\x7a\xfa\xb7\x73\xbe\x4e\xb1\x7d\xb3\x35\xff\xbd\x5d\xff\x08\x8a\x6b\xbf\xd2\x79\xd4\xe7\x8d\x38\x8d\x7c\x07\xf3\x53\xf9\xbe\x3c\x8f\x38\x7d\x19\xf9\x1b\xbe\x1b\x1b\x79\x9c\x7b\x1c\xa1\x3c\xae\x59\xe6\x97\x96\x38\x82\xbc\x2c\x61\xf1\x7b\x7b\x7e\xf6\x2d\x16\x47\x5e\xc0\xfc\x5f\x40\xf9\xf2\x2f\x6d\x1d\x86\xe4\x9c\xff\x1d\xcd\x57\xe5\xbd\xa4\x81\x5f\x30\xbf\x7b\xec\xef\x1f\x8c\xf7\x0b\x3c\x4f\x0b\xd7\xd3\xfd\xa9\x75\xff\xa8\xde\x5b\x38\xf3\xb4\xb8\x2c\xcd\x3c\x2d\x46\x79\x9a\xb1\xde\xe8\x3f\x3d\x8d\xf7\x32\xd3\x1f\x00\x4f\x55\xc7\x07\x1f\x6c\x02\x57\xd4\xe1\xbd\x41\xb5\x77\x6b\xf9\x69\xe0\xd7\xe9\xf5\x9a\xf3\x44\x35\x2e\x32\xf0\xc6\x9a\x2b\xde\x50\xe5\x17\xf9\xe9\x19\xcc\xc3\x40\xcd\xf1\x4d\x9d\xbf\xed\x62\xdf\x63\xd0\x6f\xe4\x76\xfb\xfd\xca\x96\xf3\x42\xe9\xd7\x21\x7c\x37\x73\xe0\xf2\x01\xe0\xf2\x7f\x2b\xf9\x6c\xf1\x02\xef\x5d\x71\x6f\xc6\x71\x09\xbf\x67\x4d\x21\xbf\x36\xf3\x49\xef\x77\x2a\x49\xe0\xb7\x54\xf4\x6d\xec\x47\xdc\x13\x44\xe8\x9d\x87\xf9\xdd\x72\x01\xfe\x50\x3d\xdf\x5c\xf2\xc8\x37\x55\xb8\xf5\x2d\xeb\x3b\x2f\x86\x5b\xcd\x77\x64\xc0\x8f\x05\xda\x1f\xe6\x3d\xfc\x0f\x1c\xf1\x63\x51\x89\x43\x68\xfc\xc6\x79\x6c\xbc\xbb\x35\xe2\x52\xd8\xf7\x43\x8a\x6f\x96\x78\x52\x9e\xc2\x2f\xec\x06\x4e\xc5\xbd\x96\x21\x6f\xe6\x6d\xdf\x57\xae\x0b\xc5\x1b\x4d\x7c\x61\xf7\xf7\x48\xce\x12\xbf\xca\xfe\x66\xbc\x8f\xe4\xf1\xcb\xf8\x9e\x14\x14\xd3\x1f\xb3\x5f\xbd\x29\xf3\xbd\x8f\xcf\xaf\xb6\xf6\x2e\xca\xf4\xb7\x9b\xf0\x33\x23\x8f\x7c\xd7\xc5\xdf\xaa\xe7\x75\xea\x7b\xaa\xda\xf3\xba\xe5\x4d\xca\xf3\x7c\x76\xc9\x43\xde\xf0\xf7\xba\x7a\x67\x1e\x7b\xdd\x23\x5f\x33\xfd\x7e\xc5\xc5\xef\xff\xa9\x46\xbf\x37\xee\x63\x69\x3d\x06\x7d\xf8\xee\x8f\xf1\x54\xcf\x8b\xea\xe1\x97\xb4\xce\xfa\x02\xad\xf3\x60\xe0\x00\xf5\xb3\x1f\xfd\xe0\xfd\x95\xf1\xfe\x8b\xa2\x84\x25\x5f\x0a\x76\x54\xc6\x47\xfe\x07\xbc\xf2\x06\xfc\x6c\x6a\xa8\xe2\x5f\x3e\xe9\x0f\x84\x57\x52\xa7\x8e\x33\xbc\x63\xbf\x6f\x4e\xce\x23\x6e\x45\x27\x41\xbf\x03\xfa\x39\xd0\x34\x7f\x69\xdc\x43\x4f\x54\xf0\xe1\xb7\x98\x3f\x56\xc7\x25\x23\xca\xf9\x9d\xac\x12\x57\xe2\x2e\x71\xa5\x1b\x71\xe5\xbc\x4b\x5c\xe9\xa8\x12\x57\x1e\x74\xc4\x95\x01\x8f\xb8\x52\x44\x9e\xe7\xc4\xa7\x9f\x93\xed\xfb\xf1\x0e\x27\xac\xd1\x7b\x94\xfe\x47\x41\xfb\x3f\x0b\x3b\x57\x5c\xec\xfc\x4c\x15\x3b\x23\x5b\x8a\x7f\x26\x7e\xfb\x77\x92\x77\xbc\x8f\x25\x1c\x67\xe4\x89\xa9\x06\xe0\xa6\xca\x7b\xd9\x35\xc7\x39\xff\x81\xe7\x39\xdf\x20\xe9\x64\xe5\x9c\x27\x60\xc6\xf1\x9e\xf5\x7d\xcc\xda\xc7\xf2\xce\xd7\xf9\xae\xb7\x36\x5c\x79\x9f\xd2\x3e\xb7\x7c\x8e\xe3\x59\x73\x1f\x2e\xb9\xe4\x23\xd7\x2b\xfb\x2e\x60\xc1\x05\xe6\x3e\xb4\xdf\x0f\x1a\xf7\x81\xfc\xbd\xac\xf9\xbe\x9c\xf0\x44\x12\x38\xd8\xb8\xdf\x56\xc5\x61\x37\xdc\xbf\xb4\x85\xfc\x8b\xcf\x7f\xc0\xf2\x47\x04\xc4\xf6\x0f\xbf\xed\x79\x51\xff\x34\xec\x1b\xb9\x6d\xb6\xe7\xa5\xf2\xdb\x9e\x17\xf5\x4f\x43\xdc\x92\xf8\x67\x7b\x5e\x2a\xbf\xf2\xbc\xb4\x6e\xcf\x8b\xe3\x67\xec\xa3\xed\xb8\x6b\xff\x69\xdb\xe7\x91\xf2\x67\xf8\xcb\x05\xfc\x7d\xfb\x47\xbf\x27\x06\x0e\x89\x8f\x2c\xff\xff\x24\xff\xdd\x2b\x7d\x28\x28\x9a\x76\xd8\xf9\x7f\xed\x27\xfe\x3a\xe3\x1f\x06\x7f\xb1\xce\xce\xff\x24\xf8\xad\x7e\x3b\xff\x0f\x7c\xc4\x1f\x60\xed\xc7\xc1\x0f\x85\xec\xfc\x87\xc1\x6f\x63\x7a\xef\x84\x9d\xc7\x58\xfb\xf7\xa1\x37\xc3\xf8\xef\x80\x7f\x9e\xd9\x73\x18\xfd\xcf\xb1\xf6\xf7\x81\x7f\x95\xf1\xfb\xa4\x7c\xbd\x68\x63\xf6\x5f\xf4\x11\x7f\x84\xf1\x4f\x81\x2f\x58\x3f\x9d\xe0\xb7\x31\x7e\x47\x80\xf8\x3d\x8c\xff\x3b\x68\x3f\xc3\xec\xff\xae\xa4\x77\x8a\x65\xc6\xff\x04\xf8\x23\x41\x3b\xff\x25\x1f\xf1\x67\x19\xff\x69\xf0\x17\x19\xff\x7e\xf0\x97\x18\x7f\x1f\xfa\x5f\x63\x76\xde\x42\xfb\xe6\x7a\x3b\xff\x3b\x68\xbf\x68\x67\x8b\x1f\xa3\x3d\xdf\xa4\x53\xe0\x0f\x30\xfe\xa7\xe4\xfc\xec\x12\x43\x2c\xd6\xfd\xc2\x4f\xfc\x0b\x0d\x76\xfe\x4d\xf0\x57\x18\xff\xa0\xc1\x67\xfd\x07\xc0\xcf\xb0\xfe\x77\x42\xef\x22\xeb\xe7\xcf\xd0\xfe\x06\x5b\xf7\x0f\x7c\xc4\xdf\x60\x7c\x3f\xfa\x69\x65\xfd\xfc\x07\xfa\x69\xf9\x84\x9d\xff\x23\xf0\x9b\x18\xff\x8a\x8b\xfd\xbf\x6f\xd8\xcf\xf8\xf7\x82\x7f\x9e\xf1\xff\x05\x76\xae\x31\x7e\x5c\xb6\x6f\x14\x4b\x6c\x1e\x8e\xfa\x88\xdf\xc3\xc6\xf5\x9b\x01\xe2\x5f\x60\xfc\x28\xfa\x09\x31\x7f\xf8\x09\xfa\x69\x62\xfc\x6f\x82\xdf\xc2\xf8\x9f\x46\x3f\x1b\xcc\xce\xdf\x46\xfb\x01\x96\xe7\xde\x03\xfe\x31\xc6\xff\xa1\xec\xe7\x0e\xb1\x64\x67\x8b\x77\x25\xff\x4e\xc7\xbc\x05\x64\x9e\xfd\x19\xc1\x7f\x5f\x91\xf7\x8b\xbf\xee\xe0\x67\xe5\xbd\xe7\xdd\x0e\xfe\xf7\x64\x3f\xcd\x0e\xfe\x23\xb2\x9f\x4f\x3b\xf8\x8f\x49\x7c\xfc\x29\x07\x7f\x4c\xb6\xbf\xc3\xc1\xff\x67\xc9\xdf\xe5\xe0\xff\xb9\xe4\xef\x74\xf0\xff\x41\xf6\xef\x77\xf0\x9f\x91\xfc\x3a\x07\xff\x6b\xb2\x9f\x3b\x1d\xfc\x3a\xd9\xbe\xd1\xc1\xff\x2b\xc9\x0f\x3a\xf8\x5f\x95\xfc\x7a\x07\x3f\x21\xe7\x2d\xec\xe0\xbf\x2e\xe7\xed\x2e\x07\xbf\x55\xda\x73\x8f\x83\xff\x92\xec\x67\x8f\x83\xbf\x2c\xfb\x89\x38\xf8\xbd\x28\xcb\xcb\x7e\x40\x08\x11\x63\x74\x86\xd1\x57\x2d\x74\x59\x76\x23\x68\xd2\x5f\x16\x42\xcc\x84\xec\xf5\xd6\xfe\xe3\xac\xff\x38\xeb\xbf\x4c\xcf\xb1\xfe\x27\xfd\x76\x7a\xad\xce\xae\xaf\xc5\xa2\xaf\x8f\xe9\x2b\xff\x7d\x99\xd1\xad\x9a\x9d\x5e\xf5\xdb\xfb\xeb\xb5\x8c\xe7\xf1\xb2\x7e\x36\xbe\x0d\xa6\xaf\xb5\xde\x4e\x2f\x37\x98\xf4\x13\x42\xe0\x5f\x91\x30\xf5\xf5\x30\xfd\x8b\x8c\x5e\xae\xb7\xeb\xbf\xd0\x60\xd7\xbf\xd4\x60\xd7\xb7\xbe\x93\xd9\xbb\xcb\xae\x7f\x88\xe9\xbf\xc1\xf4\xb5\xf8\xec\xf4\x6c\xc0\xde\xdf\x7a\xc8\x4e\xcf\xd6\xdb\xfb\xb7\xce\xf7\x43\xe5\x7a\x0b\xfd\x30\x72\x39\x2b\x7d\x8c\xd1\xbd\x9a\xbd\x7f\xf1\x40\x6e\x78\x32\x27\xd2\xe3\xc3\xb9\xcc\xf8\x99\xa7\x87\x13\x89\xd1\xd3\xc3\xb9\x44\x2a\x9b\x4e\x24\x53\xa9\xe1\x4c\x4e\x3c\x30\x3e\x3c\x56\xa9\x7e\x90\xd7\x3e\x93\xcc\x64\x1f\x3c\x71\x7c\xf4\x74\x36\x97\x1c\x1b\x4b\x8c\x0f\xdb\xfa\xca\xa5\x32\x89\x67\xbb\x12\xa9\x33\xa7\x4f\x0f\xa7\x72\x22\xad\x66\xdb\x35\xa8\x2a\x95\x35\x5c\x4f\xa7\x5a\x4f\xa7\x97\x9e\x4e\x57\x3d\x66\x8d\x1c\x62\x2e\x95\xc9\x8d\x27\x53\xc3\xe3\x89\x6c\x2e\x99\x3b\x97\xe5\x03\xcf\x8c\x1e\xcf\x8a\xc4\xb3\xc3\xe3\xd9\xd1\x33\xa7\xad\xa6\x9d\x38\x9e\x40\x9b\x8a\x59\x16\x96\xdd\x24\x5e\xe1\xe0\x5a\x07\x96\x1d\xce\x49\x5b\x86\xb9\xe9\x66\x85\xb5\x79\x6a\xec\x4c\xd6\xd1\x94\x98\x89\xb1\xd1\xd4\xf0\xe9\x72\x6d\x36\x37\x9e\x4b\x3e\x2d\x1e\xc8\xea\xcf\x94\xcb\x43\x07\x0f\x76\x25\x0e\x94\x8b\xf6\xc4\x3e\x59\x76\x26\xda\x65\xd9\x81\xb2\x1d\x65\x57\x22\x46\xec\x18\x5a\xc7\x88\xdb\x1e\x83\x14\xaa\xdb\x51\x6f\xf0\xbb\xa9\xd9\xbe\x6e\x34\xeb\x46\xb3\x6e\x34\xeb\xae\xcc\x7e\x62\xf8\xd9\xe1\xd3\xb9\xc4\x68\xe6\xd9\x2e\xe2\x61\x79\xb2\x67\x52\x69\x0b\x37\x77\x2e\x33\x36\x9c\x19\x3d\x4e\xac\x43\x07\x0f\xee\x4f\x74\x51\xdf\x5d\x50\x05\xee\x3e\xb0\x0d\xba\x1d\x34\x95\xed\x28\xbb\x12\xfb\xa9\x7a\x3f\xa4\xf7\x43\x0a\x74\x3b\xaa\xa9\xec\x40\xd9\x5e\x2e\x9d\x86\x77\x2a\x0d\xef\x74\x1a\xde\x49\x9d\x76\x92\x2e\x50\x1d\x28\xf7\x81\xdd\xde\x09\x55\xb2\xec\x4e\x74\xa0\x59\x07\x56\x00\x74\xbb\x2c\x63\x89\x7d\xa8\xde\x87\x6a\xd0\xed\x06\xbf\x1d\xbd\xb7\xa3\x1e\x74\x3b\x68\x2a\xbb\x12\xfb\xda\x68\xa0\xfb\xf0\x2e\xf0\x76\x7f\xbb\x7c\x42\x81\x0a\x84\x18\xea\xa3\xf2\x21\x86\x07\x79\x6e\xad\xe1\x0f\x4b\xd7\xf0\x6f\xdf\x39\x7f\xfc\xca\x62\x97\xe6\x2d\x3f\xc9\xf8\x2c\xfd\x10\xf5\x9a\x50\xa0\x0b\x21\x6e\xe0\x9d\x2c\x9e\x39\xca\x6f\x37\x7e\x8b\xbc\xc1\x5f\x77\xb1\xdf\xc0\x8b\xd7\x43\xde\xfa\x7f\x22\xd4\xfa\x57\xa0\x7f\xc0\xa2\x3f\xa8\xd0\x7f\xc5\x45\xff\x24\x3a\xad\x36\xfe\x82\x8b\xfe\xd6\x5e\xbb\x9e\x16\x60\x37\xae\xff\x82\x8b\xfe\x75\x74\x3a\x50\x65\xfc\x2f\xb8\xe8\x8f\x41\xff\x31\x8b\xfe\x7a\x85\xfe\x1b\x6e\xeb\x8f\xef\xa9\x1b\x0d\xde\xfa\xdf\x76\x59\xff\x59\xe8\x9f\xb1\xe8\xdf\xa9\xd0\xff\xbe\x8b\xfe\x18\xa0\xe6\xdc\x2e\x6f\xfd\x3f\x73\xd1\xdf\xfa\x65\x2a\xcf\x5b\xf4\xef\x52\xe8\xff\x9c\xcb\xfc\xaf\x44\xa9\xbc\x5e\xef\xad\xff\xb3\x2e\xf3\xbf\x08\xfd\xd6\xf9\x6f\x54\xe8\xbf\xe4\x32\xfe\x59\xbc\x5b\xbc\x21\xbc\xf5\xcf\xba\x8c\x3f\xd4\x67\xea\x35\xca\x3b\x14\xfa\x9f\x77\xd1\x7f\x0c\xef\x27\x78\xfe\xca\xf5\x7f\xc3\x6d\xfe\xa1\xbf\xcd\xa2\xff\x4e\x85\xfe\xa3\x7e\xd2\xcf\x63\xe0\x2a\xfe\xdd\x1b\xfe\xdd\x98\xc7\xaf\x82\x4f\x2d\xbf\xd1\x5d\x9b\xfc\x69\x17\xfd\x4d\x07\x6a\x93\xff\xae\x8b\xfe\xd6\x78\x6d\xf2\x2f\xb8\xe8\xef\x79\xa8\x36\xf9\xbf\x75\xd1\x3f\xf4\x70\x6d\xf2\x3d\x42\x2d\x9f\xf9\x62\x6d\xf2\x07\x34\xb5\xfc\x85\x47\x6a\x93\xbf\xd7\x45\x7e\xee\x4b\xb5\xc9\x07\x5d\xc6\xbf\xd4\xa3\x6e\xcf\xcf\xcf\x27\x5d\xf4\xbf\xe5\x22\xcf\xe9\x30\xde\xb5\xf1\xdf\x75\xc8\x87\x2c\xf9\x63\xb7\xc5\xff\x8d\x9b\x89\xff\x0b\x00\x00\xff\xff\x7e\x5c\x3e\xd5\xd8\x56\x00\x00") func tcptracerEbpfOBytes() ([]byte, error) { return bindataRead( @@ -83,7 +83,7 @@ func tcptracerEbpfO() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "tcptracer-ebpf.o", size: 19896, mode: os.FileMode(420), modTime: time.Unix(1, 0)} + info := bindataFileInfo{name: "tcptracer-ebpf.o", size: 22232, mode: os.FileMode(420), modTime: time.Unix(1, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/vendor/github.com/weaveworks/tcptracer-bpf/pkg/tracer/tracer.go b/vendor/github.com/weaveworks/tcptracer-bpf/pkg/tracer/tracer.go index 39f08974b..4f060da9d 100644 --- a/vendor/github.com/weaveworks/tcptracer-bpf/pkg/tracer/tracer.go +++ b/vendor/github.com/weaveworks/tcptracer-bpf/pkg/tracer/tracer.go @@ -129,6 +129,7 @@ func (t *Tracer) Stop() { close(t.stopChan) t.perfMapIPV4.PollStop() t.perfMapIPV6.PollStop() + t.m.Close() } func initialize(module *bpflib.Module, eventMapName string, eventChan chan []byte, lostChan chan uint64) (*bpflib.PerfMap, error) { diff --git a/vendor/github.com/weaveworks/tcptracer-bpf/tcptracer-bpf.c b/vendor/github.com/weaveworks/tcptracer-bpf/tcptracer-bpf.c index b6d16ae69..24d8210b2 100644 --- a/vendor/github.com/weaveworks/tcptracer-bpf/tcptracer-bpf.c +++ b/vendor/github.com/weaveworks/tcptracer-bpf/tcptracer-bpf.c @@ -24,6 +24,8 @@ struct bpf_map_def SEC("maps/tcp_event_ipv4") tcp_event_ipv4 = { .key_size = sizeof(int), .value_size = sizeof(__u32), .max_entries = 1024, + .pinning = 0, + .namespace = "", }; /* This is a key/value store with the keys being the cpu number @@ -34,6 +36,8 @@ struct bpf_map_def SEC("maps/tcp_event_ipv6") tcp_event_ipv6 = { .key_size = sizeof(int), .value_size = sizeof(__u32), .max_entries = 1024, + .pinning = 0, + .namespace = "", }; /* These maps are used to match the kprobe & kretprobe of connect */ @@ -46,6 +50,8 @@ struct bpf_map_def SEC("maps/connectsock_ipv4") connectsock_ipv4 = { .key_size = sizeof(__u64), .value_size = sizeof(void *), .max_entries = 1024, + .pinning = 0, + .namespace = "", }; /* This is a key/value store with the keys being a pid @@ -56,6 +62,8 @@ struct bpf_map_def SEC("maps/connectsock_ipv6") connectsock_ipv6 = { .key_size = sizeof(__u64), .value_size = sizeof(void *), .max_entries = 1024, + .pinning = 0, + .namespace = "", }; /* This is a key/value store with the keys being an ipv4_tuple_t @@ -66,6 +74,8 @@ struct bpf_map_def SEC("maps/tuplepid_ipv4") tuplepid_ipv4 = { .key_size = sizeof(struct ipv4_tuple_t), .value_size = sizeof(struct pid_comm_t), .max_entries = 1024, + .pinning = 0, + .namespace = "", }; /* This is a key/value store with the keys being an ipv6_tuple_t @@ -76,6 +86,8 @@ struct bpf_map_def SEC("maps/tuplepid_ipv6") tuplepid_ipv6 = { .key_size = sizeof(struct ipv6_tuple_t), .value_size = sizeof(struct pid_comm_t), .max_entries = 1024, + .pinning = 0, + .namespace = "", }; /* This is a key/value store with the keys being a pid @@ -86,6 +98,8 @@ struct bpf_map_def SEC("maps/fdinstall_ret") fdinstall_ret = { .key_size = sizeof(__u64), .value_size = sizeof(unsigned int), .max_entries = 1024, + .pinning = 0, + .namespace = "", }; /* This is a key/value store with the keys being a pid (tgid) @@ -96,6 +110,8 @@ struct bpf_map_def SEC("maps/fdinstall_pids") fdinstall_pids = { .key_size = sizeof(__u32), .value_size = sizeof(__u32), .max_entries = 1024, + .pinning = 0, + .namespace = "", }; /* http://stackoverflow.com/questions/1001307/detecting-endianness-programmatically-in-a-c-program */ @@ -132,6 +148,8 @@ struct bpf_map_def SEC("maps/tcptracer_status") tcptracer_status = { .key_size = sizeof(__u64), .value_size = sizeof(struct tcptracer_status_t), .max_entries = 1, + .pinning = 0, + .namespace = "", }; __attribute__((always_inline)) diff --git a/vendor/manifest b/vendor/manifest index e06b5a4e6..46e91809e 100644 --- a/vendor/manifest +++ b/vendor/manifest @@ -1016,11 +1016,20 @@ "revision": "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75", "branch": "master" }, + { + "importpath": "github.com/iovisor/gobpf/bpffs", + "repository": "https://github.com/iovisor/gobpf", + "vcs": "git", + "revision": "aef06278f7e7142309a608d0e14e69cf94a5adae", + "branch": "master", + "path": "/bpffs", + "notests": true + }, { "importpath": "github.com/iovisor/gobpf/elf", "repository": "https://github.com/iovisor/gobpf", "vcs": "git", - "revision": "23f7ee81c1cc244d16ddc8110c2ec8b8a09d0448", + "revision": "aef06278f7e7142309a608d0e14e69cf94a5adae", "branch": "master", "path": "/elf", "notests": true @@ -1462,7 +1471,7 @@ "importpath": "github.com/weaveworks/tcptracer-bpf", "repository": "https://github.com/weaveworks/tcptracer-bpf", "vcs": "git", - "revision": "783f088bbe3e91d4d23cf2f48072f80de2fd03fc", + "revision": "a616ebc6c5ac196af743e5dfc621a52fce030f87", "branch": "master", "notests": true },