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