ns: Remove the ns service

Now that we have moved all operations to the control socket we can
remove the ns handler. The query function in the library is racy, as
there might be non-response messages in our incoming buffer when we
start reading, so this is dropped too - rather than just being
translated to the new interface.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
This commit is contained in:
Bjorn Andersson
2017-06-06 21:03:21 -07:00
parent f775838736
commit 0bc03abb43
3 changed files with 1 additions and 241 deletions

View File

@@ -232,53 +232,3 @@ int qrtr_recvfrom(int sock, void *buf, unsigned int bsz, uint32_t *node, uint32_
*port = sq.sq_port;
return rc;
}
int qrtr_lookup(int sock, uint32_t service, uint16_t version, uint16_t instance, uint32_t ifilter,
void (* cb)(void *,uint32_t,uint32_t,uint32_t,uint32_t), void *udata)
{
struct sockaddr_qrtr sq;
struct ns_pkt pkt;
int len;
int rc;
if (qrtr_getname(sock, &sq))
return -1;
memset(&pkt, 0, sizeof(pkt));
pkt.type = cpu_to_le32(NS_PKT_QUERY);
pkt.query.ifilter = cpu_to_le32(ifilter);
pkt.query.instance = cpu_to_le32(instance << 16 | version);
pkt.query.service = cpu_to_le32(service);
rc = qrtr_sendto(sock, sq.sq_node, NS_PORT, &pkt, sizeof(pkt));
if (rc < 0)
return -1;
while ((len = recv(sock, &pkt, sizeof(pkt), 0)) > 0) {
unsigned int type = le32_to_cpu(pkt.type);
if (len < sizeof(pkt) || type != NS_PKT_NOTICE) {
LOGW("invalid/short packet");
continue;
}
if (pkt.notice.seq == 0)
break;
pkt.notice.service = le32_to_cpu(pkt.notice.service);
pkt.notice.instance = le32_to_cpu(pkt.notice.instance);
pkt.notice.node = le32_to_cpu(pkt.notice.node);
pkt.notice.port = le32_to_cpu(pkt.notice.port);
cb(udata, pkt.notice.service, pkt.notice.instance,
pkt.notice.node, pkt.notice.port);
}
if (len < 0) {
LOGE_errno("recv()");
return -1;
}
return 0;
}

159
src/ns.c
View File

@@ -35,7 +35,6 @@ static const char *ctrl_pkt_strings[] = {
struct context {
int ctrl_sock;
int ns_sock;
int local_node;
@@ -613,154 +612,6 @@ static int say_hello(struct context *ctx)
return 0;
}
static void ns_pkt_publish(int sock, struct sockaddr_qrtr *sq_src,
unsigned int service, unsigned int instance)
{
struct qrtr_ctrl_pkt cmsg;
struct sockaddr_qrtr sq;
struct server *srv;
int rc;
srv = server_add(service, instance, sq_src->sq_node, sq_src->sq_port);
if (srv == NULL) {
warn("unable to add server");
return;
}
cmsg.cmd = cpu_to_le32(QRTR_CMD_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);
cmsg.server.port = cpu_to_le32(srv->port);
sq.sq_family = AF_QIPCRTR;
sq.sq_node = QRTRADDR_ANY;
sq.sq_port = QRTR_CTRL_PORT;
rc = sendto(sock, &cmsg, sizeof(cmsg), 0, (void *)&sq, sizeof(sq));
if (rc < 0)
warn("sendto()");
}
static void ns_pkt_bye(int sock, struct sockaddr_qrtr *sq_src)
{
struct qrtr_ctrl_pkt cmsg;
struct sockaddr_qrtr sq;
struct server *srv;
int rc;
srv = server_del(sq_src->sq_node, sq_src->sq_port);
if (srv == NULL) {
warnx("bye from to unregistered server");
return;
}
cmsg.cmd = cpu_to_le32(QRTR_CMD_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);
cmsg.server.port = cpu_to_le32(srv->port);
free(srv);
sq.sq_family = AF_QIPCRTR;
sq.sq_node = QRTRADDR_ANY;
sq.sq_port = QRTR_CTRL_PORT;
rc = sendto(sock, &cmsg, sizeof(cmsg), 0, (void *)&sq, sizeof(sq));
if (rc < 0)
warn("sendto()");
}
static void ns_pkt_query(int sock, struct sockaddr_qrtr *sq,
struct server_filter *filter)
{
struct list reply_list;
struct list_item *li;
struct ns_pkt opkt;
int seq;
int rc;
seq = server_query(filter, &reply_list);
memset(&opkt, 0, sizeof(opkt));
opkt.type = NS_PKT_NOTICE;
list_for_each(&reply_list, li) {
struct server *srv = container_of(li, struct server, qli);
opkt.notice.seq = cpu_to_le32(seq);
opkt.notice.service = cpu_to_le32(srv->service);
opkt.notice.instance = cpu_to_le32(srv->instance);
opkt.notice.node = cpu_to_le32(srv->node);
opkt.notice.port = cpu_to_le32(srv->port);
rc = sendto(sock, &opkt, sizeof(opkt),
0, (void *)sq, sizeof(*sq));
if (rc < 0) {
warn("sendto()");
break;
}
--seq;
}
if (rc < 0)
return;
memset(&opkt, 0, sizeof(opkt));
opkt.type = NS_PKT_NOTICE;
rc = sendto(sock, &opkt, sizeof(opkt), 0, (void *)sq, sizeof(*sq));
if (rc < 0)
warn("sendto()");
}
static void ns_port_fn(void *vcontext, struct waiter_ticket *tkt)
{
struct context *ctx = vcontext;
struct server_filter filter;
struct sockaddr_qrtr sq;
int sock = ctx->ns_sock;
struct ns_pkt *msg;
char buf[4096];
socklen_t sl;
ssize_t len;
sl = sizeof(sq);
len = recvfrom(sock, buf, sizeof(buf), 0, (void *)&sq, &sl);
if (len <= 0) {
warn("recvfrom()");
close(sock);
ctx->ns_sock = -1;
goto out;
}
msg = (void *)buf;
dprintf("new packet; from: %d:%d\n", sq.sq_node, sq.sq_port);
if (len < 4) {
warnx("short packet from %d:%d", sq.sq_node, sq.sq_port);
goto out;
}
switch (le32_to_cpu(msg->type)) {
case NS_PKT_PUBLISH:
ns_pkt_publish(ctx->ctrl_sock, &sq,
le32_to_cpu(msg->publish.service),
le32_to_cpu(msg->publish.instance));
break;
case NS_PKT_BYE:
ns_pkt_bye(ctx->ctrl_sock, &sq);
break;
case NS_PKT_QUERY:
filter.service = le32_to_cpu(msg->query.service);
filter.instance = le32_to_cpu(msg->query.instance);
filter.ifilter = le32_to_cpu(msg->query.ifilter);
ns_pkt_query(sock, &sq, &filter);
break;
case NS_PKT_NOTICE:
break;
}
out:
waiter_ticket_clear(tkt);
}
static int qrtr_socket(int port)
{
struct sockaddr_qrtr sq;
@@ -829,10 +680,6 @@ int main(int argc, char **argv)
if (ctx.ctrl_sock < 0)
errx(1, "unable to create control socket");
ctx.ns_sock = qrtr_socket(NS_PORT);
if (ctx.ns_sock < 0)
errx(1, "unable to create nameserver socket");
rc = getsockname(ctx.ctrl_sock, (void*)&sq, &sl);
if (rc < 0)
err(1, "getsockname()");
@@ -849,17 +696,13 @@ int main(int argc, char **argv)
if (fork() != 0) {
close(ctx.ctrl_sock);
close(ctx.ns_sock);
exit(0);
}
tkt = waiter_add_fd(w, ctx.ctrl_sock);
waiter_ticket_callback(tkt, ctrl_port_fn, &ctx);
tkt = waiter_add_fd(w, ctx.ns_sock);
waiter_ticket_callback(tkt, ns_port_fn, &ctx);
while (ctx.ctrl_sock >= 0 && ctx.ns_sock >= 0)
while (ctx.ctrl_sock >= 0)
waiter_wait(w);
puts("exiting cleanly");

View File

@@ -14,41 +14,8 @@ 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 NS_PORT 53
#define QRTR_CTRL_PORT ((unsigned int)-2)
enum ns_pkt_type {
NS_PKT_RESET = 0,
NS_PKT_PUBLISH = 1,
NS_PKT_QUERY = 3,
NS_PKT_NOTICE = 4,
NS_PKT_BYE = 5,
};
struct ns_pkt {
__le32 type;
union {
struct {
__le32 service;
__le32 instance;
__le32 ifilter;
} query;
struct {
__le32 service;
__le32 instance;
} publish, bye;
struct {
__le32 seq;
__le32 service;
__le32 instance;
__le32 node;
__le32 port;
} notice;
};
} __attribute__((packed));
enum ctrl_pkt_cmd {
QRTR_CMD_HELLO = 2,
QRTR_CMD_BYE = 3,