blob: b13970c386c3d0ed545a9e3c650e8aac041a9901 [file] [log] [blame]
Sreeram Ramachandranf4f6c8d2014-06-23 09:54:06 -07001/*
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 */
Ken Chend15bcfc2020-12-04 00:08:54 +080016#define LOG_TAG "Netd"
Sreeram Ramachandranf4f6c8d2014-06-23 09:54:06 -070017
18#include "Network.h"
19
Ken Chen1a3a3272020-12-04 04:03:08 +080020#include "RouteController.h"
21#include "SockDiag.h"
Sreeram Ramachandranf4f6c8d2014-06-23 09:54:06 -070022#include "log/log.h"
23
Erik Kline2d3a1632016-03-15 16:33:48 +090024#include <android-base/strings.h>
25#include <sstream>
26
Lorenzo Colitti7035f222017-02-13 18:29:00 +090027namespace android {
28namespace net {
29
Sreeram Ramachandranf4f6c8d2014-06-23 09:54:06 -070030Network::~Network() {
31 if (!mInterfaces.empty()) {
32 ALOGE("deleting network with netId %u without clearing its interfaces", mNetId);
33 }
34}
35
Sreeram Ramachandrane09b20a2014-07-05 17:15:14 -070036unsigned Network::getNetId() const {
37 return mNetId;
38}
39
Sreeram Ramachandranf4f6c8d2014-06-23 09:54:06 -070040bool Network::hasInterface(const std::string& interface) const {
41 return mInterfaces.find(interface) != mInterfaces.end();
42}
43
Sreeram Ramachandran48e19b02014-07-22 22:23:20 -070044const std::set<std::string>& Network::getInterfaces() const {
45 return mInterfaces;
46}
47
Sreeram Ramachandranf4f6c8d2014-06-23 09:54:06 -070048int Network::clearInterfaces() {
49 while (!mInterfaces.empty()) {
50 // Make a copy of the string, so removeInterface() doesn't lose its parameter when it
51 // removes the string from the set.
52 std::string interface = *mInterfaces.begin();
53 if (int ret = removeInterface(interface)) {
54 return ret;
55 }
56 }
57 return 0;
58}
Sreeram Ramachandran89dad012014-07-02 10:09:49 -070059
Erik Kline2d3a1632016-03-15 16:33:48 +090060std::string Network::toString() const {
61 const char kSeparator[] = " ";
62 std::stringstream repr;
63
Ken Chen2f661522021-03-30 19:41:49 +080064 repr << mNetId << kSeparator << getTypeString();
Erik Kline2d3a1632016-03-15 16:33:48 +090065
66 if (mInterfaces.size() > 0) {
67 repr << kSeparator << android::base::Join(mInterfaces, ",");
68 }
69
70 return repr.str();
71}
72
Ken Chen8e0ba5a2021-06-11 03:29:45 +080073std::string Network::uidRangesToString() const {
74 if (mUidRangeMap.empty()) {
75 return "";
76 }
77
78 std::ostringstream result;
79 for (auto it = mUidRangeMap.begin(); it != mUidRangeMap.end(); ++it) {
80 result << "prio " << it->first << " " << it->second.toString();
81 if (std::next(it) != mUidRangeMap.end()) result << "; ";
82 }
83 return result.str();
84}
85
Ken Chen0c209f82022-12-22 15:11:39 +080086std::string Network::allowedUidsToString() const {
Ken Chen04ee6092022-12-26 17:35:33 +080087 if (!mAllowedUids) {
Ken Chen0c209f82022-12-22 15:11:39 +080088 return "unrestricted";
89 }
Ken Chen04ee6092022-12-26 17:35:33 +080090 return mAllowedUids->toString();
Ken Chen0c209f82022-12-22 15:11:39 +080091}
92
Ken Chen4ea88462021-05-23 14:56:43 +080093// Check if the user has been added to this network. If yes, the highest priority of matching
94// setting is returned by subPriority. Thus caller can make choice among several matching
95// networks.
Ken Chen53360bf2021-12-10 02:41:05 +080096bool Network::appliesToUser(uid_t uid, int32_t* subPriority) const {
Ken Chen4ea88462021-05-23 14:56:43 +080097 for (const auto& [priority, uidRanges] : mUidRangeMap) {
98 if (uidRanges.hasUid(uid)) {
99 *subPriority = priority;
100 return true;
101 }
Ken Chen868ae632021-02-24 17:50:08 +0800102 }
103 return false;
104}
105
Ken Chen53360bf2021-12-10 02:41:05 +0800106void Network::addToUidRangeMap(const UidRanges& uidRanges, int32_t subPriority) {
Ken Chen4ea88462021-05-23 14:56:43 +0800107 auto iter = mUidRangeMap.find(subPriority);
108 if (iter != mUidRangeMap.end()) {
109 iter->second.add(uidRanges);
110 } else {
111 mUidRangeMap[subPriority] = uidRanges;
112 }
113}
114
Ken Chen53360bf2021-12-10 02:41:05 +0800115void Network::removeFromUidRangeMap(const UidRanges& uidRanges, int32_t subPriority) {
Ken Chen4ea88462021-05-23 14:56:43 +0800116 auto iter = mUidRangeMap.find(subPriority);
117 if (iter != mUidRangeMap.end()) {
118 iter->second.remove(uidRanges);
119 if (iter->second.empty()) {
120 mUidRangeMap.erase(subPriority);
121 }
122 } else {
Ken Chen53360bf2021-12-10 02:41:05 +0800123 ALOGW("uidRanges with priority %d not found", subPriority);
Ken Chen4ea88462021-05-23 14:56:43 +0800124 }
125}
126
Ken Chen0c209f82022-12-22 15:11:39 +0800127void Network::clearAllowedUids() {
Ken Chen04ee6092022-12-26 17:35:33 +0800128 mAllowedUids.reset();
Ken Chen0c209f82022-12-22 15:11:39 +0800129}
130
131void Network::setAllowedUids(const UidRanges& uidRanges) {
Ken Chen04ee6092022-12-26 17:35:33 +0800132 mAllowedUids = uidRanges;
Ken Chen0c209f82022-12-22 15:11:39 +0800133}
134
135bool Network::isUidAllowed(uid_t uid) {
Ken Chen04ee6092022-12-26 17:35:33 +0800136 return !mAllowedUids || mAllowedUids->hasUid(uid);
Ken Chen0c209f82022-12-22 15:11:39 +0800137}
138
chiachangwang65bc4ea2022-09-07 08:10:30 +0000139bool Network::canAddUidRanges(const UidRanges& uidRanges) const {
Ken Chen4ea88462021-05-23 14:56:43 +0800140 if (uidRanges.overlapsSelf()) {
141 ALOGE("uid range %s overlaps self", uidRanges.toString().c_str());
142 return false;
143 }
144
Ken Chen4ea88462021-05-23 14:56:43 +0800145 return true;
146}
147
Ken Chen1a3a3272020-12-04 04:03:08 +0800148bool Network::isSecure() const {
149 return mSecure;
150}
151
152Network::Network(unsigned netId, bool secure) : mNetId(netId), mSecure(secure) {}
153
Lorenzo Colitti7035f222017-02-13 18:29:00 +0900154} // namespace net
155} // namespace android