| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/curvecp/server_packetizer.h" | 5 #include "net/curvecp/server_packetizer.h" |
| 6 | 6 |
| 7 #include "net/base/io_buffer.h" | 7 #include "net/base/io_buffer.h" |
| 8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
| 9 #include "net/curvecp/protocol.h" | 9 #include "net/curvecp/protocol.h" |
| 10 #include "net/udp/udp_server_socket.h" | 10 #include "net/udp/udp_server_socket.h" |
| 11 | 11 |
| 12 namespace net { | 12 namespace net { |
| 13 | 13 |
| 14 ServerPacketizer::ServerPacketizer() | 14 ServerPacketizer::ServerPacketizer() |
| 15 : Packetizer(), | 15 : Packetizer(), |
| 16 state_(NONE), | 16 state_(NONE), |
| 17 listener_(NULL), | 17 listener_(NULL), |
| 18 read_buffer_(new IOBuffer(kMaxPacketLength)), | 18 read_buffer_(new IOBuffer(kMaxPacketLength)) { |
| 19 ALLOW_THIS_IN_INITIALIZER_LIST( | |
| 20 read_callback_(this, &ServerPacketizer::OnReadComplete)), | |
| 21 ALLOW_THIS_IN_INITIALIZER_LIST( | |
| 22 write_callback_(this, &ServerPacketizer::OnWriteComplete)) { | |
| 23 } | 19 } |
| 24 | 20 |
| 25 ServerPacketizer::~ServerPacketizer() { | 21 ServerPacketizer::~ServerPacketizer() { |
| 26 } | 22 } |
| 27 | 23 |
| 28 int ServerPacketizer::Listen(const IPEndPoint& endpoint, | 24 int ServerPacketizer::Listen(const IPEndPoint& endpoint, |
| 29 Packetizer::Listener* listener) { | 25 Packetizer::Listener* listener) { |
| 30 DCHECK(!listener_); | 26 DCHECK(!listener_); |
| 31 listener_ = listener; | 27 listener_ = listener; |
| 32 socket_.reset(new UDPServerSocket(NULL, NetLog::Source())); | 28 socket_.reset(new UDPServerSocket(NULL, NetLog::Source())); |
| 33 int rv = socket_->Listen(endpoint); | 29 int rv = socket_->Listen(endpoint); |
| 34 if (rv != OK) | 30 if (rv != OK) |
| 35 return rv; | 31 return rv; |
| 36 | 32 |
| 37 return ReadPackets(); | 33 return ReadPackets(); |
| 38 } | 34 } |
| 39 | 35 |
| 40 bool ServerPacketizer::Open(ConnectionKey key, Packetizer::Listener* listener) { | 36 bool ServerPacketizer::Open(ConnectionKey key, Packetizer::Listener* listener) { |
| 41 DCHECK(listener_map_.find(key) == listener_map_.end()); | 37 DCHECK(listener_map_.find(key) == listener_map_.end()); |
| 42 listener_map_[key] = listener; | 38 listener_map_[key] = listener; |
| 43 return true; | 39 return true; |
| 44 } | 40 } |
| 45 | 41 |
| 46 int ServerPacketizer::SendMessage(ConnectionKey key, | 42 int ServerPacketizer::SendMessage(ConnectionKey key, |
| 47 const char* data, | 43 const char* data, |
| 48 size_t length, | 44 size_t length, |
| 49 OldCompletionCallback* callback) { | 45 const CompletionCallback& callback) { |
| 50 DCHECK(socket_.get()); | 46 DCHECK(socket_.get()); |
| 51 DCHECK_LT(0u, length); | 47 DCHECK_LT(0u, length); |
| 52 DCHECK_GT(kMaxPacketLength - sizeof(ServerMessagePacket), length); | 48 DCHECK_GT(kMaxPacketLength - sizeof(ServerMessagePacket), length); |
| 53 | 49 |
| 54 ConnectionMap::const_iterator it = connection_map_.find(key); | 50 ConnectionMap::const_iterator it = connection_map_.find(key); |
| 55 if (it == connection_map_.end()) { | 51 if (it == connection_map_.end()) { |
| 56 LOG(ERROR) << "Unknown connection key"; | 52 LOG(ERROR) << "Unknown connection key"; |
| 57 return ERR_FAILED; // No route to the client! | 53 return ERR_FAILED; // No route to the client! |
| 58 } | 54 } |
| 59 IPEndPoint endpoint = it->second; | 55 IPEndPoint endpoint = it->second; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 scoped_refptr<IOBuffer> buffer(new IOBuffer(sizeof(struct CookiePacket))); | 126 scoped_refptr<IOBuffer> buffer(new IOBuffer(sizeof(struct CookiePacket))); |
| 131 struct CookiePacket* data = | 127 struct CookiePacket* data = |
| 132 reinterpret_cast<struct CookiePacket*>(buffer->data()); | 128 reinterpret_cast<struct CookiePacket*>(buffer->data()); |
| 133 memset(data, 0, sizeof(struct CookiePacket)); | 129 memset(data, 0, sizeof(struct CookiePacket)); |
| 134 memcpy(data->id, "RL3aNMXK", 8); | 130 memcpy(data->id, "RL3aNMXK", 8); |
| 135 memcpy(data->client_extension, hello_packet->client_extension, 16); | 131 memcpy(data->client_extension, hello_packet->client_extension, 16); |
| 136 // TODO(mbelshe) Fill in the rest of the CookiePacket fields. | 132 // TODO(mbelshe) Fill in the rest of the CookiePacket fields. |
| 137 | 133 |
| 138 // XXXMB - Can't have two pending writes at the same time... | 134 // XXXMB - Can't have two pending writes at the same time... |
| 139 int rv = socket_->SendTo(buffer, sizeof(struct CookiePacket), recv_address_, | 135 int rv = socket_->SendTo(buffer, sizeof(struct CookiePacket), recv_address_, |
| 140 &write_callback_); | 136 base::Bind(&ServerPacketizer::OnWriteComplete, |
| 137 base::Unretained(this))); |
| 141 DCHECK(rv == ERR_IO_PENDING || rv == sizeof(struct CookiePacket)); | 138 DCHECK(rv == ERR_IO_PENDING || rv == sizeof(struct CookiePacket)); |
| 142 } | 139 } |
| 143 | 140 |
| 144 void ServerPacketizer::HandleInitiatePacket(Packet* packet, int length) { | 141 void ServerPacketizer::HandleInitiatePacket(Packet* packet, int length) { |
| 145 // Handle InitiatePacket | 142 // Handle InitiatePacket |
| 146 LOG(ERROR) << "Received Initiate Packet"; | 143 LOG(ERROR) << "Received Initiate Packet"; |
| 147 | 144 |
| 148 InitiatePacket* initiate_packet = reinterpret_cast<InitiatePacket*>(packet); | 145 InitiatePacket* initiate_packet = reinterpret_cast<InitiatePacket*>(packet); |
| 149 | 146 |
| 150 // We have an active connection. | 147 // We have an active connection. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 } | 210 } |
| 214 | 211 |
| 215 int ServerPacketizer::ReadPackets() { | 212 int ServerPacketizer::ReadPackets() { |
| 216 DCHECK(socket_.get()); | 213 DCHECK(socket_.get()); |
| 217 | 214 |
| 218 int rv; | 215 int rv; |
| 219 while (true) { | 216 while (true) { |
| 220 rv = socket_->RecvFrom(read_buffer_, | 217 rv = socket_->RecvFrom(read_buffer_, |
| 221 kMaxPacketLength, | 218 kMaxPacketLength, |
| 222 &recv_address_, | 219 &recv_address_, |
| 223 &read_callback_); | 220 base::Bind(&ServerPacketizer::OnReadComplete, |
| 221 base::Unretained(this))); |
| 224 if (rv <= 0) { | 222 if (rv <= 0) { |
| 225 if (rv != ERR_IO_PENDING) | 223 if (rv != ERR_IO_PENDING) |
| 226 LOG(ERROR) << "Error reading listen socket: " << rv; | 224 LOG(ERROR) << "Error reading listen socket: " << rv; |
| 227 return rv; | 225 return rv; |
| 228 } | 226 } |
| 229 | 227 |
| 230 ProcessRead(rv); | 228 ProcessRead(rv); |
| 231 } | 229 } |
| 232 | 230 |
| 233 return rv; | 231 return rv; |
| 234 } | 232 } |
| 235 | 233 |
| 236 void ServerPacketizer::OnReadComplete(int result) { | 234 void ServerPacketizer::OnReadComplete(int result) { |
| 237 if (result > 0) | 235 if (result > 0) |
| 238 ProcessRead(result); | 236 ProcessRead(result); |
| 239 ReadPackets(); | 237 ReadPackets(); |
| 240 } | 238 } |
| 241 | 239 |
| 242 void ServerPacketizer::OnWriteComplete(int result) { | 240 void ServerPacketizer::OnWriteComplete(int result) { |
| 243 // TODO(mbelshe): do we need to do anything? | 241 // TODO(mbelshe): do we need to do anything? |
| 244 } | 242 } |
| 245 | 243 |
| 246 } | 244 } |
| OLD | NEW |