Re: [PATCH can-next] can: dev: always create TX echo skb

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marc,

On Wed. 10 Mar 2021 at 06:19, Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> wrote:
>
> So far the creation of the TX echo skb was optional and can be
> controlled by the local sender of a CAN frame.
>
> It turns out that the TX echo CAN skb can be piggybacked to carry
> information in the driver from the TX- to the TX-complete handler.
>
> Several drivers already use the return value of
> can_get_echo_skb() (which is the length of the data field in the CAN
> frame) for their number of transferred bytes statistics. The
> statistics are not working if CAN echo skbs are disabled.
>
> Another use case is to calculate and set the CAN frame length on the
> wire, which is needed for BQL support in both the TX and TX-completion
> handler.
>
> For now in can_put_echo_skb(), which is called from the TX handler,
> the skb carrying the CAN frame is discarded if no TX echo is
> requested, leading to the above illustrated problems.
>
> This patch changes the can_put_echo_skb() function, so that the echo
> skb is always generated. If the sender requests no echo, the echo skb
> is consumed in __can_get_echo_skb() without being passed into the RX
> handler of the networking stack, but the CAN data length and CAN frame
> length information is properly returned.
>
> Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
> ---
>  drivers/net/can/dev/skb.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c
> index 6a64fe410987..22b0472a5fad 100644
> --- a/drivers/net/can/dev/skb.c
> +++ b/drivers/net/can/dev/skb.c
> @@ -45,7 +45,7 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
>         BUG_ON(idx >= priv->echo_skb_max);
>
>         /* check flag whether this packet has to be looped back */
> -       if (!(dev->flags & IFF_ECHO) || skb->pkt_type != PACKET_LOOPBACK ||
> +       if (!(dev->flags & IFF_ECHO) ||
>             (skb->protocol != htons(ETH_P_CAN) &&
>              skb->protocol != htons(ETH_P_CANFD))) {
>                 kfree_skb(skb);
> @@ -58,7 +58,6 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
>                         return -ENOMEM;
>
>                 /* make settings for echo to reduce code in irq context */
> -               skb->pkt_type = PACKET_BROADCAST;
>                 skb->ip_summed = CHECKSUM_UNNECESSARY;
>                 skb->dev = dev;
>
> @@ -111,6 +110,13 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr,
>
>                 priv->echo_skb[idx] = NULL;
>
> +               if (skb->pkt_type == PACKET_LOOPBACK) {
> +                       skb->pkt_type = PACKET_BROADCAST;
> +               } else {
> +                       dev_consume_skb_any(skb);
> +                       return NULL;
> +               }
> +
>                 return skb;
>         }

I do see any particular issues on this patch at the moment,
however, while looking at the TX echo functionality, it reminded
me of a point which has always been a bit unclear to me: the
CAN_CTRLMODE_LOOPBACK. So let me go a bit off topic.

Like all other controller's mode, I would expect the
CAN_CTRLMODE_LOOPBACK flag to do two things:
  - Announce that the device is capable of doing loopback
  - Control this feature (enable/disable it)

But, by default, this flag is set to 0 unless the user
explicitly passes the "loopback on" argument when configuring
the device.

So isn't this supposed to be an issue for all the drivers which
expect to get a TX loopback in order to trigger the TX completion
handler?

Personally, for my driver, I would like to use the
can_set_static_ctrlmode() to force CAN_CTRLMODE_LOOPBACK so that
I do not need a different TX completion logic when
CAN_CTRLMODE_LOOPBACK is off.

The issue is that because CAN_CTRLMODE_LOOPBACK is per default
off, doing:
  can_set_static_ctrlmode(netdev, CAN_CTRLMODE_LOOPBACK);
would lead to a
  RTNETLINK answers: Operation not supported
when configuring the device unless "loopback on" is explicitly
passed on the command line.

At the moment, I have the feeling that many drivers just ignore
the value of this flag and activate the loopback regardless.

Do you think that it would make sense to set
CAN_CTRLMODE_LOOPBACK by default to on?


Yours sincerely,
Vincent



[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux