diff --git a/lib/libqrtr.c b/lib/libqrtr.c index 7b89e7a..79e57eb 100644 --- a/lib/libqrtr.c +++ b/lib/libqrtr.c @@ -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; diff --git a/qrtr.py b/qrtr.py index a305c8e..141bd70 100755 --- a/qrtr.py +++ b/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 diff --git a/src/ns.c b/src/ns.c index 2100f8d..31c38fe 100644 --- a/src/ns.c +++ b/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;