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

Reply via email to