1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2013 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
16086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
17086d980eb6a82fa644037785bc42a16586c2e774Ben Chan#ifndef SHILL_SOCKET_INFO_H_
18086d980eb6a82fa644037785bc42a16586c2e774Ben Chan#define SHILL_SOCKET_INFO_H_
19086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
20cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h>
21086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
228d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h"
23086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
24086d980eb6a82fa644037785bc42a16586c2e774Ben Channamespace shill {
25086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
26086d980eb6a82fa644037785bc42a16586c2e774Ben Chanclass SocketInfo {
27086d980eb6a82fa644037785bc42a16586c2e774Ben Chan public:
28086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // These connection states (except kConnectionStateUnknown and
29086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // kConnectionStateMax) are equivalent to and should be kept in sync with
30086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // those defined in kernel/inlude/net/tcp_states.h
31086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  enum ConnectionState {
32086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateUnknown = -1,
33086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateEstablished = 1,
34086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateSynSent,
35086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateSynRecv,
36086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateFinWait1,
37086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateFinWait2,
38086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateTimeWait,
39086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateClose,
40086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateCloseWait,
41086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateLastAck,
42086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateListen,
43086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateClosing,
44086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kConnectionStateMax,
45086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  };
46086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
47086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // These timer states (except kTimerStateUnknown and kTimerStateMax) are
48086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // equivalent to and should be kept in sync with those specified in
49086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // kernel/Documentation/networking/proc_net_tcp.txt
50086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  enum TimerState {
51086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateUnknown = -1,
52086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateNoTimerPending = 0,
53086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateRetransmitTimerPending,
54086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateAnotherTimerPending,
55086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateInTimeWaitState,
56086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateZeroWindowProbeTimerPending,
57086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    kTimerStateMax,
58086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  };
59086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
60086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  SocketInfo();
61086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  SocketInfo(ConnectionState connection_state,
621a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart             const IPAddress& local_ip_address,
637fab89734d88724a288e96a9996b15548c5294c7Ben Chan             uint16_t local_port,
641a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart             const IPAddress& remote_ip_address,
657fab89734d88724a288e96a9996b15548c5294c7Ben Chan             uint16_t remote_port,
667fab89734d88724a288e96a9996b15548c5294c7Ben Chan             uint64_t transmit_queue_value,
677fab89734d88724a288e96a9996b15548c5294c7Ben Chan             uint64_t receive_queue_value,
68086d980eb6a82fa644037785bc42a16586c2e774Ben Chan             TimerState timer_state);
691a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  SocketInfo(const SocketInfo& socket_info);
70086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  ~SocketInfo();
71086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
721a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  SocketInfo& operator=(const SocketInfo& socket_info);
73086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
74086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // Returns true if this socket info and |socket_info| refer to the same
75086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // socket, i.e. both have the same local address, local port, remote address,
76086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // and remote port.
771a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  bool IsSameSocketAs(const SocketInfo& socket_info) const;
78086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
79086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  ConnectionState connection_state() const { return connection_state_; }
80086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  void set_connection_state(ConnectionState connection_state) {
81086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    connection_state_ = connection_state;
82086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
83086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
841a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  const IPAddress& local_ip_address() const { return local_ip_address_; }
851a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  void set_local_ip_address(const IPAddress& local_ip_address) {
86086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    local_ip_address_ = local_ip_address;
87086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
88086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
897fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t local_port() const { return local_port_; }
907fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void set_local_port(uint16_t local_port) { local_port_ = local_port; }
91086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
921a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  const IPAddress& remote_ip_address() const { return remote_ip_address_; }
931a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  void set_remote_ip_address(const IPAddress& remote_ip_address) {
94086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    remote_ip_address_ = remote_ip_address;
95086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
96086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
977fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t remote_port() const { return remote_port_; }
987fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void set_remote_port(uint16_t remote_port) { remote_port_ = remote_port; }
99086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
1007fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint64_t transmit_queue_value() const { return transmit_queue_value_; }
1017fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void set_transmit_queue_value(uint64_t transmit_queue_value) {
102086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    transmit_queue_value_ = transmit_queue_value;
103086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
104086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
1057fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint64_t receive_queue_value() const { return receive_queue_value_; }
1067fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void set_receive_queue_value(uint64_t receive_queue_value) {
107086d980eb6a82fa644037785bc42a16586c2e774Ben Chan    receive_queue_value_ = receive_queue_value;
108086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  }
109086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
110086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  TimerState timer_state() const { return timer_state_; }
111086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  void set_timer_state(TimerState timer_state) { timer_state_ = timer_state; }
112086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
113086d980eb6a82fa644037785bc42a16586c2e774Ben Chan private:
114086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  ConnectionState connection_state_;
115086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  IPAddress local_ip_address_;
1167fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t local_port_;
117086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  IPAddress remote_ip_address_;
1187fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t remote_port_;
1197fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint64_t transmit_queue_value_;
1207fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint64_t receive_queue_value_;
121086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  TimerState timer_state_;
122086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
123086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // No DISALLOW_COPY_AND_ASSIGN(SocketInfo) as SocketInfo needs to be kept in
124086d980eb6a82fa644037785bc42a16586c2e774Ben Chan  // STL containers.
125086d980eb6a82fa644037785bc42a16586c2e774Ben Chan};
126086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
127086d980eb6a82fa644037785bc42a16586c2e774Ben Chan}  // namespace shill
128086d980eb6a82fa644037785bc42a16586c2e774Ben Chan
129086d980eb6a82fa644037785bc42a16586c2e774Ben Chan#endif  // SHILL_SOCKET_INFO_H_
130