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 DBG 30582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel #define DBG false 31582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#endif /* DBG */ 32582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#define LOG_TAG "IPAHALService/CtUpdateAmbassador" 33582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 34582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel/* External Includes */ 35582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#include <arpa/inet.h> 36582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#include <cutils/log.h> 37582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 38582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel/* HIDL Includes */ 39582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#include <android/hardware/tetheroffload/control/1.0/ITetheringOffloadCallback.h> 40582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 41582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel/* Internal Includes */ 42582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel#include "CtUpdateAmbassador.h" 43582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 44582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel/* Namespace pollution avoidance */ 45582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelusing ::android::hardware::tetheroffload::control::V1_0::ITetheringOffloadCallback; 46582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelusing ::android::hardware::tetheroffload::control::V1_0::NetworkProtocol; 47582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelusing HALIpAddrPortPair = ::android::hardware::tetheroffload::control::V1_0::IPv4AddrPortPair; 48582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelusing HALNatTimeoutUpdate = ::android::hardware::tetheroffload::control::V1_0::NatTimeoutUpdate; 49582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 50582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelusing IpaIpAddrPortPair = ::IOffloadManager::ConntrackTimeoutUpdater::IpAddrPortPair; 51582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelusing IpaNatTimeoutUpdate = ::IOffloadManager::ConntrackTimeoutUpdater::NatTimeoutUpdate; 52582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelusing IpaL4Protocol = ::IOffloadManager::ConntrackTimeoutUpdater::L4Protocol; 53582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 54582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 55582b9e5c388f74eeafad876c81492c81bf1f3945Thierry StrudelCtUpdateAmbassador::CtUpdateAmbassador( 56582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel const ::android::sp<ITetheringOffloadCallback>& cb) : mFramework(cb) { 57582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel} /* CtUpdateAmbassador */ 58582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 59582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelvoid CtUpdateAmbassador::updateTimeout(IpaNatTimeoutUpdate in) { 60582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel if (DBG) { 61582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel ALOGD("updateTimeout(src={%#010X, %#04X}, dest={%#010X, %#04X}, Proto=%d)", 62582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel in.src.ipAddr, in.src.port, in.dst.ipAddr, in.dst.port, 63582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel in.proto); 64582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel } 65582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel HALNatTimeoutUpdate out; 66582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel if (!translate(in, out)) { 67582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /* Cannot log the input outside of DBG flag because it contains sensitive 68582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * information. This will lead to a two step debug if the information 69582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * cannot be gleaned from IPACM logs. The other option is to improve this 70582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * with the use of our local log. That would likely still be hard to 71582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * instruct testers to collect logs, because, assuming timeout updates 72582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * are numerous, it will overrun the ring quickly. Therefore, the tester 73582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * would have to know the exact moment as issue occurred. Or we make the 74582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * ring massive. This would lead to a significant memory overhead. 75582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * Because of this overhead, we would likely not want to check in a change 76582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * with it and once we provide a debug build for increasing buffer size, 77582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * why not just define the DBG flag? 78582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 79582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel ALOGE("Failed to translate timeout event :("); 80582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel } else { 81582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel mFramework->updateTimeout(out); 82582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel } 83582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel} /* updateTimeout */ 84582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 85582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelbool CtUpdateAmbassador::translate(IpaNatTimeoutUpdate in, HALNatTimeoutUpdate &out) { 86582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel return translate(in.src, out.src) 87582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel && translate(in.dst, out.dst) 88582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel && L4ToNetwork(in.proto, out.proto); 89582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel} /* translate */ 90582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 91582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelbool CtUpdateAmbassador::translate(IpaIpAddrPortPair in, HALIpAddrPortPair& out) { 92582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel char ipAddrStr[INET_ADDRSTRLEN]; 93582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 94582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel if (inet_ntop(AF_INET, &(in.ipAddr), ipAddrStr, INET_ADDRSTRLEN) == nullptr) { 95582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel /* errno would be valid here with EAFNOSUPPORT or ENOSPC, neither should really 96582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel * be possible in our scenario though. 97582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel */ 98582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel return false; 99582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel } 100582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 101582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel out.addr = ipAddrStr; 102582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel out.port = in.port; 103582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 104582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel return true; 105582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel} /* translate */ 106582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel 107582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudelbool CtUpdateAmbassador::L4ToNetwork(IpaL4Protocol in, NetworkProtocol &out) { 108582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel bool ret = false; 109582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel switch(in) { 110582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel case IpaL4Protocol::TCP: 111582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel ret = true; 112582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel out = NetworkProtocol::TCP; 113582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel break; 114582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel case IpaL4Protocol::UDP: 115582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel ret = true; 116582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel out = NetworkProtocol::UDP; 117582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel break; 118582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel default: 119582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel ret = false; 120582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel break; 121582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel } 122582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel return ret; 123582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel} /* L4ToNetwork */ 124