/*
 * 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.
 */
#pragma once

#include "result.h"

#include <linux/if_ether.h>
#include <netinet/in.h>

#include <string>

// A class representing a network interface. The class provides useful
// functionality to configure and query the network interface.
class Interface {
public:
    Interface();
    ~Interface();
    Result init(const char* interfaceName);

    // Returns the interface index indicated by the system
    unsigned int getIndex() const { return mIndex; }
    // Get the MAC address of the interface
    const uint8_t (&getMacAddress() const)[ETH_ALEN] { return mMacAddress; }
    // Get the name of the interface
    const std::string& getName() const { return mInterfaceName; }

    Result bringUp();
    Result bringDown();
    Result setMtu(uint16_t mtu);
    Result setAddress(in_addr_t address);
    Result setSubnetMask(in_addr_t subnetMask);

private:
    struct ifreq createRequest() const;
    Result populateIndex();
    Result populateMacAddress();
    Result setInterfaceUp(bool shouldBeUp);

    std::string mInterfaceName;
    int mSocketFd;
    unsigned int mIndex;
    uint8_t mMacAddress[ETH_ALEN];
};