blob: fc390259d2c6a6d47e3d3ed73f73744035160dca [file] [log] [blame]
/* Copyright (C) 2015 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/qemu-control-impl.h"
#include "android/android.h"
#include "android/emulation/control/cellular_agent.h"
#include "android/network/control.h"
#include "android/network/globals.h"
#include "android/shaper.h"
#include "android/telephony/modem_driver.h"
static void cellular_setSignalStrength(int zeroTo31)
{
// (See do_gsm_signal() in android-qemu1-glue/console.c)
if (android_modem) {
if (zeroTo31 < 0) zeroTo31 = 0;
if (zeroTo31 > 31) zeroTo31 = 31;
amodem_set_signal_strength(android_modem, zeroTo31, 99);
}
}
static void cellular_setSignalStrengthProfile(enum CellularSignal signal)
{
// (See do_gsm_signal_profile() in android-qemu1-glue/console.c)
if (android_modem) {
int signalQuality = -1;
switch (signal) {
case Cellular_Signal_None: signalQuality = 0; break;
case Cellular_Signal_Poor: signalQuality = 1; break;
case Cellular_Signal_Moderate: signalQuality = 2; break;
case Cellular_Signal_Good: signalQuality = 3; break;
case Cellular_Signal_Great: signalQuality = 4; break;
}
if (signalQuality >= 0) {
amodem_set_signal_strength_profile(android_modem, signalQuality);
}
}
}
static void cellular_setVoiceStatus(enum CellularStatus voiceStatus)
{
// (See do_gsm_voice() in android-qemu1-glue/console.c)
ARegistrationState state = A_REGISTRATION_UNKNOWN;
if (android_modem) {
switch (voiceStatus) {
case Cellular_Stat_Home: state = A_REGISTRATION_HOME; break;
case Cellular_Stat_Roaming: state = A_REGISTRATION_ROAMING; break;
case Cellular_Stat_Searching: state = A_REGISTRATION_SEARCHING; break;
case Cellular_Stat_Denied: state = A_REGISTRATION_DENIED; break;
case Cellular_Stat_Unregistered: state = A_REGISTRATION_UNREGISTERED; break;
}
amodem_set_voice_registration(android_modem, state);
}
}
static void cellular_setDataStatus(enum CellularStatus dataStatus)
{
// (See do_gsm_data() in android-qemu1-glue/console.c)
ARegistrationState state = A_REGISTRATION_UNKNOWN;
switch (dataStatus) {
case Cellular_Stat_Home: state = A_REGISTRATION_HOME; break;
case Cellular_Stat_Roaming: state = A_REGISTRATION_ROAMING; break;
case Cellular_Stat_Searching: state = A_REGISTRATION_SEARCHING; break;
case Cellular_Stat_Denied: state = A_REGISTRATION_DENIED; break;
case Cellular_Stat_Unregistered: state = A_REGISTRATION_UNREGISTERED; break;
}
if (android_modem) {
amodem_set_data_registration(android_modem, state);
}
android_net_disable = (state != A_REGISTRATION_HOME &&
state != A_REGISTRATION_ROAMING );
}
static void cellular_setStandard(enum CellularStandard cStandard)
{
// (See do_network_speed() in android-qemu1-glue/console.c)
char *speedName;
switch (cStandard) {
case Cellular_Std_GSM: speedName = "gsm"; break;
case Cellular_Std_HSCSD: speedName = "hscsd"; break;
case Cellular_Std_GPRS: speedName = "gprs"; break;
case Cellular_Std_EDGE: speedName = "edge"; break;
case Cellular_Std_UMTS: speedName = "umts"; break;
case Cellular_Std_HSDPA: speedName = "hsdpa"; break;
case Cellular_Std_LTE: speedName = "lte"; break;
case Cellular_Std_full: speedName = "full"; break;
default:
return; // Error
}
// Find this entry in the speed table and set
// android_net_download_speed and android_net_upload_speed
if (!android_network_set_speed(speedName)) {
return;
}
// Tell the network shaper the new rates
netshaper_set_rate(android_net_shaper_in, android_net_download_speed);
netshaper_set_rate(android_net_shaper_out, android_net_upload_speed);
if (android_modem) {
// Tell the guest about the new network type.
amodem_set_data_network_type(android_modem,
android_parse_network_type(speedName));
}
}
static const QAndroidCellularAgent sQAndroidCellularAgent = {
.setSignalStrength = cellular_setSignalStrength,
.setSignalStrengthProfile = cellular_setSignalStrengthProfile,
.setVoiceStatus = cellular_setVoiceStatus,
.setDataStatus = cellular_setDataStatus,
.setStandard = cellular_setStandard};
const QAndroidCellularAgent* const gQAndroidCellularAgent =
&sQAndroidCellularAgent;