socket_info.h revision 1a212a6b98b22ad1d69652bb26a9e94138635476
1086d980eb6a82fa644037785bc42a16586c2e774Ben Chan// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2086d980eb6a82fa644037785bc42a16586c2e774Ben Chan// Use of this source code is governed by a BSD-style license that can be
3086d980eb6a82fa644037785bc42a16586c2e774Ben Chan// found in the LICENSE file.
4086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
5086d980eb6a82fa644037785bc42a16586c2e774Ben Chan#ifndef SHILL_SOCKET_INFO_H_
6086d980eb6a82fa644037785bc42a16586c2e774Ben Chan#define SHILL_SOCKET_INFO_H_
7086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
8cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h>
9086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
108d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h"
11086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
12086d980eb6a82fa644037785bc42a16586c2e774Ben Channamespace shill {
13086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
14086d980eb6a82fa644037785bc42a16586c2e774Ben Chanclass SocketInfo {
15086d980eb6a82fa644037785bc42a16586c2e774Ben Chan public:
16086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // These connection states (except kConnectionStateUnknown and
17086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // kConnectionStateMax) are equivalent to and should be kept in sync with
18086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // those defined in kernel/inlude/net/tcp_states.h
19086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  enum ConnectionState {
20086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateUnknown = -1,
21086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateEstablished = 1,
22086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateSynSent,
23086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateSynRecv,
24086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateFinWait1,
25086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateFinWait2,
26086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateTimeWait,
27086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateClose,
28086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateCloseWait,
29086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateLastAck,
30086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateListen,
31086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateClosing,
32086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateMax,
33086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  };
34086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
35086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // These timer states (except kTimerStateUnknown and kTimerStateMax) are
36086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // equivalent to and should be kept in sync with those specified in
37086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // kernel/Documentation/networking/proc_net_tcp.txt
38086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  enum TimerState {
39086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateUnknown = -1,
40086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateNoTimerPending = 0,
41086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateRetransmitTimerPending,
42086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateAnotherTimerPending,
43086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateInTimeWaitState,
44086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateZeroWindowProbeTimerPending,
45086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateMax,
46086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  };
47086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
48086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  SocketInfo();
49086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  SocketInfo(ConnectionState connection_state,
501a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart             const IPAddress& local_ip_address,
517fab89734d88724a288e96a9996b15548c5294c7Ben Chan             uint16_t local_port,
521a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart             const IPAddress& remote_ip_address,
537fab89734d88724a288e96a9996b15548c5294c7Ben Chan             uint16_t remote_port,
547fab89734d88724a288e96a9996b15548c5294c7Ben Chan             uint64_t transmit_queue_value,
557fab89734d88724a288e96a9996b15548c5294c7Ben Chan             uint64_t receive_queue_value,
56086d980eb6a82fa644037785bc42a16586c2e774Ben Chan             TimerState timer_state);
571a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  SocketInfo(const SocketInfo& socket_info);
58086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  ~SocketInfo();
59086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
601a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  SocketInfo& operator=(const SocketInfo& socket_info);
61086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
62086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // Returns true if this socket info and |socket_info| refer to the same
63086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // socket, i.e. both have the same local address, local port, remote address,
64086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // and remote port.
651a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  bool IsSameSocketAs(const SocketInfo& socket_info) const;
66086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
67086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  ConnectionState connection_state() const { return connection_state_; }
68086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  void set_connection_state(ConnectionState connection_state) {
69086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    connection_state_ = connection_state;
70086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
71086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
721a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  const IPAddress& local_ip_address() const { return local_ip_address_; }
731a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  void set_local_ip_address(const IPAddress& local_ip_address) {
74086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    local_ip_address_ = local_ip_address;
75086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
76086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
777fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t local_port() const { return local_port_; }
787fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void set_local_port(uint16_t local_port) { local_port_ = local_port; }
79086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
801a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  const IPAddress& remote_ip_address() const { return remote_ip_address_; }
811a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  void set_remote_ip_address(const IPAddress& remote_ip_address) {
82086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    remote_ip_address_ = remote_ip_address;
83086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
84086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
857fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t remote_port() const { return remote_port_; }
867fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void set_remote_port(uint16_t remote_port) { remote_port_ = remote_port; }
87086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
887fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint64_t transmit_queue_value() const { return transmit_queue_value_; }
897fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void set_transmit_queue_value(uint64_t transmit_queue_value) {
90086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    transmit_queue_value_ = transmit_queue_value;
91086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
92086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
937fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint64_t receive_queue_value() const { return receive_queue_value_; }
947fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void set_receive_queue_value(uint64_t receive_queue_value) {
95086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    receive_queue_value_ = receive_queue_value;
96086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
97086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
98086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  TimerState timer_state() const { return timer_state_; }
99086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  void set_timer_state(TimerState timer_state) { timer_state_ = timer_state; }
100086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
101086d980eb6a82fa644037785bc42a16586c2e774Ben Chan private:
102086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  ConnectionState connection_state_;
103086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  IPAddress local_ip_address_;
1047fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t local_port_;
105086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  IPAddress remote_ip_address_;
1067fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t remote_port_;
1077fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint64_t transmit_queue_value_;
1087fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint64_t receive_queue_value_;
109086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  TimerState timer_state_;
110086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
111086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // No DISALLOW_COPY_AND_ASSIGN(SocketInfo) as SocketInfo needs to be kept in
112086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // STL containers.
113086d980eb6a82fa644037785bc42a16586c2e774Ben Chan};
114086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
115086d980eb6a82fa644037785bc42a16586c2e774Ben Chan}  // namespace shill
116086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
117086d980eb6a82fa644037785bc42a16586c2e774Ben Chan#endif  // SHILL_SOCKET_INFO_H_
118