xref: /aosp_15_r20/hardware/interfaces/wifi/aidl/default/ringbuffer.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include "ringbuffer.h"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
20*4d7e907cSAndroid Build Coastguard Worker 
21*4d7e907cSAndroid Build Coastguard Worker namespace aidl {
22*4d7e907cSAndroid Build Coastguard Worker namespace android {
23*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
24*4d7e907cSAndroid Build Coastguard Worker namespace wifi {
25*4d7e907cSAndroid Build Coastguard Worker 
Ringbuffer(size_t maxSize)26*4d7e907cSAndroid Build Coastguard Worker Ringbuffer::Ringbuffer(size_t maxSize) : size_(0), maxSize_(maxSize) {}
27*4d7e907cSAndroid Build Coastguard Worker 
append(const std::vector<uint8_t> & input)28*4d7e907cSAndroid Build Coastguard Worker enum Ringbuffer::AppendStatus Ringbuffer::append(const std::vector<uint8_t>& input) {
29*4d7e907cSAndroid Build Coastguard Worker     if (input.size() == 0) {
30*4d7e907cSAndroid Build Coastguard Worker         return AppendStatus::FAIL_IP_BUFFER_ZERO;
31*4d7e907cSAndroid Build Coastguard Worker     }
32*4d7e907cSAndroid Build Coastguard Worker     if (input.size() > maxSize_) {
33*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "Oversized message of " << input.size() << " bytes is dropped";
34*4d7e907cSAndroid Build Coastguard Worker         return AppendStatus::FAIL_IP_BUFFER_EXCEEDED_MAXSIZE;
35*4d7e907cSAndroid Build Coastguard Worker     }
36*4d7e907cSAndroid Build Coastguard Worker     data_.push_back(input);
37*4d7e907cSAndroid Build Coastguard Worker     size_ += input.size() * sizeof(input[0]);
38*4d7e907cSAndroid Build Coastguard Worker     while (size_ > maxSize_) {
39*4d7e907cSAndroid Build Coastguard Worker         if (data_.front().size() <= 0 || data_.front().size() > maxSize_) {
40*4d7e907cSAndroid Build Coastguard Worker             LOG(ERROR) << "First buffer in the ring buffer is Invalid. Size: "
41*4d7e907cSAndroid Build Coastguard Worker                        << data_.front().size();
42*4d7e907cSAndroid Build Coastguard Worker             return AppendStatus::FAIL_RING_BUFFER_CORRUPTED;
43*4d7e907cSAndroid Build Coastguard Worker         }
44*4d7e907cSAndroid Build Coastguard Worker         size_ -= data_.front().size() * sizeof(data_.front()[0]);
45*4d7e907cSAndroid Build Coastguard Worker         data_.pop_front();
46*4d7e907cSAndroid Build Coastguard Worker     }
47*4d7e907cSAndroid Build Coastguard Worker     return AppendStatus::SUCCESS;
48*4d7e907cSAndroid Build Coastguard Worker }
49*4d7e907cSAndroid Build Coastguard Worker 
getData() const50*4d7e907cSAndroid Build Coastguard Worker const std::list<std::vector<uint8_t>>& Ringbuffer::getData() const {
51*4d7e907cSAndroid Build Coastguard Worker     return data_;
52*4d7e907cSAndroid Build Coastguard Worker }
53*4d7e907cSAndroid Build Coastguard Worker 
clear()54*4d7e907cSAndroid Build Coastguard Worker void Ringbuffer::clear() {
55*4d7e907cSAndroid Build Coastguard Worker     data_.clear();
56*4d7e907cSAndroid Build Coastguard Worker     size_ = 0;
57*4d7e907cSAndroid Build Coastguard Worker }
58*4d7e907cSAndroid Build Coastguard Worker 
59*4d7e907cSAndroid Build Coastguard Worker }  // namespace wifi
60*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
61*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
62*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl
63