@@ -1559,7 +1559,8 @@ folly::coro::Task<ServerSetup> MoQSession::setup(ClientSetup setup) {
1559
1559
XLOG(ERR) << "writeClientSetup failed sess=" << this;
1560
1560
co_yield folly::coro::co_error(std::runtime_error("Failed to write setup"));
1561
1561
}
1562
- maxRequestID_ = maxConcurrentRequests_ = maxRequestID;
1562
+ maxRequestID_ = maxRequestID;
1563
+ maxConcurrentRequests_ = maxRequestID_ / getRequestIDMultiplier();
1563
1564
controlWriteEvent_.signal();
1564
1565
1565
1566
auto deletedToken = cancellationSource_.getToken();
@@ -1618,6 +1619,9 @@ void MoQSession::onClientSetup(ClientSetup clientSetup) {
1618
1619
}
1619
1620
initializeNegotiatedVersion(serverSetup->selectedVersion);
1620
1621
auto maxRequestID = getMaxRequestIDIfPresent(serverSetup->params);
1622
+ if (getDraftMajorVersion(serverSetup->selectedVersion) < 11) {
1623
+ nextRequestID_ = 0;
1624
+ }
1621
1625
// TODO: clamp egress max auth token cache size
1622
1626
controlCodec_.setMaxAuthTokenCacheSize(
1623
1627
getMaxAuthTokenCacheSizeIfPresent(serverSetup->params));
@@ -1628,7 +1632,8 @@ void MoQSession::onClientSetup(ClientSetup clientSetup) {
1628
1632
close(SessionCloseErrorCode::VERSION_NEGOTIATION_FAILED);
1629
1633
return;
1630
1634
}
1631
- maxRequestID_ = maxConcurrentRequests_ = maxRequestID;
1635
+ maxRequestID_ = maxRequestID;
1636
+ maxConcurrentRequests_ = maxRequestID_ / getRequestIDMultiplier();
1632
1637
setupComplete_ = true;
1633
1638
controlWriteEvent_.signal();
1634
1639
}
@@ -2028,7 +2033,7 @@ void MoQSession::onSubscribe(SubscribeRequest subscribeRequest) {
2028
2033
XLOG(DBG1) << __func__ << " ftn=" << subscribeRequest.fullTrackName
2029
2034
<< " sess=" << this;
2030
2035
const auto requestID = subscribeRequest.requestID;
2031
- if (closeSessionIfRequestIDInvalid(requestID)) {
2036
+ if (closeSessionIfRequestIDInvalid(requestID, false, true )) {
2032
2037
return;
2033
2038
}
2034
2039
@@ -2118,7 +2123,7 @@ void MoQSession::onSubscribeUpdate(SubscribeUpdate subscribeUpdate) {
2118
2123
XLOG(ERR) << "No matching subscribe ID=" << requestID << " sess=" << this;
2119
2124
return;
2120
2125
}
2121
- if (closeSessionIfRequestIDInvalid(requestID)) {
2126
+ if (closeSessionIfRequestIDInvalid(requestID, false, false )) {
2122
2127
return;
2123
2128
}
2124
2129
@@ -2142,7 +2147,7 @@ void MoQSession::onSubscribeUpdate(SubscribeUpdate subscribeUpdate) {
2142
2147
2143
2148
void MoQSession::onUnsubscribe(Unsubscribe unsubscribe) {
2144
2149
XLOG(DBG1) << __func__ << " id=" << unsubscribe.requestID << " sess=" << this;
2145
- if (closeSessionIfRequestIDInvalid(unsubscribe.requestID)) {
2150
+ if (closeSessionIfRequestIDInvalid(unsubscribe.requestID, false, false )) {
2146
2151
return;
2147
2152
}
2148
2153
if (!publishHandler_) {
@@ -2267,7 +2272,7 @@ void MoQSession::onRequestsBlocked(RequestsBlocked requestsBlocked) {
2267
2272
// Increment the maxRequestID_ by the number of pending closed subscribes
2268
2273
// and send a new MaxRequestID.
2269
2274
if (requestsBlocked.maxRequestID >= maxRequestID_ && closedRequests_ > 0) {
2270
- maxRequestID_ += closedRequests_;
2275
+ maxRequestID_ += ( closedRequests_ * getRequestIDMultiplier()) ;
2271
2276
closedRequests_ = 0;
2272
2277
sendMaxRequestID(true);
2273
2278
}
@@ -2280,7 +2285,7 @@ void MoQSession::onFetch(Fetch fetch) {
2280
2285
: folly::to<std::string>("joining=", joining->joiningRequestID.value);
2281
2286
XLOG(DBG1) << __func__ << " (" << logStr << ") sess=" << this;
2282
2287
const auto requestID = fetch.requestID;
2283
- if (closeSessionIfRequestIDInvalid(requestID)) {
2288
+ if (closeSessionIfRequestIDInvalid(requestID, false, true )) {
2284
2289
return;
2285
2290
}
2286
2291
if (standalone) {
@@ -2384,6 +2389,9 @@ folly::coro::Task<void> MoQSession::handleFetch(
2384
2389
2385
2390
void MoQSession::onFetchCancel(FetchCancel fetchCancel) {
2386
2391
XLOG(DBG1) << __func__ << " id=" << fetchCancel.requestID << " sess=" << this;
2392
+ if (closeSessionIfRequestIDInvalid(fetchCancel.requestID, false, false)) {
2393
+ return;
2394
+ }
2387
2395
auto pubTrackIt = pubTracks_.find(fetchCancel.requestID);
2388
2396
if (pubTrackIt == pubTracks_.end()) {
2389
2397
XLOG(DBG4) << "No publish key for fetch id=" << fetchCancel.requestID
@@ -2436,7 +2444,9 @@ void MoQSession::onFetchError(FetchError fetchError) {
2436
2444
void MoQSession::onAnnounce(Announce ann) {
2437
2445
XLOG(DBG1) << __func__ << " ns=" << ann.trackNamespace << " sess=" << this;
2438
2446
if (closeSessionIfRequestIDInvalid(
2439
- ann.requestID, getDraftMajorVersion(*getNegotiatedVersion()) < 11)) {
2447
+ ann.requestID,
2448
+ getDraftMajorVersion(*getNegotiatedVersion()) < 11,
2449
+ true)) {
2440
2450
return;
2441
2451
}
2442
2452
if (!subscribeHandler_) {
@@ -2588,7 +2598,9 @@ void MoQSession::onSubscribeAnnounces(SubscribeAnnounces sa) {
2588
2598
XLOG(DBG1) << __func__ << " prefix=" << sa.trackNamespacePrefix
2589
2599
<< " sess=" << this;
2590
2600
if (closeSessionIfRequestIDInvalid(
2591
- sa.requestID, getDraftMajorVersion(*getNegotiatedVersion()) < 11)) {
2601
+ sa.requestID,
2602
+ getDraftMajorVersion(*getNegotiatedVersion()) < 11,
2603
+ true)) {
2592
2604
return;
2593
2605
}
2594
2606
if (!publishHandler_) {
@@ -2701,7 +2713,8 @@ void MoQSession::onTrackStatusRequest(TrackStatusRequest trackStatusRequest) {
2701
2713
<< " sess=" << this;
2702
2714
if (closeSessionIfRequestIDInvalid(
2703
2715
trackStatusRequest.requestID,
2704
- getDraftMajorVersion(*getNegotiatedVersion()) < 11)) {
2716
+ getDraftMajorVersion(*getNegotiatedVersion()) < 11,
2717
+ true)) {
2705
2718
return;
2706
2719
}
2707
2720
if (!publishHandler_) {
@@ -3050,7 +3063,9 @@ RequestID MoQSession::getNextRequestID(bool legacyAction) {
3050
3063
<< nextRequestID_ << " peerMaxRequestID_=" << peerMaxRequestID_
3051
3064
<< " sess=" << this;
3052
3065
}
3053
- return nextRequestID_++;
3066
+ auto ret = nextRequestID_;
3067
+ nextRequestID_ += getRequestIDMultiplier();
3068
+ return ret;
3054
3069
}
3055
3070
3056
3071
folly::coro::Task<Publisher::SubscribeResult> MoQSession::subscribe(
@@ -3224,7 +3239,7 @@ void MoQSession::retireRequestID(bool signalWriteLoop) {
3224
3239
// If # of closed requests is greater than 1/2 of max requests, then
3225
3240
// let's bump the maxRequestID by the number of closed requests.
3226
3241
if (++closedRequests_ >= maxConcurrentRequests_ / 2) {
3227
- maxRequestID_ += closedRequests_;
3242
+ maxRequestID_ += ( closedRequests_ * getRequestIDMultiplier()) ;
3228
3243
closedRequests_ = 0;
3229
3244
sendMaxRequestID(signalWriteLoop);
3230
3245
}
@@ -3412,9 +3427,6 @@ void MoQSession::fetchError(const FetchError& fetchErr) {
3412
3427
3413
3428
void MoQSession::fetchCancel(const FetchCancel& fetchCan) {
3414
3429
XLOG(DBG1) << __func__ << " sess=" << this;
3415
- if (closeSessionIfRequestIDInvalid(fetchCan.requestID)) {
3416
- return;
3417
- }
3418
3430
auto trackIt = fetches_.find(fetchCan.requestID);
3419
3431
if (trackIt == fetches_.end()) {
3420
3432
XLOG(ERR) << "unknown subscribe ID=" << fetchCan.requestID
@@ -3544,12 +3556,39 @@ void MoQSession::onDatagram(std::unique_ptr<folly::IOBuf> datagram) {
3544
3556
3545
3557
bool MoQSession::closeSessionIfRequestIDInvalid(
3546
3558
RequestID requestID,
3547
- bool skipCheck) {
3548
- if (!skipCheck && maxRequestID_ <= requestID.value) {
3549
- XLOG(ERR) << "Invalid requestID: " << requestID << " sess=" << this;
3550
- close(SessionCloseErrorCode::TOO_MANY_REQUESTS);
3559
+ bool skipCheck,
3560
+ bool isNewRequest) {
3561
+ if (skipCheck) {
3562
+ return false;
3563
+ }
3564
+
3565
+ if (getDraftMajorVersion(*getNegotiatedVersion()) >= 11 &&
3566
+ ((requestID.value % 2) == 1) !=
3567
+ (dir_ == MoQControlCodec::Direction::CLIENT)) {
3568
+ XLOG(ERR) << "Invalid requestID parity: " << requestID << " sess=" << this;
3569
+ close(SessionCloseErrorCode::INVALID_REQUEST_ID);
3551
3570
return true;
3552
3571
}
3572
+ if (isNewRequest) {
3573
+ if (requestID.value >= maxRequestID_) {
3574
+ XLOG(ERR) << "Too many requests requestID: " << requestID
3575
+ << " sess=" << this;
3576
+ close(SessionCloseErrorCode::TOO_MANY_REQUESTS);
3577
+ return true;
3578
+ }
3579
+ if (requestID.value != nextExpectedPeerRequestID_) {
3580
+ XLOG(ERR) << "Invalid next requestID: " << requestID << " sess=" << this;
3581
+ close(SessionCloseErrorCode::INVALID_REQUEST_ID);
3582
+ return true;
3583
+ }
3584
+ nextExpectedPeerRequestID_ += getRequestIDMultiplier();
3585
+ } else {
3586
+ if (requestID.value >= maxRequestID_) {
3587
+ XLOG(ERR) << "Invalid requestID: " << requestID << " sess=" << this;
3588
+ close(SessionCloseErrorCode::INVALID_REQUEST_ID);
3589
+ return true;
3590
+ }
3591
+ }
3553
3592
return false;
3554
3593
}
3555
3594
0 commit comments