From 5dfd3c16fa1cc9e288c41ef6e3e4c3bc63acf612 Mon Sep 17 00:00:00 2001 From: Eyal Birger Date: Mon, 15 Feb 2016 06:09:38 +0200 Subject: [PATCH] ubus: use network order in ubus message header fields Changing the ubus message header fields from 'host' order to 'network' order allows passing ubus messages between hosts with different endianity. Example use (creating a ubus proxy): on host A (e.g. big endian router already running ubusd), run: $ socat TCP-LISTEN:5699,fork UNIX:/var/run/ubus.sock & On host B (e.g. little endian development PC) run: $ socat UNIX-LISTEN:/var/run/ubus.sock,fork TCP::5699 & Now ubus applications can be run on host B and seamlessly interact with ubus applications on host A. Signed-off-by: Eyal Birger --- libubus-io.c | 7 +++++-- ubusd.c | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/libubus-io.c b/libubus-io.c index b9b3128..9320bf3 100644 --- a/libubus-io.c +++ b/libubus-io.c @@ -133,8 +133,8 @@ int __hidden ubus_send_msg(struct ubus_context *ctx, uint32_t seq, hdr.version = 0; hdr.type = cmd; - hdr.seq = seq; - hdr.peer = peer; + hdr.seq = cpu_to_be16(seq); + hdr.peer = cpu_to_be32(peer); if (!msg) { blob_buf_init(&b, 0); @@ -281,6 +281,9 @@ static bool get_next_msg(struct ubus_context *ctx, int *recv_fd) return false; } + hdrbuf.hdr.seq = be16_to_cpu(hdrbuf.hdr.seq); + hdrbuf.hdr.peer = be32_to_cpu(hdrbuf.hdr.peer); + if (!ubus_validate_hdr(&hdrbuf.hdr)) return false; diff --git a/ubusd.c b/ubusd.c index f1f8ac7..7279a70 100644 --- a/ubusd.c +++ b/ubusd.c @@ -110,8 +110,15 @@ static int ubus_msg_writev(int fd, struct ubus_msg_buf *ub, int offset) } if (offset < sizeof(ub->hdr)) { - iov[0].iov_base = ((char *) &ub->hdr) + offset; - iov[0].iov_len = sizeof(ub->hdr) - offset; + struct ubus_msghdr hdr; + + hdr.version = ub->hdr.version; + hdr.type = ub->hdr.type; + hdr.seq = cpu_to_be16(ub->hdr.seq); + hdr.peer = cpu_to_be32(ub->hdr.peer); + + iov[0].iov_base = ((char *) &hdr) + offset; + iov[0].iov_len = sizeof(hdr) - offset; iov[1].iov_base = (char *) ub->data; iov[1].iov_len = ub->len; @@ -275,6 +282,9 @@ retry: if (!cl->pending_msg) goto disconnect; + cl->hdrbuf.hdr.seq = be16_to_cpu(cl->hdrbuf.hdr.seq); + cl->hdrbuf.hdr.peer = be32_to_cpu(cl->hdrbuf.hdr.peer); + memcpy(&cl->pending_msg->hdr, &cl->hdrbuf.hdr, sizeof(cl->hdrbuf.hdr)); memcpy(cl->pending_msg->data, &cl->hdrbuf.data, sizeof(cl->hdrbuf.data)); } -- 2.25.1