blob: 984f2a5bcb25e401b02b66ac4e9793c8132c798b [file] [log] [blame]
/*
* Copyright (C) 2022 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;
import android.hardware.tetheroffload.ForwardedStats;
import android.hardware.tetheroffload.ITetheringOffloadCallback;
/**
* Interface used to control tethering offload.
*/
@VintfStability
interface IOffload {
/**
* Error code for all {@code ServiceSpecificException}s thrown by this interface.
*/
const int ERROR_CODE_UNUSED = 0;
/**
* Indicates intent to start offload for tethering in immediate future.
*
* This API must be called exactly once when Tethering is requested by the user.
*
* If this API is called multiple times without first calling stopOffload, then the subsequent
* calls must fail without changing the state of the server.
*
* If for some reason, the hardware is currently unable to support offload, this call must fail.
*
* @param fd1 A file descriptor bound to the following netlink groups
* (NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY).
* @param fd2 A file descriptor bound to the following netlink groups
* (NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY).
* @param cb Assuming success, this callback must provide unsolicited updates of offload status.
* It is assumed to be valid until stopOffload is called.
*
* @throws:
* - EX_ILLEGAL_ARGUMENT if any file descriptors are invalid.
* - EX_ILLEGAL_STATE if this method previously succeeded and stopOffload() was not
* later called.
* - EX_SERVICE_SPECIFIC with the error message set to a human-readable reason for the
* error.
*
* Remarks: Initializing offload does not imply that any upstreams or downstreams have yet been,
* or even will be, chosen. This API is symmetrical with stopOffload.
*/
void initOffload(in ParcelFileDescriptor fd1, in ParcelFileDescriptor fd2,
in ITetheringOffloadCallback cb);
/**
* Indicate desire to tear down all tethering offload.
*
* Called after tethering is no longer requested by the user. Any remaining offload must
* be subsequently torn down by the management process. Upon success, the callback registered
* in initOffload must be released, and offload must be stopped.
*
* @throws:
* - EX_ILLEGAL_STATE if initOffload() was not called, or if stopOffload() was already
* called.
* - EX_SERVICE_SPECIFIC with the error message set to a human-readable reason for the
* error.
*
* Remarks: Statistics must be reset by this API.
*/
void stopOffload();
/**
* Instruct management process not to forward traffic destined to or from the specified
* prefixes.
*
* This API may only be called after initOffload and before stopOffload.
*
* @param prefixes List containing fully specified prefixes. For e.g. 192.168.1.0/24
* or 2001:4860:684::/64
*
* @throws:
* - EX_ILLEGAL_ARGUMENT if the IP prefixes are invalid.
* - EX_ILLEGAL_STATE if this method is called before initOffload(), or if this method
* is called after stopOffload().
* - EX_SERVICE_SPECIFIC with the error message set to a human-readable reason for the
* error.
*
* Remarks: This list overrides any previously specified list
*/
void setLocalPrefixes(in String[] prefixes);
/**
* Query offloaded traffic statistics forwarded to an upstream address.
*
* Return statistics that have transpired since the last query. This would include
* statistics from all offloaded downstream tether interfaces that have been forwarded to this
* upstream interface. After returning the statistics, the counters are reset to zero.
*
* Only offloaded statistics must be returned by this API, software stats must not be
* returned.
*
* @param upstream Upstream interface on which traffic exited/entered
*
* @return ForwardedStats depicting the received and transmitted bytes
*
* @throws:
* - EX_SERVICE_SPECIFIC with the error message set to a human-readable reason for the
* error.
*/
ForwardedStats getForwardedStats(in String upstream);
/**
* Instruct hardware to send callbacks, and possibly stop offload, 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 apply them
* 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.
*
* 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 {@code warningBytes} must always be less than or equal to {@code limitBytes},
* when {@code warningBytes} is reached, {@code limitBytes} may still 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.
*
* @throws:
* - EX_ILLEGAL_ARGUMENT if any parameters are invalid (such as invalid upstream
* or negative number of bytes).
* - EX_ILLEGAL_STATE if this method is called before initOffload(), or if this method
* is called after stopOffload().
* - EX_SERVICE_SPECIFIC with the error message set to a human-readable reason for the
* error.
*/
void setDataWarningAndLimit(in String upstream, in long warningBytes, in long limitBytes);
/**
* Instruct hardware to start forwarding traffic to the specified upstream.
*
* When iface, v4Addr, and v4Gw are all non-null, the management process may begin forwarding
* any currently configured or future configured IPv4 downstreams to this upstream interface.
*
* If any of the previously three mentioned parameters are null, then any current IPv4 offload
* must be stopped.
*
* When iface and v6Gws are both non-null, and in the case of v6Gws, are not empty, the
* management process may begin forwarding any currently configured or future configured IPv6
* downstreams to this upstream interface.
*
* If either of the two above parameters are null, or no V6 Gateways are provided, then IPv6
* offload must be stopped.
*
* This API may only be called after initOffload and before stopOffload.
*
* @param iface Upstream interface name. Note that only one is needed because IPv4 and IPv6
* interfaces cannot be different (only known that this can occur during software
* xlat, which cannot be offloaded through hardware anyways). If the iface is
* null, offload must be stopped.
* @param v4Addr The local IPv4 address assigned to the provided upstream interface, i.e. the
* IPv4 address the packets are NATed to. For e.g. 192.168.0.12.
* @param v4Gw The IPv4 address of the IPv4 gateway on the upstream interface.
* For e.g. 192.168.1.1
* @param v6Gws A list of IPv6 addresses (for e.g. fe80::97be:9de7:b24b:9194) for possible IPv6
* gateways on the upstream interface.
*
* @throws:
* - EX_ILLEGAL_ARGUMENT if any parameters are invalid (such as invalid upstream
* or IP addresses).
* - EX_ILLEGAL_STATE if this method is called before initOffload(), or if this method
* is called after stopOffload().
* - EX_SERVICE_SPECIFIC with the error message set to a human-readable reason for the
* error.
*
* Remarks: This overrides any previously configured parameters.
*/
void setUpstreamParameters(
in String iface, in String v4Addr, in String v4Gw, in String[] v6Gws);
/**
* Configure a downstream interface and prefix in the hardware management process that may be
* forwarded.
*
* The prefix may be an IPv4 or an IPv6 prefix to signify which family can be offloaded from
* the specified tether interface. The list of IPv4 and IPv6 downstreams that are configured
* may differ.
*
* If the given protocol, as determined by the prefix, has an upstream set,
* the hardware may begin forwarding traffic between the upstream and any devices on the
* downstream interface that have IP addresses within the specified prefix. Other traffic from
* the same downstream interfaces is unaffected and must be forwarded if and only if it was
* already being forwarded.
*
* If no upstream is currently configured, then these downstream interface and prefixes must be
* preserved so that offload may begin in the future when an upstream is set.
*
* This API does not replace any previously configured downstreams and any such downstreams must
* be explicitly removed by calling removeDownstream.
*
* This API may only be called after initOffload and before stopOffload.
*
* @param iface Downstream interface
* @param prefix Downstream prefix depicting addresses that may be offloaded.
* For e.g. 192.168.1.0/24 or 2001:4860:684::/64)
*
* @throws:
* - EX_ILLEGAL_ARGUMENT if any parameters are invalid (such as invalid downstream
* or IP prefix).
* - EX_ILLEGAL_STATE if this method is called before initOffload(), or if this method
* is called after stopOffload().
* - EX_SERVICE_SPECIFIC with the error message set to a human-readable reason for the
* error.
*
* Remarks: The hardware management process may fail this call in a normal situation. This can
* happen because the hardware cannot support the current number of prefixes, the
* hardware cannot support concurrent offload on multiple interfaces, the hardware
* cannot currently support offload on the tether interface for some reason, or any
* other dynamic configuration issues which may occur. In this case,
* traffic must remain unaffected and must be forwarded if and only if it was already
* being forwarded.
*/
void addDownstream(in String iface, in String prefix);
/**
* Remove a downstream prefix that may be forwarded from the hardware management process.
*
* The prefix may be an IPv4 or an IPv6 prefix. If it was not previously configured using
* addDownstream, then this must be a no-op.
*
* This API may only be called after initOffload and before stopOffload.
*
* @param iface Downstream interface
* @param prefix Downstream prefix depicting prefix that must no longer be offloaded
* For e.g. 192.168.1.0/24 or 2001:4860:684::/64)
*
* @throws:
* - EX_ILLEGAL_ARGUMENT if any parameters are invalid (such as invalid downstream
* or IP prefix).
* - EX_ILLEGAL_STATE if this method is called before initOffload(), or if this method
* is called after stopOffload().
* - EX_SERVICE_SPECIFIC with the error message set to a human-readable reason for the
* error.
*/
void removeDownstream(in String iface, in String prefix);
}