blob: 93254df16e10eacab9cb6154ee80a43663ba58bd [file] [log] [blame]
Amit Pundird477f822020-02-07 22:26:08 +05301#ifndef _QRTR_LIB_H_
2#define _QRTR_LIB_H_
3
4#include <linux/qrtr.h>
5#include <sys/types.h>
6#include <sys/socket.h>
Amit Pundir53c12872022-10-27 21:55:51 +05307#include <stddef.h>
Amit Pundird477f822020-02-07 22:26:08 +05308#include <stdint.h>
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14#ifndef offsetof
Amit Pundir53c12872022-10-27 21:55:51 +053015#define offsetof(type, md) ((size_t)&((type *)0)->md)
Amit Pundird477f822020-02-07 22:26:08 +053016#endif
17
18#ifndef container_of
19#define container_of(ptr, type, member) \
20 ((type *)((char *)(ptr) - offsetof(type, member)))
21#endif
22
23#ifndef AF_QIPCRTR
24#define AF_QIPCRTR 42
25#endif
26
27struct sockaddr_qrtr;
28
29struct qrtr_packet {
30 int type;
31
32 unsigned int node;
33 unsigned int port;
34
35 unsigned int service;
36 unsigned int instance;
37 unsigned int version;
38
39 void *data;
40 size_t data_len;
41};
42
43#define DEFINE_QRTR_PACKET(pkt, size) \
44 char pkt ## _buf[size]; \
45 struct qrtr_packet pkt = { .data = pkt ##_buf, \
46 .data_len = sizeof(pkt ##_buf), }
47
48#define QMI_REQUEST 0
49#define QMI_RESPONSE 2
50#define QMI_INDICATION 4
51
52#define QMI_COMMON_TLV_TYPE 0
53
54enum qmi_elem_type {
55 QMI_EOTI,
56 QMI_OPT_FLAG,
57 QMI_DATA_LEN,
58 QMI_UNSIGNED_1_BYTE,
59 QMI_UNSIGNED_2_BYTE,
60 QMI_UNSIGNED_4_BYTE,
61 QMI_UNSIGNED_8_BYTE,
62 QMI_SIGNED_1_BYTE_ENUM,
63 QMI_SIGNED_2_BYTE_ENUM,
64 QMI_SIGNED_4_BYTE_ENUM,
65 QMI_STRUCT,
66 QMI_STRING,
67};
68
69enum qmi_array_type {
70 NO_ARRAY,
71 STATIC_ARRAY,
72 VAR_LEN_ARRAY,
73};
74
75/**
76 * struct qmi_elem_info - describes how to encode a single QMI element
77 * @data_type: Data type of this element.
78 * @elem_len: Array length of this element, if an array.
79 * @elem_size: Size of a single instance of this data type.
80 * @array_type: Array type of this element.
81 * @tlv_type: QMI message specific type to identify which element
82 * is present in an incoming message.
83 * @offset: Specifies the offset of the first instance of this
84 * element in the data structure.
85 * @ei_array: Null-terminated array of @qmi_elem_info to describe nested
86 * structures.
87 */
88struct qmi_elem_info {
89 enum qmi_elem_type data_type;
90 uint32_t elem_len;
91 uint32_t elem_size;
92 enum qmi_array_type array_type;
93 uint8_t tlv_type;
Amit Pundir53c12872022-10-27 21:55:51 +053094 size_t offset;
Amit Pundird477f822020-02-07 22:26:08 +053095 struct qmi_elem_info *ei_array;
96};
97
98#define QMI_RESULT_SUCCESS_V01 0
99#define QMI_RESULT_FAILURE_V01 1
100
101#define QMI_ERR_NONE_V01 0
102#define QMI_ERR_MALFORMED_MSG_V01 1
103#define QMI_ERR_NO_MEMORY_V01 2
104#define QMI_ERR_INTERNAL_V01 3
105#define QMI_ERR_CLIENT_IDS_EXHAUSTED_V01 5
106#define QMI_ERR_INVALID_ID_V01 41
107#define QMI_ERR_ENCODING_V01 58
108#define QMI_ERR_INCOMPATIBLE_STATE_V01 90
109#define QMI_ERR_NOT_SUPPORTED_V01 94
110
111/**
112 * qmi_response_type_v01 - common response header (decoded)
113 * @result: result of the transaction
114 * @error: error value, when @result is QMI_RESULT_FAILURE_V01
115 */
116struct qmi_response_type_v01 {
117 uint16_t result;
118 uint16_t error;
119};
120
121extern struct qmi_elem_info qmi_response_type_v01_ei[];
122
123int qrtr_open(int rport);
124void qrtr_close(int sock);
125
126int qrtr_sendto(int sock, uint32_t node, uint32_t port, const void *data, unsigned int sz);
127int qrtr_recvfrom(int sock, void *buf, unsigned int bsz, uint32_t *node, uint32_t *port);
128int qrtr_recv(int sock, void *buf, unsigned int bsz);
129
130int qrtr_new_server(int sock, uint32_t service, uint16_t version, uint16_t instance);
131int qrtr_remove_server(int sock, uint32_t service, uint16_t version, uint16_t instance);
132
133int qrtr_publish(int sock, uint32_t service, uint16_t version, uint16_t instance);
134int qrtr_bye(int sock, uint32_t service, uint16_t version, uint16_t instance);
135
136int qrtr_new_lookup(int sock, uint32_t service, uint16_t version, uint16_t instance);
137int qrtr_remove_lookup(int sock, uint32_t service, uint16_t version, uint16_t instance);
138
139int qrtr_poll(int sock, unsigned int ms);
140
141int qrtr_decode(struct qrtr_packet *dest, void *buf, size_t len,
142 const struct sockaddr_qrtr *sq);
143
144int qmi_decode_header(const struct qrtr_packet *pkt, unsigned int *msg_id);
145int qmi_decode_message(void *c_struct, unsigned int *txn,
146 const struct qrtr_packet *pkt,
147 int type, int id, struct qmi_elem_info *ei);
148ssize_t qmi_encode_message(struct qrtr_packet *pkt, int type, int msg_id,
149 int txn_id, const void *c_struct,
150 struct qmi_elem_info *ei);
151
152/* Initial kernel header didn't expose these */
153#ifndef QRTR_NODE_BCAST
154
155#define QRTR_NODE_BCAST 0xffffffffu
156#define QRTR_PORT_CTRL 0xfffffffeu
157
158enum qrtr_pkt_type {
159 QRTR_TYPE_DATA = 1,
160 QRTR_TYPE_HELLO = 2,
161 QRTR_TYPE_BYE = 3,
162 QRTR_TYPE_NEW_SERVER = 4,
163 QRTR_TYPE_DEL_SERVER = 5,
164 QRTR_TYPE_DEL_CLIENT = 6,
165 QRTR_TYPE_RESUME_TX = 7,
166 QRTR_TYPE_EXIT = 8,
167 QRTR_TYPE_PING = 9,
168 QRTR_TYPE_NEW_LOOKUP = 10,
169 QRTR_TYPE_DEL_LOOKUP = 11,
170};
171
172struct qrtr_ctrl_pkt {
173 __le32 cmd;
174
175 union {
176 struct {
177 __le32 service;
178 __le32 instance;
179 __le32 node;
180 __le32 port;
181 } server;
182
183 struct {
184 __le32 node;
185 __le32 port;
186 } client;
187 };
188} __attribute__((packed));
189
190#endif
191
192#ifdef __cplusplus
193} /* extern "C" */
194#endif
195
196#endif