Network Bonding or Teaming cannot add on-board eth0

I am trying to set up linux bonding or teaming on the Jetson TX2.
I want to bond the on-board eth0 with an additional USB phy (eth1) to get double the speed with balance-rr bonding mode. The Jetson is directly connected to PC with also a bonded interface.

I compiled the bonding and teaming kernel modules and they are loaded:

root@tegra-ubuntu:/home/nvidia# lsmod
Module                  Size  Used by
bonding               124720  0
team_mode_roundrobin     1663  0
team                   28640  1 team_mode_roundrobin

I create a bonding interface:

ip link add bond0 type bond mode balance-rr
ip link set eth1 master bond0
ip link set eth0 master bond0

adding eth1 works but with eth0 it gives me:

RTNETLINK answers: Operation not supported

Similar result with teaming:

teamd config:

https://github.com/jpirko/libteam/blob/master/teamd/example_configs/roundrobin.conf

{
	"device":		"team0",
	"runner":		{"name": "roundrobin"},
	"ports":		{"eth0": {}, "eth1": {}}
}

starting teamd failes with:

root@tegra-ubuntu:/home/nvidia# teamd -g -f roundrobin.conf
Using team device "team0".
Using PID file "/var/run/teamd/team0.pid"
Using config file "/home/nvidia/roundrobin.conf"
This program is not intended to be run as root.
Added loop callback: daemon, 0x4303f0
Added loop callback: libteam_events, 0x4303f0
Added loop callback: workq, 0x4303f0
Using team runner "roundrobin".
usock: Using sockpath "/var/run/teamd/team0.sock"
Added loop callback: usock, 0x4303f0
<ifinfo_list>
 13: team0: a2:17:b3:9d:f4:6c: 0
</ifinfo_list>
<port_list>
</port_list>
eth1: Adding port (found ifindex "10").
eth0: Adding port (found ifindex "3").
eth0: Failed to add port (Invalid argument).
Failed to add ports.
Removed loop callback: usock, 0x4303f0
Removed loop callback: workq, 0x4303f0
Removed loop callback: libteam_events, 0x4303f0
Removed loop callback: daemon, 0x4303f0
teamd_init() failed.
Failed: Invalid argument

I have the same error when adding only eth1 first and trying to add the other port with teamdctl team0 port add eth0

I have tried this on our custom base board and also on the TX2 dev board with the same result.
Bonding and Teaming works when bonding two usb phys.

Is Bonding or Teaming supported by the Nvidia on-board eth driver?

I don’t think the driver is specific to NVIDIA for this case. The file in “/proc/config.gz” is not a real file, but is instead the kernel showing its running configuration. Try this to see if bonding was enabled:

zcat /proc/config.gz | grep -i bonding

So it looks like you will need to add a kernel module. I’ve never set this up so I couldn’t tell you about configuration, only about building modules. The current kernel should work. If you flashed with JetPack or on command line you will have on your host “Linux_for_Tegra/source_sync.sh”. With this you can download the source for the relevant kernel. I will assume this is L4T R28.2.1 (you can verify via “head -n 1 /etc/nv_tegra_release”):

./source_sync.sh -k tegra-l4t-r28.2.1

You would copy the config.gz from your TX2 to host as your starting config. Note the output of “uname -r”. If that output is “4.4.38-tegra”, then the CONFIG_LOCALVERSION can be edited to “-tegra” in order to match your current configuration (then you will know installing a module is a simple file copy with the module matching the running system). Ask if you need more information on cross compile or native compile of the module. FYI, source_sync.sh runs on any platform, you can run from the Jetson and native compile, or run from the PC host and cross compile.

I have not set up bonding, but here is a kernel doc on the config (this same doc will probably be in the source_sync.sh content and would be guaranteed to be correct for that kernel version):
https://www.kernel.org/doc/Documentation/networking/bonding.txt

Thank you for your reply. I did all of this already.
I checked out with source_sync.sh although to tag tegra-l4t-r28.2 which I assume not much has changed with regards to bonding.

I built my own kernel as well as my own modules and flashed with the flash.sh utility.

I build with the following config which can also be found in /proc/config.gz

CONFIG_BONDING=m
CONFIG_NET_TEAM=m
CONFIG_NET_TEAM_MODE_BROADCAST=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
CONFIG_NET_TEAM_MODE_LOADBALANCE=m

Bonding as well as teaming works with two USB Ethernet ports. So it is not an issue of configuring it.
It looks like the underlying on-board Ethernet does not support this.

Can anybody confirm that this is not supported or if there are any plans to support it any time in the future?

Best regards,
Stefan

You may be right. I’m not actually sure though whether the hardware itself must support bonding, or if perhaps it is a driver issue. Someone else will probably know.