lib: Fix endian handling and add new/del server

Fix up the handling of endian translation and add support for decoding
new and del server messages.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
This commit is contained in:
Bjorn Andersson
2017-06-07 09:46:15 -07:00
parent 0a2f2111f7
commit ba500a4d3d
2 changed files with 39 additions and 8 deletions

View File

@@ -245,21 +245,48 @@ int qrtr_handle_ctrl_msg(struct sockaddr_qrtr *sq,
void *data)
{
const struct qrtr_ctrl_pkt *pkt = buf;
uint16_t instance;
uint32_t service;
uint16_t version;
uint32_t node;
uint32_t port;
int cmd;
if (len < sizeof(__le32))
return -EINVAL;
switch (pkt->cmd) {
case QRTR_CMD_BYE:
return ops->bye ? ops->bye(sq->sq_node, data) : 0;
case QRTR_CMD_DEL_CLIENT:
cmd = le32_to_cpu(pkt->cmd);
if (cmd == QRTR_CMD_BYE && ops->bye) {
return ops->bye(sq->sq_node, data);
} else if (cmd == QRTR_CMD_DEL_CLIENT && ops->del_client) {
if (len < 3 * sizeof(__le32))
return -EINVAL;
return ops->del_client ?
ops->del_client(pkt->client.node, pkt->client.port, data) :
0;
return ops->del_client(pkt->client.node, pkt->client.port, data);
} else if (cmd == QRTR_CMD_NEW_SERVER && ops->new_server) {
if (len < 5 * sizeof(__le32))
return -EINVAL;
node = le32_to_cpu(pkt->server.node);
port = le32_to_cpu(pkt->server.port);
service = le32_to_cpu(pkt->server.service);
version = le32_to_cpu(pkt->server.instance) & 0xffff;
instance = le32_to_cpu(pkt->server.instance) >> 16;
return ops->new_server(service, version, instance, node, port, data);
} else if (cmd == QRTR_CMD_DEL_SERVER && ops->del_server) {
if (len < 5 * sizeof(__le32))
return -EINVAL;
node = le32_to_cpu(pkt->server.node);
port = le32_to_cpu(pkt->server.port);
service = le32_to_cpu(pkt->server.service);
version = le32_to_cpu(pkt->server.instance) & 0xffff;
instance = le32_to_cpu(pkt->server.instance) >> 16;
return ops->del_server(service, version, instance, node, port, data);
}
return -EINVAL;
return 0;
}

View File

@@ -8,6 +8,10 @@ struct sockaddr_qrtr;
struct qrtr_ind_ops {
int (*bye)(uint32_t node, void *data);
int (*del_client)(uint32_t node, uint32_t port, void *data);
int (*new_server)(uint32_t service, uint16_t version, uint16_t instance,
uint32_t node, uint32_t port, void *data);
int (*del_server)(uint32_t service, uint16_t version, uint16_t instance,
uint32_t node, uint32_t port, void *data);
};
int qrtr_open(int rport);