// Copyright 2016 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

#include "android-qemu2-glue/net-android.h"

#include "android/android.h"
#include "android/network/constants.h"
#include "android/network/globals.h"
#include "android/telephony/modem_driver.h"
#include "android/shaper.h"

extern "C" {
#include "qemu/osdep.h"
#include "net/slirp.h"
}

static void* s_opaque = nullptr;

void android_qemu_init_slirp_shapers(void)
{
    android_net_delay_in = netdelay_create(
            [](void* data, size_t size, void* opaque) {
                net_slirp_receive_raw(s_opaque,
                                      static_cast<const uint8_t*>(data),
                                      static_cast<int>(size));
            });

    android_net_shaper_in = netshaper_create(1,
            [](void* data, size_t size, void* opaque) {
                netdelay_send_aux(android_net_delay_in, data, size, opaque);
            });

    android_net_shaper_out = netshaper_create(1,
            [](void* data, size_t size, void* opaque) {
                net_slirp_output_raw(opaque,
                                     static_cast<const uint8_t*>(data),
                                     static_cast<int>(size));
            });

    netdelay_set_latency(android_net_delay_in, android_net_min_latency,
                         android_net_max_latency);

    netshaper_set_rate(android_net_shaper_out, android_net_download_speed);
    netshaper_set_rate(android_net_shaper_in, android_net_upload_speed);

    s_opaque = net_slirp_set_shapers(
            android_net_shaper_out,
            [](void* opaque, const void* data, int len) {
                netshaper_send_aux(static_cast<NetShaper>(opaque),
                                   (char*)data, len, s_opaque);
            },
            android_net_shaper_in,
            [](void* opaque, const void* data, int len) {
                netshaper_send_aux(static_cast<NetShaper>(opaque),
                                   (void*)data, len, s_opaque);
            });
}
