lib: Provide new API for clients to register services

Add a new set of operations to libqrtr for sending registration events
to the control service, rather than using the nameservice port.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
This commit is contained in:
Bjorn Andersson
2017-06-06 12:42:04 -07:00
parent 35db849ec9
commit ff29fb17a3
3 changed files with 69 additions and 9 deletions

View File

@@ -13,6 +13,7 @@
#include "ns.h"
#define LOGW(fmt, ...) do { fprintf(stderr, "W|qrtr: " fmt "\n", ##__VA_ARGS__); } while (0)
#define LOGE(fmt, ...) do { fprintf(stderr, "E|qrtr: " fmt "\n", ##__VA_ARGS__); } while (0)
#define LOGE_errno(fmt, ...) do { fprintf(stderr, "E|qrtr: " fmt ": %s\n", ##__VA_ARGS__, strerror(errno)); } while (0)
static int qrtr_getname(int sock, struct sockaddr_qrtr *sq)
@@ -96,6 +97,49 @@ int qrtr_sendto(int sock, uint32_t node, uint32_t port, const void *data, unsign
return 0;
}
int qrtr_new_server(int sock, uint32_t service, uint16_t version, uint16_t instance)
{
struct qrtr_ctrl_pkt pkt;
struct sockaddr_qrtr sq;
if (qrtr_getname(sock, &sq))
return -1;
memset(&pkt, 0, sizeof(pkt));
if (!sq.sq_port) {
LOGE("unable to register server on unbound port");
return -1;
}
pkt.cmd = cpu_to_le32(QRTR_CMD_NEW_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));
}
int qrtr_remove_server(int sock, uint32_t service, uint16_t version, uint16_t instance)
{
struct qrtr_ctrl_pkt pkt;
struct sockaddr_qrtr sq;
if (qrtr_getname(sock, &sq))
return -1;
memset(&pkt, 0, sizeof(pkt));
pkt.cmd = cpu_to_le32(QRTR_CMD_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));
}
int qrtr_publish(int sock, uint32_t service, uint16_t version, uint16_t instance)
{
struct sockaddr_qrtr sq;

29
qrtr.py
View File

@@ -16,29 +16,42 @@ class qrtr:
if self.sock < 0:
raise RuntimeError("unable to open qrtr socket")
self.service = None
self._qrtr = _qrtr
def __del__(self):
if self.service != None:
_qrtr.qrtr_bye(self.sock, self.service[0], self.service[1])
_qrtr.qrtr_close(self.sock)
self._qrtr.qrtr_close(self.sock)
def _lookup_list_add(self, ptr, srv, instance, node, port):
res = qrtr.Result(srv, instance, (node, port))
cast(ptr, POINTER(py_object)).contents.value.append(res)
def lookup(self, srv, instance=0, ifilter=0):
results = []
err = _qrtr.qrtr_lookup(self.sock, srv, instance, ifilter,
qrtr._cbtype(self._lookup_list_add), cast(pointer(py_object(results)), c_void_p))
if err:
raise RuntimeError("query failed")
return results
return results
def publish(self, service, instance):
err = _qrtr.qrtr_publish(self.sock, service, instance)
def publish(self, service, version, instance):
err = _qrtr.qrtr_publish(self.sock, service, version, instance)
if err:
raise RuntimeError("publish failed")
self.service = (service, instance)
self.service = (service, version, instance)
def new_server(self, service, version, instance):
err = _qrtr.qrtr_new_server(self.sock, service, version, instance)
if err:
raise RuntimeError("new_server failed")
self.service = (service, version, instance)
return self.service
def remove_server(self, service):
err = _qrtr.qrtr_remove_server(self.sock, *service)
if err:
raise RuntimeError("remove_server failed")
self.service = None
def send(self, addr, data):
node, port = addr

View File

@@ -165,7 +165,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_NEW_SERVER);
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);
@@ -209,6 +209,9 @@ static struct server *server_add(unsigned int service, unsigned int instance,
struct node *node;
int rc;
if (!service || !port)
return NULL;
srv = calloc(1, sizeof(*srv));
if (srv == NULL)
return NULL;