summaryrefslogtreecommitdiff
path: root/data-ipa-cfg-mgr/hal
diff options
context:
space:
mode:
authorBruno Martins <bgcngm@gmail.com>2019-03-26 18:55:03 +0100
committerIsaac Chen <tingyi364@gmail.com>2019-08-30 16:03:42 +0200
commit6307de29a852c3af01716415b511f5050383fa53 (patch)
tree433684103d25e8c265ce4b777a44b27c8144b2b6 /data-ipa-cfg-mgr/hal
parent8330d437f89b8c0cdec11370ba1292ffe19532fb (diff)
wayne-common: Move to common data-ipa-cfg-mgr
* It is now available at vendor/qcom/opensource/data-ipa-cfg-mgr Change-Id: If66808c4bc2c02f7d253bdc1f7b34b83f559a047
Diffstat (limited to 'data-ipa-cfg-mgr/hal')
-rw-r--r--data-ipa-cfg-mgr/hal/Android.mk29
-rw-r--r--data-ipa-cfg-mgr/hal/inc/CtUpdateAmbassador.h62
-rw-r--r--data-ipa-cfg-mgr/hal/inc/HAL.h199
-rw-r--r--data-ipa-cfg-mgr/hal/inc/IOffloadManager.h350
-rw-r--r--data-ipa-cfg-mgr/hal/inc/IpaEventRelay.h55
-rw-r--r--data-ipa-cfg-mgr/hal/inc/LocalLogBuffer.h73
-rw-r--r--data-ipa-cfg-mgr/hal/inc/OffloadStatistics.h49
-rw-r--r--data-ipa-cfg-mgr/hal/inc/PrefixParser.h80
-rw-r--r--data-ipa-cfg-mgr/hal/src/CtUpdateAmbassador.cpp123
-rw-r--r--data-ipa-cfg-mgr/hal/src/HAL.cpp615
-rw-r--r--data-ipa-cfg-mgr/hal/src/IpaEventRelay.cpp83
-rw-r--r--data-ipa-cfg-mgr/hal/src/LocalLogBuffer.cpp126
-rw-r--r--data-ipa-cfg-mgr/hal/src/OffloadStatistics.cpp57
-rw-r--r--data-ipa-cfg-mgr/hal/src/PrefixParser.cpp391
14 files changed, 0 insertions, 2292 deletions
diff --git a/data-ipa-cfg-mgr/hal/Android.mk b/data-ipa-cfg-mgr/hal/Android.mk
deleted file mode 100644
index b342a69..0000000
--- a/data-ipa-cfg-mgr/hal/Android.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_ARM_MODE := arm
-LOCAL_SRC_FILES := src/CtUpdateAmbassador.cpp \
- src/HAL.cpp \
- src/IpaEventRelay.cpp \
- src/LocalLogBuffer.cpp \
- src/OffloadStatistics.cpp \
- src/PrefixParser.cpp
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc
-LOCAL_MODULE := liboffloadhal
-LOCAL_CPP_FLAGS := -Wall -Werror
-LOCAL_SHARED_LIBRARIES := libhwbinder \
- libhidlbase \
- libhidltransport \
- liblog \
- libcutils \
- libdl \
- libbase \
- libutils \
- libhardware_legacy \
- libhardware \
- android.hardware.tetheroffload.config@1.0 \
- android.hardware.tetheroffload.control@1.0
-LOCAL_VENDOR_MODULE := true
-LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib
-LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64
-include $(BUILD_SHARED_LIBRARY)
diff --git a/data-ipa-cfg-mgr/hal/inc/CtUpdateAmbassador.h b/data-ipa-cfg-mgr/hal/inc/CtUpdateAmbassador.h
deleted file mode 100644
index d4890f3..0000000
--- a/data-ipa-cfg-mgr/hal/inc/CtUpdateAmbassador.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _CT_UPDATE_AMBASSADOR_H_
-#define _CT_UPDATE_AMBASSADOR_H_
-/* External Includes */
-#include <hidl/HidlTransportSupport.h>
-
-/* HIDL Includes */
-#include <android/hardware/tetheroffload/control/1.0/ITetheringOffloadCallback.h>
-
-/* Internal Includes */
-#include "IOffloadManager.h"
-
-/* Namespace pollution avoidance */
-using ::android::hardware::tetheroffload::control::V1_0::ITetheringOffloadCallback;
-using ::android::hardware::tetheroffload::control::V1_0::NetworkProtocol;
-using HALIpAddrPortPair = ::android::hardware::tetheroffload::control::V1_0::IPv4AddrPortPair;
-using HALNatTimeoutUpdate = ::android::hardware::tetheroffload::control::V1_0::NatTimeoutUpdate;
-
-using IpaIpAddrPortPair = ::IOffloadManager::ConntrackTimeoutUpdater::IpAddrPortPair;
-using IpaNatTimeoutUpdate = ::IOffloadManager::ConntrackTimeoutUpdater::NatTimeoutUpdate;
-using IpaL4Protocol = ::IOffloadManager::ConntrackTimeoutUpdater::L4Protocol;
-
-
-class CtUpdateAmbassador : public IOffloadManager::ConntrackTimeoutUpdater {
-public:
- CtUpdateAmbassador(const ::android::sp<ITetheringOffloadCallback>& /* cb */);
- /* ------------------- CONNTRACK TIMEOUT UPDATER ------------------------ */
- void updateTimeout(IpaNatTimeoutUpdate /* update */);
-private:
- static bool translate(IpaNatTimeoutUpdate /* in */, HALNatTimeoutUpdate& /* out */);
- static bool translate(IpaIpAddrPortPair /* in */, HALIpAddrPortPair& /* out */);
- static bool L4ToNetwork(IpaL4Protocol /* in */, NetworkProtocol& /* out */);
- const ::android::sp<ITetheringOffloadCallback>& mFramework;
-}; /* CtUpdateAmbassador */
-#endif /* _CT_UPDATE_AMBASSADOR_H_ */ \ No newline at end of file
diff --git a/data-ipa-cfg-mgr/hal/inc/HAL.h b/data-ipa-cfg-mgr/hal/inc/HAL.h
deleted file mode 100644
index 622a67e..0000000
--- a/data-ipa-cfg-mgr/hal/inc/HAL.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _HAL_H_
-#define _HAL_H_
-
-/* HIDL Includes */
-#include <android/hardware/tetheroffload/config/1.0/IOffloadConfig.h>
-#include <android/hardware/tetheroffload/control/1.0/IOffloadControl.h>
-#include <hidl/HidlTransportSupport.h>
-
-/* External Includes */
-#include <string>
-#include <vector>
-
-/* Internal Includes */
-#include "CtUpdateAmbassador.h"
-#include "IOffloadManager.h"
-#include "IpaEventRelay.h"
-#include "LocalLogBuffer.h"
-
-/* Avoid the namespace litering everywhere */
-using ::android::hardware::configureRpcThreadpool;
-using ::android::hardware::joinRpcThreadpool;
-using ::android::hardware::Return;
-using ::android::hardware::hidl_handle;
-using ::android::hardware::hidl_string;
-using ::android::hardware::hidl_vec;
-
-using RET = ::IOffloadManager::RET;
-using Prefix = ::IOffloadManager::Prefix;
-
-using ::std::map;
-using ::std::string;
-using ::std::vector;
-
-using ::android::hardware::tetheroffload::config::V1_0::IOffloadConfig;
-using ::android::hardware::tetheroffload::control::V1_0::IOffloadControl;
-
-using ::android::hardware::tetheroffload::control::V1_0::ITetheringOffloadCallback;
-
-
-class HAL : public IOffloadControl, IOffloadConfig {
-public:
- /* Static Const Definitions */
- static const uint32_t UDP_SUBSCRIPTIONS =
- NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY;
- static const uint32_t TCP_SUBSCRIPTIONS =
- NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY;
-
- /* Interface to IPACM */
- /**
- * @TODO This will likely need to be extended into a proper FactoryPattern
- * when version bumps are needed.
- *
- * This makeIPAHAL function would move to a HALFactory class. Each HAL could
- * then be versioned (class HAL_V1, class HAL_V2, etc) and inherit from a base class HAL.
- * Then the version number in this function could be used to decide which one to return
- * (if any).
- *
- * IPACM does not need to talk directly back to the returned HAL class. The other methods that
- * IPACM needs to call are covered by registering the event listeners. If IPACM did need to
- * talk directly back to the HAL object, without HAL registering a callback, these methods would
- * need to be defined in the HAL base class.
- *
- * This would slightly break backwards compatibility so it should be discouraged; however, the
- * base class could define a sane default implementation and not require that the child class
- * implement this new method. This "sane default implementation" might only be possible in the
- * case of listening to async events; if IPACM needs to query something, then this would not
- * be backwards compatible and should be done via registering a callback so that IPACM knows
- * this version of HAL supports that functionality.
- *
- * The above statements assume that only one version of the HAL will be instantiated at a time.
- * Yet, it seems possible that a HAL_V1 and HAL_V2 service could both be registered, extending
- * support to both old and new client implementations. It would be difficult to multiplex
- * information from both versions. Additionally, IPACM would be responsible for instantiating
- * two HALs (makeIPAHAL(1, ...); makeIPAHAL(2, ...)) which makes signaling between HAL versions
- * (see next paragraph) slightly more difficult but not impossible.
- *
- * If concurrent versions of HAL are required, there will likely need to only be one master.
- * Whichever version of HAL receives a client first may be allowed to take over control while
- * other versions would be required to return failures (ETRYAGAIN: another version in use) until
- * that version of the client relinquishes control. This should work seemlessly because we
- * currently have an assumption that only one client will be present in system image.
- * Logically, that client will have only a single version (or if it supports multiple, it will
- * always attempt the newest version of HAL before falling back) and therefore no version
- * collisions could possibly occur.
- *
- * Dislaimer:
- * ==========
- * Supporting multiple versions of an interface, in the same code base, at runtime, comes with a
- * significant carrying cost and overhead in the form of developer headaches. This should not
- * be done lightly and should be extensively scoped before committing to the effort.
- *
- * Perhaps the notion of minor version could be introduced to bridge the gaps created above.
- * For example, 1.x and 1.y could be ran concurrently and supported from the same IPACM code.
- * Yet, a major version update, would not be backwards compatible. This means that a 2.x HAL
- * could not linked into the same IPACM code base as a 1.x HAL.
- */
- static HAL* makeIPAHAL(int /* version */, IOffloadManager* /* mgr */);
-
- /* IOffloadConfig */
- Return<void> setHandles(
- const hidl_handle& /* fd1 */,
- const hidl_handle& /* fd2 */,
- setHandles_cb /* hidl_cb */);
-
- /* IOffloadControl */
- Return<void> initOffload(
- const ::android::sp<ITetheringOffloadCallback>& /* cb */,
- initOffload_cb /* hidl_cb */);
- Return<void> stopOffload(
- stopOffload_cb /* hidl_cb */);
- Return<void> setLocalPrefixes(
- const hidl_vec<hidl_string>& /* prefixes */,
- setLocalPrefixes_cb /* hidl_cb */);
- Return<void> getForwardedStats(
- const hidl_string& /* upstream */,
- getForwardedStats_cb /* hidl_cb */);
- Return<void> setDataLimit(
- const hidl_string& /* upstream */,
- uint64_t /* limit */,
- setDataLimit_cb /* hidl_cb */);
- Return<void> setUpstreamParameters(
- const hidl_string& /* iface */,
- const hidl_string& /* v4Addr */,
- const hidl_string& /* v4Gw */,
- const hidl_vec<hidl_string>& /* v6Gws */,
- setUpstreamParameters_cb /* hidl_cb */);
- Return<void> addDownstream(
- const hidl_string& /* iface */,
- const hidl_string& /* prefix */,
- addDownstream_cb /* hidl_cb */);
- Return<void> removeDownstream(
- const hidl_string& /* iface */,
- const hidl_string& /* prefix */,
- removeDownstream_cb /* hidl_cb */);
-
-private:
- typedef struct BoolResult {
- bool success;
- string errMsg;
- } boolResult_t;
-
- HAL(IOffloadManager* /* mgr */);
- void registerAsSystemService(const char* /* name */);
-
- void doLogcatDump();
-
- static BoolResult makeInputCheckFailure(string /* customErr */);
- static BoolResult ipaResultToBoolResult(RET /* in */);
-
- static vector<string> convertHidlStrToStdStr(hidl_vec<hidl_string> /* in */);
-
- void registerEventListeners();
- void registerIpaCb();
- void registerCtCb();
- void unregisterEventListeners();
- void unregisterIpaCb();
- void unregisterCtCb();
-
- void clearHandles();
-
- bool isInitialized();
-
- IOffloadManager* mIPA;
- hidl_handle mHandle1;
- hidl_handle mHandle2;
- LocalLogBuffer mLogs;
- ::android::sp<ITetheringOffloadCallback> mCb;
- IpaEventRelay *mCbIpa;
- CtUpdateAmbassador *mCbCt;
-}; /* HAL */
-#endif /* _HAL_H_ */
diff --git a/data-ipa-cfg-mgr/hal/inc/IOffloadManager.h b/data-ipa-cfg-mgr/hal/inc/IOffloadManager.h
deleted file mode 100644
index 6a357b3..0000000
--- a/data-ipa-cfg-mgr/hal/inc/IOffloadManager.h
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _I_OFFLOAD_MANAGER_H_
-#define _I_OFFLOAD_MANAGER_H_
-
-/* External Includes */
-#include <sys/types.h>
-
-/* Internal Includes */
-#include "OffloadStatistics.h"
-
-
-class IOffloadManager {
-public:
- enum RET {
- FAIL_TOO_MANY_PREFIXES = -6,
- FAIL_UNSUPPORTED = -5,
- FAIL_INPUT_CHECK = -4,
- FAIL_HARDWARE = -3,
- FAIL_UNNEEDED = -2,
- FAIL_TRY_AGAIN = -1,
- SUCCESS = 0,
- SUCCESS_DUPLICATE_CONFIG = 1,
- SUCCESS_NO_OP = 2,
- SUCCESS_OPTIMIZED = 3
- }; /* RET */
-
- enum IP_FAM {
- V4 = 0,
- V6 = 1,
- INVALID = 2
- }; /* IP_FAM */
-
- /* Overloading to use for addresses as well */
- typedef struct Prefix {
- IP_FAM fam;
- uint32_t v4Addr;
- uint32_t v4Mask;
- uint32_t v6Addr[4];
- uint32_t v6Mask[4];
- } prefix_t;
-
- /* ---------------------------- LIFECYCLE ------------------------------- */
- virtual ~IOffloadManager(){}
-
- /* ---------------------- ASYNC EVENT CALLBACKS ------------------------- */
- class IpaEventListener {
- public:
- enum StoppedReason {
- /**
- * Offload was stopped due to the configuration being removed via
- * setUpstreamParameters/removeDownstream.
- */
- REQUESTED,
- /**
- * Offload was stopped due to an internal (to IPA or modem) error.
- *
- * Statistics may be temporarily unavailable.
- */
- ERROR,
- /**
- * Offload was stopped because the upstream connection has
- * migrated to unsupported radio access technology.
- *
- * Statistics will still be available.
- */
- UNSUPPORTED
- }; /* StoppedReason */
- virtual ~IpaEventListener(){}
- /**
- * Called when Offload first begins to occur on any upstream and
- * tether interface pair. It should be paired with an onOffloadStopped
- * call.
- */
- virtual void onOffloadStarted(){}
- /**
- * Called when Offload stops occurring on all upstream and tether
- * interface pairs. It comes after a call to onOffloadStarted.
- *
- * @param reason Reason that Offload was stopped
- */
- virtual void onOffloadStopped(StoppedReason /* reason */){}
- /**
- * Called when the hardware can support Offload again.
- *
- * Any statistics that were previously unavailable, may be queried
- * again at this time.
- */
- virtual void onOffloadSupportAvailable(){}
- /**
- * Called when the limit set via setQuota has expired.
- *
- * It is implied that Offload has been stopped on all upstream and
- * tether interface pairs when this callback is called.
- */
- virtual void onLimitReached(){}
- }; /* IpaEventListener */
-
- /**
- * Request notifications about asynchronous events that occur in hardware.
- *
- * The calling client must be able to handle the callback on a separate
- * thread (i.e. their implementation of IpaEventListener must be thread
- * safe).
- *
- * @return SUCCESS iff callback successfully registered
- *
- * Remarks: This can't really be allowed to fail.
- */
- virtual RET registerEventListener(IpaEventListener* /* listener */) = 0;
- /**
- * Unregister a previously registered listener.
- *
- * @return SUCCESS iff callback successfully unregistered
- * FAIL_INPUT_CHECK if callback was never registered
- */
- virtual RET unregisterEventListener(IpaEventListener* /* listener */) = 0;
-
- class ConntrackTimeoutUpdater {
- public:
- enum L4Protocol {
- TCP = 0,
- UDP = 1
- }; /* L4Protocol */
- typedef struct IpAddrPortPair {
- uint32_t ipAddr;
- uint16_t port;
- } ipAddrPortPair_t;
- typedef struct NatTimeoutUpdate {
- IpAddrPortPair src;
- IpAddrPortPair dst;
- L4Protocol proto;
- } natTimeoutUpdate_t;
- virtual ~ConntrackTimeoutUpdater(){}
- virtual void updateTimeout(NatTimeoutUpdate /* update */) {}
- }; /* ConntrackTimeoutUpdater */
-
- /**
- * Register a callback that may be called if the OffloadManager wants to
- * update the timeout value in conntrack of kernel.
- *
- * The calling client must be able to handle the callback on a separate
- * thread (i.e. their implementation of ConntrackTimeoutUpdater must be
- * thread safe)
- *
- * @return SUCCESS iff callback successfully registered
- *
- * Remarks: This can't really be allowed to fail
- */
- virtual RET registerCtTimeoutUpdater(ConntrackTimeoutUpdater* /* cb */) = 0;
- /**
- * Unregister a previously registered callback.
- *
- * @return SUCCESS iff callback successfully unregistered
- * FAIL_INPUT_CHECK if callback was never registered
- */
- virtual RET unregisterCtTimeoutUpdater(ConntrackTimeoutUpdater* /* cb */) = 0;
-
- /* ----------------------------- CONFIG --------------------------------- */
- /**
- * Provide a file descriptor for use with conntrack library
- *
- * @param fd File Descriptor that has been opened and bound to groups
- * @param groups Groups (bit mask) that fd has been bound to
- *
- * @return SUCCESS iff IOffloadManager needed this file descriptor and
- * it was properly bound.
- * FAIL_INPUT_CHECK if IOffloadManager needed this file descriptor
- * but it was found to not be properly bound
- * FAIL_UNNEEDED if IOffloadManager determined that it does not need
- * a file descriptor bound to these groups.
- */
- virtual RET provideFd(int /* fd */, unsigned int /* group */) = 0;
- /**
- * Indicate that IOffloadManager <b>must</b> cease using all file
- * descriptors passed via provideFd API.
- *
- * After this call returns, the file descriptors will likely be closed by
- * the calling client.
- *
- * @return SUCCESS iff IOffloadManager has stopped using all file
- * descriptors
- * FAIL_TRY_AGAIN if IOffloadManager needs more time with these
- * file descriptors before it can release them
- *
- * Remarks: Currently, it would be very difficult to handle a FAIL_TRY_AGAIN
- * because HAL serivce does not own a thread outside of RPC
- * Threadpool to reschedule this call.
- */
- virtual RET clearAllFds() = 0;
- /**
- * Query whether STA+AP offload is supported on this device.
- *
- * @return true if supported, false otherwise
- */
- virtual bool isStaApSupported() = 0;
-
- /* ------------------------------ ROUTE --------------------------------- */
- /**
- * Add a downstream prefix that <i>may</i> be forwarded.
- *
- * The Prefix may be an IPv4 or IPv6 address to signify which family can be
- * offloaded from the specified tether interface. If the given IP family,
- * as determined by the Prefix, has a corresponding upstream configured,
- * then traffic should be forwarded between the two interfaces.
- *
- * Only traffic that has a downstream address within the specified Prefix
- * can be forwarded. Traffic from the same downstream interface that falls
- * outside of the Prefix will be unaffected and can be forwarded iff it was
- * previously configured via a separate addDownstream call.
- *
- * If no upstream has been configured, then this information must be cached
- * so that offload may begin once an upstream is configured.
- *
- * This API does <b>not</b> replace any previously configured downstreams
- * and must be explicitly removed by calling removeDownstream or by clearing
- * the entire configuration by calling stopAllOffload.
- *
- * @return SUCCESS The new information was accepted
- * FAIL_TOO_MANY_PREFIXES The hardware has already accepted the max
- * number of Prefixes that can be supported.
- * If offload is desired on this Prefix then
- * another must be removed first.
- * FAIL_UNSUPPORTED The hardware cannot forward traffic from this
- * downstream interface and will never be able to.
- */
- virtual RET addDownstream(const char* /* downstream */,
- const Prefix& /* prefix */) = 0;
- /**
- * Remove a downstream Prefix that forwarding was previously requested for.
- *
- * The Prefix may be an IPv4 or IPv6 address. Traffic outside of this
- * Prefix is not affected.
- *
- * @return SUCCESS iff forwarding was previously occurring and has been
- * stopped
- * SUCCESS_NO_OP iff forwarding was not previously occurring and
- * therefore no action needed to be taken
- */
- virtual RET removeDownstream(const char* /* downstream */,
- const Prefix& /* prefix */) = 0;
- /**
- * Indicate that hardware should forward traffic from any configured
- * downstreams to the specified upstream.
- *
- * When iface is non-null and non-empty and v4Gw is valid, then any
- * currently configured or future configured IPv4 downstreams should be
- * forwarded to this upstream interface.
- *
- * When iface is non-null and non-empty and v6Gw is valid, then any
- * currently configured or future configured IPv6 downstreams should be
- * forwarded to this upstream interface.
- *
- * @param iface Upstream interface name. Only one is needed because IPv4
- * and IPv6 interface names are required to match.
- * @param v4Gw The address of the IPv4 Gateway on the iface
- * @param v6Gw The address of one of the IPv6 Gateways on the iface
- *
- * @return SUCCESS iff the specified configuration was applied
- * SUCCESS_DUPLICATE_CONFIG if this configuration <i>exactly</i>
- * matches a previously provided
- * configuration. This means that no
- * action has to be taken, but, the
- * configuration was previously accepted
- * and applied.
- * FAIL_UNSUPPORTED if hardware cannot support forwarding to this
- * upstream interface
- *
- * Remarks: This overrides any previously configured parameters
- */
- virtual RET setUpstream(const char* /* iface */, const Prefix& /* v4Gw */,
- const Prefix& /* v6Gw */) = 0;
- /**
- * All traffic must be returned to the software path and all configuration
- * (including provided file descriptors) must be forgotten.
- *
- * @return SUCCESS If all offload was successfully stopped and provided
- * file descriptors were released.
- *
- * Remarks: This can't really fail?
- */
- virtual RET stopAllOffload() = 0;
-
- /* --------------------------- STATS/POLICY ----------------------------- */
- /**
- * Instruct hardware to stop forwarding traffic and send a callback after
- * limit bytes have been transferred in either direction on this upstream
- * interface.
- *
- * @param upstream Upstream interface name that the limit should apply to
- * @param limit Bytes limit that can occur before action should be taken
- *
- * @return SUCCESS If the limit was successfully applied
- * SUCCESS_OPTIMIZED If the limit was sufficiently high to be
- * interpreted as "no quota".
- * FAIL_HARDWARE If the limit was rejected by the hardware
- * FAIL_UNSUPPORTED If metering is not supported on this interface
- * FAIL_TRY_AGAIN If this upstream has not been previously
- * configured to allow offload
- * (via setUpstreamParameters)
- */
- virtual RET setQuota(const char* /* upstream */, uint64_t /* limit */) = 0;
- /**
- * Query for statistics counters in hardware.
- *
- * This returns an aggregate of all hardware accelerated traffic which
- * has occurred on this upstream interface.
- *
- * @param upstream Interface on which traffic entered/exited
- * @param reset Whether hardware counters should reset after returning
- * current statistics
- * @param ret Output variable where statistics are returned
- *
- * @return SUCCESS If the statistics were successfully populated in ret and
- * were successfully reset if requested.
- * FAIL_TRY_AGAIN If the statistics are not currently available but
- * may be available later. This may occur during
- * a subsystem restart.
- * FAIL_UNSUPPORTED If statistics are not supported on this upstream
- */
- virtual RET getStats(const char* /* upstream */, bool /* reset */,
- OffloadStatistics& /* ret */) = 0;
-}; /* IOffloadManager */
-#endif /* _I_OFFLOAD_MANAGER_H_ */
diff --git a/data-ipa-cfg-mgr/hal/inc/IpaEventRelay.h b/data-ipa-cfg-mgr/hal/inc/IpaEventRelay.h
deleted file mode 100644
index 4541510..0000000
--- a/data-ipa-cfg-mgr/hal/inc/IpaEventRelay.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _IPA_EVENT_RELAY_H_
-#define _IPA_EVENT_RELAY_H_
-/* External Includes */
-#include <hidl/HidlTransportSupport.h>
-
-/* HIDL Includes */
-#include <android/hardware/tetheroffload/control/1.0/ITetheringOffloadCallback.h>
-
-/* Internal Includes */
-#include "IOffloadManager.h"
-
-/* Namespace pollution avoidance */
-using ::android::hardware::tetheroffload::control::V1_0::ITetheringOffloadCallback;
-
-
-class IpaEventRelay : public IOffloadManager::IpaEventListener {
-public:
- IpaEventRelay(const ::android::sp<ITetheringOffloadCallback>& /* cb */);
- /* ----------------------- IPA EVENT LISTENER --------------------------- */
- void onOffloadStarted();
- void onOffloadStopped(StoppedReason /* reason */);
- void onOffloadSupportAvailable();
- void onLimitReached();
-private:
- const ::android::sp<ITetheringOffloadCallback>& mFramework;
-}; /* IpaEventRelay */
-#endif /* _IPA_EVENT_RELAY_H_ */ \ No newline at end of file
diff --git a/data-ipa-cfg-mgr/hal/inc/LocalLogBuffer.h b/data-ipa-cfg-mgr/hal/inc/LocalLogBuffer.h
deleted file mode 100644
index c23ef7d..0000000
--- a/data-ipa-cfg-mgr/hal/inc/LocalLogBuffer.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _LOCAL_LOG_BUFFER_H_
-#define _LOCAL_LOG_BUFFER_H_
-/* External Includes */
-#include <deque>
-#include <sstream>
-#include <string>
-#include <sys/types.h>
-#include <vector>
-
-/* Namespace pollution avoidance */
-using ::std::deque;
-using ::std::string;
-using ::std::stringstream;
-using ::std::vector;
-
-
-class LocalLogBuffer {
-public:
- class FunctionLog {
- public:
- FunctionLog(string /* funcName */);
- FunctionLog(const FunctionLog& /* other */);
- void addArg(string /* kw */, string /* arg */);
- void addArg(string /* kw */, vector<string> /* args */);
- void addArg(string /* kw */, uint64_t /* arg */);
- void setResult(bool /* success */, string /* msg */);
- void setResult(vector<unsigned int> /* ret */);
- void setResult(uint64_t /* rx */, uint64_t /* tx */);
- string toString();
- private:
- void maybeAddArgsComma();
- const string mName;
- bool mArgsProvided;
- stringstream mSSArgs;
- stringstream mSSReturn;
- }; /* FunctionLog */
- LocalLogBuffer(string /* name */, int /* maxLogs */);
- void addLog(FunctionLog /* log */);
- void toLogcat();
-private:
- deque<FunctionLog> mLogs;
- const string mName;
- const size_t mMaxLogs;
-}; /* LocalLogBuffer */
-#endif /* _LOCAL_LOG_BUFFER_H_ */ \ No newline at end of file
diff --git a/data-ipa-cfg-mgr/hal/inc/OffloadStatistics.h b/data-ipa-cfg-mgr/hal/inc/OffloadStatistics.h
deleted file mode 100644
index 226ea72..0000000
--- a/data-ipa-cfg-mgr/hal/inc/OffloadStatistics.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _OFFLOAD_STATISTICS_H_
-#define _OFFLOAD_STATISTICS_H_
-
-#include <string>
-#include <sys/types.h>
-
-
-class OffloadStatistics {
-public:
- uint64_t rx;
- uint64_t tx;
-
- OffloadStatistics();
- OffloadStatistics(std::string /* upstream */);
-
- uint64_t getTotalRxBytes();
- uint64_t getTotalTxBytes();
-private:
- std::string upstream;
-}; /* OffloadStatistics */
-#endif /* _OFFLOAD_STATISTICS_H_ */
diff --git a/data-ipa-cfg-mgr/hal/inc/PrefixParser.h b/data-ipa-cfg-mgr/hal/inc/PrefixParser.h
deleted file mode 100644
index 99afbe0..0000000
--- a/data-ipa-cfg-mgr/hal/inc/PrefixParser.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _PREFIX_PARSER_H_
-#define _PREFIX_PARSER_H_
-
-/* External Includes */
-#include <string.h>
-#include <sys/types.h>
-#include <vector>
-
-/* Internal Includes */
-#include "IOffloadManager.h"
-
-/* Avoiding namespace pollution */
-using IP_FAM = ::IOffloadManager::IP_FAM;
-using Prefix = ::IOffloadManager::Prefix;
-
-using ::std::string;
-using ::std::vector;
-
-
-class PrefixParser {
-public:
- PrefixParser();
- bool add(vector<string> /* in */);
- bool add(string /* in */);
- bool addV4(vector<string> /* in */);
- bool addV4(string /* in */);
- bool addV6(vector<string> /* in */);
- bool addV6(string /* in */);
- int size();
- bool allAreFullyQualified();
- Prefix getFirstPrefix();
- Prefix getFirstPrefix(IP_FAM);
- string getLastErrAsStr();
-private:
- bool add(string /* in */, IP_FAM /* famHint */);
- bool add(vector<string> /* in */, IP_FAM /* famHint */);
- static IP_FAM guessIPFamily(string /* in */);
- static bool splitIntoAddrAndMask(string /* in */, string& /* addr */,
- string& /* mask */);
- static int parseSubnetMask(string /* in */, IP_FAM /* famHint */);
- static bool parseV4Addr(string /* in */, Prefix& /* out */);
- static bool parseV6Addr(string /* in */, Prefix& /* out */);
- static bool populateV4Mask(int /* mask */, Prefix& /* out */);
- static bool populateV6Mask(int /* mask */, Prefix& /* out */);
- static uint32_t createMask(int /* mask */);
- static Prefix makeBlankPrefix(IP_FAM /* famHint */);
- bool isMaskValid(int /* mask */, IP_FAM /* fam */);
- static const uint32_t FULLY_QUALIFIED_MASK = ~0;
- vector<Prefix> mPrefixes;
- string mLastErr;
-}; /* PrefixParser */
-#endif /* _PREFIX_PARSER_H_ */ \ No newline at end of file
diff --git a/data-ipa-cfg-mgr/hal/src/CtUpdateAmbassador.cpp b/data-ipa-cfg-mgr/hal/src/CtUpdateAmbassador.cpp
deleted file mode 100644
index 4843fe2..0000000
--- a/data-ipa-cfg-mgr/hal/src/CtUpdateAmbassador.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef DBG
- #define DBG false
-#endif /* DBG */
-#define LOG_TAG "IPAHALService/CtUpdateAmbassador"
-
-/* External Includes */
-#include <arpa/inet.h>
-#include <cutils/log.h>
-
-/* HIDL Includes */
-#include <android/hardware/tetheroffload/control/1.0/ITetheringOffloadCallback.h>
-
-/* Internal Includes */
-#include "CtUpdateAmbassador.h"
-
-/* Namespace pollution avoidance */
-using ::android::hardware::tetheroffload::control::V1_0::ITetheringOffloadCallback;
-using ::android::hardware::tetheroffload::control::V1_0::NetworkProtocol;
-using HALIpAddrPortPair = ::android::hardware::tetheroffload::control::V1_0::IPv4AddrPortPair;
-using HALNatTimeoutUpdate = ::android::hardware::tetheroffload::control::V1_0::NatTimeoutUpdate;
-
-using IpaIpAddrPortPair = ::IOffloadManager::ConntrackTimeoutUpdater::IpAddrPortPair;
-using IpaNatTimeoutUpdate = ::IOffloadManager::ConntrackTimeoutUpdater::NatTimeoutUpdate;
-using IpaL4Protocol = ::IOffloadManager::ConntrackTimeoutUpdater::L4Protocol;
-
-
-CtUpdateAmbassador::CtUpdateAmbassador(
- const ::android::sp<ITetheringOffloadCallback>& cb) : mFramework(cb) {
-} /* CtUpdateAmbassador */
-
-void CtUpdateAmbassador::updateTimeout(IpaNatTimeoutUpdate in) {
- if (DBG) {
- ALOGD("updateTimeout(src={%#010X, %#04X}, dest={%#010X, %#04X}, Proto=%d)",
- in.src.ipAddr, in.src.port, in.dst.ipAddr, in.dst.port,
- in.proto);
- }
- HALNatTimeoutUpdate out;
- if (!translate(in, out)) {
- /* Cannot log the input outside of DBG flag because it contains sensitive
- * information. This will lead to a two step debug if the information
- * cannot be gleaned from IPACM logs. The other option is to improve this
- * with the use of our local log. That would likely still be hard to
- * instruct testers to collect logs, because, assuming timeout updates
- * are numerous, it will overrun the ring quickly. Therefore, the tester
- * would have to know the exact moment as issue occurred. Or we make the
- * ring massive. This would lead to a significant memory overhead.
- * Because of this overhead, we would likely not want to check in a change
- * with it and once we provide a debug build for increasing buffer size,
- * why not just define the DBG flag?
- */
- ALOGE("Failed to translate timeout event :(");
- } else {
- mFramework->updateTimeout(out);
- }
-} /* updateTimeout */
-
-bool CtUpdateAmbassador::translate(IpaNatTimeoutUpdate in, HALNatTimeoutUpdate &out) {
- return translate(in.src, out.src)
- && translate(in.dst, out.dst)
- && L4ToNetwork(in.proto, out.proto);
-} /* translate */
-
-bool CtUpdateAmbassador::translate(IpaIpAddrPortPair in, HALIpAddrPortPair& out) {
- char ipAddrStr[INET_ADDRSTRLEN];
-
- if (inet_ntop(AF_INET, &(in.ipAddr), ipAddrStr, INET_ADDRSTRLEN) == nullptr) {
- /* errno would be valid here with EAFNOSUPPORT or ENOSPC, neither should really
- * be possible in our scenario though.
- */
- return false;
- }
-
- out.addr = ipAddrStr;
- out.port = in.port;
-
- return true;
-} /* translate */
-
-bool CtUpdateAmbassador::L4ToNetwork(IpaL4Protocol in, NetworkProtocol &out) {
- bool ret = false;
- switch(in) {
- case IpaL4Protocol::TCP:
- ret = true;
- out = NetworkProtocol::TCP;
- break;
- case IpaL4Protocol::UDP:
- ret = true;
- out = NetworkProtocol::UDP;
- break;
- default:
- ret = false;
- break;
- }
- return ret;
-} /* L4ToNetwork */
diff --git a/data-ipa-cfg-mgr/hal/src/HAL.cpp b/data-ipa-cfg-mgr/hal/src/HAL.cpp
deleted file mode 100644
index c2498cd..0000000
--- a/data-ipa-cfg-mgr/hal/src/HAL.cpp
+++ /dev/null
@@ -1,615 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef DBG
- #define DBG true
-#endif /* DBG */
-#define LOG_TAG "IPAHALService"
-
-/* HIDL Includes */
-#include <hwbinder/IPCThreadState.h>
-#include <hwbinder/ProcessState.h>
-
-/* Kernel Includes */
-#include <linux/netfilter/nfnetlink_compat.h>
-
-/* External Includes */
-#include <cutils/log.h>
-#include <cstring>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <vector>
-
-/* Internal Includes */
-#include "HAL.h"
-#include "LocalLogBuffer.h"
-#include "PrefixParser.h"
-
-/* Namespace pollution avoidance */
-using ::android::hardware::Void;
-using ::android::status_t;
-
-using RET = ::IOffloadManager::RET;
-using Prefix = ::IOffloadManager::Prefix;
-
-using ::std::map;
-using ::std::vector;
-
-
-/* ------------------------------ PUBLIC ------------------------------------ */
-HAL* HAL::makeIPAHAL(int version, IOffloadManager* mgr) {
- if (DBG)
- ALOGI("makeIPAHAL(%d, %s)", version,
- (mgr != nullptr) ? "provided" : "null");
- if (nullptr == mgr) return NULL;
- else if (version != 1) return NULL;
- HAL* ret = new HAL(mgr);
- if (nullptr == ret) return NULL;
- configureRpcThreadpool(1, false);
- ret->registerAsSystemService("ipacm");
- return ret;
-} /* makeIPAHAL */
-
-
-/* ------------------------------ PRIVATE ----------------------------------- */
-HAL::HAL(IOffloadManager* mgr) : mLogs("HAL Function Calls", 50) {
- mIPA = mgr;
- mCb.clear();
- mCbIpa = nullptr;
- mCbCt = nullptr;
-} /* HAL */
-
-void HAL::registerAsSystemService(const char* name) {
- status_t ret = 0;
-
- ret = IOffloadControl::registerAsService();
- if (ret != 0) ALOGE("Failed to register IOffloadControl (%d)", ret);
- else if (DBG) {
- ALOGI("Successfully registered IOffloadControl");
- }
-
- ret = IOffloadConfig::registerAsService();
- if (ret != 0) ALOGE("Failed to register IOffloadConfig (%d)", ret);
- else if (DBG) {
- ALOGI("Successfully registered IOffloadConfig");
- }
-} /* registerAsSystemService */
-
-void HAL::doLogcatDump() {
- ALOGD("mHandles");
- ALOGD("========");
- /* @TODO This will segfault if they aren't initialized and I don't currently
- * care to check for initialization in a function that isn't used anyways
- * ALOGD("fd1->%d", mHandle1->data[0]);
- * ALOGD("fd2->%d", mHandle2->data[0]);
- */
- ALOGD("========");
-} /* doLogcatDump */
-
-HAL::BoolResult HAL::makeInputCheckFailure(string customErr) {
- BoolResult ret;
- ret.success = false;
- ret.errMsg = "Failed Input Checks: " + customErr;
- return ret;
-} /* makeInputCheckFailure */
-
-HAL::BoolResult HAL::ipaResultToBoolResult(RET in) {
- BoolResult ret;
- ret.success = (in >= RET::SUCCESS);
- switch (in) {
- case RET::FAIL_TOO_MANY_PREFIXES:
- ret.errMsg = "Too Many Prefixes Provided";
- break;
- case RET::FAIL_UNSUPPORTED:
- ret.errMsg = "Unsupported by Hardware";
- break;
- case RET::FAIL_INPUT_CHECK:
- ret.errMsg = "Failed Input Checks";
- break;
- case RET::FAIL_HARDWARE:
- ret.errMsg = "Hardware did not accept";
- break;
- case RET::FAIL_TRY_AGAIN:
- ret.errMsg = "Try Again";
- break;
- case RET::SUCCESS:
- ret.errMsg = "Successful";
- break;
- case RET::SUCCESS_DUPLICATE_CONFIG:
- ret.errMsg = "Successful: Was a duplicate configuration";
- break;
- case RET::SUCCESS_NO_OP:
- ret.errMsg = "Successful: No action needed";
- break;
- case RET::SUCCESS_OPTIMIZED:
- ret.errMsg = "Successful: Performed optimized version of action";
- break;
- default:
- ret.errMsg = "Unknown Error";
- break;
- }
- return ret;
-} /* ipaResultToBoolResult */
-
-/* This will likely always result in doubling the number of loops the execution
- * goes through. Obviously that is suboptimal. But if we first translate
- * away from all HIDL specific code, then we can avoid sprinkling HIDL
- * dependencies everywhere.
- */
-vector<string> HAL::convertHidlStrToStdStr(hidl_vec<hidl_string> in) {
- vector<string> ret;
- for (size_t i = 0; i < in.size(); i++) {
- string add = in[i];
- ret.push_back(add);
- }
- return ret;
-} /* convertHidlStrToStdStr */
-
-void HAL::registerEventListeners() {
- registerIpaCb();
- registerCtCb();
-} /* registerEventListeners */
-
-void HAL::registerIpaCb() {
- if (isInitialized() && mCbIpa == nullptr) {
- LocalLogBuffer::FunctionLog fl("registerEventListener");
- mCbIpa = new IpaEventRelay(mCb);
- mIPA->registerEventListener(mCbIpa);
- mLogs.addLog(fl);
- } else {
- ALOGE("Failed to registerIpaCb (isInitialized()=%s, (mCbIpa == nullptr)=%s)",
- isInitialized() ? "true" : "false",
- (mCbIpa == nullptr) ? "true" : "false");
- }
-} /* registerIpaCb */
-
-void HAL::registerCtCb() {
- if (isInitialized() && mCbCt == nullptr) {
- LocalLogBuffer::FunctionLog fl("registerCtTimeoutUpdater");
- mCbCt = new CtUpdateAmbassador(mCb);
- mIPA->registerCtTimeoutUpdater(mCbCt);
- mLogs.addLog(fl);
- } else {
- ALOGE("Failed to registerCtCb (isInitialized()=%s, (mCbCt == nullptr)=%s)",
- isInitialized() ? "true" : "false",
- (mCbCt == nullptr) ? "true" : "false");
- }
-} /* registerCtCb */
-
-void HAL::unregisterEventListeners() {
- unregisterIpaCb();
- unregisterCtCb();
-} /* unregisterEventListeners */
-
-void HAL::unregisterIpaCb() {
- if (mCbIpa != nullptr) {
- LocalLogBuffer::FunctionLog fl("unregisterEventListener");
- mIPA->unregisterEventListener(mCbIpa);
- mCbIpa = nullptr;
- mLogs.addLog(fl);
- } else {
- ALOGE("Failed to unregisterIpaCb");
- }
-} /* unregisterIpaCb */
-
-void HAL::unregisterCtCb() {
- if (mCbCt != nullptr) {
- LocalLogBuffer::FunctionLog fl("unregisterCtTimeoutUpdater");
- mIPA->unregisterCtTimeoutUpdater(mCbCt);
- mCbCt = nullptr;
- mLogs.addLog(fl);
- } else {
- ALOGE("Failed to unregisterCtCb");
- }
-} /* unregisterCtCb */
-
-void HAL::clearHandles() {
- ALOGI("clearHandles()");
- /* @TODO handle this more gracefully... also remove the log
- *
- * Things that would be nice, but I can't do:
- * [1] Destroy the object (it's on the stack)
- * [2] Call freeHandle (it's private)
- *
- * Things I can do but are hacks:
- * [1] Look at code and notice that setTo immediately calls freeHandle
- */
- mHandle1.setTo(nullptr, true);
- mHandle2.setTo(nullptr, true);
-} /* clearHandles */
-
-bool HAL::isInitialized() {
- return mCb.get() != nullptr;
-} /* isInitialized */
-
-
-/* -------------------------- IOffloadConfig -------------------------------- */
-Return<void> HAL::setHandles(
- const hidl_handle &fd1,
- const hidl_handle &fd2,
- setHandles_cb hidl_cb
-) {
- LocalLogBuffer::FunctionLog fl(__func__);
-
- if (fd1->numFds != 1) {
- BoolResult res = makeInputCheckFailure("Must provide exactly one FD per handle (fd1)");
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
-
- mLogs.addLog(fl);
- return Void();
- }
-
- if (fd2->numFds != 1) {
- BoolResult res = makeInputCheckFailure("Must provide exactly one FD per handle (fd2)");
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
-
- mLogs.addLog(fl);
- return Void();
- }
-
- /* The = operator calls freeHandle internally. Therefore, if we were using
- * these handles previously, they're now gone... forever. But hopefully the
- * new ones kick in very quickly.
- *
- * After freeing anything previously held, it will dup the FD so we have our
- * own copy.
- */
- mHandle1 = fd1;
- mHandle2 = fd2;
-
- /* Log the DUPed FD instead of the actual input FD so that we can lookup
- * this value in ls -l /proc/<pid>/<fd>
- */
- fl.addArg("fd1", mHandle1->data[0]);
- fl.addArg("fd2", mHandle2->data[0]);
-
- /* Try to provide each handle to IPACM. Destroy our DUPed hidl_handles if
- * IPACM does not like either input. This keeps us from leaking FDs or
- * providing half solutions.
- *
- * @TODO unfortunately, this does not cover duplicate configs where IPACM
- * thinks it is still holding on to a handle that we would have freed above.
- * It also probably means that IPACM would not know about the first FD being
- * freed if it rejects the second FD.
- */
- RET ipaReturn = mIPA->provideFd(mHandle1->data[0], UDP_SUBSCRIPTIONS);
- if (ipaReturn == RET::SUCCESS) {
- ipaReturn = mIPA->provideFd(mHandle2->data[0], TCP_SUBSCRIPTIONS);
- }
-
- if (ipaReturn != RET::SUCCESS) {
- ALOGE("IPACM failed to accept the FDs (%d %d)", mHandle1->data[0],
- mHandle2->data[0]);
- clearHandles();
- } else {
- /* @TODO remove logs after stabilization */
- ALOGI("IPACM was provided two FDs (%d, %d)", mHandle1->data[0],
- mHandle2->data[0]);
- }
-
- BoolResult res = ipaResultToBoolResult(ipaReturn);
- hidl_cb(res.success, res.errMsg);
-
- fl.setResult(res.success, res.errMsg);
- mLogs.addLog(fl);
- return Void();
-} /* setHandles */
-
-
-/* -------------------------- IOffloadControl ------------------------------- */
-Return<void> HAL::initOffload
-(
- const ::android::sp<ITetheringOffloadCallback>& cb,
- initOffload_cb hidl_cb
-) {
- LocalLogBuffer::FunctionLog fl(__func__);
-
- if (isInitialized()) {
- BoolResult res = makeInputCheckFailure("Already initialized");
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- mLogs.addLog(fl);
- } else {
- /* Should storing the CB be a function? */
- mCb = cb;
- registerEventListeners();
- BoolResult res = ipaResultToBoolResult(RET::SUCCESS);
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- mLogs.addLog(fl);
- }
-
- return Void();
-} /* initOffload */
-
-Return<void> HAL::stopOffload
-(
- stopOffload_cb hidl_cb
-) {
- LocalLogBuffer::FunctionLog fl(__func__);
-
- if (!isInitialized()) {
- BoolResult res = makeInputCheckFailure("Was never initialized");
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- mLogs.addLog(fl);
- } else {
- /* Should removing the CB be a function? */
- mCb.clear();
- unregisterEventListeners();
-
- RET ipaReturn = mIPA->stopAllOffload();
- if (ipaReturn != RET::SUCCESS) {
- /* Ignore IPAs return value here and provide why stopAllOffload
- * failed. However, if IPA failed to clearAllFds, then we can't
- * clear our map because they may still be in use.
- */
- RET ret = mIPA->clearAllFds();
- if (ret == RET::SUCCESS) {
- clearHandles();
- }
- } else {
- ipaReturn = mIPA->clearAllFds();
- /* If IPA fails, they may still be using these for some reason. */
- if (ipaReturn == RET::SUCCESS) {
- clearHandles();
- } else {
- ALOGE("IPACM failed to return success for clearAllFds so they will not be released...");
- }
- }
-
- BoolResult res = ipaResultToBoolResult(ipaReturn);
- hidl_cb(res.success, res.errMsg);
-
- fl.setResult(res.success, res.errMsg);
- mLogs.addLog(fl);
- }
-
- return Void();
-} /* stopOffload */
-
-Return<void> HAL::setLocalPrefixes
-(
- const hidl_vec<hidl_string>& prefixes,
- setLocalPrefixes_cb hidl_cb
-) {
- BoolResult res;
- PrefixParser parser;
- vector<string> prefixesStr = convertHidlStrToStdStr(prefixes);
-
- LocalLogBuffer::FunctionLog fl(__func__);
- fl.addArg("prefixes", prefixesStr);
-
- memset(&res,0,sizeof(BoolResult));
-
- if (!isInitialized()) {
- BoolResult res = makeInputCheckFailure("Not initialized");
- } else if(prefixesStr.size() < 1) {
- res = ipaResultToBoolResult(RET::FAIL_INPUT_CHECK);
- } else if (!parser.add(prefixesStr)) {
- res = makeInputCheckFailure(parser.getLastErrAsStr());
- } else {
- res = ipaResultToBoolResult(RET::SUCCESS);
- }
-
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- mLogs.addLog(fl);
- return Void();
-} /* setLocalPrefixes */
-
-Return<void> HAL::getForwardedStats
-(
- const hidl_string& upstream,
- getForwardedStats_cb hidl_cb
-) {
- LocalLogBuffer::FunctionLog fl(__func__);
- fl.addArg("upstream", upstream);
-
- OffloadStatistics ret;
- RET ipaReturn = mIPA->getStats(upstream.c_str(), true, ret);
- if (ipaReturn == RET::SUCCESS) {
- hidl_cb(ret.getTotalRxBytes(), ret.getTotalTxBytes());
- fl.setResult(ret.getTotalRxBytes(), ret.getTotalTxBytes());
- } else {
- /* @TODO Ensure the output is zeroed, but this is probably not enough to
- * tell Framework that an error has occurred. If, for example, they had
- * not yet polled for statistics previously, they may incorrectly assume
- * that simply no statistics have transpired on hardware path.
- *
- * Maybe ITetheringOffloadCallback:onEvent(OFFLOAD_STOPPED_ERROR) is
- * enough to handle this case, time will tell.
- */
- hidl_cb(0, 0);
- fl.setResult(0, 0);
- }
-
- mLogs.addLog(fl);
- return Void();
-} /* getForwardedStats */
-
-Return<void> HAL::setDataLimit
-(
- const hidl_string& upstream,
- uint64_t limit,
- setDataLimit_cb hidl_cb
-) {
- LocalLogBuffer::FunctionLog fl(__func__);
- fl.addArg("upstream", upstream);
- fl.addArg("limit", limit);
-
- if (!isInitialized()) {
- BoolResult res = makeInputCheckFailure("Not initialized (setDataLimit)");
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- } else {
- RET ipaReturn = mIPA->setQuota(upstream.c_str(), limit);
- if(ipaReturn == RET::FAIL_TRY_AGAIN) {
- ipaReturn = RET::SUCCESS;
- }
- BoolResult res = ipaResultToBoolResult(ipaReturn);
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- }
-
- mLogs.addLog(fl);
- return Void();
-} /* setDataLimit */
-
-Return<void> HAL::setUpstreamParameters
-(
- const hidl_string& iface,
- const hidl_string& v4Addr,
- const hidl_string& v4Gw,
- const hidl_vec<hidl_string>& v6Gws,
- setUpstreamParameters_cb hidl_cb
-) {
- vector<string> v6GwStrs = convertHidlStrToStdStr(v6Gws);
-
- LocalLogBuffer::FunctionLog fl(__func__);
- fl.addArg("iface", iface);
- fl.addArg("v4Addr", v4Addr);
- fl.addArg("v4Gw", v4Gw);
- fl.addArg("v6Gws", v6GwStrs);
-
- PrefixParser v4AddrParser;
- PrefixParser v4GwParser;
- PrefixParser v6GwParser;
-
- /* @TODO maybe we should enforce that these addresses and gateways are fully
- * qualified here. But then, how do we allow them to be empty/null as well
- * while still preserving a sane API on PrefixParser?
- */
- if (!isInitialized()) {
- BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)");
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- } else if (!v4AddrParser.addV4(v4Addr) && !v4Addr.empty()) {
- BoolResult res = makeInputCheckFailure(v4AddrParser.getLastErrAsStr());
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- } else if (!v4GwParser.addV4(v4Gw) && !v4Gw.empty()) {
- BoolResult res = makeInputCheckFailure(v4GwParser.getLastErrAsStr());
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- } else if (v6GwStrs.size() >= 1 && !v6GwParser.addV6(v6GwStrs)) {
- BoolResult res = makeInputCheckFailure(v6GwParser.getLastErrAsStr());
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- } else if (iface.size()>= 1) {
- RET ipaReturn = mIPA->setUpstream(
- iface.c_str(),
- v4GwParser.getFirstPrefix(),
- v6GwParser.getFirstPrefix());
- BoolResult res = ipaResultToBoolResult(ipaReturn);
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- } else {
- /* send NULL iface string when upstream down */
- RET ipaReturn = mIPA->setUpstream(
- NULL,
- v4GwParser.getFirstPrefix(IP_FAM::V4),
- v6GwParser.getFirstPrefix(IP_FAM::V6));
- BoolResult res = ipaResultToBoolResult(ipaReturn);
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- }
-
- mLogs.addLog(fl);
- return Void();
-} /* setUpstreamParameters */
-
-Return<void> HAL::addDownstream
-(
- const hidl_string& iface,
- const hidl_string& prefix,
- addDownstream_cb hidl_cb
-) {
- LocalLogBuffer::FunctionLog fl(__func__);
- fl.addArg("iface", iface);
- fl.addArg("prefix", prefix);
-
- PrefixParser prefixParser;
-
- if (!isInitialized()) {
- BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)");
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- }
- else if (!prefixParser.add(prefix)) {
- BoolResult res = makeInputCheckFailure(prefixParser.getLastErrAsStr());
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- } else {
- RET ipaReturn = mIPA->addDownstream(
- iface.c_str(),
- prefixParser.getFirstPrefix());
- BoolResult res = ipaResultToBoolResult(ipaReturn);
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- }
-
- mLogs.addLog(fl);
- return Void();
-} /* addDownstream */
-
-Return<void> HAL::removeDownstream
-(
- const hidl_string& iface,
- const hidl_string& prefix,
- removeDownstream_cb hidl_cb
-) {
- LocalLogBuffer::FunctionLog fl(__func__);
- fl.addArg("iface", iface);
- fl.addArg("prefix", prefix);
-
- PrefixParser prefixParser;
-
- if (!isInitialized()) {
- BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)");
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- }
- else if (!prefixParser.add(prefix)) {
- BoolResult res = makeInputCheckFailure(prefixParser.getLastErrAsStr());
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- } else {
- RET ipaReturn = mIPA->removeDownstream(
- iface.c_str(),
- prefixParser.getFirstPrefix());
- BoolResult res = ipaResultToBoolResult(ipaReturn);
- hidl_cb(res.success, res.errMsg);
- fl.setResult(res.success, res.errMsg);
- }
-
- mLogs.addLog(fl);
- return Void();
-} /* removeDownstream */
diff --git a/data-ipa-cfg-mgr/hal/src/IpaEventRelay.cpp b/data-ipa-cfg-mgr/hal/src/IpaEventRelay.cpp
deleted file mode 100644
index 788b152..0000000
--- a/data-ipa-cfg-mgr/hal/src/IpaEventRelay.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#define LOG_TAG "IPAHALService/IpaEventRelay"
-/* External Includes */
-#include <cutils/log.h>
-
-/* HIDL Includes */
-#include <android/hardware/tetheroffload/control/1.0/ITetheringOffloadCallback.h>
-
-/* Internal Includes */
-#include "IpaEventRelay.h"
-
-/* Namespace pollution avoidance */
-using ::android::hardware::tetheroffload::control::V1_0::ITetheringOffloadCallback;
-using ::android::hardware::tetheroffload::control::V1_0::OffloadCallbackEvent;
-
-
-IpaEventRelay::IpaEventRelay(
- const ::android::sp<ITetheringOffloadCallback>& cb) : mFramework(cb) {
-} /* IpaEventRelay */
-
-void IpaEventRelay::onOffloadStarted() {
- ALOGI("onOffloadStarted()");
- mFramework->onEvent(OffloadCallbackEvent::OFFLOAD_STARTED);
-} /* onOffloadStarted */
-
-void IpaEventRelay::onOffloadStopped(StoppedReason reason) {
- ALOGI("onOffloadStopped(%d)", reason);
- switch (reason) {
- case REQUESTED:
- /*
- * No way to communicate this to Framework right now, they make an
- * assumption that offload is stopped when they remove the
- * configuration.
- */
- break;
- case ERROR:
- mFramework->onEvent(OffloadCallbackEvent::OFFLOAD_STOPPED_ERROR);
- break;
- case UNSUPPORTED:
- mFramework->onEvent(OffloadCallbackEvent::OFFLOAD_STOPPED_UNSUPPORTED);
- break;
- default:
- ALOGE("Unknown stopped reason(%d)", reason);
- break;
- }
-} /* onOffloadStopped */
-
-void IpaEventRelay::onOffloadSupportAvailable() {
- ALOGI("onOffloadSupportAvailable()");
- mFramework->onEvent(OffloadCallbackEvent::OFFLOAD_SUPPORT_AVAILABLE);
-} /* onOffloadSupportAvailable */
-
-void IpaEventRelay::onLimitReached() {
- ALOGI("onLimitReached()");
- mFramework->onEvent(OffloadCallbackEvent::OFFLOAD_STOPPED_LIMIT_REACHED);
-} /* onLimitReached */
diff --git a/data-ipa-cfg-mgr/hal/src/LocalLogBuffer.cpp b/data-ipa-cfg-mgr/hal/src/LocalLogBuffer.cpp
deleted file mode 100644
index f556e40..0000000
--- a/data-ipa-cfg-mgr/hal/src/LocalLogBuffer.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#define LOG_TAG "IPAHALService/dump"
-
-/* External Includes */
-#include <cutils/log.h>
-#include <deque>
-#include <string>
-#include <sys/types.h>
-#include <vector>
-
-/* Internal Includes */
-#include "LocalLogBuffer.h"
-
-/* Namespace pollution avoidance */
-using ::std::deque;
-using ::std::string;
-using ::std::vector;
-
-
-LocalLogBuffer::FunctionLog::FunctionLog(string funcName) : mName(funcName) {
- mArgsProvided = false;
-} /* FunctionLog */
-
-LocalLogBuffer::FunctionLog::FunctionLog(const FunctionLog& other) :
- mName(other.mName) {
- mArgsProvided = other.mArgsProvided;
- /* Is this right? How do you copy stringstreams without wizardry? */
- mSSArgs.str(other.mSSArgs.str());
- mSSReturn.str(other.mSSReturn.str());
-} /* FunctionLog */
-
-void LocalLogBuffer::FunctionLog::addArg(string kw, string arg) {
- maybeAddArgsComma();
- mSSArgs << kw << "=" << arg;
-} /* addArg */
-
-void LocalLogBuffer::FunctionLog::addArg(string kw, vector<string> args) {
- maybeAddArgsComma();
- mSSArgs << kw << "=[";
- for (size_t i = 0; i < args.size(); i++) {
- mSSArgs << args[i];
- if (i < (args.size() - 1))
- mSSArgs << ", ";
- }
- mSSArgs << "]";
-} /* addArg */
-
-void LocalLogBuffer::FunctionLog::addArg(string kw, uint64_t arg) {
- maybeAddArgsComma();
- mSSArgs << kw << "=" << arg;
-} /* addArg */
-
-void LocalLogBuffer::FunctionLog::maybeAddArgsComma() {
- if (!mArgsProvided) {
- mArgsProvided = true;
- } else {
- mSSArgs << ", ";
- }
-} /* maybeAddArgsComma */
-
-void LocalLogBuffer::FunctionLog::setResult(bool success, string msg) {
- mSSReturn << "[" << ((success) ? "success" : "failure") << ", " << msg
- << "]";
-} /* setResult */
-
-void LocalLogBuffer::FunctionLog::setResult(vector<unsigned int> ret) {
- mSSReturn << "[";
- for (size_t i = 0; i < ret.size(); i++) {
- mSSReturn << ret[i];
- if (i < (ret.size() - 1))
- mSSReturn << ", ";
- }
- mSSReturn << "]";
-} /* setResult */
-
-void LocalLogBuffer::FunctionLog::setResult(uint64_t rx, uint64_t tx) {
- mSSReturn << "[rx=" << rx << ", tx=" << tx << "]";
-} /* setResult */
-
-string LocalLogBuffer::FunctionLog::toString() {
- stringstream ret;
- ret << mName << "(" << mSSArgs.str() << ") returned " << mSSReturn.str();
- return ret.str();
-} /* toString */
-
-LocalLogBuffer::LocalLogBuffer(string name, int maxLogs) : mName(name),
- mMaxLogs(maxLogs) {
-} /* LocalLogBuffer */
-
-void LocalLogBuffer::addLog(FunctionLog log) {
- while (mLogs.size() > mMaxLogs)
- mLogs.pop_front();
- mLogs.push_back(log);
-} /* addLog */
-
-void LocalLogBuffer::toLogcat() {
- for (size_t i = 0; i < mLogs.size(); i++)
- ALOGD("%s: %s", mName.c_str(), mLogs[i].toString().c_str());
-} /* toLogcat */
diff --git a/data-ipa-cfg-mgr/hal/src/OffloadStatistics.cpp b/data-ipa-cfg-mgr/hal/src/OffloadStatistics.cpp
deleted file mode 100644
index 8f8beb6..0000000
--- a/data-ipa-cfg-mgr/hal/src/OffloadStatistics.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include <string.h>
-#include <sys/types.h>
-
-#include "OffloadStatistics.h"
-
-
-/* ------------------------------ PUBLIC ------------------------------------ */
-OffloadStatistics::OffloadStatistics() {
- this->upstream = "UNSET";
- this->rx = 0;
- this->tx = 0;
-} /* OffloadStatistics */
-
-OffloadStatistics::OffloadStatistics
-(
- std::string upstream
-) {
- this->upstream = upstream;
- this->rx = 0;
- this->tx =0;
-} /* OffloadStatistics */
-
-uint64_t OffloadStatistics::getTotalRxBytes() {
- return rx;
-} /* getTotalRxBytes */
-
-uint64_t OffloadStatistics::getTotalTxBytes() {
- return tx;
-} /* getTotalTxBytes */
diff --git a/data-ipa-cfg-mgr/hal/src/PrefixParser.cpp b/data-ipa-cfg-mgr/hal/src/PrefixParser.cpp
deleted file mode 100644
index ff55147..0000000
--- a/data-ipa-cfg-mgr/hal/src/PrefixParser.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/* External Includes */
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <netinet/ip.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <vector>
-
-/* Internal Includes */
-#include "IOffloadManager.h"
-#include "PrefixParser.h"
-
-/* Avoiding namespace pollution */
-using IP_FAM = ::IOffloadManager::IP_FAM;
-using Prefix = ::IOffloadManager::Prefix;
-
-using ::std::string;
-using ::std::vector;
-
-
-/* ------------------------------ PUBLIC ------------------------------------ */
-PrefixParser::PrefixParser() {
- mLastErr = "No Err";
-} /* PrefixParser */
-
-bool PrefixParser::add(vector<string> in) {
- return add(in, IP_FAM::INVALID);
-} /* add */
-
-bool PrefixParser::add(string in) {
- return add(in, IP_FAM::INVALID);
-} /* add */
-
-bool PrefixParser::addV4(string in) {
- return add(in, IP_FAM::V4);
-} /* addV4 */
-
-bool PrefixParser::addV4(vector<string> in) {
- return add(in, IP_FAM::V4);
-} /* addV4 */
-
-bool PrefixParser::addV6(string in) {
- return add(in, IP_FAM::V6);
-} /* addV6 */
-
-bool PrefixParser::addV6(vector<string> in) {
- for (size_t i = 0; i < in.size(); i++) {
- if (!addV6(in[i]))
- return false;
- }
- return true;
-} /* addV6 */
-
-int PrefixParser::size() {
- return mPrefixes.size();
-} /* size */
-
-bool PrefixParser::allAreFullyQualified() {
- for (size_t i = 0; i < mPrefixes.size(); i++) {
- if (mPrefixes[i].fam == IP_FAM::V4) {
- uint32_t masked = mPrefixes[i].v4Addr & mPrefixes[i].v4Mask;
- if (masked != mPrefixes[i].v4Addr)
- return false;
- } else {
- uint32_t masked[4];
- masked[0] = mPrefixes[i].v6Addr[0] & mPrefixes[i].v6Mask[0];
- masked[1] = mPrefixes[i].v6Addr[1] & mPrefixes[i].v6Mask[1];
- masked[2] = mPrefixes[i].v6Addr[2] & mPrefixes[i].v6Mask[2];
- masked[3] = mPrefixes[i].v6Addr[3] & mPrefixes[i].v6Mask[3];
- for (int j = 0; j < 4; j++) {
- if (masked[j] != mPrefixes[i].v6Addr[j])
- return false;
- }
- }
- }
- return true;
-} /* allAreFullyQualified */
-
-Prefix PrefixParser::getFirstPrefix() {
- if (size() >= 1)
- return mPrefixes[0];
- return makeBlankPrefix(IP_FAM::INVALID);
-} /* getFirstPrefix */
-
-Prefix PrefixParser::getFirstPrefix(IP_FAM famHint) {
- if (size() >= 1)
- return mPrefixes[0];
- return makeBlankPrefix(famHint);
-} /* getFirstPrefix */
-
-string PrefixParser::getLastErrAsStr() {
- return mLastErr;
-} /* getLastErrAsStr */
-
-
-/* ------------------------------ PRIVATE ----------------------------------- */
-bool PrefixParser::add(vector<string> in, IP_FAM famHint) {
- if (in.size() == 0)
- return false;
-
- for (size_t i = 0; i < in.size(); i++) {
- if (!add(in[i], famHint))
- return false;
- }
- return true;
-} /* add */
-
-bool PrefixParser::add(string in, IP_FAM famHint) {
- if (in.length() == 0) {
- mLastErr = "Failed to parse string, length = 0...";
- return false;
- }
-
- if (famHint == IP_FAM::INVALID)
- famHint = guessIPFamily(in);
-
- string subnet;
- string addr;
-
- if (!splitIntoAddrAndMask(in, addr, subnet)) {
- mLastErr = "Failed to split into Address and Mask(" + in + ")";
- return false;
- }
-
- int mask = parseSubnetMask(subnet, famHint);
- if (!isMaskValid(mask, famHint)) {
- mLastErr = "Invalid mask";
- return false;
- }
-
- Prefix pre = makeBlankPrefix(famHint);
-
- if (famHint == IP_FAM::V4) {
- if (!parseV4Addr(addr, pre)) {
- mLastErr = "Failed to parse V4 Address(" + addr + ")";
- return false;
- }
- } else if (!parseV6Addr(addr, pre)) {
- mLastErr = "Failed to parse V6 Address(" + addr + ")";
- return false;
- }
-
- if (famHint == IP_FAM::V4 && !populateV4Mask(mask, pre)) {
- mLastErr = "Failed to populate IPv4 Mask(" + std::to_string(mask)
- + ", " + addr + ")";
- return false;
- } else if (!populateV6Mask(mask, pre)) {
- mLastErr = "Failed to populate IPv6 Mask(" + std::to_string(mask)
- + ", " + addr + ")";
- return false;
- }
-
- mPrefixes.push_back(pre);
- return true;
-} /* add */
-
-/* Assumption (based on man inet_pton)
- *
- * X represents a hex character
- * d represents a base 10 digit
- * / represents the start of the subnet mask
- * (assume that it can be left off of all below combinations)
- *
- * IPv4 Addresses always look like the following:
- * ddd.ddd.ddd.ddd/dd
- *
- * IPv6 Addresses can look a few different ways:
- * x:x:x:x:x:x:x:x/ddd
- * x::x/ddd
- * x:x:x:x:x:x:d.d.d.d/ddd
- *
- * Therefore, if a presentation of an IP Address contains a colon, then it
- * may not be a valid IPv6, but, it is definitely not valid IPv4. If a
- * presentation of an IP Address does not contain a colon, then it may not be
- * a valid IPv4, but, it is definitely not IPv6.
- */
-IP_FAM PrefixParser::guessIPFamily(string in) {
- size_t found = in.find(":");
- if (found != string::npos)
- return IP_FAM::V6;
- return IP_FAM::V4;
-} /* guessIPFamily */
-
-bool PrefixParser::splitIntoAddrAndMask(string in, string &addr, string &mask) {
- size_t pos = in.find("/");
-
- if (pos != string::npos && pos >= 1) {
- /* addr is now everything up until the first / */
- addr = in.substr(0, pos);
- } else if (pos == string::npos) {
- /* There is no /, so the entire input is an address */
- addr = in;
- } else {
- /* There was nothing before the /, not recoverable */
- return false;
- }
-
- if (pos != string::npos && pos < in.size()) {
- /* There is a / and it is not the last character. Everything after /
- * must be the subnet.
- */
- mask = in.substr(pos + 1);
- } else if (pos != string::npos && pos == in.size()) {
- /* There is a /, but it is the last character. This is garbage, but,
- * we may still be able to interpret the address so we will throw it
- * out.
- */
- mask = "";
- } else if (pos == string::npos) {
- /* There is no /, therefore, there is no subnet */
- mask = "";
- } else {
- /* This really shouldn't be possible because it would imply that find
- * returned a position larger than the size of the input. Just
- * preserving sanity that mask is always initialized.
- */
- mask = "";
- }
-
- return true;
-} /* splitIntoAddrAndMask */
-
-int PrefixParser::parseSubnetMask(string in, IP_FAM famHint) {
- if (in.empty())
- /* Treat no subnet mask as fully qualified */
- return (famHint == IP_FAM::V6) ? 128 : 32;
- return atoi(in.c_str());
-} /* parseSubnetMask */
-
-bool PrefixParser::parseV4Addr(string in, Prefix &out) {
- struct sockaddr_in sa;
-
- int ret = inet_pton(AF_INET, in.c_str(), &(sa.sin_addr));
-
- if (ret < 0) {
- /* errno would be valid */
- return false;
- } else if (ret == 0) {
- /* input was not a valid IP address */
- return false;
- }
-
- /* Address in network byte order */
- out.v4Addr = htonl(sa.sin_addr.s_addr);
- return true;
-} /* parseV4Addr */
-
-bool PrefixParser::parseV6Addr(string in, Prefix &out) {
- struct sockaddr_in6 sa;
-
- int ret = inet_pton(AF_INET6, in.c_str(), &(sa.sin6_addr));
-
- if (ret < 0) {
- /* errno would be valid */
- return false;
- } else if (ret == 0) {
- /* input was not a valid IP address */
- return false;
- }
-
- /* Translate unsigned chars to unsigned ints to match IPA
- *
- * TODO there must be a better way to do this beyond bit fiddling
- * Maybe a Union since we've already made the assumption that the data
- * structures match?
- */
- out.v6Addr[0] = (sa.sin6_addr.s6_addr[0] << 24) |
- (sa.sin6_addr.s6_addr[1] << 16) |
- (sa.sin6_addr.s6_addr[2] << 8) |
- (sa.sin6_addr.s6_addr[3]);
- out.v6Addr[1] = (sa.sin6_addr.s6_addr[4] << 24) |
- (sa.sin6_addr.s6_addr[5] << 16) |
- (sa.sin6_addr.s6_addr[6] << 8) |
- (sa.sin6_addr.s6_addr[7]);
- out.v6Addr[2] = (sa.sin6_addr.s6_addr[8] << 24) |
- (sa.sin6_addr.s6_addr[9] << 16) |
- (sa.sin6_addr.s6_addr[10] << 8) |
- (sa.sin6_addr.s6_addr[11]);
- out.v6Addr[3] = (sa.sin6_addr.s6_addr[12] << 24) |
- (sa.sin6_addr.s6_addr[13] << 16) |
- (sa.sin6_addr.s6_addr[14] << 8) |
- (sa.sin6_addr.s6_addr[15]);
- return true;
-} /* parseV6Addr */
-
-bool PrefixParser::populateV4Mask(int mask, Prefix &out) {
- if (mask < 0 || mask > 32)
- return false;
- out.v4Mask = createMask(mask);
- return true;
-} /* populateV4Mask */
-
-bool PrefixParser::populateV6Mask(int mask, Prefix &out) {
- if (mask < 0 || mask > 128)
- return false;
-
- for (int i = 0; i < 4; i++) {
- out.v6Mask[i] = createMask(mask);
- mask = (mask > 32) ? mask - 32 : 0;
- }
-
- return true;
-} /* populateV6Mask */
-
-uint32_t PrefixParser::createMask(int mask) {
- uint32_t ret = 0;
-
- if (mask >= 32) {
- ret = ~ret;
- return ret;
- }
-
- for (int i = 0; i < 32; i++) {
- if (i < mask)
- ret = (ret << 1) | 1;
- else
- ret = (ret << 1);
- }
-
- return ret;
-} /* createMask */
-
-Prefix PrefixParser::makeBlankPrefix(IP_FAM famHint) {
- Prefix ret;
-
- ret.fam = famHint;
-
- ret.v4Addr = 0;
- ret.v4Mask = 0;
-
- ret.v6Addr[0] = 0;
- ret.v6Addr[1] = 0;
- ret.v6Addr[2] = 0;
- ret.v6Addr[3] = 0;
-
- ret.v6Mask[0] = 0;
- ret.v6Mask[1] = 0;
- ret.v6Mask[2] = 0;
- ret.v6Mask[3] = 0;
-
- return ret;
-} /* makeBlankPrefix */
-
-bool PrefixParser::isMaskValid(int mask, IP_FAM fam) {
- if (mask < 0) {
- mLastErr = "Failed parse subnet mask(" + std::to_string(mask) + ")";
- return false;
- } else if (mask == 0) {
- mLastErr = "Subnet mask cannot be 0(" + std::to_string(mask) + ")";
- return false;
- } else if (fam == IP_FAM::V4 && mask > 32) {
- mLastErr = "Interpreted address as V4 but mask was too large("
- + std::to_string(mask) + ")";
- return false;
- } else if (fam == IP_FAM::V6 && mask > 128) {
- mLastErr = "Interpreted address as V6 but mask was too large("
- + std::to_string(mask) + ")";
- return false;
- }
-
- return true;
-} /* isMaskValid */