// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_SOCKET_SOCKET_TAG_H_ #define NET_SOCKET_SOCKET_TAG_H_ #include "build/build_config.h" #include "net/base/net_export.h" #include "net/socket/socket_descriptor.h" #if defined(OS_ANDROID) #include #include #include #endif // OS_ANDROID namespace net { // SocketTag represents a tag that can be applied to a socket. Currently only // implemented for Android, it facilitates assigning a Android TrafficStats tag // and UID to a socket so that future network data usage by the socket is // attributed to the tag and UID that the socket is tagged with. // // This class is small (<=64-bits) and contains only POD to facilitate default // copy and assignment operators so that it can easily be passed by value. class NET_EXPORT SocketTag { public: #if defined(OS_ANDROID) // Default constructor doesn't set any tags. SocketTag() : SocketTag(UNSET_UID, UNSET_TAG) {} // Create a SocketTag with given UID |uid| and |traffic_stats_tag|. SocketTag(uid_t uid, int32_t traffic_stats_tag) : uid_(uid), traffic_stats_tag_(traffic_stats_tag) {} #else SocketTag() {} #endif // OS_ANDROID ~SocketTag() {} bool operator<(const SocketTag& other) const; bool operator==(const SocketTag& other) const; bool operator!=(const SocketTag& other) const { return !(*this == other); } // Apply this tag to |socket|. void Apply(SocketDescriptor socket) const; #if defined(OS_ANDROID) // Values to indicate no UID or tag should be set. These values match those in // Android: // http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/net/TrafficStats.java#147 // http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/net/TrafficStats.java#169 static const uid_t UNSET_UID = -1; static const int32_t UNSET_TAG = -1; private: // UID to tag with. uid_t uid_; // TrafficStats tag to tag with. int32_t traffic_stats_tag_; #endif // OS_ANDROID // Copying and assignment are allowed. }; } // namespace net #endif // NET_SOCKET_SOCKET_TAG_H_