#!/bin/bash

source ./kernel_config_utils.sh
source ./bpf_utils.sh

bpf_check() {
    is_error=false
    if ! kernel_config_check CONFIG_BPF_SYSCALL; then
        is_error=true
    fi
    if ! kernel_config_check CONFIG_CGROUPS; then
        is_error=true
    fi
    if ! kernel_config_check CONFIG_CGROUP_BPF; then
        is_error=true
    fi
    if ! kernel_config_check CONFIG_BPF_STREAM_PARSER; then
        is_error=true
    fi

    map_types=$(cat << EOF
    hash
    array
    sockmap
    sockhash
EOF
)
    prog_types=$(cat << EOF
    socket_filter
    perf_event
    sock_ops
    sched_cls
EOF
)
    helpers=$(cat << EOF
    bpf_map_lookup_elem
EOF
)
    declare -A progs_spec_helpers
    progs_spec_helpers=(
        ["socket_filter"]=$(cat << EOF
            bpf_skb_load_bytes
EOF
)
        ["sched_cls"]=$(cat << EOF
            bpf_clone_redirect
            bpf_redirect
EOF
)
    )

    for map_type in $map_types; do
        if ! bpf_map_type_check $map_type; then
            is_error=true
        fi
    done
    for prog_type in $prog_types; do
        if bpf_prog_type_check $prog_type; then
            for helper in $helpers; do
                if ! bpf_prog_helper_check $prog_type $helper; then
                    is_error=true
                fi
            done

            local prog_spec_helpers="${progs_spec_helpers[$prog_type]}"

            for helper in $prog_spec_helpers; do
                if ! bpf_prog_helper_check $prog_type $helper; then
                    is_error=true
                fi
            done
        else
            is_error=true
        fi
    done
    if [ "$is_error" == "true" ]; then
        return 1
    fi

    return 0
}

