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