/* * Copyright (C) 2016 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 PROTOCOL_H_ #define PROTOCOL_H_ #include <cstdint> #include "cutils/sockets.h" namespace android { namespace wifilogd { namespace protocol { constexpr char kServiceSocketName[] = "wifilog"; constexpr char kServiceSocketPath[] = ANDROID_SOCKET_DIR "/wifilog"; // SOCK_DGRAM require a contiguous memory allocation [1]. Limit the message // size to one normal page, to maximize reliability. (This size isn't a // significant limitation as most messages will be much smaller. We don't // want to go much smaller, though, as packet-fate blobs may be in the // neighborhood of 2KB.) // // [1] http://stackoverflow.com/a/4822037 constexpr size_t kMaxMessageSize = 4096; enum class Opcode : uint16_t { kWriteAsciiMessage, kDumpBuffers = 0x20, }; enum class MessageSeverity : uint8_t { kError, kWarning, kInformational, kTrace, kDump, }; struct Command { Command& set_opcode(Opcode new_opcode) { opcode = new_opcode; return *this; } Command& set_payload_len(uint16_t new_payload_len) { payload_len = new_payload_len; return *this; } uint64_t src_boottime_nsec; // For latency measurement. // For drop detection. Sequence numbers are meaningful only within // the context of a single tag. (This is to minimize synchronization // requirements for multi-threaded clients.) uint16_t sequence_num; Opcode opcode; uint16_t payload_len; uint16_t reserved; // Must be zero. // Payload follows, with content depending on |opcode|. }; struct AsciiMessage { // Old-style log messages. AsciiMessage& set_data_len(uint16_t new_data_len) { data_len = new_data_len; return *this; } AsciiMessage& set_tag_len(uint8_t new_tag_len) { tag_len = new_tag_len; return *this; } AsciiMessage& set_severity(MessageSeverity new_severity) { severity = new_severity; return *this; } uint16_t data_len; uint8_t tag_len; MessageSeverity severity; // Payload follows. // uint8_t tag[tag_len]; // uint8_t data[data_len]; }; } // namespace protocol } // namespace wifilogd } // namespace android #endif // PROTOCOL_H_