1f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran/*
2f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * Copyright (C) 2014 The Android Open Source Project
3f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran *
4f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * Licensed under the Apache License, Version 2.0 (the "License");
5f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * you may not use this file except in compliance with the License.
6f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * You may obtain a copy of the License at
7f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran *
8f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran *      http://www.apache.org/licenses/LICENSE-2.0
9f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran *
10f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * Unless required by applicable law or agreed to in writing, software
11f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * distributed under the License is distributed on an "AS IS" BASIS,
12f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * See the License for the specific language governing permissions and
14f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran * limitations under the License.
15f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran */
16f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran
17f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran#ifndef NETD_SERVER_NETWORK_H
18f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran#define NETD_SERVER_NETWORK_H
19f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran
20f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran#include "NetdConstants.h"
21f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran
22f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran#include <set>
23f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran#include <string>
24f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran
25f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran// A Network represents a collection of interfaces participating as a single administrative unit.
26f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandranclass Network {
27f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandranpublic:
2836ed53e37b2639681055b2d3d8777241e7dd6982Sreeram Ramachandran    enum Type {
296a773534e7f8541f221f27fb8063af079b1a5936Sreeram Ramachandran        LOCAL,
3036ed53e37b2639681055b2d3d8777241e7dd6982Sreeram Ramachandran        PHYSICAL,
3136ed53e37b2639681055b2d3d8777241e7dd6982Sreeram Ramachandran        VIRTUAL,
3236ed53e37b2639681055b2d3d8777241e7dd6982Sreeram Ramachandran    };
3336ed53e37b2639681055b2d3d8777241e7dd6982Sreeram Ramachandran
34f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    // You MUST ensure that no interfaces are still assigned to this network, say by calling
35f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    // clearInterfaces(), before deleting it. This is because interface removal may fail. If we
36f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    // automatically removed interfaces in the destructor, you wouldn't know if it failed.
37f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    virtual ~Network();
38f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran
3936ed53e37b2639681055b2d3d8777241e7dd6982Sreeram Ramachandran    virtual Type getType() const = 0;
40e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran    unsigned getNetId() const;
4136ed53e37b2639681055b2d3d8777241e7dd6982Sreeram Ramachandran
42f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    bool hasInterface(const std::string& interface) const;
4348e19b037e7e20674048ef76bf31ce65c741347cSreeram Ramachandran    const std::set<std::string>& getInterfaces() const;
44f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran
45f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    // These return 0 on success or negative errno on failure.
46f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    virtual int addInterface(const std::string& interface) WARN_UNUSED_RESULT = 0;
47f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    virtual int removeInterface(const std::string& interface) WARN_UNUSED_RESULT = 0;
48f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    int clearInterfaces() WARN_UNUSED_RESULT;
49f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran
50f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandranprotected:
5189dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran    explicit Network(unsigned netId);
5289dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran
53f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    const unsigned mNetId;
54f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran    std::set<std::string> mInterfaces;
55f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran};
56f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran
57f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran#endif  // NETD_SERVER_NETWORK_H
58