/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * 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.
 */

#ifndef LOG_TAG
#define LOG_TAG "bpfloader"
#endif

#include <arpa/inet.h>
#include <elf.h>
#include <error.h>
#include <fcntl.h>
#include <inttypes.h>
#include <linux/bpf.h>
#include <linux/unistd.h>
#include <net/if.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
#include <log/log.h>

#include <netdutils/Misc.h>
#include <netdutils/Slice.h>
#include "bpf/BpfUtils.h"
#include "netdbpf/bpf_shared.h"

using android::base::unique_fd;
using android::netdutils::Slice;

#define BPF_PROG_PATH "/system/etc/bpf"
#define BPF_PROG_SRC BPF_PROG_PATH "/bpf_kern.o"

#define CLEANANDEXIT(ret, mapPatterns)                 \
    do {                                               \
        for (int i = 0; i < mapPatterns.size(); i++) { \
            if (mapPatterns[i].fd > -1) {              \
                close(mapPatterns[i].fd);              \
            }                                          \
        }                                              \
        return ret;                                    \
    } while (0)

using android::bpf::BpfMapInfo;
using android::bpf::BpfProgInfo;

int main() {
    const std::vector<BpfMapInfo> mapPatterns = {
            BpfMapInfo(COOKIE_TAG_MAP, COOKIE_TAG_MAP_PATH),
            BpfMapInfo(UID_COUNTERSET_MAP, UID_COUNTERSET_MAP_PATH),
            BpfMapInfo(APP_UID_STATS_MAP, APP_UID_STATS_MAP_PATH),
            BpfMapInfo(UID_STATS_MAP, UID_STATS_MAP_PATH),
            BpfMapInfo(TAG_STATS_MAP, TAG_STATS_MAP_PATH),
            BpfMapInfo(IFACE_STATS_MAP, IFACE_STATS_MAP_PATH),
            BpfMapInfo(CONFIGURATION_MAP, CONFIGURATION_MAP_PATH),
            BpfMapInfo(UID_OWNER_MAP, UID_OWNER_MAP_PATH),
    };
    for (int i = 0; i < mapPatterns.size(); i++) {
        if (mapPatterns[i].fd < 0) {
            ALOGE("Rerieve Map from %s failed: %d", mapPatterns[i].path.c_str(), mapPatterns[i].fd);
            CLEANANDEXIT(-1, mapPatterns);
        }
    }
    BpfProgInfo programs[] = {
            {BPF_CGROUP_INET_EGRESS, BPF_EGRESS_PROG_PATH, BPF_CGROUP_EGRESS_PROG_NAME,
             BPF_PROG_TYPE_CGROUP_SKB, unique_fd(-1)},
            {BPF_CGROUP_INET_INGRESS, BPF_INGRESS_PROG_PATH, BPF_CGROUP_INGRESS_PROG_NAME,
             BPF_PROG_TYPE_CGROUP_SKB, unique_fd(-1)},
            {MAX_BPF_ATTACH_TYPE, XT_BPF_INGRESS_PROG_PATH, XT_BPF_INGRESS_PROG_NAME,
             BPF_PROG_TYPE_SOCKET_FILTER, unique_fd(-1)},
            {MAX_BPF_ATTACH_TYPE, XT_BPF_EGRESS_PROG_PATH, XT_BPF_EGRESS_PROG_NAME,
             BPF_PROG_TYPE_SOCKET_FILTER, unique_fd(-1)},
            {MAX_BPF_ATTACH_TYPE, XT_BPF_WHITELIST_PROG_PATH, XT_BPF_WHITELIST_PROG_NAME,
             BPF_PROG_TYPE_SOCKET_FILTER, unique_fd(-1)},
            {MAX_BPF_ATTACH_TYPE, XT_BPF_BLACKLIST_PROG_PATH, XT_BPF_BLACKLIST_PROG_NAME,
             BPF_PROG_TYPE_SOCKET_FILTER, unique_fd(-1)}};
    int ret = android::bpf::parseProgramsFromFile(BPF_PROG_SRC, programs, ARRAY_SIZE(programs),
                                                  mapPatterns);
    CLEANANDEXIT(ret, mapPatterns);
}
