tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

event.h (13340B)


      1 // Copyright 2016 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef MOJO_CORE_PORTS_EVENT_H_
      6 #define MOJO_CORE_PORTS_EVENT_H_
      7 
      8 #include <stdint.h>
      9 
     10 #include <vector>
     11 
     12 #include "mojo/core/ports/name.h"
     13 #include "mojo/core/ports/user_message.h"
     14 
     15 namespace mojo {
     16 namespace core {
     17 namespace ports {
     18 
     19 class Event;
     20 
     21 using ScopedEvent = mozilla::UniquePtr<Event>;
     22 
     23 // A Event is the fundamental unit of operation and communication within and
     24 // between Nodes.
     25 class Event {
     26 public:
     27  enum Type : uint32_t {
     28    // A user message event contains arbitrary user-specified payload data
     29    // which may include any number of ports and/or system handles (e.g. FDs).
     30    kUserMessage,
     31 
     32    // When a Node receives a user message with one or more ports attached, it
     33    // sends back an instance of this event for every attached port to indicate
     34    // that the port has been accepted by its destination node.
     35    kPortAccepted,
     36 
     37    // This event begins circulation any time a port enters a proxying state. It
     38    // may be re-circulated in certain edge cases, but the ultimate purpose of
     39    // the event is to ensure that every port along a route is (if necessary)
     40    // aware that the proxying port is indeed proxying (and to where) so that it
     41    // can begin to be bypassed along the route.
     42    kObserveProxy,
     43 
     44    // An event used to acknowledge to a proxy that all concerned nodes and
     45    // ports are aware of its proxying state and that no more user messages will
     46    // be routed to it beyond a given final sequence number.
     47    kObserveProxyAck,
     48 
     49    // Indicates that a port has been closed. This event fully circulates a
     50    // route to ensure that all ports are aware of closure.
     51    kObserveClosure,
     52 
     53    // Used to request the merging of two routes via two sacrificial receiving
     54    // ports, one from each route.
     55    kMergePort,
     56 
     57    // Used to request that the conjugate port acknowledges read messages by
     58    // sending back a UserMessageReadAck.
     59    kUserMessageReadAckRequest,
     60 
     61    // Used to acknowledge read messages to the conjugate.
     62    kUserMessageReadAck,
     63 
     64    // Used to update the previous node and port name of a port.
     65    kUpdatePreviousPeer,
     66  };
     67 
     68 #pragma pack(push, 1)
     69  struct PortDescriptor {
     70    PortDescriptor() = default;
     71 
     72    NodeName peer_node_name = {};
     73    PortName peer_port_name = {};
     74    NodeName referring_node_name = {};
     75    PortName referring_port_name = {};
     76    uint64_t next_sequence_num_to_send = 0;
     77    uint64_t next_sequence_num_to_receive = 0;
     78    uint64_t last_sequence_num_to_receive = 0;
     79    bool peer_closed = false;
     80    char padding[7] = {0};
     81  };
     82 #pragma pack(pop)
     83  virtual ~Event();
     84 
     85  static ScopedEvent Deserialize(const void* buffer, size_t num_bytes);
     86 
     87  template <typename T>
     88  static mozilla::UniquePtr<T> Cast(ScopedEvent* event) {
     89    return mozilla::WrapUnique(static_cast<T*>(event->release()));
     90  }
     91 
     92  Type type() const { return type_; }
     93  const PortName& port_name() const { return port_name_; }
     94  void set_port_name(const PortName& port_name) { port_name_ = port_name; }
     95 
     96  size_t GetSerializedSize() const;
     97  void Serialize(void* buffer) const;
     98  virtual ScopedEvent CloneForBroadcast() const;
     99 
    100  const PortName& from_port() const { return from_port_; }
    101  void set_from_port(const PortName& from_port) { from_port_ = from_port; }
    102 
    103  uint64_t control_sequence_num() const { return control_sequence_num_; }
    104  void set_control_sequence_num(uint64_t control_sequence_num) {
    105    control_sequence_num_ = control_sequence_num;
    106  }
    107 
    108 protected:
    109  Event(Type type, const PortName& port_name, const PortName& from_port,
    110        uint64_t control_sequence_num);
    111 
    112  virtual size_t GetSerializedDataSize() const = 0;
    113  virtual void SerializeData(void* buffer) const = 0;
    114 
    115 private:
    116  const Type type_;
    117  PortName port_name_;
    118  PortName from_port_;
    119  uint64_t control_sequence_num_;
    120 
    121  DISALLOW_COPY_AND_ASSIGN(Event);
    122 };
    123 
    124 class UserMessageEvent : public Event {
    125 public:
    126  explicit UserMessageEvent(size_t num_ports);
    127  ~UserMessageEvent() override;
    128 
    129  bool HasMessage() const { return !!message_; }
    130  void AttachMessage(mozilla::UniquePtr<UserMessage> message);
    131 
    132  template <typename T>
    133  T* GetMessage() {
    134    DCHECK(HasMessage());
    135    DCHECK_EQ(&T::kUserMessageTypeInfo, message_->type_info());
    136    return static_cast<T*>(message_.get());
    137  }
    138 
    139  template <typename T>
    140  const T* GetMessage() const {
    141    DCHECK(HasMessage());
    142    DCHECK_EQ(&T::kUserMessageTypeInfo, message_->type_info());
    143    return static_cast<const T*>(message_.get());
    144  }
    145 
    146  template <typename T>
    147  mozilla::UniquePtr<T> TakeMessage() {
    148    DCHECK(HasMessage());
    149    DCHECK_EQ(&T::kUserMessageTypeInfo, message_->type_info());
    150    return mozilla::UniquePtr<T>{static_cast<T*>(message_.release())};
    151  }
    152 
    153  void ReservePorts(size_t num_ports);
    154  bool NotifyWillBeRoutedExternally();
    155 
    156  uint64_t sequence_num() const { return sequence_num_; }
    157  void set_sequence_num(uint64_t sequence_num) { sequence_num_ = sequence_num; }
    158 
    159  size_t num_ports() const { return ports_.size(); }
    160  PortDescriptor* port_descriptors() { return port_descriptors_.data(); }
    161  PortName* ports() { return ports_.data(); }
    162 
    163  static ScopedEvent Deserialize(const PortName& port_name,
    164                                 const PortName& from_port,
    165                                 uint64_t control_sequence_num,
    166                                 const void* buffer, size_t num_bytes);
    167 
    168  size_t GetSizeIfSerialized() const;
    169 
    170 private:
    171  UserMessageEvent(const PortName& port_name, const PortName& from_port,
    172                   uint64_t control_sequence_num, uint64_t sequence_num);
    173 
    174  size_t GetSerializedDataSize() const override;
    175  void SerializeData(void* buffer) const override;
    176 
    177  uint64_t sequence_num_ = 0;
    178  std::vector<PortDescriptor> port_descriptors_;
    179  std::vector<PortName> ports_;
    180  mozilla::UniquePtr<UserMessage> message_;
    181 
    182  DISALLOW_COPY_AND_ASSIGN(UserMessageEvent);
    183 };
    184 
    185 class PortAcceptedEvent : public Event {
    186 public:
    187  PortAcceptedEvent(const PortName& port_name, const PortName& from_port,
    188                    uint64_t control_sequence_num);
    189  ~PortAcceptedEvent() override;
    190 
    191  static ScopedEvent Deserialize(const PortName& port_name,
    192                                 const PortName& from_port,
    193                                 uint64_t control_sequence_num,
    194                                 const void* buffer, size_t num_bytes);
    195 
    196 private:
    197  size_t GetSerializedDataSize() const override;
    198  void SerializeData(void* buffer) const override;
    199 
    200  DISALLOW_COPY_AND_ASSIGN(PortAcceptedEvent);
    201 };
    202 
    203 class ObserveProxyEvent : public Event {
    204 public:
    205  ObserveProxyEvent(const PortName& port_name, const PortName& from_port,
    206                    uint64_t control_sequence_num,
    207                    const NodeName& proxy_node_name,
    208                    const PortName& proxy_port_name,
    209                    const NodeName& proxy_target_node_name,
    210                    const PortName& proxy_target_port_name);
    211  ~ObserveProxyEvent() override;
    212 
    213  const NodeName& proxy_node_name() const { return proxy_node_name_; }
    214  const PortName& proxy_port_name() const { return proxy_port_name_; }
    215  const NodeName& proxy_target_node_name() const {
    216    return proxy_target_node_name_;
    217  }
    218  const PortName& proxy_target_port_name() const {
    219    return proxy_target_port_name_;
    220  }
    221 
    222  static ScopedEvent Deserialize(const PortName& port_name,
    223                                 const PortName& from_port,
    224                                 uint64_t control_sequence_num,
    225                                 const void* buffer, size_t num_bytes);
    226 
    227 private:
    228  size_t GetSerializedDataSize() const override;
    229  void SerializeData(void* buffer) const override;
    230  ScopedEvent CloneForBroadcast() const override;
    231 
    232  const NodeName proxy_node_name_;
    233  const PortName proxy_port_name_;
    234  const NodeName proxy_target_node_name_;
    235  const PortName proxy_target_port_name_;
    236 
    237  DISALLOW_COPY_AND_ASSIGN(ObserveProxyEvent);
    238 };
    239 
    240 class ObserveProxyAckEvent : public Event {
    241 public:
    242  ObserveProxyAckEvent(const PortName& port_name, const PortName& from_port,
    243                       uint64_t control_sequence_num,
    244                       uint64_t last_sequence_num);
    245  ~ObserveProxyAckEvent() override;
    246 
    247  uint64_t last_sequence_num() const { return last_sequence_num_; }
    248 
    249  static ScopedEvent Deserialize(const PortName& port_name,
    250                                 const PortName& from_port,
    251                                 uint64_t control_sequence_num,
    252                                 const void* buffer, size_t num_bytes);
    253 
    254 private:
    255  size_t GetSerializedDataSize() const override;
    256  void SerializeData(void* buffer) const override;
    257 
    258  const uint64_t last_sequence_num_;
    259 
    260  DISALLOW_COPY_AND_ASSIGN(ObserveProxyAckEvent);
    261 };
    262 
    263 class ObserveClosureEvent : public Event {
    264 public:
    265  ObserveClosureEvent(const PortName& port_name, const PortName& from_port,
    266                      uint64_t control_sequence_num,
    267                      uint64_t last_sequence_num);
    268  ~ObserveClosureEvent() override;
    269 
    270  uint64_t last_sequence_num() const { return last_sequence_num_; }
    271  void set_last_sequence_num(uint64_t last_sequence_num) {
    272    last_sequence_num_ = last_sequence_num;
    273  }
    274 
    275  static ScopedEvent Deserialize(const PortName& port_name,
    276                                 const PortName& from_port,
    277                                 uint64_t control_sequence_num,
    278                                 const void* buffer, size_t num_bytes);
    279 
    280 private:
    281  size_t GetSerializedDataSize() const override;
    282  void SerializeData(void* buffer) const override;
    283 
    284  uint64_t last_sequence_num_;
    285 
    286  DISALLOW_COPY_AND_ASSIGN(ObserveClosureEvent);
    287 };
    288 
    289 class MergePortEvent : public Event {
    290 public:
    291  MergePortEvent(const PortName& port_name, const PortName& from_port,
    292                 uint64_t control_sequence_num, const PortName& new_port_name,
    293                 const PortDescriptor& new_port_descriptor);
    294  ~MergePortEvent() override;
    295 
    296  const PortName& new_port_name() const { return new_port_name_; }
    297  const PortDescriptor& new_port_descriptor() const {
    298    return new_port_descriptor_;
    299  }
    300 
    301  static ScopedEvent Deserialize(const PortName& port_name,
    302                                 const PortName& from_port,
    303                                 uint64_t control_sequence_num,
    304                                 const void* buffer, size_t num_bytes);
    305 
    306 private:
    307  size_t GetSerializedDataSize() const override;
    308  void SerializeData(void* buffer) const override;
    309 
    310  const PortName new_port_name_;
    311  const PortDescriptor new_port_descriptor_;
    312 
    313  DISALLOW_COPY_AND_ASSIGN(MergePortEvent);
    314 };
    315 
    316 class UserMessageReadAckRequestEvent : public Event {
    317 public:
    318  UserMessageReadAckRequestEvent(const PortName& port_name,
    319                                 const PortName& from_port,
    320                                 uint64_t control_sequence_num,
    321                                 uint64_t sequence_num_to_acknowledge);
    322  ~UserMessageReadAckRequestEvent() override;
    323 
    324  uint64_t sequence_num_to_acknowledge() const {
    325    return sequence_num_to_acknowledge_;
    326  }
    327 
    328  static ScopedEvent Deserialize(const PortName& port_name,
    329                                 const PortName& from_port,
    330                                 uint64_t control_sequence_num,
    331                                 const void* buffer, size_t num_bytes);
    332 
    333 private:
    334  size_t GetSerializedDataSize() const override;
    335  void SerializeData(void* buffer) const override;
    336 
    337  uint64_t sequence_num_to_acknowledge_;
    338 };
    339 
    340 class UserMessageReadAckEvent : public Event {
    341 public:
    342  UserMessageReadAckEvent(const PortName& port_name, const PortName& from_port,
    343                          uint64_t control_sequence_num,
    344                          uint64_t sequence_num_acknowledged);
    345  ~UserMessageReadAckEvent() override;
    346 
    347  uint64_t sequence_num_acknowledged() const {
    348    return sequence_num_acknowledged_;
    349  }
    350 
    351  static ScopedEvent Deserialize(const PortName& port_name,
    352                                 const PortName& from_port,
    353                                 uint64_t control_sequence_num,
    354                                 const void* buffer, size_t num_bytes);
    355 
    356 private:
    357  size_t GetSerializedDataSize() const override;
    358  void SerializeData(void* buffer) const override;
    359 
    360  uint64_t sequence_num_acknowledged_;
    361 };
    362 
    363 class UpdatePreviousPeerEvent : public Event {
    364 public:
    365  UpdatePreviousPeerEvent(const PortName& port_name, const PortName& from_port,
    366                          uint64_t control_sequence_num,
    367                          const NodeName& new_node_name,
    368                          const PortName& new_port_name);
    369  ~UpdatePreviousPeerEvent() override;
    370 
    371  const NodeName& new_node_name() const { return new_node_name_; }
    372 
    373  const PortName& new_port_name() const { return new_port_name_; }
    374 
    375  static ScopedEvent Deserialize(const PortName& port_name,
    376                                 const PortName& from_port,
    377                                 uint64_t control_sequence_num,
    378                                 const void* buffer, size_t num_bytes);
    379 
    380 private:
    381  size_t GetSerializedDataSize() const override;
    382  void SerializeData(void* buffer) const override;
    383 
    384  const NodeName new_node_name_;
    385  const PortName new_port_name_;
    386 };
    387 
    388 }  // namespace ports
    389 }  // namespace core
    390 }  // namespace mojo
    391 
    392 #endif  // MOJO_CORE_PORTS_EVENT_H_