mirror of
https://github.com/linux-msm/qrtr.git
synced 2025-12-24 14:06:30 +01:00
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:
@@ -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
29
qrtr.py
@@ -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
|
||||
|
||||
5
src/ns.c
5
src/ns.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user