mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-30 18:07:52 +00:00 
			
		
		
		
	hostapd: add enhanced MPSK support
Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
		| @@ -604,7 +604,7 @@ define Package/afcd/install | |||||||
| endef | endef | ||||||
|  |  | ||||||
| define Install/hostapd | define Install/hostapd | ||||||
| 	$(INSTALL_DIR) $(1)/usr/sbin $(1)/usr/share/hostap | 	$(INSTALL_DIR) $(1)/usr/sbin $(1)/usr/share/hostap $(1)/etc/init.d | ||||||
| 	$(INSTALL_DATA) ./files/hostapd.uc $(1)/usr/share/hostap/ | 	$(INSTALL_DATA) ./files/hostapd.uc $(1)/usr/share/hostap/ | ||||||
| 	$(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/config $(1)/etc/radius | 	$(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/config $(1)/etc/radius | ||||||
| 	ln -sf hostapd $(1)/usr/sbin/hostapd-radius | 	ln -sf hostapd $(1)/usr/sbin/hostapd-radius | ||||||
| @@ -612,6 +612,8 @@ define Install/hostapd | |||||||
| 	$(INSTALL_DATA) ./files/radius.config $(1)/etc/config/radius | 	$(INSTALL_DATA) ./files/radius.config $(1)/etc/config/radius | ||||||
| 	$(INSTALL_DATA) ./files/radius.clients $(1)/etc/radius/clients | 	$(INSTALL_DATA) ./files/radius.clients $(1)/etc/radius/clients | ||||||
| 	$(INSTALL_DATA) ./files/radius.users $(1)/etc/radius/users | 	$(INSTALL_DATA) ./files/radius.users $(1)/etc/radius/users | ||||||
|  | 	$(INSTALL_BIN) ./files/mpskd $(1)/usr/share/hostap/ | ||||||
|  | 	$(INSTALL_BIN) ./files/mpskd.init $(1)/etc/init.d/mpskd | ||||||
| endef | endef | ||||||
|  |  | ||||||
| define Install/supplicant | define Install/supplicant | ||||||
|   | |||||||
							
								
								
									
										319
									
								
								feeds/ipq807x_v5.4/hostapd/files/mpskd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								feeds/ipq807x_v5.4/hostapd/files/mpskd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,319 @@ | |||||||
|  | #!/usr/bin/env ucode | ||||||
|  | 'use strict'; | ||||||
|  | import * as uloop from 'uloop'; | ||||||
|  | import * as libubus from 'ubus'; | ||||||
|  |  | ||||||
|  | uloop.init(); | ||||||
|  | let ubus = libubus.connect(); | ||||||
|  |  | ||||||
|  | let interfaces = {}; | ||||||
|  | let ssids = {}; | ||||||
|  | let cache = {}; | ||||||
|  | let sub_6g = []; | ||||||
|  | let sub_6g_obj; | ||||||
|  | let reload_timer; | ||||||
|  | let gc_timer; | ||||||
|  |  | ||||||
|  | let timeout = 48 * 60 * 60; | ||||||
|  |  | ||||||
|  | function event_cb_6g(req) { | ||||||
|  | 	//printf('6g %s %.J\n', req.data, req.type); | ||||||
|  | 	if (req.type != 'auth' && req.type != 'probe') | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	let addr = req.data.address; | ||||||
|  | 	let iface = interfaces[req.data.ifname]; | ||||||
|  | 	if (!iface) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	let ssid = iface.ssid; | ||||||
|  | 	if (!ssid || !length(ssids[ssid].keys)) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	let ssid_cache = cache[ssid]; | ||||||
|  | 	if (ssid_cache && ssid_cache[addr]) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	if (req.type == 'probe') { | ||||||
|  | 		printf(`Ignore probe ${req.type} on ${req.data.ifname} from ${addr}\n`); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	printf(`reject ${req.type} on ${req.data.ifname} from ${addr}\n`); | ||||||
|  | 	return 5; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function event_cb(req) { | ||||||
|  | 	//printf('normal %s %.J\n', req.data, req.type); | ||||||
|  | 	if (req.type != 'probe') | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	let addr = req.data.address; | ||||||
|  | 	let iface = interfaces[req.data.ifname]; | ||||||
|  | 	if (!iface) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	let ssid = iface.ssid; | ||||||
|  | 	if (!ssid || !length(ssids[ssid].keys)) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	let ssid_cache = cache[ssid]; | ||||||
|  | 	if (ssid_cache && ssid_cache[addr]) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	printf(`reply to ${req.type} on ${req.data.ifname} from ${addr} without 6G RNR\n`); | ||||||
|  | 	return 2;  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function create_6g_subscriber() { | ||||||
|  | 	for (let cur_sub in sub_6g) | ||||||
|  | 		cur_sub.remove(); | ||||||
|  | 	sub_6g = []; | ||||||
|  |  | ||||||
|  | 	for (let ifname, iface in interfaces) { | ||||||
|  | 		let obj = 'hostapd.' + ifname; | ||||||
|  | 		let cur_sub; | ||||||
|  | 		if (iface.band == '6g') | ||||||
|  | 			cur_sub = ubus.subscriber((req) => event_cb_6g(req)); | ||||||
|  | 		else | ||||||
|  | 			cur_sub = ubus.subscriber((req) => event_cb(req)); | ||||||
|  | 		cur_sub.subscribe(obj); | ||||||
|  | 		push(sub_6g, cur_sub); | ||||||
|  | 		printf(`subscribe ${ifname}\n`); | ||||||
|  | 		ubus.call(obj, 'notify_response', { notify_response: 1 }); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function cache_gc() { | ||||||
|  | 	let ts = time(); | ||||||
|  |  | ||||||
|  | 	for (let ssid in keys(cache)) { | ||||||
|  | 		if (!ssids[ssid]) { | ||||||
|  | 			delete cache[ssid]; | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		let ssid_cache = cache[ssid]; | ||||||
|  | 		ssid = ssids[ssid]; | ||||||
|  |  | ||||||
|  | 		for (let addr in keys(ssid_cache)) { | ||||||
|  | 			let sta = ssid_cache[addr]; | ||||||
|  | 			let keep = ts < cache.timeout; | ||||||
|  |  | ||||||
|  | 			if (keep && !ssid.keys[sta.key]) | ||||||
|  | 				keep = false; | ||||||
|  | 			if (keep) | ||||||
|  | 				sta.keydata = ssid.keys[sta.key]; | ||||||
|  | 			if (!keep) | ||||||
|  | 				delete cache[addr]; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function netifd_reload() { | ||||||
|  | 	let data = ubus.call('network.wireless', 'status'); | ||||||
|  |  | ||||||
|  | 	ssids = {}; | ||||||
|  | 	interfaces = {}; | ||||||
|  |  | ||||||
|  | 	for (let radio_name, radio in data) { | ||||||
|  | 		if (!radio.up) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		for (let iface in radio.interfaces) { | ||||||
|  | 			let config = iface.config; | ||||||
|  |  | ||||||
|  | 			if (config.mode != 'ap' || !iface.ifname) | ||||||
|  | 				continue; | ||||||
|  |  | ||||||
|  | 			let band = radio.config.band; | ||||||
|  | 			let nr_data = ubus.call('hostapd.' + iface.ifname, 'rrm_nr_get_own'); | ||||||
|  | 			let nr; | ||||||
|  | 			if (nr_data && nr_data.value && nr_data.value[2]) | ||||||
|  | 				nr = nr_data.value[2]; | ||||||
|  | 			interfaces[iface.ifname] = { | ||||||
|  | 				band, nr, | ||||||
|  | 				ssid: config.ssid, | ||||||
|  | 			}; | ||||||
|  |  | ||||||
|  | 			ssids[config.ssid] ??= { | ||||||
|  | 				interfaces: [], | ||||||
|  | 				keys: {}, | ||||||
|  | 				bands: {}, | ||||||
|  | 			}; | ||||||
|  | 			let ssid = ssids[config.ssid]; | ||||||
|  |  | ||||||
|  | 			push(ssid.interfaces, iface.ifname); | ||||||
|  | 			ssid.bands[band] = iface.ifname; | ||||||
|  | 			for (let sta in iface.stations) { | ||||||
|  | 				let stacfg = sta.config; | ||||||
|  |  | ||||||
|  | 				let key = stacfg.key; | ||||||
|  | 				if (!key) | ||||||
|  | 					continue; | ||||||
|  |  | ||||||
|  | 				let keydata = {}; | ||||||
|  | 				let vid = stacfg.vid; | ||||||
|  | 				if (vid) | ||||||
|  | 					keydata.vlan = +vid; | ||||||
|  |  | ||||||
|  | 				ssid.keys[key] = keydata; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	printf('New config: %.J\n',  { ssids, interfaces }); | ||||||
|  | 	cache_gc(); | ||||||
|  | 	create_6g_subscriber(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function iface_ssid(ifname) { | ||||||
|  | 	let iface = interfaces[ifname]; | ||||||
|  | 	if (!iface) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	return iface.ssid; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function sta_cache_entry_get(ssid, addr) { | ||||||
|  | 	let ssid_cache = cache[ssid] ?? {}; | ||||||
|  |  | ||||||
|  | 	let entry = ssid_cache[addr]; | ||||||
|  | 	if (entry) | ||||||
|  | 		entry.timeout = time() + timeout; | ||||||
|  |  | ||||||
|  | 	printf(`Get cache entry ssid=${ssid} addr=${addr}: ${entry}\n`); | ||||||
|  | 	return entry; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function sta_cache_entry_add(ssid, addr, key) { | ||||||
|  | 	cache[ssid] ??= {}; | ||||||
|  | 	let ssid_cache = cache[ssid]; | ||||||
|  | 	let ssid_data = ssids[ssid]; | ||||||
|  | 	let keydata = ssid_data.keys[key]; | ||||||
|  |  | ||||||
|  | 	let cache_data = { | ||||||
|  | 		timeout: time() + timeout, | ||||||
|  | 		ssid, key, | ||||||
|  | 		data: keydata ?? {}, | ||||||
|  | 	}; | ||||||
|  | 	ssid_cache[addr] = cache_data; | ||||||
|  | 	printf(`Added cache entry ssid=${ssid} addr=${addr}\n`); | ||||||
|  | 	return cache_data; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function ssid_psk(ssid) { | ||||||
|  | 	ssid = ssids[ssid]; | ||||||
|  | 	if (!ssid) | ||||||
|  | 		return []; | ||||||
|  |  | ||||||
|  | 	return keys(ssid.keys); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function sta_auth_psk(ifname, addr) { | ||||||
|  | 	let ssid = iface_ssid(ifname); | ||||||
|  | 	if (!ssid) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	let cache = sta_cache_entry_get(ssid, addr); | ||||||
|  | 	if (cache) | ||||||
|  | 		return [ cache.key ]; | ||||||
|  |  | ||||||
|  | 	return ssid_psk(ssid); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function sta_auth_cache(ifname, addr, idx) { | ||||||
|  | 	let ssid = iface_ssid(ifname); | ||||||
|  | 	if (!ssid) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	let cache = sta_cache_entry_get(ssid, addr); | ||||||
|  | 	if (cache) | ||||||
|  | 		return cache.data; | ||||||
|  |  | ||||||
|  | 	let psk = ssid_psk(ssid); | ||||||
|  | 	if (!psk) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	psk = psk[idx]; | ||||||
|  | 	if (!psk) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	cache = sta_cache_entry_add(ssid, addr, psk); | ||||||
|  | 	if (!cache) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	let ssid_data = ssids[ssid]; | ||||||
|  | 	if (!ssid_data) | ||||||
|  | 		return cache.data; | ||||||
|  |  | ||||||
|  | 	let target_ifname = ssid_data.bands['6g']; | ||||||
|  | 	if (!target_ifname) | ||||||
|  | 		return cache.data; | ||||||
|  |  | ||||||
|  | 	let target_iface = interfaces[target_ifname]; | ||||||
|  | 	if (!target_iface) | ||||||
|  | 		return cache.data; | ||||||
|  |  | ||||||
|  | 	cache.timer = uloop.timer(30 * 1000, () => { | ||||||
|  | 		let msg = { | ||||||
|  | 			addr, | ||||||
|  | 			disassociation_imminent: false, | ||||||
|  | 			neighbors: [ | ||||||
|  | 				target_iface.nr | ||||||
|  | 			], | ||||||
|  | 			abridged: false, | ||||||
|  | 		}; | ||||||
|  | 		printf(`ubus call hostapd.${ifname} bss_transition_request '${msg}'\n`); | ||||||
|  | 		ubus.call('hostapd.' + ifname, 'bss_transition_request', msg); | ||||||
|  | 		delete cache.timer; | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	return cache.data; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function auth_cb(msg) { | ||||||
|  | 	let data = msg.data; | ||||||
|  |  | ||||||
|  | 	printf(`Event ${msg.type}: ${msg.data}\n`); | ||||||
|  | 	switch (msg.type) { | ||||||
|  | 	case 'sta_auth': | ||||||
|  | 		return { | ||||||
|  | 			psk: sta_auth_psk(data.iface, data.sta), | ||||||
|  | 			force_psk: true, | ||||||
|  | 		}; | ||||||
|  | 	case 'sta_connected': | ||||||
|  | 		if (data.psk_idx == null) | ||||||
|  | 			return; | ||||||
|  | 		return sta_auth_cache(data.iface, data.sta, data.psk_idx); | ||||||
|  | 	case 'reload': | ||||||
|  | 		netifd_reload(); | ||||||
|  | 		reload_timer.set(5000); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | let ubus_methods = { | ||||||
|  | 	state: { | ||||||
|  | 		call: function(req) { | ||||||
|  | 			return { | ||||||
|  | 				interfaces, | ||||||
|  | 				ssids, | ||||||
|  | 				cache | ||||||
|  | 			}; | ||||||
|  | 		}, | ||||||
|  | 		args: { | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | reload_timer = uloop.timer(-1, () => { netifd_reload(); }); | ||||||
|  | gc_timer = uloop.timer(1000, () => { gc_timer.set(30 * 1000); cache_gc(); }); | ||||||
|  | ubus.publish('mpsk', ubus_methods); | ||||||
|  | let sub = ubus.subscriber(auth_cb); | ||||||
|  | let listener = ubus.listener('ubus.object.add', (event, msg) => { | ||||||
|  | 	if (msg.path == 'hostapd-auth') | ||||||
|  | 		sub.subscribe(msg.path); | ||||||
|  | }); | ||||||
|  | sub.subscribe('hostapd-auth'); | ||||||
|  | netifd_reload(); | ||||||
|  | uloop.run(); | ||||||
							
								
								
									
										13
									
								
								feeds/ipq807x_v5.4/hostapd/files/mpskd.init
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								feeds/ipq807x_v5.4/hostapd/files/mpskd.init
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | #!/bin/sh /etc/rc.common | ||||||
|  |  | ||||||
|  | START=19 | ||||||
|  |  | ||||||
|  | USE_PROCD=1 | ||||||
|  | NAME=mpskd | ||||||
|  |  | ||||||
|  | start_service() { | ||||||
|  | 	procd_open_instance mpskd | ||||||
|  | 	procd_set_param command /usr/share/hostap/mpskd | ||||||
|  | 	procd_set_param respawn | ||||||
|  | 	procd_close_instance | ||||||
|  | } | ||||||
							
								
								
									
										156
									
								
								feeds/ipq807x_v5.4/hostapd/patches/zzz-deny-6g-probe-resp.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								feeds/ipq807x_v5.4/hostapd/patches/zzz-deny-6g-probe-resp.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | |||||||
|  | --- a/src/ap/ieee802_11.c | ||||||
|  | +++ b/src/ap/ieee802_11.c | ||||||
|  | @@ -7740,7 +7740,7 @@ enum colocation_mode get_colocation_mode | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |   | ||||||
|  | -size_t hostapd_eid_rnr_len(struct hostapd_data *hapd, u32 type) | ||||||
|  | +size_t _hostapd_eid_rnr_len(struct hostapd_data *hapd, u32 type, int add_6g) | ||||||
|  |  { | ||||||
|  |  	size_t len = 0, current_len = 0; | ||||||
|  |  	enum colocation_mode mode = get_colocation_mode(hapd); | ||||||
|  | @@ -7753,7 +7753,7 @@ size_t hostapd_eid_rnr_len(struct hostap | ||||||
|  |  		/* fallthrough */ | ||||||
|  |   | ||||||
|  |  	case WLAN_FC_STYPE_PROBE_RESP: | ||||||
|  | -		if (mode == COLOCATED_LOWER_BAND) | ||||||
|  | +		if (add_6g && mode == COLOCATED_LOWER_BAND) | ||||||
|  |  			len += hostapd_eid_rnr_colocation_len(hapd, | ||||||
|  |  							      ¤t_len); | ||||||
|  |   | ||||||
|  | @@ -7776,6 +7776,10 @@ size_t hostapd_eid_rnr_len(struct hostap | ||||||
|  |  	return len; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +size_t hostapd_eid_rnr_len(struct hostapd_data *hapd, u32 type) | ||||||
|  | +{ | ||||||
|  | +	return _hostapd_eid_rnr_len(hapd, type, 1); | ||||||
|  | +} | ||||||
|  |   | ||||||
|  |  static u8 *hostapd_eid_rnr_iface(struct hostapd_data *hapd, | ||||||
|  |  				 struct hostapd_data *reporting_hapd, | ||||||
|  | @@ -7938,7 +7942,7 @@ static u8 *hostapd_eid_neighbor_report_d | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |   | ||||||
|  | -u8 * hostapd_eid_rnr(struct hostapd_data *hapd, u8 *eid, u32 type) | ||||||
|  | +u8 * _hostapd_eid_rnr(struct hostapd_data *hapd, u8 *eid, u32 type, int add_6g) | ||||||
|  |  { | ||||||
|  |  	u8 *eid_start = eid; | ||||||
|  |  	size_t current_len = 0; | ||||||
|  | @@ -7955,7 +7959,7 @@ u8 * hostapd_eid_rnr(struct hostapd_data | ||||||
|  |  		/* fallthrough */ | ||||||
|  |   | ||||||
|  |  	case WLAN_FC_STYPE_PROBE_RESP: | ||||||
|  | -		if (mode == COLOCATED_LOWER_BAND) | ||||||
|  | +		if (add_6g && mode == COLOCATED_LOWER_BAND) | ||||||
|  |  			eid = hostapd_eid_rnr_colocation(hapd, eid, | ||||||
|  |  							 ¤t_len); | ||||||
|  |   | ||||||
|  | @@ -7981,4 +7985,9 @@ u8 * hostapd_eid_rnr(struct hostapd_data | ||||||
|  |  	return eid; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +u8 * hostapd_eid_rnr(struct hostapd_data *hapd, u8 *eid, u32 type) | ||||||
|  | +{ | ||||||
|  | +	return _hostapd_eid_rnr(hapd, eid, type, 1); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  #endif /* CONFIG_NATIVE_WINDOWS */ | ||||||
|  | --- a/src/ap/ieee802_11.h | ||||||
|  | +++ b/src/ap/ieee802_11.h | ||||||
|  | @@ -135,6 +135,7 @@ u8 * hostapd_eid_time_zone(struct hostap | ||||||
|  |  int hostapd_update_time_adv(struct hostapd_data *hapd); | ||||||
|  |  void hostapd_client_poll_ok(struct hostapd_data *hapd, const u8 *addr); | ||||||
|  |  u8 * hostapd_eid_bss_max_idle_period(struct hostapd_data *hapd, u8 *eid); | ||||||
|  | +u8 * _hostapd_eid_rnr(struct hostapd_data *hapd, u8 *eid, u32 type, int add_6g); | ||||||
|  |  u8 * hostapd_eid_rnr(struct hostapd_data *hapd, u8 *eid, u32 type); | ||||||
|  |  u8 * hostapd_eid_multiple_bssid(struct hostapd_data *hapd, | ||||||
|  |  				struct hostapd_data *req_bss, u8 *eid, u8 *end, | ||||||
|  | @@ -146,6 +147,7 @@ size_t hostapd_eid_multiple_bssid_len(st | ||||||
|  |  				      struct hostapd_data *req_bss, u32 type, | ||||||
|  |  				      const u8 *known_bssids, | ||||||
|  |  				      u8 known_bssids_len, size_t *rnr_len); | ||||||
|  | +size_t _hostapd_eid_rnr_len(struct hostapd_data *hapd, u32 type, int add_6g); | ||||||
|  |  size_t hostapd_eid_rnr_len(struct hostapd_data *hapd, u32 type); | ||||||
|  |  int auth_sae_init_committed(struct hostapd_data *hapd, struct sta_info *sta); | ||||||
|  |  #ifdef CONFIG_SAE | ||||||
|  | --- a/src/ap/beacon.c | ||||||
|  | +++ b/src/ap/beacon.c | ||||||
|  | @@ -463,7 +463,8 @@ static u8 * hostapd_eid_supported_op_cla | ||||||
|  |  static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, | ||||||
|  |  				   const struct ieee80211_mgmt *req, | ||||||
|  |  				   int is_p2p, size_t *resp_len, | ||||||
|  | -				   const u8 *known_bssids, u8 known_bssids_len) | ||||||
|  | +				   const u8 *known_bssids, u8 known_bssids_len, | ||||||
|  | +				   int add_6g) | ||||||
|  |  { | ||||||
|  |  	struct hostapd_data *req_bss = NULL; | ||||||
|  |  	struct ieee80211_mgmt *resp; | ||||||
|  | @@ -523,7 +524,7 @@ static u8 * hostapd_gen_probe_resp(struc | ||||||
|  |  							 known_bssids, | ||||||
|  |  							 known_bssids_len, | ||||||
|  |  							 NULL); | ||||||
|  | -	buflen += hostapd_eid_rnr_len(hapd, WLAN_FC_STYPE_PROBE_RESP); | ||||||
|  | +	buflen += _hostapd_eid_rnr_len(hapd, WLAN_FC_STYPE_PROBE_RESP, add_6g); | ||||||
|  |   | ||||||
|  |  	resp = os_zalloc(buflen); | ||||||
|  |  	if (resp == NULL) | ||||||
|  | @@ -706,7 +707,7 @@ static u8 * hostapd_gen_probe_resp(struc | ||||||
|  |  	pos = hostapd_eid_mbo(hapd, pos, (u8 *) resp + buflen - pos); | ||||||
|  |  	pos = hostapd_eid_owe_trans(hapd, pos, (u8 *) resp + buflen - pos); | ||||||
|  |  	pos = hostapd_eid_dpp_cc(hapd, pos, (u8 *) resp + buflen - pos); | ||||||
|  | -	pos = hostapd_eid_rnr(hapd, pos, WLAN_FC_STYPE_PROBE_RESP); | ||||||
|  | +	pos = _hostapd_eid_rnr(hapd, pos, WLAN_FC_STYPE_PROBE_RESP, add_6g); | ||||||
|  |   | ||||||
|  |  	if (hapd->conf->vendor_elements) { | ||||||
|  |  		os_memcpy(pos, wpabuf_head(hapd->conf->vendor_elements), | ||||||
|  | @@ -930,6 +931,7 @@ void handle_probe_req(struct hostapd_dat | ||||||
|  |  		.ssi_signal = ssi_signal, | ||||||
|  |  		.elems = &elems, | ||||||
|  |  	}; | ||||||
|  | +	int ubus_response; | ||||||
|  |   | ||||||
|  |  	if (hapd->iconf->rssi_ignore_probe_request && ssi_signal && | ||||||
|  |  	    ssi_signal < hapd->iconf->rssi_ignore_probe_request) | ||||||
|  | @@ -1118,7 +1120,12 @@ void handle_probe_req(struct hostapd_dat | ||||||
|  |  	} | ||||||
|  |  #endif /* CONFIG_P2P */ | ||||||
|  |   | ||||||
|  | -	if (hostapd_ubus_handle_event(hapd, &req)) { | ||||||
|  | +	ubus_response = hostapd_ubus_handle_event(hapd, &req); | ||||||
|  | + | ||||||
|  | +	if (ubus_response == 2) { | ||||||
|  | +		wpa_printf(MSG_DEBUG, "Probe request for " MACSTR " without 6G RNR.\n", | ||||||
|  | +		       MAC2STR(mgmt->sa)); | ||||||
|  | +	} else if (ubus_response) { | ||||||
|  |  		wpa_printf(MSG_DEBUG, "Probe request for " MACSTR " rejected by ubus handler.\n", | ||||||
|  |  		       MAC2STR(mgmt->sa)); | ||||||
|  |  		return; | ||||||
|  | @@ -1170,7 +1177,7 @@ void handle_probe_req(struct hostapd_dat | ||||||
|  |   | ||||||
|  |  	resp = hostapd_gen_probe_resp(hapd, mgmt, elems.p2p != NULL, | ||||||
|  |  				      &resp_len, elems.known_bssids, | ||||||
|  | -				      elems.known_bssids_len); | ||||||
|  | +				      elems.known_bssids_len, ubus_response == 2 ? 0 : 1); | ||||||
|  |  	if (resp == NULL) | ||||||
|  |  		return; | ||||||
|  |   | ||||||
|  | @@ -1239,7 +1246,7 @@ static u8 * hostapd_probe_resp_offloads( | ||||||
|  |  			   "this"); | ||||||
|  |   | ||||||
|  |  	/* Generate a Probe Response template for the non-P2P case */ | ||||||
|  | -	return hostapd_gen_probe_resp(hapd, NULL, 0, resp_len, NULL, 0); | ||||||
|  | +	return hostapd_gen_probe_resp(hapd, NULL, 0, resp_len, NULL, 0, 1); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  #endif /* NEED_AP_MLME */ | ||||||
|  | @@ -1269,7 +1276,7 @@ static u8 * hostapd_unsol_bcast_probe_re | ||||||
|  |   | ||||||
|  |  	return hostapd_gen_probe_resp(hapd, NULL, 0, | ||||||
|  |  				      ¶ms->unsol_bcast_probe_resp_tmpl_len, | ||||||
|  | -				      NULL, 0); | ||||||
|  | +				      NULL, 0, 1); | ||||||
|  |  } | ||||||
|  |  #endif /* CONFIG_IEEE80211AX */ | ||||||
|  |   | ||||||
| @@ -1864,6 +1864,7 @@ int hostapd_ubus_handle_event(struct hostapd_data *hapd, struct hostapd_ubus_req | |||||||
|  |  | ||||||
| 	blob_buf_init(&b, 0); | 	blob_buf_init(&b, 0); | ||||||
| 	blobmsg_add_macaddr(&b, "address", addr); | 	blobmsg_add_macaddr(&b, "address", addr); | ||||||
|  | 	blobmsg_add_string(&b, "ifname", hapd->conf->iface); | ||||||
| 	if (req->mgmt_frame) | 	if (req->mgmt_frame) | ||||||
| 		blobmsg_add_macaddr(&b, "target", req->mgmt_frame->da); | 		blobmsg_add_macaddr(&b, "target", req->mgmt_frame->da); | ||||||
| 	if (req->ssi_signal) | 	if (req->ssi_signal) | ||||||
|   | |||||||
| @@ -0,0 +1,121 @@ | |||||||
|  | { | ||||||
|  | 	"uuid": 2, | ||||||
|  | 	"radios": [ | ||||||
|  | 		{ | ||||||
|  | 			"band": "2G", | ||||||
|  | 			"country": "US", | ||||||
|  | 			"channel-mode": "HE", | ||||||
|  | 			"channel-width": 20, | ||||||
|  | 			"channel": "auto" | ||||||
|  | 		}, { | ||||||
|  | 			"band": "5G", | ||||||
|  | 			"country": "US", | ||||||
|  | 			"channel-mode": "HE", | ||||||
|  | 			"channel-width": 80, | ||||||
|  | 			"channel": 36 | ||||||
|  | 		}, { | ||||||
|  | 			"band": "6G", | ||||||
|  | 			"country": "US", | ||||||
|  | 			"channel-mode": "HE", | ||||||
|  | 			"channel-width": 80, | ||||||
|  | 			"channel": 33 | ||||||
|  | 		} | ||||||
|  | 	], | ||||||
|  |  | ||||||
|  | 	"interfaces": [ | ||||||
|  | 		{ | ||||||
|  | 			"name": "WAN", | ||||||
|  | 			"role": "upstream", | ||||||
|  | 			"services": [ "lldp" ], | ||||||
|  | 			"ethernet": [ | ||||||
|  | 				{ | ||||||
|  | 					"select-ports": [ | ||||||
|  | 						"WAN*" | ||||||
|  | 					] | ||||||
|  | 				} | ||||||
|  | 			], | ||||||
|  | 			"ipv4": { | ||||||
|  | 				"addressing": "dynamic" | ||||||
|  | 			}, | ||||||
|  | 			"ssids": [ | ||||||
|  | 				{ | ||||||
|  | 					"name": "OpenWifi-roam", | ||||||
|  | 					"wifi-bands": [ | ||||||
|  | 						"2G", "5G" | ||||||
|  | 					], | ||||||
|  | 					"bss-mode": "ap", | ||||||
|  | 					"encryption": { | ||||||
|  | 						"proto": "psk2", | ||||||
|  | 						"key": "OpenWifi", | ||||||
|  | 						"ieee80211w": "optional" | ||||||
|  | 					}, | ||||||
|  | 					"rrm": { | ||||||
|  | 						"reduced-neighbor-reporting": true | ||||||
|  | 					}, | ||||||
|  | 					"multi-psk": [ | ||||||
|  | 						{ | ||||||
|  | 							"key": "aaaaaaaa" | ||||||
|  | 						}, { | ||||||
|  | 							"key": "bbbbbbbb" | ||||||
|  | 						} | ||||||
|  | 					], | ||||||
|  | 					"roaming": true | ||||||
|  | 				}, { | ||||||
|  | 					"name": "OpenWifi-roam", | ||||||
|  | 					"wifi-bands": [ | ||||||
|  | 						"6G" | ||||||
|  | 					], | ||||||
|  | 					"bss-mode": "ap", | ||||||
|  | 					"encryption": { | ||||||
|  | 						"proto": "sae", | ||||||
|  | 						"key": "OpenWifi", | ||||||
|  | 						"ieee80211w": "required" | ||||||
|  | 					}, | ||||||
|  | 					"rrm": { | ||||||
|  | 						"reduced-neighbor-reporting": true | ||||||
|  | 					}, | ||||||
|  | 					"roaming": true | ||||||
|  | 				} | ||||||
|  | 			] | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"name": "LAN", | ||||||
|  | 			"role": "downstream", | ||||||
|  | 			"services": [ "ssh", "lldp" ], | ||||||
|  | 			"ethernet": [ | ||||||
|  | 				{ | ||||||
|  | 					"select-ports": [ | ||||||
|  | 						"LAN*" | ||||||
|  | 					] | ||||||
|  | 				} | ||||||
|  | 			], | ||||||
|  | 			"ipv4": { | ||||||
|  | 				"addressing": "static", | ||||||
|  | 				"subnet": "192.168.1.1/24", | ||||||
|  | 				"dhcp": { | ||||||
|  | 					"lease-first": 10, | ||||||
|  | 					"lease-count": 100, | ||||||
|  | 					"lease-time": "6h" | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	], | ||||||
|  | 	"metrics": { | ||||||
|  | 		"statistics": { | ||||||
|  | 			"interval": 120, | ||||||
|  | 			"types": [ "ssids", "lldp", "clients" ] | ||||||
|  | 		}, | ||||||
|  | 		"health": { | ||||||
|  | 			"interval": 120 | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	"services": { | ||||||
|  | 		"lldp": { | ||||||
|  | 			"describe": "uCentral", | ||||||
|  | 			"location": "universe" | ||||||
|  | 		}, | ||||||
|  | 		"ssh": { | ||||||
|  | 			"port": 22 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 John Crispin
					John Crispin