sizeof(conf->bss[0]->iface));
} else if (os_strcmp(buf, "bridge") == 0) {
os_strlcpy(bss->bridge, pos, sizeof(bss->bridge));
+ } else if (os_strcmp(buf, "bridge_hairpin") == 0) {
+ bss->bridge_hairpin = atoi(pos);
} else if (os_strcmp(buf, "vlan_bridge") == 0) {
os_strlcpy(bss->vlan_bridge, pos, sizeof(bss->vlan_bridge));
} else if (os_strcmp(buf, "wds_bridge") == 0) {
#endif /* CONFIG_FILS */
} else if (os_strcmp(buf, "multicast_to_unicast") == 0) {
bss->multicast_to_unicast = atoi(pos);
+ } else if (os_strcmp(buf, "bridge_multicast_to_unicast") == 0) {
+ bss->bridge_multicast_to_unicast = atoi(pos);
} else if (os_strcmp(buf, "broadcast_deauth") == 0) {
bss->broadcast_deauth = atoi(pos);
} else if (os_strcmp(buf, "notify_mgmt_frames") == 0) {
char bridge[IFNAMSIZ + 1];
char vlan_bridge[IFNAMSIZ + 1];
char wds_bridge[IFNAMSIZ + 1];
+ int bridge_hairpin; /* hairpin_mode on bridge members */
enum hostapd_logger_level logger_syslog_level, logger_stdout_level;
#endif /* CONFIG_FILS */
int multicast_to_unicast;
+ int bridge_multicast_to_unicast;
int broadcast_deauth;
return -1;
}
+ if (conf->bridge[0]) {
+ /* Set explicitly configured bridge parameters that might have
+ * been lost if the interface has been removed out of the
+ * bridge. */
+
+ /* multicast to unicast on bridge ports */
+ if (conf->bridge_multicast_to_unicast)
+ hostapd_drv_br_port_set_attr(
+ hapd, DRV_BR_PORT_ATTR_MCAST2UCAST, 1);
+
+ /* hairpin mode */
+ if (conf->bridge_hairpin)
+ hostapd_drv_br_port_set_attr(
+ hapd, DRV_BR_PORT_ATTR_HAIRPIN_MODE, 1);
+ }
+
if (conf->proxy_arp) {
if (x_snoop_init(hapd)) {
wpa_printf(MSG_ERROR,
enum drv_br_port_attr {
DRV_BR_PORT_ATTR_PROXYARP,
DRV_BR_PORT_ATTR_HAIRPIN_MODE,
+ DRV_BR_PORT_ATTR_MCAST2UCAST,
};
enum drv_br_net_param {
return "proxyarp_wifi";
case DRV_BR_PORT_ATTR_HAIRPIN_MODE:
return "hairpin_mode";
+ case DRV_BR_PORT_ATTR_MCAST2UCAST:
+ return "multicast_to_unicast";
}
return NULL;