/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SRC_PROTOZERO_FILTERING_FILTER_BYTECODE_PARSER_H_ #define SRC_PROTOZERO_FILTERING_FILTER_BYTECODE_PARSER_H_ #include <stddef.h> #include <stdint.h> #include <optional> #include <vector> namespace protozero { // Loads the proto-encoded bytecode in memory and allows fast lookups for tuples // (msg_index, field_id) to tell if a given field should be allowed or not and, // in the case of nested fields, what is the next message index to recurse into. // This class does two things: // 1. Expands the array of varint from the proto into a vector<uint32_t>. This // is to avoid performing varint decoding on every lookup, at the cost of // some extra memory (2KB-4KB). Note that the expanded vector is not just a // 1:1 copy of the proto one (more below). This is to avoid O(Fields) linear // lookup complexity. // 2. Creates an index of offsets to remember the start word for each message. // This is so we can jump to O(1) to the N-th message when recursing into a // nested fields, without having to scan and find the (N-1)-th END_OF_MESSAGE // marker. // Overall lookups are O(1) for field ids < 128 (kDirectlyIndexLimit) and O(N), // with N being the number of allowed field ranges for other fields. // See comments around |word_| below for the structure of the word vector. class FilterBytecodeParser { … }; } // namespace protozero #endif // SRC_PROTOZERO_FILTERING_FILTER_BYTECODE_PARSER_H_