Line data Source code
1 1 : /** @file 2 : * @brief Ethernet Bridge public header file 3 : * 4 : * Ethernet Bridges connect two or more Ethernet networks together and 5 : * transparently forward packets from one network to the others as if 6 : * they were part of the same network. 7 : */ 8 : 9 : /* 10 : * Copyright (c) 2021 BayLibre SAS 11 : * Copyright (c) 2024 Nordic Semiconductor 12 : * 13 : * SPDX-License-Identifier: Apache-2.0 14 : */ 15 : 16 : #ifndef ZEPHYR_INCLUDE_NET_ETHERNET_BRIDGE_H_ 17 : #define ZEPHYR_INCLUDE_NET_ETHERNET_BRIDGE_H_ 18 : 19 : #include <zephyr/sys/slist.h> 20 : #include <zephyr/sys/iterable_sections.h> 21 : 22 : #ifdef __cplusplus 23 : extern "C" { 24 : #endif 25 : 26 : /** 27 : * @brief Ethernet Bridging API 28 : * @defgroup eth_bridge Ethernet Bridging API 29 : * @since 2.7 30 : * @version 0.8.0 31 : * @ingroup networking 32 : * @{ 33 : */ 34 : 35 : /** @cond INTERNAL_HIDDEN */ 36 : 37 : #if defined(CONFIG_NET_ETHERNET_BRIDGE) 38 : #define NET_ETHERNET_BRIDGE_ETH_INTERFACE_COUNT CONFIG_NET_ETHERNET_BRIDGE_ETH_INTERFACE_COUNT 39 : #else 40 : #define NET_ETHERNET_BRIDGE_ETH_INTERFACE_COUNT 1 41 : #endif 42 : 43 : struct eth_bridge_iface_context { 44 : /* Lock to protect access to interface array below */ 45 : struct k_mutex lock; 46 : 47 : /* The actual bridge virtual interface */ 48 : struct net_if *iface; 49 : 50 : /* What Ethernet interfaces are bridged together */ 51 : struct net_if *eth_iface[NET_ETHERNET_BRIDGE_ETH_INTERFACE_COUNT]; 52 : 53 : /* How many interfaces are bridged atm */ 54 : size_t count; 55 : 56 : /* Bridge instance id */ 57 : int id; 58 : 59 : /* Is the bridge interface initialized */ 60 : bool is_init : 1; 61 : 62 : /* Has user configured the bridge */ 63 : bool is_setup : 1; 64 : 65 : /* Is the interface enabled or not */ 66 : bool status : 1; 67 : }; 68 : 69 : /** @endcond */ 70 : 71 : /** 72 : * @brief Add an Ethernet network interface to a bridge 73 : * 74 : * This adds a network interface to a bridge. The interface is then put 75 : * into promiscuous mode. After more than one Ethernet interfaces are 76 : * added to the bridge interface, the bridge interface is setup. 77 : * After the setup is done, the bridge interface can be brought up so 78 : * that it can start bridging L2 traffic. 79 : * 80 : * @param br A pointer to a bridge interface 81 : * @param iface Interface to add 82 : * 83 : * @return 0 if OK, negative error code otherwise. 84 : */ 85 1 : int eth_bridge_iface_add(struct net_if *br, struct net_if *iface); 86 : 87 : /** 88 : * @brief Remove an Ethernet network interface from a bridge. 89 : * 90 : * If the bridge interface setup has only one Ethernet interface left 91 : * after this function call, the bridge is disabled as it cannot bridge 92 : * the L2 traffic any more. The bridge interface is left in UP state 93 : * if this case. 94 : * 95 : * @param br A pointer to a bridge interface 96 : * @param iface Interface to remove 97 : * 98 : * @return 0 if OK, negative error code otherwise. 99 : */ 100 1 : int eth_bridge_iface_remove(struct net_if *br, struct net_if *iface); 101 : 102 : /** 103 : * @brief Get bridge index according to pointer 104 : * 105 : * @param br Pointer to bridge instance 106 : * 107 : * @return Bridge index 108 : */ 109 1 : int eth_bridge_get_index(struct net_if *br); 110 : 111 : /** 112 : * @brief Get bridge instance according to index 113 : * 114 : * @param index Bridge instance index 115 : * 116 : * @return Pointer to bridge interface or NULL if not found. 117 : */ 118 1 : struct net_if *eth_bridge_get_by_index(int index); 119 : 120 : /** 121 : * @typedef eth_bridge_cb_t 122 : * @brief Callback used while iterating over bridge instances 123 : * 124 : * @param br Pointer to bridge context instance 125 : * @param user_data User supplied data 126 : */ 127 1 : typedef void (*eth_bridge_cb_t)(struct eth_bridge_iface_context *br, void *user_data); 128 : 129 : /** 130 : * @brief Go through all the bridge context instances in order to get 131 : * information about them. This is mainly useful in 132 : * net-shell to print data about currently active bridges. 133 : * 134 : * @param cb Callback to call for each bridge instance 135 : * @param user_data User supplied data 136 : */ 137 1 : void net_eth_bridge_foreach(eth_bridge_cb_t cb, void *user_data); 138 : 139 : /** 140 : * @} 141 : */ 142 : 143 : #ifdef __cplusplus 144 : } 145 : #endif 146 : 147 : #endif /* ZEPHYR_INCLUDE_NET_ETHERNET_BRIDGE_H_ */