* [PATCH RFC 0/1] macvlan: allow source mode devices along with passthru @ 2026-06-12 9:23 Thomas Martitz 2026-06-12 9:23 ` [PATCH RFC 1/1] " Thomas Martitz 2026-07-02 6:56 ` [PATCH RESEND RFC 0/1] " Thomas Martitz 0 siblings, 2 replies; 4+ messages in thread From: Thomas Martitz @ 2026-06-12 9:23 UTC (permalink / raw) To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, open list:NETWORKING DRIVERS, open list Cc: Thomas Martitz, open list:NETWORKING DRIVERS, open list Hello, we're trying to solve a use case on our devices where two SoC are connected on the same board, using the only available high-speed. One SoC runs the main Linux system including the full routing stack (FRITZ!OS) and the other SoC implements most of the GPON ONT side. The high-speed interface is of course also used for the user traffic. Therefore we must tell the inter-SoC traffic apart from the user traffic. We achieve this by matching the well-known MAC address of the ONT SoC. The user traffic passes through the ONT SoC without modifying MAC headers. Now we would like to use macvlan (with source mode devices) on the main SoC side for this but our routing stack requires the rx_handler to be available. Therefore macvlan is currently not an option. With this patch macvlan becomes an option because the current limitation of either "one passthru device" or "any other configuration" is relaxed for the combination of passthru and any number of source mode devices. This allows us to configure a source mode device for the other SoC and register an rx_handler for further processing on the passthru device. The patch is still in an RFC state. I am not 100% confident that all the cases where the code checks "macvlan_passthru(port)" are handled appropriately. I hope you can guide me a little bit and provide feedback on the general approach. Thanks in advance! Thomas Martitz (1): macvlan: allow source mode devices along with passthru drivers/net/macvlan.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) -- 2.54.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH RFC 1/1] macvlan: allow source mode devices along with passthru 2026-06-12 9:23 [PATCH RFC 0/1] macvlan: allow source mode devices along with passthru Thomas Martitz @ 2026-06-12 9:23 ` Thomas Martitz 2026-07-02 6:56 ` [PATCH RESEND RFC 0/1] " Thomas Martitz 1 sibling, 0 replies; 4+ messages in thread From: Thomas Martitz @ 2026-06-12 9:23 UTC (permalink / raw) To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, open list:NETWORKING DRIVERS, open list Cc: Thomas Martitz, open list:NETWORKING DRIVERS, open list This allows for configurations where there are a few known senders in the system (e.g. multiple SoCs on the same board) along with unlimited external senders. The source mode devices represent the known senders while all external senders terminate on passthru device. Although you can still receive packets on the lower device without the need for the passthru vlan device, there are use cases where you need additional packet processing in the pipeline that hooks via rx_handler. With this the rx_handler can be attached to the passthru device while macvlan itself remains attached to the lower device. We use this to use the same physical link for inter-SoC networking and external networking. Some of our chips have no other viable link for inter-SoC traffic. Signed-off-by: Thomas Martitz <t.martitz@fritz.com> --- drivers/net/macvlan.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index c40fa331836bb..d28f9d905a84d 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -1502,15 +1502,6 @@ int macvlan_common_newlink(struct net_device *dev, } port = macvlan_port_get_rtnl(lowerdev); - /* Only 1 macvlan device can be created in passthru mode */ - if (macvlan_passthru(port)) { - /* The macvlan port must be not created this time, - * still goto destroy_macvlan_port for readability. - */ - err = -EINVAL; - goto destroy_macvlan_port; - } - vlan->lowerdev = lowerdev; vlan->dev = dev; vlan->port = port; @@ -1523,10 +1514,30 @@ int macvlan_common_newlink(struct net_device *dev, if (data && data[IFLA_MACVLAN_FLAGS]) vlan->flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); + /* Only 1 macvlan device can be created in passthru mode. There may be + * additional source mode devices but nothing else at the moment. + * + * First check if adding a source mode device to an existing passthru vlan. + */ + if (macvlan_passthru(port) && vlan->mode != MACVLAN_MODE_SOURCE) { + /* The macvlan port must be not created this time, + * still goto destroy_macvlan_port for readability. + */ + err = -EINVAL; + goto destroy_macvlan_port; + } + + /* Now check if adding a passthru device to an existing set of source mode + * devices. + */ if (vlan->mode == MACVLAN_MODE_PASSTHRU) { - if (port->count) { - err = -EINVAL; - goto destroy_macvlan_port; + struct macvlan_dev *p; + + list_for_each_entry(p, &port->vlans, list) { + if (p->mode != MACVLAN_MODE_SOURCE) { + err = -EINVAL; + goto destroy_macvlan_port; + } } macvlan_set_passthru(port); eth_hw_addr_inherit(dev, lowerdev); @@ -1560,7 +1571,11 @@ int macvlan_common_newlink(struct net_device *dev, if (err) goto unregister_netdev; - list_add_tail_rcu(&vlan->list, &port->vlans); + /* macvlan_handle_frame expects the (one and only) passthru device first. */ + if (vlan->mode == MACVLAN_MODE_PASSTHRU) + list_add_rcu(&vlan->list, &port->vlans); + else + list_add_tail_rcu(&vlan->list, &port->vlans); update_port_bc_queue_len(vlan->port); netif_stacked_transfer_operstate(lowerdev, dev); linkwatch_fire_event(dev); -- 2.54.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH RESEND RFC 0/1] macvlan: allow source mode devices along with passthru 2026-06-12 9:23 [PATCH RFC 0/1] macvlan: allow source mode devices along with passthru Thomas Martitz 2026-06-12 9:23 ` [PATCH RFC 1/1] " Thomas Martitz @ 2026-07-02 6:56 ` Thomas Martitz 2026-07-02 6:56 ` [PATCH RESEND 1/1] " Thomas Martitz 1 sibling, 1 reply; 4+ messages in thread From: Thomas Martitz @ 2026-07-02 6:56 UTC (permalink / raw) To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, open list:NETWORKING DRIVERS, open list Cc: Thomas Martitz, open list:NETWORKING DRIVERS, open list Hello, we're trying to solve a use case on our devices where two SoC are connected on the same board, using the only available high-speed. One SoC runs the main Linux system including the full routing stack (FRITZ!OS) and the other SoC implements most of the GPON ONT side. The high-speed interface is of course also used for the user traffic. Therefore we must tell the inter-SoC traffic apart from the user traffic. We achieve this by matching the well-known MAC address of the ONT SoC. The user traffic passes through the ONT SoC without modifying MAC headers. Now we would like to use macvlan (with source mode devices) on the main SoC side for this but our routing stack requires the rx_handler to be available. Therefore macvlan is currently not an option. With this patch macvlan becomes an option because the current limitation of either "one passthru device" or "any other configuration" is relaxed for the combination of passthru and any number of source mode devices. This allows us to configure a source mode device for the other SoC and register an rx_handler for further processing on the passthru device. The patch is still in an RFC state. I am not 100% confident that all the cases where the code checks "macvlan_passthru(port)" are handled appropriately. I hope you can guide me a little bit and provide feedback on the general approach. Thanks in advance! Thomas Martitz (1): macvlan: allow source mode devices along with passthru drivers/net/macvlan.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) -- 2.54.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH RESEND 1/1] macvlan: allow source mode devices along with passthru 2026-07-02 6:56 ` [PATCH RESEND RFC 0/1] " Thomas Martitz @ 2026-07-02 6:56 ` Thomas Martitz 0 siblings, 0 replies; 4+ messages in thread From: Thomas Martitz @ 2026-07-02 6:56 UTC (permalink / raw) To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, open list:NETWORKING DRIVERS, open list Cc: Thomas Martitz, open list:NETWORKING DRIVERS, open list This allows for configurations where there are a few known senders in the system (e.g. multiple SoCs on the same board) along with unlimited external senders. The source mode devices represent the known senders while all external senders terminate on passthru device. Although you can still receive packets on the lower device without the need for the passthru vlan device, there are use cases where you need additional packet processing in the pipeline that hooks via rx_handler. With this the rx_handler can be attached to the passthru device while macvlan itself remains attached to the lower device. We use this to use the same physical link for inter-SoC networking and external networking. Some of our chips have no other viable link for inter-SoC traffic. Signed-off-by: Thomas Martitz <t.martitz@fritz.com> --- drivers/net/macvlan.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index c40fa331836bb..d28f9d905a84d 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -1502,15 +1502,6 @@ int macvlan_common_newlink(struct net_device *dev, } port = macvlan_port_get_rtnl(lowerdev); - /* Only 1 macvlan device can be created in passthru mode */ - if (macvlan_passthru(port)) { - /* The macvlan port must be not created this time, - * still goto destroy_macvlan_port for readability. - */ - err = -EINVAL; - goto destroy_macvlan_port; - } - vlan->lowerdev = lowerdev; vlan->dev = dev; vlan->port = port; @@ -1523,10 +1514,30 @@ int macvlan_common_newlink(struct net_device *dev, if (data && data[IFLA_MACVLAN_FLAGS]) vlan->flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); + /* Only 1 macvlan device can be created in passthru mode. There may be + * additional source mode devices but nothing else at the moment. + * + * First check if adding a source mode device to an existing passthru vlan. + */ + if (macvlan_passthru(port) && vlan->mode != MACVLAN_MODE_SOURCE) { + /* The macvlan port must be not created this time, + * still goto destroy_macvlan_port for readability. + */ + err = -EINVAL; + goto destroy_macvlan_port; + } + + /* Now check if adding a passthru device to an existing set of source mode + * devices. + */ if (vlan->mode == MACVLAN_MODE_PASSTHRU) { - if (port->count) { - err = -EINVAL; - goto destroy_macvlan_port; + struct macvlan_dev *p; + + list_for_each_entry(p, &port->vlans, list) { + if (p->mode != MACVLAN_MODE_SOURCE) { + err = -EINVAL; + goto destroy_macvlan_port; + } } macvlan_set_passthru(port); eth_hw_addr_inherit(dev, lowerdev); @@ -1560,7 +1571,11 @@ int macvlan_common_newlink(struct net_device *dev, if (err) goto unregister_netdev; - list_add_tail_rcu(&vlan->list, &port->vlans); + /* macvlan_handle_frame expects the (one and only) passthru device first. */ + if (vlan->mode == MACVLAN_MODE_PASSTHRU) + list_add_rcu(&vlan->list, &port->vlans); + else + list_add_tail_rcu(&vlan->list, &port->vlans); update_port_bc_queue_len(vlan->port); netif_stacked_transfer_operstate(lowerdev, dev); linkwatch_fire_event(dev); -- 2.54.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-07-02 6:57 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-06-12 9:23 [PATCH RFC 0/1] macvlan: allow source mode devices along with passthru Thomas Martitz 2026-06-12 9:23 ` [PATCH RFC 1/1] " Thomas Martitz 2026-07-02 6:56 ` [PATCH RESEND RFC 0/1] " Thomas Martitz 2026-07-02 6:56 ` [PATCH RESEND 1/1] " Thomas Martitz
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox