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:
Bjorn Andersson
2018-01-31 05:53:49 +00:00
parent b65e63045f
commit 0ec649d4e6
8 changed files with 96 additions and 106 deletions

View File

@@ -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 \

View File

@@ -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;

View File

@@ -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

View File

@@ -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)
{

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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

View File

@@ -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