inline On 2024-05-10 19:48, g...@eigenlab.org wrote: > From: Gioacchino Mazzurco <g...@polymathes.cc> > > Add support for hostapd Access Point Micro Peering > > Signed-off-by: Gioacchino Mazzurco <g...@polymathes.cc> > --- > .../wifi-scripts/files/lib/netifd/hostapd.sh | 16 +- > package/network/services/hostapd/Makefile | 2 +- > ...ment-APuP-Access-Point-Micro-Peering.patch | 426 ++++++++++++++++++ > ...us-notification-when-a-peer-comes-up.patch | 74 +++ > ...-ucode-hook-for-when-a-peer-comes-up.patch | 83 ++++ > 5 files changed, 599 insertions(+), 2 deletions(-) > create mode 100644 > package/network/services/hostapd/patches/780-Implement-APuP-Access-Point-Micro-Peering.patch > create mode 100644 > package/network/services/hostapd/patches/790-APuP-add-ubus-notification-when-a-peer-comes-up.patch > create mode 100644 > package/network/services/hostapd/patches/800-APuP-add-ucode-hook-for-when-a-peer-comes-up.patch > > diff --git a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh > b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh > index 763702e76b..40266db065 100644 > --- a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh > +++ b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh > @@ -383,6 +383,9 @@ hostapd_common_add_bss_config() { > config_add_string fils_dhcp > > config_add_int ocv > + > + config_add_boolean apup > + config_add_string apup_peer_ifname_prefix > } > > hostapd_set_vlan_file() { > @@ -569,7 +572,7 @@ hostapd_set_bss_options() { > ppsk airtime_bss_weight airtime_bss_limit airtime_sta_weight \ > multicast_to_unicast_all proxy_arp per_sta_vif \ > eap_server eap_user_file ca_cert server_cert private_key > private_key_passwd server_id \ > - vendor_elements fils ocv > + vendor_elements fils ocv apup > > set_default fils 0 > set_default isolate 0 > @@ -593,6 +596,7 @@ hostapd_set_bss_options() { > set_default airtime_bss_weight 0 > set_default airtime_bss_limit 0 > set_default eap_server 0 > + set_default apup 0 > > /usr/sbin/hostapd -vfils || fils=0 > > @@ -1163,6 +1167,16 @@ hostapd_set_bss_options() { > append bss_conf "per_sta_vif=$per_sta_vif" "$N" > fi > > + if [ "$apup" -gt 0 ]; then > + append bss_conf "apup=$apup" "$N" > + > + local apup_peer_ifname_prefix > + json_get_vars apup_peer_ifname_prefix > + if [ -n "$apup_peer_ifname_prefix" ] ; then > + append bss_conf > "apup_peer_ifname_prefix=$apup_peer_ifname_prefix" "$N" > + fi > + fi > + > json_get_values opts hostapd_bss_options > for val in $opts; do > append bss_conf "$val" "$N" > diff --git a/package/network/services/hostapd/Makefile > b/package/network/services/hostapd/Makefile > index 0171bc0edc..1eaa67f992 100644 > --- a/package/network/services/hostapd/Makefile > +++ b/package/network/services/hostapd/Makefile > @@ -87,7 +87,7 @@ DRIVER_MAKEOPTS= \ > CONFIG_IEEE80211AC=$(HOSTAPD_IEEE80211AC) \ > CONFIG_IEEE80211AX=$(HOSTAPD_IEEE80211AX) \ > CONFIG_MBO=$(CONFIG_WPA_MBO_SUPPORT) \ > - CONFIG_UCODE=y > + CONFIG_UCODE=y CONFIG_APUP=y > > ifeq ($(SSL_VARIANT),openssl) > DRIVER_MAKEOPTS += CONFIG_TLS=openssl CONFIG_SAE=y > diff --git > a/package/network/services/hostapd/patches/780-Implement-APuP-Access-Point-Micro-Peering.patch > > b/package/network/services/hostapd/patches/780-Implement-APuP-Access-Point-Micro-Peering.patch > new file mode 100644 > index 0000000000..db3a05e3e6 > --- /dev/null > +++ > b/package/network/services/hostapd/patches/780-Implement-APuP-Access-Point-Micro-Peering.patch > @@ -0,0 +1,426 @@ > +From 99a9a4e97b4964e12749766de9c57bb7e59e740e Mon Sep 17 00:00:00 2001 > +From: Gioacchino Mazzurco <g...@polymathes.cc> > +Date: Mon, 6 May 2024 13:53:48 +0200 > +Subject: [PATCH 1/3] Implement APuP Access Point Micro Peering > + > +Access Point Micro Peering is a simpler and hopefully more useful successor > to
layers are only ever added, never removed ;) more useful than what? With what are you comparing? And why compare when you're superseding? > +Ad Hoc, Wireless Distribution System, 802.11s mesh mode, Multi-AP and > EasyMesh. > +When enabled almost plain APs communicate between them via 4-address mode, WAT? > +like in WDS but all of them are AP, so they can eventually communicate also > with > +plain stations and more AP nodes in sight, without more trickery. ...and other AP nodes. > +APuP has low hardware requirements, just AP mode support + 4-address mode, > and > +no more unnecessary complications, like hardcoded bridging or routing > algorithm > +in WiFi stack. > +For each AP in sight an interface is created, and then it can be used as > +convenient in each case, bridging, routing etc. > +Those interfaces could be simply bridged in a trivial topology (which happens > +automatically if wds_bridge is not an empty string), or feeded to a > +routing daemon. > + > +Signed-off-by: Gioacchino Mazzurco <g...@polymathes.cc> > +--- > + hostapd/Makefile | 5 ++ > + hostapd/config_file.c | 8 ++ > + src/ap/ap_config.h | 29 +++++++ > + src/ap/ap_drv_ops.c | 31 +++++++- > + src/ap/ap_drv_ops.h | 3 + > + src/ap/apup.c | 149 +++++++++++++++++++++++++++++++++++ > + src/ap/apup.h | 25 ++++++ > + src/ap/ieee802_11.c | 11 ++- > + src/ap/ieee802_11.h | 2 + > + src/drivers/driver.h | 2 +- > + src/drivers/driver_nl80211.c | 14 +--- > + 11 files changed, 262 insertions(+), 17 deletions(-) > + create mode 100644 src/ap/apup.c > + create mode 100644 src/ap/apup.h > + > +--- a/hostapd/Makefile > ++++ b/hostapd/Makefile > +@@ -1415,6 +1415,11 @@ ifdef CONFIG_NO_TKIP > + CFLAGS += -DCONFIG_NO_TKIP > + endif > + > ++ifdef CONFIG_APUP > ++CFLAGS += -DCONFIG_APUP > ++OBJS += ../src/ap/apup.o > ++endif > ++ > + $(DESTDIR)$(BINDIR)/%: % > + install -D $(<) $(@) > + > +--- a/hostapd/config_file.c > ++++ b/hostapd/config_file.c > +@@ -5058,6 +5058,14 @@ static int hostapd_config_fill(struct ho > + bss->mld_indicate_disabled = atoi(pos); > + #endif /* CONFIG_TESTING_OPTIONS */ > + #endif /* CONFIG_IEEE80211BE */ > ++#ifdef CONFIG_APUP > ++ } else if (os_strcmp(buf, "apup") == 0) { > ++ bss->apup = !!atoi(pos); > ++ if(bss->apup) bss->wds_sta = 1; > ++ } else if (os_strcmp(buf, "apup_peer_ifname_prefix") == 0) { > ++ os_strlcpy( bss->apup_peer_ifname_prefix, > ++ pos, sizeof(bss->apup_peer_ifname_prefix) ); use tabs > ++#endif // def CONFIG_APUP > + } else { > + wpa_printf(MSG_ERROR, > + "Line %d: unknown configuration item '%s'", > +--- a/src/ap/ap_config.h > ++++ b/src/ap/ap_config.h > +@@ -970,6 +970,35 @@ struct hostapd_bss_config { > + bool mld_indicate_disabled; > + #endif /* CONFIG_TESTING_OPTIONS */ > + #endif /* CONFIG_IEEE80211BE */ > ++ > ++#ifdef CONFIG_APUP > ++ /** > ++ * Access Point Micro Peering > ++ * A simpler and more useful successor to Ad Hoc, > ++ * Wireless Distribution System, 802.11s mesh mode, Multi-AP and > EasyMesh. > ++ * > ++ * Almost plain APs communicate between them via 4-address mode, like > in WDS > ++ * but all of them are AP, so they can eventually communicate also with > ++ * plain stations and more AP nodes in sight. > ++ * Low hardware requirements, just AP mode support + 4-address mode, > and no > ++ * more unnecessary complications, like hardcoded bridging or routing > ++ * algorithm in WiFi stack. > ++ * For each AP in sight an interface is created, and then it can be > used as > ++ * convenient in each case, bridging, routing etc. in sight? Reachable? > ++ */ > ++ bool apup; > ++ > ++ /** > ++ * In 4-address mode each peer AP in sight is associated to its own again > ++ * interface so we have more flexibility in "user-space". Do you mean each partner AP reachable is allocated its own locally corresponding interface? > ++ * Those interfaces could be simply bridged in a trivial topology (which > ++ * happens automatically if wds_bridge is not an empty string), or > feeded to fed > ++ * a routing daemon. > ++ * > ++ * If not defined interface names are generated following the WDS > convention. oxford comma: defined, interface > ++ */ > ++ char apup_peer_ifname_prefix[IFNAMSIZ + 1]; > ++#endif /* CONFIG_APUP */ > + }; > + > + /** > +--- a/src/ap/ap_drv_ops.c > ++++ b/src/ap/ap_drv_ops.c > +@@ -381,12 +381,39 @@ int hostapd_vlan_if_remove(struct hostap > + int hostapd_set_wds_sta(struct hostapd_data *hapd, char *ifname_wds, > + const u8 *addr, int aid, int val) > + { > +- const char *bridge = NULL; > +- > + if (hapd->driver == NULL || hapd->driver->set_wds_sta == NULL) > + return -1; > ++ > ++ const char *bridge = NULL; > ++ char ifName[IFNAMSIZ + 1]; > ++ > ++ int mRet = 0; > ++ > ++#ifdef CONFIG_APUP > ++ if(hapd->conf->apup && hapd->conf->apup_peer_ifname_prefix[0]) > ++ { > ++ mRet = os_snprintf( > ++ ifName, sizeof(ifName), "%s%d", > ++ hapd->conf->apup_peer_ifname_prefix, aid ); use tabs > ++ } > ++ else > ++#endif // def CONFIG_APUP > ++ mRet = os_snprintf( > ++ ifName, sizeof(ifName), "%s.sta%d", > ++ hapd->conf->iface, aid ); same > ++ > ++ if (mRet >= (int) sizeof(ifName)) > ++ wpa_printf( MSG_WARNING, > ++ "nl80211: WDS interface name was truncated" ); same > ++ else if (mRet < 0) > ++ return mRet; > ++ > ++ // Pass back to the caller the resulting interface name > ++ if (ifname_wds) os_strlcpy(ifname_wds, ifName, IFNAMSIZ + 1); > ++ > + if (hapd->conf->wds_bridge[0]) > + bridge = hapd->conf->wds_bridge; > ++ > + return hapd->driver->set_wds_sta(hapd->drv_priv, addr, aid, val, > + bridge, ifname_wds); > + } > +--- a/src/ap/ap_drv_ops.h > ++++ b/src/ap/ap_drv_ops.h > +@@ -33,6 +33,9 @@ int hostapd_set_drv_ieee8021x(struct hos > + int enabled); > + int hostapd_vlan_if_add(struct hostapd_data *hapd, const char *ifname); > + int hostapd_vlan_if_remove(struct hostapd_data *hapd, const char *ifname); > ++ > ++/** @param val as per nl80211 driver implementation, 1 means add 0 means > remove > ++ */ > + int hostapd_set_wds_sta(struct hostapd_data *hapd, char *ifname_wds, > + const u8 *addr, int aid, int val); > + int hostapd_sta_add(struct hostapd_data *hapd, > +--- /dev/null > ++++ b/src/ap/apup.c > +@@ -0,0 +1,149 @@ > ++/* > ++ * hostapd / APuP Access Point Micro Peering > ++ * > ++ * Copyright (C) 2023-2024 Gioacchino Mazzurco <g...@polymathes.cc> > ++ * Copyright (C) 2023-2024 AsociaciĆ³n Civil Altermundi > <i...@altermundi.net> > ++ * > ++ * This software may be distributed under the terms of the BSD license. > ++ * See README for more details. > ++ */ > ++ > ++/* Be extremely careful altering include order, move just one in the wrong > place > ++ * and you will start getting a bunch of error of undefined bool, size_t > etc. */ > ++ > ++#include "utils/includes.h" > ++#include "utils/common.h" > ++#include "utils/os.h" > ++ > ++#include "apup.h" > ++ > ++#include "drivers/driver.h" > ++#include "wpa_auth.h" > ++#include "ap_mlme.h" > ++#include "ieee802_11.h" > ++#include "ap_drv_ops.h" > ++ > ++void apup_process_beacon(struct hostapd_data *hapd, > ++ const struct ieee80211_mgmt *mgmt, size_t len, > ++ const struct ieee802_11_elems *elems ) > ++{ > ++ if(!os_memcmp(hapd->own_addr, mgmt->bssid, ETH_ALEN)) > ++ { > ++ wpa_printf( MSG_WARNING, > ++ "apup_process_beacon(...) own beacon elems.ssid > %.*s", > ++ (int) elems->ssid_len, elems->ssid ); use tabs consistently > ++ return; > ++ } > ++ > ++ if( elems->ssid_len != hapd->conf->ssid.ssid_len || > ++ os_memcmp(elems->ssid, hapd->conf->ssid.ssid, elems->ssid_len) ) > ++ return; > ++ > ++ struct sta_info* sta_ret = ap_get_sta(hapd, mgmt->bssid); > ++ if(sta_ret) return; > ++ > ++ sta_ret = ap_sta_add(hapd, mgmt->bssid); > ++ > ++ /* TODO: this has been added just to making compiler happy after > breaking > ++ * changes introduced in 11a607d121df512e010148bedcb4263a03329dc7 to > support > ++ * IEEE80211BE Multi Link Operation. Look at that commit with more time > and > ++ * understand what could be a proper implementation in this context too > ++ */ What was added? Some variables? So those need to be 'proper' for the finished product. > ++ const u8 *mld_link_addr = NULL; > ++ bool mld_link_sta = false; > ++ > ++ /* First add the station without more information */ > ++ int aRet = hostapd_sta_add( > ++ hapd, mgmt->bssid, sta_ret->aid, 0, > ++ NULL, 0, 0, NULL, NULL, NULL, 0, NULL, 0, NULL, > ++ sta_ret->flags, 0, 0, 0, > ++ 0, // 0 add, 1 set > ++ mld_link_addr, mld_link_sta ); use tabs > ++ > ++ sta_ret->flags |= WLAN_STA_AUTH; > ++ wpa_auth_sm_event(sta_ret->wpa_sm, WPA_AUTH); > ++ > ++ /* TODO: Investigate if supporting WPA or other encryption method is > ++ * possible */ Use whether when you mean whether or not - use if when you mean, cause and effect. > ++ sta_ret->auth_alg = WLAN_AUTH_OPEN; > ++ mlme_authenticate_indication(hapd, sta_ret); > ++ > ++ sta_ret->capability = le_to_host16(mgmt->u.beacon.capab_info); > ++ > ++ if (sta_ret->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) > ++ sta_ret->flags |= WLAN_STA_SHORT_PREAMBLE; > ++ else > ++ sta_ret->flags &= ~WLAN_STA_SHORT_PREAMBLE; > ++ > ++ copy_supp_rates(hapd, sta_ret, elems); > ++ > ++ /* Whithout this flag copy_sta_[v]ht_capab will disable [V]HT Without > ++ * capabilities even if available */ > ++ if(elems->ht_capabilities || elems->vht_capabilities) > ++ sta_ret->flags |= WLAN_STA_WMM; > ++ > ++ copy_sta_ht_capab(hapd, sta_ret, elems->ht_capabilities); > ++#ifdef CONFIG_IEEE80211AC > ++ copy_sta_vht_capab(hapd, sta_ret, elems->vht_capabilities); > ++ copy_sta_vht_oper(hapd, sta_ret, elems->vht_operation); > ++ copy_sta_vendor_vht(hapd, sta_ret, elems->vendor_vht, > elems->vendor_vht_len); > ++#endif // def CONFIG_IEEE80211AC > ++#ifdef CONFIG_IEEE80211AX > ++ copy_sta_he_6ghz_capab(hapd, sta_ret, elems->he_6ghz_band_cap); > ++#endif // def CONFIG_IEEE80211AX > ++#ifdef CONFIG_IEEE80211BE > ++ copy_sta_eht_capab( hapd, sta_ret, > ++ IEEE80211_MODE_AP, // TODO: Make sure is the right > value tabs... "Make sure (sic) is the right value": yes - please :) > ++ elems->he_capabilities, elems->he_capabilities_len, > ++ elems->eht_capabilities, > elems->eht_capabilities_len); > ++#endif //def CONFIG_IEEE80211BE tabs > ++ > ++ update_ht_state(hapd, sta_ret); > ++ > ++ if (hostapd_get_aid(hapd, sta_ret) < 0) > ++ { > ++ wpa_printf( MSG_INFO, "apup_process_beacon(...) No room for > more AIDs"); what's an AID? > ++ return; > ++ } > ++ > ++ sta_ret->flags |= WLAN_STA_ASSOC_REQ_OK; > ++ > ++ /* Make sure that the previously registered inactivity timer will not > ++ * remove the STA immediately. */ > ++ sta_ret->timeout_next = STA_NULLFUNC; > ++ > ++ sta_ret->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC; > ++ > ++ /* Then set the paramethers */ parameters > ++ int sRet = hostapd_sta_add( > ++ hapd, mgmt->bssid, sta_ret->aid, > ++ sta_ret->capability, > ++ sta_ret->supported_rates, sta_ret->supported_rates_len, > ++ 0, // u16 listen_interval TODO ? wat? > ++ sta_ret->ht_capabilities, > ++ sta_ret->vht_capabilities, > ++ sta_ret->he_capab, sta_ret->he_capab_len, > ++ sta_ret->eht_capab, sta_ret->eht_capab_len, > ++ sta_ret->he_6ghz_capab, > ++ sta_ret->flags, > ++ 0, // u8 qosinfo > ++ sta_ret->vht_opmode, > ++ 0, // int supp_p2p_ps > ++ 1, // 0 add, 1 set > ++ mld_link_addr, mld_link_sta ); tabs > ++ > ++ ap_sta_set_authorized(hapd, sta_ret, 1); > ++ hostapd_set_sta_flags(hapd, sta_ret); > ++ > ++ char mIfname[IFNAMSIZ + 1]; > ++ os_memset(mIfname, 0, IFNAMSIZ + 1); > ++ > ++ // last param 1 means add 0 means remove perhaps signal exactly this? int remove = 1; > ++ int mRet = hostapd_set_wds_sta( > ++ hapd, mIfname, mgmt->bssid, sta_ret->aid, 1 ); > ++ ++ int mRet = hostapd_set_wds_sta(hapd, mIfname, mgmt->bssid, ++ sta_ret->aid, remove ); > ++ wpa_printf( MSG_INFO, > ++ "apup_process_beacon(...) Added APuP peer at %s with flags: > %d," Access Point Micro Peering peer - so much alliteration. :) > ++ " capabilities %d", > ++ mIfname, sta_ret->flags, sta_ret->capability ); taaaaaaaaabzzzz > ++} > +--- /dev/null > ++++ b/src/ap/apup.h > +@@ -0,0 +1,25 @@ > ++/* > ++ * hostapd / APuP Access Point Micro Peering > ++ * > ++ * Copyright (C) 2023-2024 Gioacchino Mazzurco <g...@polymathes.cc> > ++ * Copyright (C) 2023-2024 AsociaciĆ³n Civil Altermundi > <i...@altermundi.net> > ++ * > ++ * This software may be distributed under the terms of the BSD license. > ++ * See README for more details. > ++ */ > ++ > ++/* Be extremely careful altering include order, move just one in the wrong > place > ++ * and you will start getting a bunch of error of undefined bool, size_t > etc. */ Many a lifetime lost fighting compilers. > ++ > ++#include "utils/includes.h" > ++#include "utils/common.h" > ++ > ++#include "hostapd.h" > ++#include "common/ieee802_11_defs.h" > ++ > ++/** When beacons from other Access Point are received, if the SSID is > matching if the SSID matches.... what? > ++ * add them as APuP peers (aka WDS STA to our own AP) the same happens on > the > ++ * peer when receiving our beacons */ The same happens? Or: The equivalent process occurs? Or: The corresponding process? > ++void apup_process_beacon(struct hostapd_data *hapd, > ++ const struct ieee80211_mgmt *mgmt, size_t len, > ++ const struct ieee802_11_elems *elems ); tabzzzzzzz > +--- a/src/ap/ieee802_11.c > ++++ b/src/ap/ieee802_11.c > +@@ -59,6 +59,9 @@ > + #include "nan_usd_ap.h" > + #include "pasn/pasn_common.h" > + > ++#ifdef CONFIG_APUP > ++# include "apup.h" > ++#endif // def CONFIG_APUP > + > + #ifdef CONFIG_FILS > + static struct wpabuf * > +@@ -3469,8 +3472,8 @@ static u16 check_multi_ap(struct hostapd > + } > + > + > +-static u16 copy_supp_rates(struct hostapd_data *hapd, struct sta_info *sta, > +- struct ieee802_11_elems *elems) > ++u16 copy_supp_rates(struct hostapd_data *hapd, struct sta_info *sta, > ++ const struct ieee802_11_elems *elems) tabzzzzz I see we're redefining a function here, but is there a smart way to pass a pointer rather than copying the supported rates? All of the params are pointers, so shouldn't this function be a 'get'? I don't know what the convention is here. Any other wifi peeps opine here? > + { > + /* Supported rates not used in IEEE 802.11ad/DMG */ > + if (hapd->iface->current_mode && > +@@ -5927,6 +5930,10 @@ static void handle_beacon(struct hostapd > + 0); > + > + ap_list_process_beacon(hapd->iface, mgmt, &elems, fi); > ++ > ++#ifdef CONFIG_APUP > ++ if(hapd->conf->apup) apup_process_beacon(hapd, mgmt, len, &elems); > ++#endif // def CONFIG_APUP > + } > + > + > +--- a/src/ap/ieee802_11.h > ++++ b/src/ap/ieee802_11.h > +@@ -108,6 +108,8 @@ int hostapd_process_ml_assoc_req_addr(st > + const u8 *basic_mle, size_t basic_mle_len, > + u8 *mld_addr); > + int hostapd_get_aid(struct hostapd_data *hapd, struct sta_info *sta); > ++u16 copy_supp_rates(struct hostapd_data *hapd, struct sta_info *sta, > ++ const struct ieee802_11_elems *elems); > + u16 copy_sta_ht_capab(struct hostapd_data *hapd, struct sta_info *sta, > + const u8 *ht_capab); > + u16 copy_sta_vendor_vht(struct hostapd_data *hapd, struct sta_info *sta, > +--- a/src/drivers/driver.h > ++++ b/src/drivers/driver.h > +@@ -3976,7 +3976,7 @@ struct wpa_driver_ops { > + * Returns: 0 on success, -1 on failure > + */ > + int (*set_wds_sta)(void *priv, const u8 *addr, int aid, int val, > +- const char *bridge_ifname, char *ifname_wds); > ++ const char *bridge_ifname, const char *ifname_wds); tabs > + > + /** > + * send_action - Transmit an Action frame > +--- a/src/drivers/driver_nl80211.c > ++++ b/src/drivers/driver_nl80211.c > +@@ -8415,24 +8415,14 @@ static int have_ifidx(struct wpa_driver_ > + > + > + static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val, > +- const char *bridge_ifname, char *ifname_wds) > ++ const char *bridge_ifname, const char *ifname_wds) tabs > + { > + struct i802_bss *bss = priv; > + struct wpa_driver_nl80211_data *drv = bss->drv; > +- char name[IFNAMSIZ + 1]; > ++ const char *name = ifname_wds; // Kept to reduce changes to the minimum > + union wpa_event_data event; > + int ret; > + > +- ret = os_snprintf(name, sizeof(name), "%s.sta%d", bss->ifname, aid); > +- if (ret >= (int) sizeof(name)) > +- wpa_printf(MSG_WARNING, > +- "nl80211: WDS interface name was truncated"); > +- else if (ret < 0) > +- return ret; > +- > +- if (ifname_wds) > +- os_strlcpy(ifname_wds, name, IFNAMSIZ + 1); > +- > + wpa_printf(MSG_DEBUG, "nl80211: Set WDS STA addr=" MACSTR > + " aid=%d val=%d name=%s", MAC2STR(addr), aid, val, name); > + if (val) { > diff --git > a/package/network/services/hostapd/patches/790-APuP-add-ubus-notification-when-a-peer-comes-up.patch > > b/package/network/services/hostapd/patches/790-APuP-add-ubus-notification-when-a-peer-comes-up.patch > new file mode 100644 > index 0000000000..86da7d0e5e > --- /dev/null > +++ > b/package/network/services/hostapd/patches/790-APuP-add-ubus-notification-when-a-peer-comes-up.patch > @@ -0,0 +1,74 @@ > +From 82eddeb699fcdb041ad21f4dd6cd97cf674b9685 Mon Sep 17 00:00:00 2001 > +From: Gioacchino Mazzurco <g...@polymathes.cc> > +Date: Tue, 7 May 2024 10:37:54 +0200 > +Subject: [PATCH 2/3] APuP add ubus notification when a peer comes up comes up? from where? to where? Maybe 'appears' is better? A remote peer? > + > +The notification ones get looks like > +{ "apup-newpeer": {"address":"02:0a:ab:45:5a:ab","ifname":"wlan0.peer1"} } > + > +Signed-off-by: Gioacchino Mazzurco <g...@polymathes.cc> > +--- > + src/ap/apup.c | 8 ++++++++ > + src/ap/ubus.c | 15 +++++++++++++++ > + src/ap/ubus.h | 5 +++++ > + 3 files changed, 28 insertions(+) > + > +--- a/src/ap/apup.c > ++++ b/src/ap/apup.c > +@@ -23,6 +23,10 @@ > + #include "ieee802_11.h" > + #include "ap_drv_ops.h" > + > ++#ifdef UBUS_SUPPORT > ++# include "ubus.h" > ++#endif > ++ > + void apup_process_beacon(struct hostapd_data *hapd, > + const struct ieee80211_mgmt *mgmt, size_t len, > + const struct ieee802_11_elems *elems ) tabzzz > +@@ -142,6 +146,10 @@ void apup_process_beacon(struct hostapd_ > + int mRet = hostapd_set_wds_sta( > + hapd, mIfname, mgmt->bssid, sta_ret->aid, 1 ); > + > ++#ifdef UBUS_SUPPORT > ++ hostapd_ubus_notify_apup_newpeer(hapd, mgmt->bssid, mIfname); > ++#endif > ++ > + wpa_printf( MSG_INFO, > + "apup_process_beacon(...) Added APuP peer at %s with flags: > %d," > + " capabilities %d", tabzz > +--- a/src/ap/ubus.c > ++++ b/src/ap/ubus.c > +@@ -2004,3 +2004,18 @@ int hostapd_ubus_notify_bss_transition_q > + return ureq.resp; > + #endif > + } > ++ > ++#ifdef CONFIG_APUP > ++void hostapd_ubus_notify_apup_newpeer( > ++ struct hostapd_data *hapd, const u8 *addr, const char *ifname ) > ++{ > ++ if (!hapd->ubus.obj.has_subscribers) > ++ return; > ++ > ++ blob_buf_init(&b, 0); > ++ blobmsg_add_macaddr(&b, "address", addr); > ++ blobmsg_add_string(&b, "ifname", ifname); > ++ > ++ ubus_notify(ctx, &hapd->ubus.obj, "apup-newpeer", b.head, -1); > ++} > ++#endif // def CONFIG_APUP > +--- a/src/ap/ubus.h > ++++ b/src/ap/ubus.h > +@@ -71,6 +71,11 @@ int hostapd_ubus_notify_bss_transition_q > + void hostapd_ubus_notify_authorized(struct hostapd_data *hapd, struct > sta_info *sta, > + const char *auth_alg); > + > ++#ifdef CONFIG_APUP > ++void hostapd_ubus_notify_apup_newpeer( > ++ struct hostapd_data *hapd, const u8 *addr, const char *ifname ); > ++#endif // def CONFIG_APUP > ++ > + #else > + > + struct hostapd_ubus_bss {}; > diff --git > a/package/network/services/hostapd/patches/800-APuP-add-ucode-hook-for-when-a-peer-comes-up.patch > > b/package/network/services/hostapd/patches/800-APuP-add-ucode-hook-for-when-a-peer-comes-up.patch > new file mode 100644 > index 0000000000..ab89eb9543 > --- /dev/null > +++ > b/package/network/services/hostapd/patches/800-APuP-add-ucode-hook-for-when-a-peer-comes-up.patch > @@ -0,0 +1,83 @@ > +From f5682a5f73108fa43977864351cd8f770f10aee0 Mon Sep 17 00:00:00 2001 > +From: Gioacchino Mazzurco <g...@polymathes.cc> > +Date: Tue, 7 May 2024 11:54:23 +0200 > +Subject: [PATCH 3/3] APuP add ucode hook for when a peer comes up > + > +Signed-off-by: Gioacchino Mazzurco <g...@polymathes.cc> > +--- > + src/ap/apup.c | 16 ++++++++++++---- > + src/ap/ucode.c | 18 ++++++++++++++++++ > + src/ap/ucode.h | 4 ++++ > + 3 files changed, 34 insertions(+), 4 deletions(-) > + > +--- a/src/ap/apup.c > ++++ b/src/ap/apup.c > +@@ -27,6 +27,10 @@ > + # include "ubus.h" > + #endif > + > ++#ifdef UCODE_SUPPORT > ++# include "ucode.h" > ++#endif > ++ > + void apup_process_beacon(struct hostapd_data *hapd, > + const struct ieee80211_mgmt *mgmt, size_t len, > + const struct ieee802_11_elems *elems ) > +@@ -146,12 +150,16 @@ void apup_process_beacon(struct hostapd_ > + int mRet = hostapd_set_wds_sta( > + hapd, mIfname, mgmt->bssid, sta_ret->aid, 1 ); > + > +-#ifdef UBUS_SUPPORT > +- hostapd_ubus_notify_apup_newpeer(hapd, mgmt->bssid, mIfname); > +-#endif > +- > + wpa_printf( MSG_INFO, > + "apup_process_beacon(...) Added APuP peer at %s with flags: > %d," > + " capabilities %d", tabzzzz > + mIfname, sta_ret->flags, sta_ret->capability ); > ++ > ++#ifdef UBUS_SUPPORT > ++ hostapd_ubus_notify_apup_newpeer(hapd, mgmt->bssid, mIfname); > ++#endif > ++ > ++#ifdef UCODE_SUPPORT > ++ hostapd_ucode_apup_newpeer(hapd, mIfname); > ++#endif > + } > +--- a/src/ap/ucode.c > ++++ b/src/ap/ucode.c > +@@ -811,3 +811,21 @@ void hostapd_ucode_free_bss(struct hosta > + ucv_put(wpa_ucode_call(2)); > + ucv_gc(vm); > + } > ++ > ++#ifdef CONFIG_APUP > ++void hostapd_ucode_apup_newpeer( > ++ struct hostapd_data *hapd, const char *ifname ) > ++{ > ++ uc_value_t *val; > ++ > ++ if (wpa_ucode_call_prepare("apup_newpeer")) > ++ return; > ++ > ++ val = hostapd_ucode_bss_get_uval(hapd); > ++ uc_value_push(ucv_get(ucv_string_new(hapd->conf->iface))); // BSS ifname > ++ uc_value_push(ucv_get(val)); > ++ uc_value_push(ucv_get(ucv_string_new(ifname))); // APuP peer ifname > ++ ucv_put(wpa_ucode_call(2)); > ++ ucv_gc(vm); > ++} > ++#endif // def CONFIG_APUP > +--- a/src/ap/ucode.h > ++++ b/src/ap/ucode.h > +@@ -27,6 +27,10 @@ void hostapd_ucode_add_bss(struct hostap > + void hostapd_ucode_free_bss(struct hostapd_data *hapd); > + void hostapd_ucode_reload_bss(struct hostapd_data *hapd); > + > ++#ifdef CONFIG_APUP > ++void hostapd_ucode_apup_newpeer(struct hostapd_data *hapd, const char > *ifname); > ++#endif // def CONFIG_APUP > ++ > + #else > + > + static inline int hostapd_ucode_init(struct hapd_interfaces *ifaces) _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel