mirror of
https://github.com/linux-msm/qrtr.git
synced 2025-12-24 05:56:29 +01:00
qrtr: Backport future qrtr.h uapi
The uapi qrtr.h is extended with additional types and constants. Drop the local qrtr.h to use the one from linux-headers and extend it conditionally while we're waiting for the updated file. Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
This commit is contained in:
4
Makefile
4
Makefile
@@ -26,10 +26,14 @@ $(proj)-ns-srcs := \
|
||||
src/waiter.c \
|
||||
src/util.c \
|
||||
|
||||
$(proj)-ns-cflags := -Ilib
|
||||
|
||||
$(proj)-lookup-srcs := \
|
||||
src/lookup.c \
|
||||
src/util.c \
|
||||
|
||||
$(proj)-lookup-cflags := -Ilib
|
||||
|
||||
lib$(proj).so-srcs := \
|
||||
lib/libqrtr.c \
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <linux/qrtr.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -8,7 +9,6 @@
|
||||
#include <errno.h>
|
||||
#include <poll.h>
|
||||
|
||||
#include "qrtr.h"
|
||||
#include "libqrtr.h"
|
||||
#include "ns.h"
|
||||
|
||||
@@ -107,11 +107,11 @@ int qrtr_new_server(int sock, uint32_t service, uint16_t version, uint16_t insta
|
||||
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
|
||||
pkt.cmd = cpu_to_le32(QRTR_CMD_NEW_SERVER);
|
||||
pkt.cmd = cpu_to_le32(QRTR_TYPE_NEW_SERVER);
|
||||
pkt.server.service = cpu_to_le32(service);
|
||||
pkt.server.instance = cpu_to_le32(instance << 16 | version);
|
||||
|
||||
return qrtr_sendto(sock, sq.sq_node, QRTR_CTRL_PORT, &pkt, sizeof(pkt));
|
||||
return qrtr_sendto(sock, sq.sq_node, QRTR_PORT_CTRL, &pkt, sizeof(pkt));
|
||||
}
|
||||
|
||||
int qrtr_remove_server(int sock, uint32_t service, uint16_t version, uint16_t instance)
|
||||
@@ -124,13 +124,13 @@ int qrtr_remove_server(int sock, uint32_t service, uint16_t version, uint16_t in
|
||||
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
|
||||
pkt.cmd = cpu_to_le32(QRTR_CMD_DEL_SERVER);
|
||||
pkt.cmd = cpu_to_le32(QRTR_TYPE_DEL_SERVER);
|
||||
pkt.server.service = cpu_to_le32(service);
|
||||
pkt.server.instance = cpu_to_le32(instance << 16 | version);
|
||||
pkt.server.node = cpu_to_le32(sq.sq_node);
|
||||
pkt.server.port = cpu_to_le32(sq.sq_port);
|
||||
|
||||
return qrtr_sendto(sock, sq.sq_node, QRTR_CTRL_PORT, &pkt, sizeof(pkt));
|
||||
return qrtr_sendto(sock, sq.sq_node, QRTR_PORT_CTRL, &pkt, sizeof(pkt));
|
||||
}
|
||||
|
||||
int qrtr_publish(int sock, uint32_t service, uint16_t version, uint16_t instance)
|
||||
@@ -153,11 +153,11 @@ int qrtr_new_lookup(int sock, uint32_t service, uint16_t version, uint16_t insta
|
||||
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
|
||||
pkt.cmd = cpu_to_le32(QRTR_CMD_NEW_LOOKUP);
|
||||
pkt.cmd = cpu_to_le32(QRTR_TYPE_NEW_LOOKUP);
|
||||
pkt.server.service = cpu_to_le32(service);
|
||||
pkt.server.instance = cpu_to_le32(instance << 16 | version);
|
||||
|
||||
return qrtr_sendto(sock, sq.sq_node, QRTR_CTRL_PORT, &pkt, sizeof(pkt));
|
||||
return qrtr_sendto(sock, sq.sq_node, QRTR_PORT_CTRL, &pkt, sizeof(pkt));
|
||||
}
|
||||
|
||||
int qrtr_remove_lookup(int sock, uint32_t service, uint16_t version, uint16_t instance)
|
||||
@@ -170,13 +170,13 @@ int qrtr_remove_lookup(int sock, uint32_t service, uint16_t version, uint16_t in
|
||||
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
|
||||
pkt.cmd = cpu_to_le32(QRTR_CMD_DEL_LOOKUP);
|
||||
pkt.cmd = cpu_to_le32(QRTR_TYPE_DEL_LOOKUP);
|
||||
pkt.server.service = cpu_to_le32(service);
|
||||
pkt.server.instance = cpu_to_le32(instance << 16 | version);
|
||||
pkt.server.node = cpu_to_le32(sq.sq_node);
|
||||
pkt.server.port = cpu_to_le32(sq.sq_port);
|
||||
|
||||
return qrtr_sendto(sock, sq.sq_node, QRTR_CTRL_PORT, &pkt, sizeof(pkt));
|
||||
return qrtr_sendto(sock, sq.sq_node, QRTR_PORT_CTRL, &pkt, sizeof(pkt));
|
||||
}
|
||||
|
||||
int qrtr_poll(int sock, unsigned int ms)
|
||||
@@ -221,7 +221,7 @@ int qrtr_recvfrom(int sock, void *buf, unsigned int bsz, uint32_t *node, uint32_
|
||||
|
||||
int qrtr_is_ctrl_addr(struct sockaddr_qrtr *sq)
|
||||
{
|
||||
return sq->sq_port == QRTR_CTRL_PORT;
|
||||
return sq->sq_port == QRTR_PORT_CTRL;
|
||||
}
|
||||
|
||||
int qrtr_handle_ctrl_msg(struct sockaddr_qrtr *sq,
|
||||
@@ -243,14 +243,14 @@ int qrtr_handle_ctrl_msg(struct sockaddr_qrtr *sq,
|
||||
|
||||
cmd = le32_to_cpu(pkt->cmd);
|
||||
|
||||
if (cmd == QRTR_CMD_BYE && ops->bye) {
|
||||
if (cmd == QRTR_TYPE_BYE && ops->bye) {
|
||||
return ops->bye(sq->sq_node, data);
|
||||
} else if (cmd == QRTR_CMD_DEL_CLIENT && ops->del_client) {
|
||||
} else if (cmd == QRTR_TYPE_DEL_CLIENT && ops->del_client) {
|
||||
if (len < 3 * sizeof(__le32))
|
||||
return -EINVAL;
|
||||
|
||||
return ops->del_client(pkt->client.node, pkt->client.port, data);
|
||||
} else if (cmd == QRTR_CMD_NEW_SERVER && ops->new_server) {
|
||||
} else if (cmd == QRTR_TYPE_NEW_SERVER && ops->new_server) {
|
||||
if (len < 5 * sizeof(__le32))
|
||||
return -EINVAL;
|
||||
|
||||
@@ -261,7 +261,7 @@ int qrtr_handle_ctrl_msg(struct sockaddr_qrtr *sq,
|
||||
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) {
|
||||
} else if (cmd == QRTR_TYPE_DEL_SERVER && ops->del_server) {
|
||||
if (len < 5 * sizeof(__le32))
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -41,4 +41,43 @@ int qrtr_handle_ctrl_msg(struct sockaddr_qrtr *sq,
|
||||
struct qrtr_ind_ops *ops,
|
||||
void *data);
|
||||
|
||||
/* Initial kernel header didn't expose these */
|
||||
#ifndef QRTR_NODE_BCAST
|
||||
|
||||
#define QRTR_NODE_BCAST 0xffffffffu
|
||||
#define QRTR_PORT_CTRL 0xfffffffeu
|
||||
|
||||
enum qrtr_pkt_type {
|
||||
QRTR_TYPE_DATA = 1,
|
||||
QRTR_TYPE_HELLO = 2,
|
||||
QRTR_TYPE_BYE = 3,
|
||||
QRTR_TYPE_NEW_SERVER = 4,
|
||||
QRTR_TYPE_DEL_SERVER = 5,
|
||||
QRTR_TYPE_DEL_CLIENT = 6,
|
||||
QRTR_TYPE_RESUME_TX = 7,
|
||||
QRTR_TYPE_EXIT = 8,
|
||||
QRTR_TYPE_PING = 9,
|
||||
QRTR_TYPE_NEW_LOOKUP = 10,
|
||||
QRTR_TYPE_DEL_LOOKUP = 11,
|
||||
};
|
||||
|
||||
struct qrtr_ctrl_pkt {
|
||||
__le32 cmd;
|
||||
|
||||
union {
|
||||
struct {
|
||||
__le32 service;
|
||||
__le32 instance;
|
||||
__le32 node;
|
||||
__le32 port;
|
||||
} server;
|
||||
|
||||
struct {
|
||||
__le32 node;
|
||||
__le32 port;
|
||||
} client;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
#include <limits.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/qrtr.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "qrtr.h"
|
||||
#include "libqrtr.h"
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <linux/qrtr.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -8,7 +9,7 @@
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
|
||||
#include "qrtr.h"
|
||||
#include "libqrtr.h"
|
||||
#include "util.h"
|
||||
#include "ns.h"
|
||||
|
||||
@@ -125,12 +126,12 @@ int main(int argc, char **argv)
|
||||
if (rc || sq.sq_family != AF_QIPCRTR || sl != sizeof(sq))
|
||||
err(1, "getsockname()");
|
||||
|
||||
sq.sq_port = QRTR_CTRL_PORT;
|
||||
sq.sq_port = QRTR_PORT_CTRL;
|
||||
|
||||
tv.tv_sec = 1;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
pkt.cmd = cpu_to_le32(QRTR_CMD_NEW_LOOKUP);
|
||||
pkt.cmd = cpu_to_le32(QRTR_TYPE_NEW_LOOKUP);
|
||||
|
||||
rc = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
|
||||
if (rc)
|
||||
@@ -147,7 +148,7 @@ int main(int argc, char **argv)
|
||||
const char *name = NULL;
|
||||
unsigned int i;
|
||||
|
||||
if (len < sizeof(pkt) || type != QRTR_CMD_NEW_SERVER) {
|
||||
if (len < sizeof(pkt) || type != QRTR_TYPE_NEW_SERVER) {
|
||||
warn("invalid/short packet");
|
||||
continue;
|
||||
}
|
||||
|
||||
62
src/ns.c
62
src/ns.c
@@ -1,5 +1,6 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <linux/qrtr.h>
|
||||
#include <unistd.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
@@ -14,21 +15,22 @@
|
||||
#include "waiter.h"
|
||||
#include "list.h"
|
||||
#include "container.h"
|
||||
#include "qrtr.h"
|
||||
#include "util.h"
|
||||
#include "ns.h"
|
||||
|
||||
#include "libqrtr.h"
|
||||
|
||||
static const char *ctrl_pkt_strings[] = {
|
||||
[QRTR_CMD_HELLO] = "hello",
|
||||
[QRTR_CMD_BYE] = "bye",
|
||||
[QRTR_CMD_NEW_SERVER] = "new-server",
|
||||
[QRTR_CMD_DEL_SERVER] = "del-server",
|
||||
[QRTR_CMD_DEL_CLIENT] = "del-client",
|
||||
[QRTR_CMD_RESUME_TX] = "resume-tx",
|
||||
[QRTR_CMD_EXIT] = "exit",
|
||||
[QRTR_CMD_PING] = "ping",
|
||||
[QRTR_CMD_NEW_LOOKUP] = "new-lookup",
|
||||
[QRTR_CMD_DEL_LOOKUP] = "del-lookup",
|
||||
[QRTR_TYPE_HELLO] = "hello",
|
||||
[QRTR_TYPE_BYE] = "bye",
|
||||
[QRTR_TYPE_NEW_SERVER] = "new-server",
|
||||
[QRTR_TYPE_DEL_SERVER] = "del-server",
|
||||
[QRTR_TYPE_DEL_CLIENT] = "del-client",
|
||||
[QRTR_TYPE_RESUME_TX] = "resume-tx",
|
||||
[QRTR_TYPE_EXIT] = "exit",
|
||||
[QRTR_TYPE_PING] = "ping",
|
||||
[QRTR_TYPE_NEW_LOOKUP] = "new-lookup",
|
||||
[QRTR_TYPE_DEL_LOOKUP] = "del-lookup",
|
||||
};
|
||||
|
||||
#define dprintf(...)
|
||||
@@ -156,7 +158,7 @@ static int service_announce_new(struct context *ctx,
|
||||
dprintf("advertising new server [%d:%x]@[%d:%d]\n",
|
||||
srv->service, srv->instance, srv->node, srv->port);
|
||||
|
||||
cmsg.cmd = cpu_to_le32(QRTR_CMD_NEW_SERVER);
|
||||
cmsg.cmd = cpu_to_le32(QRTR_TYPE_NEW_SERVER);
|
||||
cmsg.server.service = cpu_to_le32(srv->service);
|
||||
cmsg.server.instance = cpu_to_le32(srv->instance);
|
||||
cmsg.server.node = cpu_to_le32(srv->node);
|
||||
@@ -180,7 +182,7 @@ static int service_announce_del(struct context *ctx,
|
||||
dprintf("advertising removal of server [%d:%x]@[%d:%d]\n",
|
||||
srv->service, srv->instance, srv->node, srv->port);
|
||||
|
||||
cmsg.cmd = cpu_to_le32(QRTR_CMD_DEL_SERVER);
|
||||
cmsg.cmd = cpu_to_le32(QRTR_TYPE_DEL_SERVER);
|
||||
cmsg.server.service = cpu_to_le32(srv->service);
|
||||
cmsg.server.instance = cpu_to_le32(srv->instance);
|
||||
cmsg.server.node = cpu_to_le32(srv->node);
|
||||
@@ -200,7 +202,7 @@ static int lookup_notify(struct context *ctx, struct sockaddr_qrtr *to,
|
||||
struct qrtr_ctrl_pkt pkt = {};
|
||||
int rc;
|
||||
|
||||
pkt.cmd = new ? QRTR_CMD_NEW_SERVER : QRTR_CMD_DEL_SERVER;
|
||||
pkt.cmd = new ? QRTR_TYPE_NEW_SERVER : QRTR_TYPE_DEL_SERVER;
|
||||
if (srv) {
|
||||
pkt.server.service = cpu_to_le32(srv->service);
|
||||
pkt.server.instance = cpu_to_le32(srv->instance);
|
||||
@@ -352,7 +354,7 @@ static int ctrl_cmd_bye(struct context *ctx, struct sockaddr_qrtr *from)
|
||||
return 0;
|
||||
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
pkt.cmd = QRTR_CMD_BYE;
|
||||
pkt.cmd = QRTR_TYPE_BYE;
|
||||
pkt.client.node = from->sq_node;
|
||||
|
||||
map_for_each(&local_node->services, me) {
|
||||
@@ -415,7 +417,7 @@ static int ctrl_cmd_del_client(struct context *ctx, struct sockaddr_qrtr *from,
|
||||
if (!local_node)
|
||||
return 0;
|
||||
|
||||
pkt.cmd = QRTR_CMD_DEL_CLIENT;
|
||||
pkt.cmd = QRTR_TYPE_DEL_CLIENT;
|
||||
pkt.client.node = node_id;
|
||||
pkt.client.port = port;
|
||||
|
||||
@@ -599,41 +601,41 @@ static void ctrl_port_fn(void *vcontext, struct waiter_ticket *tkt)
|
||||
|
||||
rc = 0;
|
||||
switch (cmd) {
|
||||
case QRTR_CMD_HELLO:
|
||||
case QRTR_TYPE_HELLO:
|
||||
rc = ctrl_cmd_hello(ctx, &sq, buf, len);
|
||||
break;
|
||||
case QRTR_CMD_BYE:
|
||||
case QRTR_TYPE_BYE:
|
||||
rc = ctrl_cmd_bye(ctx, &sq);
|
||||
break;
|
||||
case QRTR_CMD_DEL_CLIENT:
|
||||
case QRTR_TYPE_DEL_CLIENT:
|
||||
rc = ctrl_cmd_del_client(ctx, &sq,
|
||||
le32_to_cpu(msg->client.node),
|
||||
le32_to_cpu(msg->client.port));
|
||||
break;
|
||||
case QRTR_CMD_NEW_SERVER:
|
||||
case QRTR_TYPE_NEW_SERVER:
|
||||
rc = ctrl_cmd_new_server(ctx, &sq,
|
||||
le32_to_cpu(msg->server.service),
|
||||
le32_to_cpu(msg->server.instance),
|
||||
le32_to_cpu(msg->server.node),
|
||||
le32_to_cpu(msg->server.port));
|
||||
break;
|
||||
case QRTR_CMD_DEL_SERVER:
|
||||
case QRTR_TYPE_DEL_SERVER:
|
||||
rc = ctrl_cmd_del_server(ctx, &sq,
|
||||
le32_to_cpu(msg->server.service),
|
||||
le32_to_cpu(msg->server.instance),
|
||||
le32_to_cpu(msg->server.node),
|
||||
le32_to_cpu(msg->server.port));
|
||||
break;
|
||||
case QRTR_CMD_EXIT:
|
||||
case QRTR_CMD_PING:
|
||||
case QRTR_CMD_RESUME_TX:
|
||||
case QRTR_TYPE_EXIT:
|
||||
case QRTR_TYPE_PING:
|
||||
case QRTR_TYPE_RESUME_TX:
|
||||
break;
|
||||
case QRTR_CMD_NEW_LOOKUP:
|
||||
case QRTR_TYPE_NEW_LOOKUP:
|
||||
rc = ctrl_cmd_new_lookup(ctx, &sq,
|
||||
le32_to_cpu(msg->server.service),
|
||||
le32_to_cpu(msg->server.instance));
|
||||
break;
|
||||
case QRTR_CMD_DEL_LOOKUP:
|
||||
case QRTR_TYPE_DEL_LOOKUP:
|
||||
rc = ctrl_cmd_del_lookup(ctx, &sq,
|
||||
le32_to_cpu(msg->server.service),
|
||||
le32_to_cpu(msg->server.instance));
|
||||
@@ -653,7 +655,7 @@ static int say_hello(struct context *ctx)
|
||||
int rc;
|
||||
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
pkt.cmd = cpu_to_le32(QRTR_CMD_HELLO);
|
||||
pkt.cmd = cpu_to_le32(QRTR_TYPE_HELLO);
|
||||
|
||||
rc = sendto(ctx->sock, &pkt, sizeof(pkt), 0,
|
||||
(struct sockaddr *)&ctx->bcast_sq, sizeof(ctx->bcast_sq));
|
||||
@@ -704,7 +706,7 @@ int main(int argc, char **argv)
|
||||
rc = getsockname(ctx.sock, (void*)&sq, &sl);
|
||||
if (rc < 0)
|
||||
err(1, "getsockname()");
|
||||
sq.sq_port = QRTR_CTRL_PORT;
|
||||
sq.sq_port = QRTR_PORT_CTRL;
|
||||
ctx.local_node = sq.sq_node;
|
||||
|
||||
rc = bind(ctx.sock, (void *)&sq, sizeof(sq));
|
||||
@@ -712,8 +714,8 @@ int main(int argc, char **argv)
|
||||
err(1, "bind control socket");
|
||||
|
||||
ctx.bcast_sq.sq_family = AF_QIPCRTR;
|
||||
ctx.bcast_sq.sq_node = QRTRADDR_ANY;
|
||||
ctx.bcast_sq.sq_port = QRTR_CTRL_PORT;
|
||||
ctx.bcast_sq.sq_node = QRTR_NODE_BCAST;
|
||||
ctx.bcast_sq.sq_port = QRTR_PORT_CTRL;
|
||||
|
||||
rc = say_hello(&ctx);
|
||||
if (rc)
|
||||
|
||||
40
src/ns.h
40
src/ns.h
@@ -4,47 +4,7 @@
|
||||
#include <endian.h>
|
||||
#include <stdint.h>
|
||||
|
||||
typedef uint16_t __le16;
|
||||
typedef uint16_t __be16;
|
||||
typedef uint32_t __le32;
|
||||
typedef uint32_t __be32;
|
||||
typedef uint64_t __le64;
|
||||
typedef uint64_t __be64;
|
||||
|
||||
static inline __le32 cpu_to_le32(uint32_t x) { return htole32(x); }
|
||||
static inline uint32_t le32_to_cpu(__le32 x) { return le32toh(x); }
|
||||
|
||||
#define QRTR_CTRL_PORT ((unsigned int)-2)
|
||||
|
||||
enum ctrl_pkt_cmd {
|
||||
QRTR_CMD_HELLO = 2,
|
||||
QRTR_CMD_BYE = 3,
|
||||
QRTR_CMD_NEW_SERVER = 4,
|
||||
QRTR_CMD_DEL_SERVER = 5,
|
||||
QRTR_CMD_DEL_CLIENT = 6,
|
||||
QRTR_CMD_RESUME_TX = 7,
|
||||
QRTR_CMD_EXIT = 8,
|
||||
QRTR_CMD_PING = 9,
|
||||
QRTR_CMD_NEW_LOOKUP = 10,
|
||||
QRTR_CMD_DEL_LOOKUP = 11,
|
||||
};
|
||||
|
||||
struct qrtr_ctrl_pkt {
|
||||
__le32 cmd;
|
||||
|
||||
union {
|
||||
struct {
|
||||
__le32 service;
|
||||
__le32 instance;
|
||||
__le32 node;
|
||||
__le32 port;
|
||||
} server;
|
||||
|
||||
struct {
|
||||
__le32 node;
|
||||
__le32 port;
|
||||
} client;
|
||||
};
|
||||
} __attribute__((packed));
|
||||
|
||||
#endif
|
||||
|
||||
17
src/qrtr.h
17
src/qrtr.h
@@ -1,17 +0,0 @@
|
||||
#ifndef __QRTR_H_
|
||||
#define __QRTR_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef AF_QIPCRTR
|
||||
#define AF_QIPCRTR 42
|
||||
#endif
|
||||
|
||||
struct sockaddr_qrtr {
|
||||
unsigned short sq_family;
|
||||
uint32_t sq_node;
|
||||
uint32_t sq_port;
|
||||
};
|
||||
|
||||
#define QRTRADDR_ANY ((uint32_t)-1)
|
||||
#endif
|
||||
Reference in New Issue
Block a user