1d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker/* 2d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * Copyright (C) 2013 The Android Open Source Project 3d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * 4d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * Licensed under the Apache License, Version 2.0 (the "License"); 5d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * you may not use this file except in compliance with the License. 6d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * You may obtain a copy of the License at 7d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * 8d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * http://www.apache.org/licenses/LICENSE-2.0 9d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * 10d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * Unless required by applicable law or agreed to in writing, software 11d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * distributed under the License is distributed on an "AS IS" BASIS, 12d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * See the License for the specific language governing permissions and 14d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker * limitations under the License. 15d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker */ 16d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker 17d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker#include "UidMarkMap.h" 18d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker 19d2617936acc15567fc5111bbdb4dde20845c3cbaChad BrubakerUidMarkMap::UidMarkEntry::UidMarkEntry(int start, int end, int new_mark) : 20d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker uid_start(start), 21d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker uid_end(end), 22d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker mark(new_mark) { 23d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker}; 24d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker 25d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubakerbool UidMarkMap::add(int uid_start, int uid_end, int mark) { 26d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker android::RWLock::AutoWLock lock(mRWLock); 27d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker if (uid_start > uid_end) { 28d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker return false; 29d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker } 30d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker android::netd::List<UidMarkEntry*>::iterator it; 31d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker for (it = mMap.begin(); it != mMap.end(); it++) { 32d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker UidMarkEntry *entry = *it; 33d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker if (entry->uid_start <= uid_end && uid_start <= entry->uid_end) { 34d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker return false; 35d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker } 36d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker } 37d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker 38d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker UidMarkEntry *e = new UidMarkEntry(uid_start, uid_end, mark); 39d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker mMap.push_back(e); 40d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker return true; 41d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker}; 42d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker 43d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubakerbool UidMarkMap::remove(int uid_start, int uid_end, int mark) { 44d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker android::RWLock::AutoWLock lock(mRWLock); 45d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker android::netd::List<UidMarkEntry*>::iterator it; 46d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker for (it = mMap.begin(); it != mMap.end(); it++) { 47d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker UidMarkEntry *entry = *it; 48d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker if (entry->uid_start == uid_start && entry->uid_end == uid_end && entry->mark == mark) { 49d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker mMap.erase(it); 50d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker delete entry; 51d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker return true; 52d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker } 53d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker } 54d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker return false; 55d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker}; 56d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker 57d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubakerint UidMarkMap::getMark(int uid) { 58d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker android::RWLock::AutoRLock lock(mRWLock); 59d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker android::netd::List<UidMarkEntry*>::iterator it; 60d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker for (it = mMap.begin(); it != mMap.end(); it++) { 61d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker UidMarkEntry *entry = *it; 62d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker if (entry->uid_start <= uid && entry->uid_end >= uid) { 63d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker return entry->mark; 64d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker } 65d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker } 66d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker return -1; 67d2617936acc15567fc5111bbdb4dde20845c3cbaChad Brubaker}; 682251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker 692251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubakerbool UidMarkMap::anyRulesForMark(int mark) { 702251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker android::RWLock::AutoRLock lock(mRWLock); 712251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker android::netd::List<UidMarkEntry*>::iterator it; 722251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker for (it = mMap.begin(); it != mMap.end(); it++) { 732251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker UidMarkEntry *entry = *it; 742251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (entry->mark == mark) { 752251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker return true; 762251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 772251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 782251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker return false; 792251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker} 80