summaryrefslogtreecommitdiff
path: root/server/NetworkController.cpp
diff options
context:
space:
mode:
authorErik Kline <ek@google.com>2015-06-25 18:24:46 +0900
committerErik Kline <ek@google.com>2015-07-06 09:18:12 +0900
commitcea2d3455eb7c0d9ad1430607cbe98cc09251c1f (patch)
tree15f4c089c1edf5fe8210f81a999ef9eaf6c732ec /server/NetworkController.cpp
parentfeb2b61d3010d52e530357116c3b22c6d77da3cf (diff)
Use struct android_net_context when interfacing with bionic
Add a new NetworkController::getNetworkContext() that builds the contents of a struct net_context out of getNetworkForConnect() and getNetworkForDns(). Bug: 19470192 Bug: 20733156 Bug: 21832279 Change-Id: I5a69b0413a83d33be28b78c0a99359b109517a8f
Diffstat (limited to 'server/NetworkController.cpp')
-rw-r--r--server/NetworkController.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/server/NetworkController.cpp b/server/NetworkController.cpp
index 76e4a6af..93a07638 100644
--- a/server/NetworkController.cpp
+++ b/server/NetworkController.cpp
@@ -237,6 +237,30 @@ unsigned NetworkController::getNetworkForConnect(uid_t uid) const {
return mDefaultNetId;
}
+void NetworkController::getNetworkContext(
+ unsigned netId, uid_t uid, struct android_net_context* netcontext) const {
+ struct android_net_context nc = {
+ .app_netid = netId,
+ .app_mark = MARK_UNSET,
+ .dns_netid = netId,
+ .dns_mark = MARK_UNSET,
+ .uid = uid,
+ };
+
+ if (nc.app_netid == NETID_UNSET) {
+ nc.app_netid = getNetworkForConnect(uid);
+ }
+ Fwmark fwmark;
+ fwmark.netId = nc.app_netid;
+ nc.app_mark = fwmark.intValue;
+
+ nc.dns_mark = getNetworkForDns(&(nc.dns_netid), uid);
+
+ if (netcontext) {
+ *netcontext = nc;
+ }
+}
+
unsigned NetworkController::getNetworkForInterface(const char* interface) const {
android::RWLock::AutoRLock lock(mRWLock);
for (const auto& entry : mNetworks) {