write: no buffer space available socket-can/linux-can

avelampudi picture avelampudi · Nov 4, 2016 · Viewed 13.3k times · Source

I'm running a program with two CAN channels (using TowerTech CAN Cape TT3201).

The two channels are can0 (500k) and can1 (125k). The can0 channels works perfectly but can1 runs a write:No buffer space available error.

I'm using ValueCAN3/VehicleSpy to check the messages.

This is before I run the program. can0 and can1 both seem to send, but only can0 shows up in VehicleSpy.

root@cantool:~# cansend can0 100#00 
root@cantool:~# cansend can1 100#20

enter image description here

This is after I try running the program

root@cantool:~# cansend can1 100#20 
write: No buffer space available 
root@cantool:~# cansend can0 111#10

enter image description here

While my program is running : I get this error for all messages to be sent on can1

2016-11-02 15:36:03,052 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    12f83018    010    1    00 
2016-11-02 15:36:03,131 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    0af81118    010    6    00 00 00 00 00 00 
2016-11-02 15:36:03,148 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    12f81018    010    6    00 00 00 00 00 00 
2016-11-02 15:36:03,174 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    0af87018    010    3    00 00 00 
2016-11-02 15:36:03,220 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    12f89018    010    4    00 00 00 00 
2016-11-02 15:36:03,352 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    12f83018    010    1    00 

However sometimes the whole program works perfectly (if the module is rebooted or some random instances).

How do I fix this?

root@cantool:~# uname -r 
4.1.15-ti-rt-r43

after doing some digging, I found this

 root@cantool:-#ip -details link show can0
 4:can0: <NOARP,UP,LOWER_UP, ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
      link/can promiscuity 0
      can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 100
      bitrate 500000 sample-point 0.875
      tq 125 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
      c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1
      clock 24000000
 root@cantool:-#ip -details link show can1
 5: can1: <NOARP,UP,LOWER_UP, ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
      link/can promiscuity 0
      can state STOPPED restart-ms 100
      bitrate 125000 sample-point 0.875
      tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
      c_can: tseg1 2..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
      clock 8000000

Turns out that can1 is STOPPED for some reason

however when I try:

ip link set can1 type can restart 
RNETLINK answers: Invalid argument

Answer

thewheelz picture thewheelz · May 15, 2017

After you enable the can0 interface with sudo ifconfig can0 up, run:

sudo ifconfig can0 txqueuelen 1000

This will increase the number of frames allowed per kernel transmission queue for the queuing discipline. More info here

... sometimes the whole program works perfectly (if the module is rebooted or some random instances).

The reason why it works when you restart the SocketCAN interface, is that you might clear up just enough buffer space to make it work.