1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_epoll_connection_helper.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <errno.h>
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <sys/socket.h>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/ip_endpoint.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/quic_random.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/epoll_server/epoll_server.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_socket_utils.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass QuicEpollAlarm : public QuicAlarm {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicEpollAlarm(EpollServer* epoll_server,
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 QuicAlarm::Delegate* delegate)
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      : QuicAlarm(delegate),
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        epoll_server_(epoll_server),
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        epoll_alarm_impl_(this) {}
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch protected:
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SetImpl() OVERRIDE {
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DCHECK(deadline().IsInitialized());
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    epoll_server_->RegisterAlarm(
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        deadline().Subtract(QuicTime::Zero()).ToMicroseconds(),
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        &epoll_alarm_impl_);
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void CancelImpl() OVERRIDE {
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DCHECK(!deadline().IsInitialized());
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    epoll_alarm_impl_.UnregisterIfRegistered();
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  class EpollAlarmImpl : public EpollAlarm {
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch   public:
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    explicit EpollAlarmImpl(QuicEpollAlarm* alarm) : alarm_(alarm) {}
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    virtual int64 OnAlarm() OVERRIDE {
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      EpollAlarm::OnAlarm();
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      alarm_->Fire();
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // Fire will take care of registering the alarm, if needed.
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return 0;
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch   private:
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    QuicEpollAlarm* alarm_;
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  };
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EpollServer* epoll_server_;
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EpollAlarmImpl epoll_alarm_impl_;
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)QuicEpollConnectionHelper::QuicEpollConnectionHelper(EpollServer* epoll_server)
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : epoll_server_(epoll_server),
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      clock_(epoll_server),
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      random_generator_(QuicRandom::GetInstance()) {
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicEpollConnectionHelper::~QuicEpollConnectionHelper() {
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const QuicClock* QuicEpollConnectionHelper::GetClock() const {
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return &clock_;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicRandom* QuicEpollConnectionHelper::GetRandomGenerator() {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return random_generator_;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochQuicAlarm* QuicEpollConnectionHelper::CreateAlarm(
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    QuicAlarm::Delegate* delegate) {
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return new QuicEpollAlarm(epoll_server_, delegate);
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace tools
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace net
89