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