[ sorry for the delay; focused on the nexthop RFC ]
On 8/20/18 12:34 AM, Jason Wang wrote:
My device lookup helper takes the base port index (starting device),
On 2018å08æ18æ 05:15, David Ahern wrote:
On 8/15/18 9:34 PM, Jason Wang wrote:So if I understand correctly, you mean using
I may miss something but BPF forbids loop. Without a loop how can wenetdev_for_each_upper_dev_rcu
make sure all stacked devices is enumerated correctly without knowing
the topology in advance?
BPF helpers allow programs to do lookups in kernel tables, in this case
the ability to find an upper device that would receive the packet.
netdev_for_each_upper_dev_rcu() inside a BPF helper? If yes, I think we
may still need device specific logic. E.g for macvlan,
netdev_for_each_upper_dev_rcu() enumerates all macvlan devices on top a
lower device. But what we need is one of the macvlan that matches the
dst mac address which is similar to what XDP rx handler did. And it
would become more complicated if we have multiple layers of device.
vlan protocol, vlan tag and dest mac. So, yes, the mac address is used
to uniquely identify the stacked device.
So let's consider a simple case, consider we have 5 macvlan devices:Stacking on top of a nic port can have all kinds of combinations of
macvlan0: doing some packet filtering before passing packets to TCP/IP
stack
macvlan1: modify packets and redirect to another interface
macvlan2: modify packets and transmit packet back through XDP_TX
macvlan3: deliver packets to AF_XDP
macvtap0: deliver packets raw XDP to VM
So, with XDP rx handler, what we need to just to attach five different
XDP programs to each macvlan device. Your idea is to do all things in
the root device XDP program. This looks complicated and not flexible
since it needs to care a lot of things, e.g adding/removing
actions/policies. And XDP program needs to call BPF helper that use
netdev_for_each_upper_dev_rcu() to work correctly with stacked device.
vlans, bonds, bridges, vlans on bonds and bridges, macvlans, etc. I
suspect trying to install a program for layer 3 forwarding on each one
and iteratively running the programs would kill the performance gained
from forwarding with xdp.