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