ClatdController - add mutex annotations
This effectively makes ClatdController single threaded.
Which makes things nice and simple.
Test: atest libbpf_android_test libnetdbpf_test netd_integration_test netd_unit_test netdutils_test resolv_integration_test resolv_unit_test
Bug: 65674744
Change-Id: I352761b6c44c17f9ea0897ea821a826f642659d5
diff --git a/server/ClatdController.h b/server/ClatdController.h
index ceebde6..6bfc0f1 100644
--- a/server/ClatdController.h
+++ b/server/ClatdController.h
@@ -39,19 +39,18 @@
class ClatdController {
public:
- explicit ClatdController(NetworkController* controller);
- virtual ~ClatdController();
+ explicit ClatdController(NetworkController* controller) EXCLUDES(mutex);
+ virtual ~ClatdController() EXCLUDES(mutex);
- void Init(void);
+ /* First thing init/startClatd/stopClatd/dump do is grab the mutex. */
+ void init(void) EXCLUDES(mutex);
int startClatd(const std::string& interface, const std::string& nat64Prefix,
- std::string* v6Addr);
- int stopClatd(const std::string& interface);
+ std::string* v6Addr) EXCLUDES(mutex);
+ int stopClatd(const std::string& interface) EXCLUDES(mutex);
void dump(netdutils::DumpWriter& dw) EXCLUDES(mutex);
- std::mutex mutex;
-
private:
struct ClatdTracker {
const NetworkController* netCtrl = nullptr;
@@ -75,9 +74,11 @@
int init(const std::string& interface, const std::string& nat64Prefix);
};
- const NetworkController* mNetCtrl;
- std::map<std::string, ClatdTracker> mClatdTrackers;
- ClatdTracker* getClatdTracker(const std::string& interface);
+ std::mutex mutex;
+
+ const NetworkController* mNetCtrl GUARDED_BY(mutex);
+ std::map<std::string, ClatdTracker> mClatdTrackers GUARDED_BY(mutex);
+ ClatdTracker* getClatdTracker(const std::string& interface) REQUIRES(mutex);
static in_addr_t selectIpv4Address(const in_addr ip, int16_t prefixlen);
static int generateIpv6Address(const char* iface, const in_addr v4, const in6_addr& nat64Prefix,
@@ -89,12 +90,12 @@
ClatEbpfMaybe, // >=4.9 kernel && P api shipping level -- might work
ClatEbpfEnabled, // >=4.9 kernel && >=Q api shipping level -- must work
};
- eClatEbpfMode mClatEbpfMode;
- base::unique_fd mNetlinkFd;
- bpf::BpfMap<ClatIngressKey, ClatIngressValue> mClatIngressMap;
+ eClatEbpfMode mClatEbpfMode GUARDED_BY(mutex);
+ base::unique_fd mNetlinkFd GUARDED_BY(mutex);
+ bpf::BpfMap<ClatIngressKey, ClatIngressValue> mClatIngressMap GUARDED_BY(mutex);
- void maybeStartBpf(const ClatdTracker& tracker);
- void maybeStopBpf(const ClatdTracker& tracker);
+ void maybeStartBpf(const ClatdTracker& tracker) REQUIRES(mutex);
+ void maybeStopBpf(const ClatdTracker& tracker) REQUIRES(mutex);
// For testing.
friend class ClatdControllerTest;