1582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel/* 2582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Copyright (c) 2017, The Linux Foundation. All rights reserved. 3582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 4582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Redistribution and use in source and binary forms, with or without 5582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * modification, are permitted provided that the following conditions are 6582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * met: 7582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * * Redistributions of source code must retain the above copyright 8582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * notice, this list of conditions and the following disclaimer. 9582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * * Redistributions in binary form must reproduce the above 10582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * copyright notice, this list of conditions and the following 11582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * disclaimer in the documentation and/or other materials provided 12582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * with the distribution. 13582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * * Neither the name of The Linux Foundation nor the names of its 14582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * contributors may be used to endorse or promote products derived 15582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * from this software without specific prior written permission. 16582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 17582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 29582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#ifndef _I_OFFLOAD_MANAGER_H_ 30582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#define _I_OFFLOAD_MANAGER_H_ 31582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 32582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel/* External Includes */ 33582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#include <sys/types.h> 34582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 35582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel/* Internal Includes */ 36582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#include "OffloadStatistics.h" 37582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 38582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 39582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelclass IOffloadManager { 40582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelpublic: 41582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel enum RET { 42582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel FAIL_TOO_MANY_PREFIXES = -6, 43582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel FAIL_UNSUPPORTED = -5, 44582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel FAIL_INPUT_CHECK = -4, 45582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel FAIL_HARDWARE = -3, 46582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel FAIL_UNNEEDED = -2, 47582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel FAIL_TRY_AGAIN = -1, 48582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel SUCCESS = 0, 49582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel SUCCESS_DUPLICATE_CONFIG = 1, 50582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel SUCCESS_NO_OP = 2, 51582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel SUCCESS_OPTIMIZED = 3 52582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel }; /* RET */ 53582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 54582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel enum IP_FAM { 55582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel V4 = 0, 56582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel V6 = 1, 57582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel INVALID = 2 58582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel }; /* IP_FAM */ 59582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 60582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /* Overloading to use for addresses as well */ 61582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel typedef struct Prefix { 62582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel IP_FAM fam; 63582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel uint32_t v4Addr; 64582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel uint32_t v4Mask; 65582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel uint32_t v6Addr[4]; 66582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel uint32_t v6Mask[4]; 67582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel } prefix_t; 68582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 69582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /* ---------------------------- LIFECYCLE ------------------------------- */ 70582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual ~IOffloadManager(){} 71582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 72582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /* ---------------------- ASYNC EVENT CALLBACKS ------------------------- */ 73582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel class IpaEventListener { 74582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel public: 75582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel enum StoppedReason { 76582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 77582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Offload was stopped due to the configuration being removed via 78582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * setUpstreamParameters/removeDownstream. 79582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 80582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel REQUESTED, 81582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 82582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Offload was stopped due to an internal (to IPA or modem) error. 83582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 84582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Statistics may be temporarily unavailable. 85582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 86582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel ERROR, 87582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 88582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Offload was stopped because the upstream connection has 89582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * migrated to unsupported radio access technology. 90582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 91582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Statistics will still be available. 92582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 93582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel UNSUPPORTED 94582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel }; /* StoppedReason */ 95582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual ~IpaEventListener(){} 96582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 97582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Called when Offload first begins to occur on any upstream and 98582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * tether interface pair. It should be paired with an onOffloadStopped 99582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * call. 100582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 101582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual void onOffloadStarted(){} 102582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 103582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Called when Offload stops occurring on all upstream and tether 104582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * interface pairs. It comes after a call to onOffloadStarted. 105582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 106582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param reason Reason that Offload was stopped 107582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 108582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual void onOffloadStopped(StoppedReason /* reason */){} 109582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 110582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Called when the hardware can support Offload again. 111582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 112582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Any statistics that were previously unavailable, may be queried 113582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * again at this time. 114582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 115582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual void onOffloadSupportAvailable(){} 116582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 117582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Called when the limit set via setQuota has expired. 118582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 119582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * It is implied that Offload has been stopped on all upstream and 120582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * tether interface pairs when this callback is called. 121582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 122582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual void onLimitReached(){} 123582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel }; /* IpaEventListener */ 124582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 125582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 126582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Request notifications about asynchronous events that occur in hardware. 127582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 128582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * The calling client must be able to handle the callback on a separate 129582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * thread (i.e. their implementation of IpaEventListener must be thread 130582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * safe). 131582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 132582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS iff callback successfully registered 133582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 134582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Remarks: This can't really be allowed to fail. 135582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 136582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET registerEventListener(IpaEventListener* /* listener */) = 0; 137582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 138582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Unregister a previously registered listener. 139582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 140582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS iff callback successfully unregistered 141582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_INPUT_CHECK if callback was never registered 142582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 143582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET unregisterEventListener(IpaEventListener* /* listener */) = 0; 144582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 145582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel class ConntrackTimeoutUpdater { 146582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel public: 147582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel enum L4Protocol { 148582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel TCP = 0, 149582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel UDP = 1 150582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel }; /* L4Protocol */ 151582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel typedef struct IpAddrPortPair { 152582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel uint32_t ipAddr; 153582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel uint16_t port; 154582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel } ipAddrPortPair_t; 155582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel typedef struct NatTimeoutUpdate { 156582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel IpAddrPortPair src; 157582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel IpAddrPortPair dst; 158582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel L4Protocol proto; 159582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel } natTimeoutUpdate_t; 160582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual ~ConntrackTimeoutUpdater(){} 161582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual void updateTimeout(NatTimeoutUpdate /* update */) {} 162582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel }; /* ConntrackTimeoutUpdater */ 163582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 164582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 165582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Register a callback that may be called if the OffloadManager wants to 166582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * update the timeout value in conntrack of kernel. 167582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 168582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * The calling client must be able to handle the callback on a separate 169582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * thread (i.e. their implementation of ConntrackTimeoutUpdater must be 170582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * thread safe) 171582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 172582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS iff callback successfully registered 173582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 174582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Remarks: This can't really be allowed to fail 175582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 176582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET registerCtTimeoutUpdater(ConntrackTimeoutUpdater* /* cb */) = 0; 177582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 178582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Unregister a previously registered callback. 179582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 180582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS iff callback successfully unregistered 181582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_INPUT_CHECK if callback was never registered 182582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 183582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET unregisterCtTimeoutUpdater(ConntrackTimeoutUpdater* /* cb */) = 0; 184582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 185582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /* ----------------------------- CONFIG --------------------------------- */ 186582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 187582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Provide a file descriptor for use with conntrack library 188582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 189582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param fd File Descriptor that has been opened and bound to groups 190582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param groups Groups (bit mask) that fd has been bound to 191582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 192582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS iff IOffloadManager needed this file descriptor and 193582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * it was properly bound. 194582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_INPUT_CHECK if IOffloadManager needed this file descriptor 195582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * but it was found to not be properly bound 196582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_UNNEEDED if IOffloadManager determined that it does not need 197582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * a file descriptor bound to these groups. 198582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 199582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET provideFd(int /* fd */, unsigned int /* group */) = 0; 200582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 201582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Indicate that IOffloadManager <b>must</b> cease using all file 202582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * descriptors passed via provideFd API. 203582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 204582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * After this call returns, the file descriptors will likely be closed by 205582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * the calling client. 206582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 207582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS iff IOffloadManager has stopped using all file 208582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * descriptors 209582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_TRY_AGAIN if IOffloadManager needs more time with these 210582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * file descriptors before it can release them 211582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 212582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Remarks: Currently, it would be very difficult to handle a FAIL_TRY_AGAIN 213582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * because HAL serivce does not own a thread outside of RPC 214582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Threadpool to reschedule this call. 215582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 216582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET clearAllFds() = 0; 217582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 218582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Query whether STA+AP offload is supported on this device. 219582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 220582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return true if supported, false otherwise 221582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 222582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual bool isStaApSupported() = 0; 223582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 224582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /* ------------------------------ ROUTE --------------------------------- */ 225582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 226582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Add a downstream prefix that <i>may</i> be forwarded. 227582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 228582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * The Prefix may be an IPv4 or IPv6 address to signify which family can be 229582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * offloaded from the specified tether interface. If the given IP family, 230582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * as determined by the Prefix, has a corresponding upstream configured, 231582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * then traffic should be forwarded between the two interfaces. 232582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 233582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Only traffic that has a downstream address within the specified Prefix 234582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * can be forwarded. Traffic from the same downstream interface that falls 235582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * outside of the Prefix will be unaffected and can be forwarded iff it was 236582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * previously configured via a separate addDownstream call. 237582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 238582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * If no upstream has been configured, then this information must be cached 239582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * so that offload may begin once an upstream is configured. 240582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 241582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * This API does <b>not</b> replace any previously configured downstreams 242582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * and must be explicitly removed by calling removeDownstream or by clearing 243582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * the entire configuration by calling stopAllOffload. 244582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 245582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS The new information was accepted 246582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_TOO_MANY_PREFIXES The hardware has already accepted the max 247582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * number of Prefixes that can be supported. 248582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * If offload is desired on this Prefix then 249582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * another must be removed first. 250582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_UNSUPPORTED The hardware cannot forward traffic from this 251582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * downstream interface and will never be able to. 252582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 253582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET addDownstream(const char* /* downstream */, 254582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel const Prefix& /* prefix */) = 0; 255582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 256582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Remove a downstream Prefix that forwarding was previously requested for. 257582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 258582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * The Prefix may be an IPv4 or IPv6 address. Traffic outside of this 259582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Prefix is not affected. 260582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 261582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS iff forwarding was previously occurring and has been 262582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * stopped 263582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * SUCCESS_NO_OP iff forwarding was not previously occurring and 264582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * therefore no action needed to be taken 265582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 266582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET removeDownstream(const char* /* downstream */, 267582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel const Prefix& /* prefix */) = 0; 268582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 269582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Indicate that hardware should forward traffic from any configured 270582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * downstreams to the specified upstream. 271582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 272582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * When iface is non-null and non-empty and v4Gw is valid, then any 273582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * currently configured or future configured IPv4 downstreams should be 274582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * forwarded to this upstream interface. 275582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 276582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * When iface is non-null and non-empty and v6Gw is valid, then any 277582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * currently configured or future configured IPv6 downstreams should be 278582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * forwarded to this upstream interface. 279582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 280582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param iface Upstream interface name. Only one is needed because IPv4 281582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * and IPv6 interface names are required to match. 282582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param v4Gw The address of the IPv4 Gateway on the iface 283582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param v6Gw The address of one of the IPv6 Gateways on the iface 284582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 285582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS iff the specified configuration was applied 286582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * SUCCESS_DUPLICATE_CONFIG if this configuration <i>exactly</i> 287582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * matches a previously provided 288582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * configuration. This means that no 289582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * action has to be taken, but, the 290582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * configuration was previously accepted 291582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * and applied. 292582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_UNSUPPORTED if hardware cannot support forwarding to this 293582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * upstream interface 294582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 295582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Remarks: This overrides any previously configured parameters 296582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 297582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET setUpstream(const char* /* iface */, const Prefix& /* v4Gw */, 298582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel const Prefix& /* v6Gw */) = 0; 299582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 300582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * All traffic must be returned to the software path and all configuration 301582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * (including provided file descriptors) must be forgotten. 302582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 303582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS If all offload was successfully stopped and provided 304582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * file descriptors were released. 305582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 306582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Remarks: This can't really fail? 307582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 308582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET stopAllOffload() = 0; 309582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 310582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /* --------------------------- STATS/POLICY ----------------------------- */ 311582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 312582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Instruct hardware to stop forwarding traffic and send a callback after 313582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * limit bytes have been transferred in either direction on this upstream 314582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * interface. 315582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 316582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param upstream Upstream interface name that the limit should apply to 317582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param limit Bytes limit that can occur before action should be taken 318582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 319582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS If the limit was successfully applied 320582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * SUCCESS_OPTIMIZED If the limit was sufficiently high to be 321582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * interpreted as "no quota". 322582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_HARDWARE If the limit was rejected by the hardware 323582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_UNSUPPORTED If metering is not supported on this interface 324582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_TRY_AGAIN If this upstream has not been previously 325582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * configured to allow offload 326582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * (via setUpstreamParameters) 327582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 328582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET setQuota(const char* /* upstream */, uint64_t /* limit */) = 0; 329582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /** 330582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Query for statistics counters in hardware. 331582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 332582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * This returns an aggregate of all hardware accelerated traffic which 333582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * has occurred on this upstream interface. 334582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 335582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param upstream Interface on which traffic entered/exited 336582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param reset Whether hardware counters should reset after returning 337582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * current statistics 338582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @param ret Output variable where statistics are returned 339582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * 340582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * @return SUCCESS If the statistics were successfully populated in ret and 341582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * were successfully reset if requested. 342582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_TRY_AGAIN If the statistics are not currently available but 343582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * may be available later. This may occur during 344582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * a subsystem restart. 345582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * FAIL_UNSUPPORTED If statistics are not supported on this upstream 346582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 347582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel virtual RET getStats(const char* /* upstream */, bool /* reset */, 348582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel OffloadStatistics& /* ret */) = 0; 349582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel}; /* IOffloadManager */ 350582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#endif /* _I_OFFLOAD_MANAGER_H_ */ 351