/** @file * @brief Ethernet Bridge public header file * * Ethernet Bridges connect two or more Ethernet networks together and * transparently forward packets from one network to the others as if * they were part of the same network. */ /* * Copyright (c) 2021 BayLibre SAS * Copyright (c) 2024 Nordic Semiconductor * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_NET_ETHERNET_BRIDGE_H_ #define ZEPHYR_INCLUDE_NET_ETHERNET_BRIDGE_H_ #include #include #ifdef __cplusplus extern "C" { #endif /** * @brief Ethernet Bridging API * @defgroup eth_bridge Ethernet Bridging API * @since 2.7 * @version 0.8.0 * @ingroup networking * @{ */ /** @cond INTERNAL_HIDDEN */ #if defined(CONFIG_NET_ETHERNET_BRIDGE) #define NET_ETHERNET_BRIDGE_ETH_INTERFACE_COUNT CONFIG_NET_ETHERNET_BRIDGE_ETH_INTERFACE_COUNT #else #define NET_ETHERNET_BRIDGE_ETH_INTERFACE_COUNT 1 #endif struct eth_bridge_iface_context { /* Lock to protect access to interface array below */ struct k_mutex lock; /* The actual bridge virtual interface */ struct net_if *iface; /* What Ethernet interfaces are bridged together */ struct net_if *eth_iface[NET_ETHERNET_BRIDGE_ETH_INTERFACE_COUNT]; /* How many interfaces are bridged atm */ size_t count; /* Bridge instance id */ int id; /* Is the bridge interface initialized */ bool is_init : 1; /* Has user configured the bridge */ bool is_setup : 1; /* Is the interface enabled or not */ bool status : 1; }; /** @endcond */ /** * @brief Add an Ethernet network interface to a bridge * * This adds a network interface to a bridge. The interface is then put * into promiscuous mode. After more than one Ethernet interfaces are * added to the bridge interface, the bridge interface is setup. * After the setup is done, the bridge interface can be brought up so * that it can start bridging L2 traffic. * * @param br A pointer to a bridge interface * @param iface Interface to add * * @return 0 if OK, negative error code otherwise. */ int eth_bridge_iface_add(struct net_if *br, struct net_if *iface); /** * @brief Remove an Ethernet network interface from a bridge. * * If the bridge interface setup has only one Ethernet interface left * after this function call, the bridge is disabled as it cannot bridge * the L2 traffic any more. The bridge interface is left in UP state * if this case. * * @param br A pointer to a bridge interface * @param iface Interface to remove * * @return 0 if OK, negative error code otherwise. */ int eth_bridge_iface_remove(struct net_if *br, struct net_if *iface); /** * @brief Get bridge index according to pointer * * @param br Pointer to bridge instance * * @return Bridge index */ int eth_bridge_get_index(struct net_if *br); /** * @brief Get bridge instance according to index * * @param index Bridge instance index * * @return Pointer to bridge interface or NULL if not found. */ struct net_if *eth_bridge_get_by_index(int index); /** * @typedef eth_bridge_cb_t * @brief Callback used while iterating over bridge instances * * @param br Pointer to bridge context instance * @param user_data User supplied data */ typedef void (*eth_bridge_cb_t)(struct eth_bridge_iface_context *br, void *user_data); /** * @brief Go through all the bridge context instances in order to get * information about them. This is mainly useful in * net-shell to print data about currently active bridges. * * @param cb Callback to call for each bridge instance * @param user_data User supplied data */ void net_eth_bridge_foreach(eth_bridge_cb_t cb, void *user_data); /** * @} */ #ifdef __cplusplus } #endif #endif /* ZEPHYR_INCLUDE_NET_ETHERNET_BRIDGE_H_ */