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 |