[SP14] Add HAL to set warning quota to tehtering offload hardware

With current setDataLimit API, tethering offload hardware will
stop offload and trigger callback when the given limit bytes is
reached.

However, for data usage warning to work, an API that allows
tethering offload hardware to report event without stopping
offload hardware is needed.

Test: hidl-gen -Lformat android.hardware.tetheroffload.control@1.1
Bug: 149467454
Bug: 170699770
Bug: 170179169
Change-Id: I804d15f92251ef902dd2e1ff1c31ba157fa91067
This commit is contained in:
junyulai 2020-01-20 17:39:59 +08:00
parent 08ca885240
commit 4011f47ad6
5 changed files with 160 additions and 1 deletions

View file

@ -507,7 +507,7 @@
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.tetheroffload.control</name>
<version>1.0</version>
<version>1.1</version>
<interface>
<name>IOffloadControl</name>
<instance>default</instance>

View file

@ -0,0 +1,16 @@
// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
name: "android.hardware.tetheroffload.control@1.1",
root: "android.hardware",
srcs: [
"types.hal",
"IOffloadControl.hal",
"ITetheringOffloadCallback.hal",
],
interfaces: [
"android.hardware.tetheroffload.control@1.0",
"android.hidl.base@1.0",
],
gen_java: true,
}

View file

@ -0,0 +1,82 @@
/*
* Copyright (C) 2020 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.
*/
package android.hardware.tetheroffload.control@1.1;
import @1.0::IOffloadControl;
/**
* Interface used to control the lifecycle of tethering offload. Note that callbacks of 1.1 HAL
* can be registered with the existing callback registration methods from 1.0 HAL.
*/
interface IOffloadControl extends @1.0::IOffloadControl {
/**
* Instruct hardware to send callbacks after certain number of bytes have been transferred in
* either direction on this upstream interface.
*
* The specified quota bytes must be applied to all traffic on the given upstream interface.
* This includes hardware forwarded traffic, software forwarded traffic, and AP-originated
* traffic. IPv4 and IPv6 traffic both count towards the same quota. IP headers are included
* in the byte count quota, but, link-layer headers are not.
*
* This API may only be called while offload is occurring on this upstream. The hardware
* management process MUST NOT store the values when offload is not started and applies once
* offload is started. This is because the quota values would likely become stale over
* time and would not reflect any new traffic that has occurred.
*
* This API replaces {@link @1.0::IOffloadControl::setDataLimit}, the framework would always
* calls this API if 1.1 HAL is supported. Otherwise, calls the other one. Thus, no
* interaction between the two APIs need to be addressed. However, the hardware implementation
* still needs to keep functionality of both in case of shipping with older framework that
* doesn't support 1.1 HAL.
*
* The specified quota bytes MUST replace any previous quotas set by
* {@code setDataWarningAndLimit} specified on the same interface. It may be interpreted as
* "tell me when either <warningBytes> or <limitBytes> bytes have been transferred
* (in either direction), and stop offload when <limitBytes> bytes have been transferred,
* starting now and counting from zero on <upstream>."
*
* Once the {@code warningBytes} is reached, the callback registered in initOffload must be
* called with {@code OFFLOAD_WARNING_REACHED} to indicate this event. Once the event fires
* for this upstream, no further {@code OFFLOAD_WARNING_REACHED} event will be fired for this
* upstream unless this method is called again with the same interface. Note that there is
* no need to call initOffload again to resume offload if stopOffload was not called by the
* client.
*
* Similarly, Once the {@code limitBytes} is reached, the callback registered in initOffload
* must be called with {@code OFFLOAD_STOPPED_LIMIT_REACHED} to indicate this event. Once
* the event fires for this upstream, no further {@code OFFLOAD_STOPPED_LIMIT_REACHED}
* event will be fired for this upstream unless this method is called again with the same
* interface. However, unlike {@code warningBytes}, when {@code limitBytes} is reached,
* all offload must be stopped. If offload is desired again, the hardware management
* process must be completely reprogrammed by calling setUpstreamParameters and
* addDownstream again.
*
* Note that when one of the quota bytes is reached, the other one is still considered valid
* unless this method is called again with the same interface.
*
* @param upstream Upstream interface name that quota must apply to.
* @param warningBytes The quota of warning, defined as the number of bytes, starting from
* zero and counting from now.
* @param limitBytes The quota of limit, defined as the number of bytes, starting from zero
* and counting from now.
*
* @return success true if quota is applied, false otherwise
* @return errMsg a human readable string if error has occurred.
*/
setDataWarningAndLimit(string upstream, uint64_t warningBytes, uint64_t limitBytes)
generates (bool success, string errMsg);
};

View file

@ -0,0 +1,33 @@
/*
* Copyright (C) 2020 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.
*/
package android.hardware.tetheroffload.control@1.1;
import @1.0::ITetheringOffloadCallback;
import OffloadCallbackEvent;
/**
* Callback providing information about status of hardware management process
* as well as providing a way to keep offloaded connections from timing out.
*/
interface ITetheringOffloadCallback extends @1.0::ITetheringOffloadCallback {
/**
* Called when an asynchronous event is generated by the hardware
* management process. Events which are common for 1.0 and 1.1 HAL
* MUST be fired on both 1.0 and 1.1 callback.
*/
oneway onEvent_1_1(OffloadCallbackEvent event);
};

View file

@ -0,0 +1,28 @@
/*
* Copyright (C) 2020 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.
*/
package android.hardware.tetheroffload.control@1.1;
import @1.0::OffloadCallbackEvent;
enum OffloadCallbackEvent : @1.0::OffloadCallbackEvent {
/**
* This event is fired when the quota, applied in setDataWarning, has expired. It is
* recommended that the client query for statistics immediately after receiving this event.
* Note that hardware acceleration must not be stopped upon receiving this event.
*/
OFFLOAD_WARNING_REACHED = 6,
};