Wolfgang Grandegger wrote:
> Oliver Hartkopp wrote:
>> Wolfgang Grandegger wrote:
>>> Hi Oliver,
>>>
>>> Oliver Hartkopp wrote:
>>>> Wolfgang Grandegger wrote:
>>>>
>>>>>>> Please also check for useless "dlc > 8" checks in the
>>>>>>> start_xmit function.
>>>>>> I thought about that and i'm not really sure about it:
>>>>>> What if anyone uses PF_PACKET with CAN netdevices, which is a possible 
>>>>>> use-case?
>>>>> OK.
>>>> Any ideas how to proceed in the start_xmit functions?
>>>>
>>>> We could add something like this consistently to *all* start_xmit 
>>>> functions:
>>>>
>>>> Index: drivers/net/can/sja1000/sja1000.c
>>>> ===================================================================
>>>> --- drivers/net/can/sja1000/sja1000.c      (Revision 1095)
>>>> +++ drivers/net/can/sja1000/sja1000.c      (Arbeitskopie)
>>>> @@ -257,6 +257,13 @@
>>>>    uint8_t dreg;
>>>>    int i;
>>>>
>>>> +  if (WARN_ONCE(skb->len != sizeof(*cf) || cf->can_dlc > 8,
>>>> +                "Dropped non conform skbuf: len %d, can_dlc %d\n",
>>>> +                skb->len, cf->can_dlc)) {
>>>> +          kfree_skb(skb);
>>>> +          return 0;
>>>> +  }
>>>> +
>>>>    netif_stop_queue(dev);
>>>>
>>>>    fi = dlc = cf->can_dlc;
>>> I'm just preparing a patch for the MSCAN touching the same topic, which
>>> I have attached below. What do you think? I also wonder if we should
>>> use dev_kfree_skb()?
>> dev_kfree_skb() is mapped to consume_skb() which indicates that everything
>> went ok in the receive path.
>>
>> IMO kfree_skb() is fine here.
>>
>>> -   if (frame->can_dlc > 8)
>>> -           return -EINVAL;
>>> +   if (skb->len != sizeof(*frame) || frame->can_dlc > 8) {
>>> +           dev_err(dev->dev.parent,
>>> +                   "Dropping non-conform paket: len %d, can_dlc %d\n",
>>> +                   skb->len, frame->can_dlc);
>>> +           kfree_skb(skb);
>>> +           return  NETDEV_TX_OK;
>>> +   }
>>>  
>>
>> I can see several drawbacks in this implementation:
>>
>> - no 'unlikely()' hint for the gcc which is provided by WARN_ONCE
> 
> Well, some people care, others don't. We actually do not use it
> consequently in SocketCAN, at least.
> 
>> - dev_err() is not rate limited and may cause kernel log load
> 
> Rate-limitation might be a good thing though.
> 
>> But the NETDEV_TX_OK could be added into the original patch ;-)
> 
> Should be. WARN_ONCE() is also used to trigger a TX netdev timeout and I
> already got twice a *bug* report from a customer, thinking it's due to a
> bug in the kernel, but he has just forgotten to connect a cable. Hope
> this makes my concerns clear about using WARN_ONCE() here as well. Like
> with can_get_dlc(), we could provide a can_check_frame() to ensure that
> the check is done consistently.

Yes, i thought about an inline function like

inline int no_can_skb((struct sk_buff *skb)
{
        struct can_frame *cf = (struct can_frame *)skb->data

        return WARN_ONCE(skb->len != sizeof(*cf) || cf->can_dlc > 8,
                         "Dropped non conform skbuf: len %d, can_dlc %d\n",
                         skb->len, cf->can_dlc);
}


so that you can have this code in each drivers xmit function:

        if (no_can_skb(skb)) {
                kfree_skb(skb);
                return NETDEV_TX_OK;
        }

Regards,
Oliver

_______________________________________________
Socketcan-core mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-core

Reply via email to