/*
 * Copyright 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * tun_interface.h - creates tun or tap interfaces for testing purposes
 */

#ifndef _SYSTEM_NETD_TESTS_TUN_INTERACE_H
#define _SYSTEM_NETD_TESTS_TUN_INTERACE_H

namespace android {
namespace net {

class TunInterface {
public:
    TunInterface() = default;
    ~TunInterface() { destroy(); }

    // Creates a tun or tap interface. Returns 0 on success or -errno on failure. Must succeed
    // before it is legal to call any of the other methods in this class.
    int init(const std::string& ifName, bool isTap);

    // Convenience overloads.
    int init() { return init("", false); }
    int init(const std::string& ifName) { return init(ifName, false); }
    int init(bool isTap) { return init("", isTap); }
    void destroy();

    const std::string& name() const { return mIfName; }
    int ifindex() const { return mIfIndex; }
    const in6_addr& srcAddr() const { return mSrcAddr; }
    const in6_addr& dstAddr() const { return mDstAddr; }

    int addAddress(const std::string& addr, int prefixlen);
    int getFdForTesting() const { return mFd; }

  private:
    int mFd = -1;
    std::string mIfName;
    int mIfIndex;
    in6_addr mSrcAddr, mDstAddr;
};

}  // namespace net
}  // namespace android

#endif
