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:<host A IP>:5699 &

Now ubus applications can be run on host B and seamlessly interact with ubus
applications on host A.

Signed-off-by: Eyal Birger <eyal.birger@gmail.com>
This commit is contained in:
Eyal Birger 2016-02-15 06:09:38 +02:00 committed by Felix Fietkau
parent fda009d8ba
commit 5dfd3c16fa
2 changed files with 17 additions and 4 deletions

View file

@ -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;

14
ubusd.c
View file

@ -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));
}