1 /*
2  * Copyright 2021 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 #pragma once
18 
19 #include <bluetooth/log.h>
20 
21 #include <cstdint>
22 
23 #include "macros.h"
24 
25 // Events that can be received by both multiplexer or port state machines
26 enum tRFC_EVENT : uint16_t {
27   RFC_EVENT_SABME = 0,
28   RFC_EVENT_UA = 1,
29   RFC_EVENT_DM = 2,
30   RFC_EVENT_DISC = 3,
31   RFC_EVENT_UIH = 4,
32   RFC_EVENT_TIMEOUT = 5,
33   RFC_EVENT_BAD_FRAME = 50,
34 };
35 
36 // Multiplexer events
37 enum tRFC_MX_EVENT : uint16_t {
38   RFC_MX_EVENT_SABME = RFC_EVENT_SABME,
39   RFC_MX_EVENT_UA = RFC_EVENT_UA,
40   RFC_MX_EVENT_DM = RFC_EVENT_DM,
41   RFC_MX_EVENT_DISC = RFC_EVENT_DISC,
42   RFC_MX_EVENT_UIH = RFC_EVENT_UIH,
43   RFC_MX_EVENT_TIMEOUT = RFC_EVENT_TIMEOUT,
44   RFC_MX_EVENT_START_REQ = 6,
45   RFC_MX_EVENT_START_RSP = 7,
46   RFC_MX_EVENT_CLOSE_REQ = 8,
47   RFC_MX_EVENT_CONN_CNF = 9,
48   RFC_MX_EVENT_CONN_IND = 10,
49   RFC_MX_EVENT_CONF_CNF = 11,
50   RFC_MX_EVENT_CONF_IND = 12,
51   RFC_MX_EVENT_QOS_VIOLATION_IND = 13,
52   RFC_MX_EVENT_DISC_IND = 14,
53 };
54 
55 // Port events
56 enum tRFC_PORT_EVENT : uint16_t {
57   RFC_PORT_EVENT_SABME = RFC_EVENT_SABME,
58   RFC_PORT_EVENT_UA = RFC_EVENT_UA,
59   RFC_PORT_EVENT_DM = RFC_EVENT_DM,
60   RFC_PORT_EVENT_DISC = RFC_EVENT_DISC,
61   RFC_PORT_EVENT_UIH = RFC_EVENT_UIH,
62   RFC_PORT_EVENT_TIMEOUT = RFC_EVENT_TIMEOUT,
63   RFC_PORT_EVENT_OPEN = 9,
64   RFC_PORT_EVENT_ESTABLISH_RSP = 11,
65   RFC_PORT_EVENT_CLOSE = 12,
66   RFC_PORT_EVENT_CLEAR = 13,
67   RFC_PORT_EVENT_DATA = 14,
68   RFC_PORT_EVENT_SEC_COMPLETE = 15,
69 };
70 
71 // Common events for both port and mux
rfcomm_event_text(const tRFC_EVENT & event)72 inline std::string rfcomm_event_text(const tRFC_EVENT& event) {
73   switch (event) {
74     CASE_RETURN_TEXT(RFC_EVENT_SABME);
75     CASE_RETURN_TEXT(RFC_EVENT_UA);
76     CASE_RETURN_TEXT(RFC_EVENT_DM);
77     CASE_RETURN_TEXT(RFC_EVENT_DISC);
78     CASE_RETURN_TEXT(RFC_EVENT_UIH);
79     CASE_RETURN_TEXT(RFC_EVENT_TIMEOUT);
80     CASE_RETURN_TEXT(RFC_EVENT_BAD_FRAME);
81     default:
82       return std::string("UNKNOWN[") + std::to_string(event) + std::string("]");
83   }
84 }
85 
rfcomm_mx_event_text(const tRFC_MX_EVENT & event)86 inline std::string rfcomm_mx_event_text(const tRFC_MX_EVENT& event) {
87   switch (event) {
88     CASE_RETURN_TEXT(RFC_MX_EVENT_SABME);
89     CASE_RETURN_TEXT(RFC_MX_EVENT_UA);
90     CASE_RETURN_TEXT(RFC_MX_EVENT_DM);
91     CASE_RETURN_TEXT(RFC_MX_EVENT_DISC);
92     CASE_RETURN_TEXT(RFC_MX_EVENT_UIH);
93     CASE_RETURN_TEXT(RFC_MX_EVENT_TIMEOUT);
94     CASE_RETURN_TEXT(RFC_MX_EVENT_START_REQ);
95     CASE_RETURN_TEXT(RFC_MX_EVENT_START_RSP);
96     CASE_RETURN_TEXT(RFC_MX_EVENT_CLOSE_REQ);
97     CASE_RETURN_TEXT(RFC_MX_EVENT_CONN_CNF);
98     CASE_RETURN_TEXT(RFC_MX_EVENT_CONN_IND);
99     CASE_RETURN_TEXT(RFC_MX_EVENT_CONF_CNF);
100     CASE_RETURN_TEXT(RFC_MX_EVENT_CONF_IND);
101     CASE_RETURN_TEXT(RFC_MX_EVENT_QOS_VIOLATION_IND);
102     CASE_RETURN_TEXT(RFC_MX_EVENT_DISC_IND);
103     default:
104       return std::string("UNKNOWN[") + std::to_string(event) + std::string("]");
105   }
106 }
107 
rfcomm_port_event_text(const tRFC_PORT_EVENT & event)108 inline std::string rfcomm_port_event_text(const tRFC_PORT_EVENT& event) {
109   switch (event) {
110     CASE_RETURN_TEXT(RFC_PORT_EVENT_SABME);
111     CASE_RETURN_TEXT(RFC_PORT_EVENT_UA);
112     CASE_RETURN_TEXT(RFC_PORT_EVENT_DM);
113     CASE_RETURN_TEXT(RFC_PORT_EVENT_DISC);
114     CASE_RETURN_TEXT(RFC_PORT_EVENT_UIH);
115     CASE_RETURN_TEXT(RFC_PORT_EVENT_TIMEOUT);
116     CASE_RETURN_TEXT(RFC_PORT_EVENT_OPEN);
117     CASE_RETURN_TEXT(RFC_PORT_EVENT_ESTABLISH_RSP);
118     CASE_RETURN_TEXT(RFC_PORT_EVENT_CLOSE);
119     CASE_RETURN_TEXT(RFC_PORT_EVENT_CLEAR);
120     CASE_RETURN_TEXT(RFC_PORT_EVENT_DATA);
121     CASE_RETURN_TEXT(RFC_PORT_EVENT_SEC_COMPLETE);
122     default:
123       return std::string("UNKNOWN[") + std::to_string(event) + std::string("]");
124   }
125 }
126 
127 namespace std {
128 template <>
129 struct formatter<tRFC_EVENT> : enum_formatter<tRFC_EVENT> {};
130 template <>
131 struct formatter<tRFC_MX_EVENT> : enum_formatter<tRFC_MX_EVENT> {};
132 template <>
133 struct formatter<tRFC_PORT_EVENT> : enum_formatter<tRFC_PORT_EVENT> {};
134 }  // namespace std
135