1 year ago

#202427

test-img

dr.chleb

SocketCAN recovery from buffer overflow CAN_ERR_CRTL_RX_OVERFLOW

I write an application in C/C++ which uses SocketCAN. Under some conditions I can generate an buffer overflow error CAN_ERR_CRTL_RX_OVERFLOW on my system. An ip command shows growing number of overflow errors.

ip -details -statistics link show can0
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
    link/can  promiscuity 0 minmtu 0 maxmtu 0 
    can state ERROR-WARNING (berr-counter tx 0 rx 0) restart-ms 100 
      bitrate 250000 sample-point 0.875 
      tq 41 prop-seg 41 phase-seg1 42 phase-seg2 12 sjw 1
      m_can: tseg1 2..256 tseg2 2..128 sjw 1..128 brp 1..512 brp-inc 1
      m_can: dtseg1 1..32 dtseg2 1..16 dsjw 1..16 dbrp 1..32 dbrp-inc 1
      clock 24000000 
      re-started bus-errors arbit-lost error-warn error-pass bus-off
      0          0          0          1          0          0         numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
    RX: bytes  packets  errors  dropped overrun mcast   
    399532     72671    754     0       754     0       
    TX: bytes  packets  errors  dropped carrier collsns 
    639        128      0       0       0       0 

Moreover, at this state the operating system is getting laggy due to high cpu usage by following system processes also after killing my application:

  • [irq/61-5a001000]
  • [ksoftirqd/0]
  • [kworker/u4:0+ev]

I would like to programmatically recover from this error state and somehow flush the buffer taking packet loss into account.

c

linux

can-bus

socketcan

0 Answers

Your Answer

Accepted video resources