<div dir="ltr">Hi Felix,<div><br></div><div>Thanks for your review!</div><div><br></div><div>If I understood the code correctly, the header fields are never accessed before the header is fully received - at which point the conversion is done.</div><div><span style="line-height:1.5">My motivation for changing the fields only as they are sent on the wire is to avoid renaming the fields or changing their semantics to avoid backporting messes...</span><br></div><div> </div><div>Could you elaborate on the corner cases? are there any tests I can run to verify them?</div><div><br></div><div>Thanks again!</div><div>Eyal.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Feb 15, 2016 at 12:05 PM Felix Fietkau <<a href="mailto:nbd@openwrt.org">nbd@openwrt.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 2016-02-15 05:09, Eyal Birger wrote:<br>
> Changing the ubus message header fields from 'host' order to 'network' order<br>
> allows passing ubus messages between hosts with different endianity.<br>
><br>
> Example use (creating a ubus proxy):<br>
><br>
> on host A (e.g. big endian router already running ubusd), run:<br>
> $ socat TCP-LISTEN:5699,fork UNIX:/var/run/ubus.sock &<br>
><br>
> On host B (e.g. little endian development PC) run:<br>
> $ socat UNIX-LISTEN:/var/run/ubus.sock,fork TCP:<host A IP>:5699 &<br>
><br>
> Now ubus applications can be run on host B and seamlessly interact with ubus<br>
> applications on host A.<br>
><br>
> Signed-off-by: Eyal Birger <<a href="mailto:eyal.birger@gmail.com" target="_blank">eyal.birger@gmail.com</a>><br>
><br>
> ----<br>
> v2:<br>
>       Applied change to ubusd too. Thanks Felix!<br>
> ---<br>
>  libubus-io.c |  7 +++++--<br>
>  ubusd.c      | 14 ++++++++++++--<br>
>  2 files changed, 17 insertions(+), 4 deletions(-)<br>
><br>
> diff --git a/ubusd.c b/ubusd.c<br>
> index f1f8ac7..7279a70 100644<br>
> --- a/ubusd.c<br>
> +++ b/ubusd.c<br>
> @@ -110,8 +110,15 @@ static int ubus_msg_writev(int fd, struct ubus_msg_buf *ub, int offset)<br>
>       }<br>
><br>
>       if (offset < sizeof(ub->hdr)) {<br>
> -             iov[0].iov_base = ((char *) &ub->hdr) + offset;<br>
> -             iov[0].iov_len = sizeof(ub->hdr) - offset;<br>
> +             struct ubus_msghdr hdr;<br>
> +<br>
> +             hdr.version = ub->hdr.version;<br>
> +             hdr.type = ub->hdr.type;<br>
> +             hdr.seq = cpu_to_be16(ub->hdr.seq);<br>
> +             hdr.peer = cpu_to_be32(ub->hdr.peer);<br>
> +<br>
> +             iov[0].iov_base = ((char *) &hdr) + offset;<br>
> +             iov[0].iov_len = sizeof(hdr) - offset;<br>
>               iov[1].iov_base = (char *) ub->data;<br>
>               iov[1].iov_len = ub->len;<br>
><br>
This has some broken corner cases, because reads can be partial. I'd<br>
prefer endian conversion on access instead of on receive/send, even<br>
though it touches a few more lines.<br>
<br>
- Felix<br>
</blockquote></div>