#include "NetdConstants.h"
#include "NetdNativeService.h"
#include "RouteController.h"
+#include "SockDiag.h"
#include "UidRanges.h"
using android::base::StringPrintf;
android::RWLock::AutoWLock _lock(lock);
#define NETD_BIG_LOCK_RPC(permission) NETD_LOCKING_RPC((permission), gBigNetdLock)
-
} // namespace
// look at routes, but it's not enough here).
NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL);
- UidRanges uidRanges;
- uidRanges.createFrom(uidRangeArray);
+ UidRanges uidRanges(uidRangeArray);
int err;
if (add) {
return binder::Status::ok();
}
+binder::Status NetdNativeService::socketDestroy(const std::vector<UidRange>& uids,
+ const std::vector<int32_t>& skipUids) {
+
+ ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
+
+ SockDiag sd;
+ if (!sd.open()) {
+ return binder::Status::fromServiceSpecificError(EIO,
+ String8("Could not open SOCK_DIAG socket"));
+ }
+
+ UidRanges uidRanges(uids);
+ int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()));
+
+ if (err) {
+ return binder::Status::fromServiceSpecificError(-err,
+ String8::format("destroySockets: %s", strerror(-err)));
+ }
+
+ return binder::Status::ok();
+}
+
} // namespace net
} // namespace android