1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef PROTOCOL_H_
18 #define PROTOCOL_H_
19 
20 #include <cstdint>
21 
22 #include "cutils/sockets.h"
23 
24 namespace android {
25 namespace wifilogd {
26 namespace protocol {
27 
28 constexpr char kServiceSocketName[] = "wifilog";
29 constexpr char kServiceSocketPath[] = ANDROID_SOCKET_DIR "/wifilog";
30 
31 // SOCK_DGRAM require a contiguous memory allocation [1]. Limit the message
32 // size to one normal page, to maximize reliability. (This size isn't a
33 // significant limitation as most messages will be much smaller. We don't
34 // want to go much smaller, though, as packet-fate blobs may be in the
35 // neighborhood of 2KB.)
36 //
37 // [1] http://stackoverflow.com/a/4822037
38 constexpr size_t kMaxMessageSize = 4096;
39 
40 enum class Opcode : uint16_t {
41   kWriteAsciiMessage,
42   kDumpBuffers = 0x20,
43 };
44 
45 enum class MessageSeverity : uint8_t {
46   kError,
47   kWarning,
48   kInformational,
49   kTrace,
50   kDump,
51 };
52 
53 struct Command {
set_opcodeCommand54   Command& set_opcode(Opcode new_opcode) {
55     opcode = new_opcode;
56     return *this;
57   }
58 
set_payload_lenCommand59   Command& set_payload_len(uint16_t new_payload_len) {
60     payload_len = new_payload_len;
61     return *this;
62   }
63 
64   uint64_t src_boottime_nsec;  // For latency measurement.
65   // For drop detection. Sequence numbers are meaningful only within
66   // the context of a single tag. (This is to minimize synchronization
67   // requirements for multi-threaded clients.)
68   uint16_t sequence_num;
69   Opcode opcode;
70   uint16_t payload_len;
71   uint16_t reserved;  // Must be zero.
72   // Payload follows, with content depending on |opcode|.
73 };
74 
75 struct AsciiMessage {  // Old-style log messages.
set_data_lenAsciiMessage76   AsciiMessage& set_data_len(uint16_t new_data_len) {
77     data_len = new_data_len;
78     return *this;
79   }
80 
set_tag_lenAsciiMessage81   AsciiMessage& set_tag_len(uint8_t new_tag_len) {
82     tag_len = new_tag_len;
83     return *this;
84   }
85 
set_severityAsciiMessage86   AsciiMessage& set_severity(MessageSeverity new_severity) {
87     severity = new_severity;
88     return *this;
89   }
90 
91   uint16_t data_len;
92   uint8_t tag_len;
93   MessageSeverity severity;
94   // Payload follows.
95   // uint8_t tag[tag_len];
96   // uint8_t data[data_len];
97 };
98 
99 }  // namespace protocol
100 }  // namespace wifilogd
101 }  // namespace android
102 
103 #endif  // PROTOCOL_H_
104