I added some printf/printk to rtcansend.c as well as rtcan_raw.c:

rtcan_raw.c:
    /* Check size of buffer */
    if (iov->iov_len != sizeof(can_frame_t)) {
            printk("rtcan_raw.c, 850: sizeof(can_frame_t): %ld\n",
                   sizeof(can_frame_t));
                printk("rtcan_raw.c, 852: iov->iov_len: %ld\n",
iov->iov_len);
            return -EMSGSIZE;
    }

when running rtcansend (32-bit compile, which fails with EMSGSIZE):
        [root@pc can]# /usr/xenomai/bin/rtcansend rtcan0 -s 0xde 0xad
        sizeof(can_frame_t): 16
        send: Message too long

        [root@pc can]# dmesg
        [11275.197125] rtcan_raw.c, 850: sizeof(can_frame_t): 16
        [11275.197133] rtcan_raw.c, 852: iov->iov_len: 34494267600

when running rtcansend (64-bit compile, sends out can msg OK):
        [root@pc can]# /usr/xenomai/bin/rtcansend rtcan0 -s 0xde 0xad
        sizeof(can_frame_t): 16

        [root@pc can]# dmesg
        [12476.571032] rtcan_raw.c, 850: sizeof(can_frame_t): 16
        [12476.571040] rtcan_raw.c, 852: iov->iov_len: 16

It looks like the struct user_msghdr *msg passed into rtcan_raw_sendmsg()
is corrupt.
I'm using Xenomai 3.1, with kernel 4.19.989 x86_64
-C Smith

On Tue, Nov 2, 2021 at 12:11 PM Jan Kiszka <jan.kis...@siemens.com> wrote:

> On 02.11.21 19:57, C Smith via Xenomai wrote:
> > I ran into a problem wherein my real-time Xenomai 32-bit app
> > fails on the socket operations of the 64-bit CAN driver.
> > My real-time userspace app is Cobalt x86, compiled -m32.
> >
> > When I try the Xenomai rtcansend.c sample app compiled 32-bit, I get the
> > same error :
> >
> > [root@pc can]# /usr/xenomai/bin/rtcansend rtcan0 --verbose
> > --identifier=0x123 0xde 0xad
> > send: Message too long
> >
> > Looking at rtcansend.c. The call to sendto is failing and returns
> 'Message
> > too long' here:
> > ret = sendto(s, (void *)&frame, sizeof(can_frame_t), 0,
> > (struct sockaddr *)&to_addr, sizeof(to_addr));
> >
> > Here is how I configured Xenomai for 32-bit when I built it:
> > ./configure --host=i686-linux CFLAGS="-m32 -D_FILE_OFFSET_BITS=64"
> > LDFLAGS=-m32 host_alias=i686-linux
> >
> > But note that if I compile both Xenomai and rtcansend.c 64-bit,
> everything
> > works fine.
> >
> > So how can 32-bit Xeno apps use the 64-bit CAN driver ?
> >
>
> We possibly have compat ABI issue here: The Xenomai core can handle
> 32-bit calls of sendto (sendmsg internally) into 64-bit kernel, but
> maybe there is something beyond that interpreted by the CAN driver that
> is not aware of 32 vs. 64 bit userland.
>
> I suspect sizeof(can_frame_t) varies, though I don't see why yet. Could
> you debug that, instrument kernel/drivers/can/rtcan_raw.c as well as the
> userspace code?
>
> The other reason for EMSGSIZE would be msg_iovlen != 1, but that would
> mean we have an issue in the generic compat sendmsg code, and that is
> less likely.
>
> Jan
>
> --
> Siemens AG, T RDA IOT
> Corporate Competence Center Embedded Linux
>

Reply via email to