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