|
1 | 1 | #if HAVE_OPENSSL |
2 | 2 | #include "guard.h" |
3 | 3 | #ifndef OPENSSL_NO_QUIC |
4 | | -#include "application.h" |
5 | 4 | #include <async_wrap-inl.h> |
6 | 5 | #include <debug_utils-inl.h> |
7 | 6 | #include <nghttp3/nghttp3.h> |
|
10 | 9 | #include <node_sockaddr-inl.h> |
11 | 10 | #include <uv.h> |
12 | 11 | #include <v8.h> |
| 12 | +#include "application.h" |
13 | 13 | #include "defs.h" |
14 | 14 | #include "endpoint.h" |
15 | 15 | #include "http3.h" |
@@ -207,12 +207,9 @@ StreamPriority Session::Application::GetStreamPriority(const Stream& stream) { |
207 | 207 | return StreamPriority::DEFAULT; |
208 | 208 | } |
209 | 209 |
|
210 | | -BaseObjectPtr<Packet> Session::Application::CreateStreamDataPacket() { |
211 | | - return Packet::Create(env(), |
212 | | - session_->endpoint(), |
213 | | - session_->remote_address(), |
214 | | - session_->max_packet_size(), |
215 | | - "stream data"); |
| 210 | +Packet::Ptr Session::Application::CreateStreamDataPacket() { |
| 211 | + return session_->endpoint().CreatePacket( |
| 212 | + session_->remote_address(), session_->max_packet_size(), "stream data"); |
216 | 213 | } |
217 | 214 |
|
218 | 215 | void Session::Application::StreamClose(Stream* stream, QuicError&& error) { |
@@ -264,7 +261,7 @@ void Session::Application::SendPendingData() { |
264 | 261 | // The number of packets that have been sent in this call to SendPendingData. |
265 | 262 | size_t packet_send_count = 0; |
266 | 263 |
|
267 | | - BaseObjectPtr<Packet> packet; |
| 264 | + Packet::Ptr packet; |
268 | 265 | uint8_t* pos = nullptr; |
269 | 266 | uint8_t* begin = nullptr; |
270 | 267 |
|
@@ -273,7 +270,7 @@ void Session::Application::SendPendingData() { |
273 | 270 | packet = CreateStreamDataPacket(); |
274 | 271 | if (!packet) [[unlikely]] |
275 | 272 | return false; |
276 | | - pos = begin = ngtcp2_vec(*packet).base; |
| 273 | + pos = begin = packet->data(); |
277 | 274 | } |
278 | 275 | DCHECK(packet); |
279 | 276 | DCHECK_NOT_NULL(pos); |
@@ -299,7 +296,6 @@ void Session::Application::SendPendingData() { |
299 | 296 | // The stream_data is the next block of data from the application stream. |
300 | 297 | if (GetStreamData(&stream_data) < 0) { |
301 | 298 | Debug(session_, "Application failed to get stream data"); |
302 | | - packet->CancelPacket(); |
303 | 299 | session_->SetLastError(QuicError::ForNgtcp2Error(NGTCP2_ERR_INTERNAL)); |
304 | 300 | closed = true; |
305 | 301 | return session_->Close(CloseMethod::SILENT); |
@@ -367,7 +363,6 @@ void Session::Application::SendPendingData() { |
367 | 363 | if (ndatalen >= 0 && !StreamCommit(&stream_data, ndatalen)) { |
368 | 364 | Debug(session_, |
369 | 365 | "Failed to commit stream data while writing packets"); |
370 | | - packet->CancelPacket(); |
371 | 366 | session_->SetLastError( |
372 | 367 | QuicError::ForNgtcp2Error(NGTCP2_ERR_INTERNAL)); |
373 | 368 | closed = true; |
@@ -380,7 +375,6 @@ void Session::Application::SendPendingData() { |
380 | 375 | // ngtcp2 callback failed for some reason. This would be a |
381 | 376 | // bug in our code. |
382 | 377 | Debug(session_, "Internal failure with ngtcp2 callback"); |
383 | | - packet->CancelPacket(); |
384 | 378 | session_->SetLastError( |
385 | 379 | QuicError::ForNgtcp2Error(NGTCP2_ERR_INTERNAL)); |
386 | 380 | closed = true; |
@@ -393,12 +387,10 @@ void Session::Application::SendPendingData() { |
393 | 387 | Debug(session_, |
394 | 388 | "Application encountered error while writing packet: %s", |
395 | 389 | ngtcp2_strerror(nwrite)); |
396 | | - packet->CancelPacket(); |
397 | 390 | session_->SetLastError(QuicError::ForNgtcp2Error(nwrite)); |
398 | 391 | closed = true; |
399 | 392 | return session_->Close(CloseMethod::SILENT); |
400 | 393 | } else if (ndatalen >= 0 && !StreamCommit(&stream_data, ndatalen)) { |
401 | | - packet->CancelPacket(); |
402 | 394 | session_->SetLastError(QuicError::ForNgtcp2Error(NGTCP2_ERR_INTERNAL)); |
403 | 395 | closed = true; |
404 | 396 | return session_->Close(CloseMethod::SILENT); |
@@ -416,10 +408,9 @@ void Session::Application::SendPendingData() { |
416 | 408 | if (datalen) { |
417 | 409 | Debug(session_, "Sending packet with %zu bytes", datalen); |
418 | 410 | packet->Truncate(datalen); |
419 | | - session_->Send(packet, path); |
420 | | - } else { |
421 | | - packet->CancelPacket(); |
| 411 | + session_->Send(std::move(packet), path); |
422 | 412 | } |
| 413 | + // If no data, Ptr destructor releases the packet. |
423 | 414 |
|
424 | 415 | return; |
425 | 416 | } |
@@ -429,15 +420,15 @@ void Session::Application::SendPendingData() { |
429 | 420 | size_t datalen = pos - begin; |
430 | 421 | Debug(session_, "Sending packet with %zu bytes", datalen); |
431 | 422 | packet->Truncate(datalen); |
432 | | - session_->Send(packet, path); |
| 423 | + session_->Send(std::move(packet), path); |
433 | 424 |
|
434 | 425 | // If we have sent the maximum number of packets, we're done. |
435 | 426 | if (++packet_send_count == max_packet_count) { |
436 | 427 | return; |
437 | 428 | } |
438 | 429 |
|
439 | 430 | // Prepare to loop back around to prepare a new packet. |
440 | | - packet.reset(); |
| 431 | + // packet is already empty from the std::move above. |
441 | 432 | pos = begin = nullptr; |
442 | 433 | } |
443 | 434 | } |
|