Search code examples
bpfebpfbcc-bpf

Sending strings to BPF Map Space and printing them out


I have a small txt file that I would like to write to BPF here. Here is what my python code looks like for BPF but I am unable to print out anything as of now. I keep ending up with a Failed to load program: Invalid argument with a bunch of register errors. As of now my string basically says hello, world, hi

BPF_ARRAY(lookupTable, char, 512);
int helloworld2(void *ctx)
{
    //print the values in the lookup table
    #pragma clang loop unroll(full)
    for (int i = 0; i < 512; i++) {
        char *key = lookupTable.lookup(&i);
        if (key) {
            bpf_trace_printk("%s\n", key);
        }
    }
    return 0;
}

Here is the Python code:

b = BPF(src_file="hello.c")

lookupTable = b["lookupTable"]
#add hello.csv to the lookupTable array
f = open("hello.csv","r")
file_contents = f.read()
#append file contents to the lookupTable array
b_string1 = file_contents.encode('utf-8')
b_string1 = ctypes.create_string_buffer(b_string1)
lookupTable[0] = b_string1
f.close()

b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="helloworld2")
b.trace_print()

I have the error linked in this pastebin since it's so long: BPF Error

One notable error is the mention of infinite loop detected which is something I would need to check out.


Solution

  • The issue is that i is passed by pointer in bpf_map_lookup_elem, so the compiler can't actually unroll the loop (from its point of view, i may not linearly increase).

    Using an intermediate variable is enough to fix this:

    BPF_ARRAY(lookupTable, char, 512);
    #define MAX_LENGTH 1
    int helloworld2(void *ctx)
    {
        //print the values in the lookup table
        #pragma clang loop unroll(full)
        for (int i = 0; i < 1; i++) {
            int k = i;
            char *key = lookupTable.lookup(&k);
            if (key) {
                bpf_trace_printk("%s\n", key);
            }
        }
        return 0;
    }