1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include "NetdConstants.h" 20 #include "UidRanges.h" 21 22 #include <set> 23 #include <string> 24 25 namespace android::net { 26 27 typedef std::map<uint32_t, UidRanges> UidRangeMap; 28 29 // A Network represents a collection of interfaces participating as a single administrative unit. 30 class Network { 31 public: 32 // You MUST ensure that no interfaces are still assigned to this network, say by calling 33 // clearInterfaces(), before deleting it. This is because interface removal may fail. If we 34 // automatically removed interfaces in the destructor, you wouldn't know if it failed. 35 virtual ~Network(); 36 37 virtual std::string getTypeString() const = 0; 38 unsigned getNetId() const; 39 40 bool hasInterface(const std::string& interface) const; 41 const std::set<std::string>& getInterfaces() const; 42 43 // These return 0 on success or negative errno on failure. addInterface(const std::string &)44 [[nodiscard]] virtual int addInterface(const std::string&) { return -EINVAL; } removeInterface(const std::string &)45 [[nodiscard]] virtual int removeInterface(const std::string&) { return -EINVAL; } 46 [[nodiscard]] int clearInterfaces(); 47 48 std::string toString() const; 49 std::string uidRangesToString() const; 50 bool appliesToUser(uid_t uid, uint32_t* subPriority) const; addUsers(const UidRanges &,uint32_t)51 [[nodiscard]] virtual int addUsers(const UidRanges&, uint32_t /*subPriority*/) { 52 return -EINVAL; 53 }; removeUsers(const UidRanges &,uint32_t)54 [[nodiscard]] virtual int removeUsers(const UidRanges&, uint32_t /*subPriority*/) { 55 return -EINVAL; 56 }; 57 bool isSecure() const; isPhysical()58 virtual bool isPhysical() { return false; } isUnreachable()59 virtual bool isUnreachable() { return false; } isVirtual()60 virtual bool isVirtual() { return false; } canAddUsers()61 virtual bool canAddUsers() { return false; } isValidSubPriority(uint32_t)62 virtual bool isValidSubPriority(uint32_t /*priority*/) { return false; } 63 virtual void addToUidRangeMap(const UidRanges& uidRanges, uint32_t subPriority); 64 virtual void removeFromUidRangeMap(const UidRanges& uidRanges, uint32_t subPriority); 65 66 protected: 67 explicit Network(unsigned netId, bool mSecure = false); 68 bool canAddUidRanges(const UidRanges& uidRanges, uint32_t subPriority) const; 69 70 const unsigned mNetId; 71 std::set<std::string> mInterfaces; 72 // Each subsidiary priority maps to a set of UID ranges of a feature. 73 std::map<uint32_t, UidRanges> mUidRangeMap; 74 const bool mSecure; 75 76 private: 77 enum Action { 78 REMOVE, 79 ADD, 80 }; 81 }; 82 83 } // namespace android::net 84