The class 3 deauth went out on the link whose address equals the AP MLD
address, where a station on another link never takes it.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A non-AP MLD dropped the broadcast deauth an AP sends from a link whose
address differs from the AP MLD address, and kept a dead association.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Add a pending patch. hwsim rewrites the addresses of a frame to an MLO
station to link addresses and then reported the TX status with them,
so mac80211 found no station for that status and recorded no ACK,
retry, lost frame or TX rate for it. hwsim now puts the MLD addresses
back before it reports the TX status.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Add two pending patches. A 4-address AP_VLAN of an AP MLD sends to a
station that is not an MLD with the address of the station's link as
TA, not the AP MLD address. A 4-address MLO station sends with the AP
MLD address as RA, not the BSSID of the default link, which an MLO
connection does not set.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
ieee80211_8023_xmit() leaves info->band at 0 on an interface that is not
an MLD, so ieee80211_get_tx_rates() uses the wrong band for these
frames. The fix is in the wireless tree.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
With HAS_RATE_CONTROL, mac80211 leaves the rate entries of every frame
cleared, so hwsim reported no rate for it, an MLD station reported no
TX bit rate, and a medium in userspace sent the frame at the lowest
rate.
Send such a frame at one rate, with one attempt and the rate list ended
after that entry. For a data frame to a peer, take the highest VHT or
HT MCS that the peer receives on the channel width in use, as a rate
controller settles on for an ideal channel; otherwise take the highest
legacy rate of the band. Stop at four streams, as minstrel_ht does
(MINSTREL_MAX_STREAMS): hwsim declares MCS 0-9 for all eight streams,
and ieee80211_get_rate_duration() warns for more than four streams on
a VHT rate.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
The error path of iface.add_bss() freed an AP MLD link that
hostapd_setup_bss() had already added to mld->links, without the MLD
reference it took. The next link to join that MLD wrote through the
freed node, which crashed hostapd after "Failed to add new bss ap-mld0
on phy phy0.0" and the restart of phy0.0 that follows it. The error
path now unlinks the BSS, drops the reference and frees an MLD left
unused, as hostapd_add_iface() and bss.delete() do.
Patch 182 makes hostapd_mld_remove_link() skip a node that is on no
list, which the new unlink reaches for a setup that fails before the
link joins.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A station in 4-address mode sends one 4-address null data frame, and the
access point sets up the 4-address station only when it receives it. If
the driver reports ACK status, send the frame again every second until
the access point acknowledges it, for at most ten transmissions.
Based on 0089-mtk-mac80211-retransmit-4addr-nullfunc-if-the-ACK-is.patch
by Peter Chiu <chui-hao.chiu@mediatek.com> in the MediaTek feed.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
An MLO radio of hwsim declares CONNECTION_MONITOR but reports neither a
beacon loss nor a connection loss, so a station whose AP went away
without a deauthentication that it accepts stayed associated. Leave the
flag out, so that mac80211 monitors the active links of the station.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
An MLO radio of hwsim declares extended, EML and MLD capabilities for
the AP interface type only, so a station interface reports no
simultaneous links. Declare the station interface type as well. The
Association Request of an MLO station of hwsim then announces the
maximum number of simultaneous links of the AP entry instead of 0.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A Measurement Report element of a Beacon report can come without its
Measurement Report field: from a station that refuses the request or
cannot perform it, with the Refused or Incapable bit set (802.11-2024
9.4.2.20.1), and as the empty Beacon report of a station that has no
beacon information for the request, with no bit set (11.10.9.1.1). An
AX210 class station sends the latter for a Passive request on a channel
with no AP. hostapd_handle_beacon_report() passed only reports that
carry the field to hostapd_ubus_notify_beacon_report(), which dropped a
report without one, so such an answer never reached ubus.
Such a report now goes out on ubus with its address, tokens, interface
and rep-mode, and without the fields of the Measurement Report.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
When the AP a station MLD is connected to switches the channel of one
link, wpa_supplicant receives EVENT_LINK_CH_SWITCH_STARTED rather than
EVENT_CH_SWITCH_STARTED. wpas_ucode_event() passed only the latter to
ucode, so hostapd was never told to move the APs on the radio of that
link. mac80211 then could not finalize the shared channel context
("some interfaces aren't switching") and dropped the station link.
Pass the link event with the same fields plus link_id, and handle it
like the interface event; iface_channel_switch() already maps the
frequency to the radio of an MLD.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A per-STA profile in the Basic Multi-Link element of an (Re)Association
Response inherits each element of the frame that carries the Basic
Multi-Link element, unless a Non-Inheritance element lists it (IEEE
802.11be 35.3.3.5.1). ieee80211_ml_build_assoc_resp() adds no such
element. When the station associates on a 5 GHz link, the profile of a
2.4 GHz partner link omits VHT Capabilities and VHT Operation and so
inherits those of the 5 GHz link. mac80211 with IEEE80211_HW_STRICT then
rejects the association ("[link 0] VHT capabilities mismatch"), and a
driver without it sets up the 2.4 GHz link with VHT parameters the AP
does not use there.
List HT Capabilities, HT Operation, VHT Capabilities, VHT Operation and
HE 6 GHz Band Capabilities in a Non-Inheritance element where the
carrying frame has them and the link does not, as a Non-Inheritance
element names only elements of that frame (9.4.2.239). A Link
Reconfiguration Response carries none of them outside the Basic
Multi-Link element, so its profiles get no Non-Inheritance element.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
wpas_dpp_chirp_start() sends each Presence Announcement with a wait time
of 2000 ms. cfg80211 refuses a frame whose wait exceeds the driver's
maximum remain-on-channel duration with -EINVAL (nl80211_tx_mgmt()), so
on a driver with a smaller maximum, such as mac80211_hwsim with 1000 ms,
no chirp is ever transmitted and the enrollee cannot be found.
Clamp the wait time to max_remain_on_chan, as the other DPP transmit
paths in this file do.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A later link of an AP MLD takes the driver instance of the first link
(hapd->drv_priv = h_hapd->drv_priv) in hostapd_driver_init() and joins
the MLD only after hostapd_drv_link_add() succeeds. When that call, or
the check for driver MLO support, fails, the link returns -1 with the
borrowed pointer still set.
The caller's cleanup, hostapd_deinit_driver(), then treats the instance
as its own: hostapd_cleanup_driver() removes the link with this BSS's
link ID from the shared instance, which is the link of another BSS when
the link IDs collide, or deinits the instance when it looks unshared.
The first link keeps a pointer to a torn down or freed instance, and the
next link that is set up calls get_capa() on it and crashes hostapd.
Seen with an AP MLD whose links span two wiphys: the link on the second
wiphy was assigned link ID 0, hostapd_drv_link_add() refused it, and the
cleanup removed link 0 of the first wiphy.
A link that never joined the MLD now drops the borrowed instance before
it returns, so the cleanup leaves the first link alone.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
hostapd_driver_scan() refuses a scan with -EBUSY while a partner link
of the same AP MLD is in HAPD_IFACE_ACS. A link stays in that state
while it waits to retry a refused scan. When two links start ACS at the
same time, the second one is refused, and from then on each link finds
the other in HAPD_IFACE_ACS on every retry. Neither link scans again,
and both give up after ACS_SCAN_RETRY_MAX_COUNT attempts.
The check exists because scan results without a matching scan cookie
go to the link that received the event, or to a partner link with a
scan callback. That needs at most one partner with a scan outstanding,
not at most one partner in ACS. Test for the scan callback instead of
the interface state. This also covers the HT 20/40 coexistence scan,
which sets the scan callback as well.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
When ieee80211_check_combinations() refuses a channel,
_ieee80211_link_use_channel() tries to evacuate a NAN channel and then
returns the result of that attempt. Without a NAN interface the attempt
returns -ENOENT, so a refused interface combination reaches userspace as
"No such file or directory" instead of the error of the check.
Keep the error of the combination check when the evacuation does not
help.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A radio that uses channel contexts gets no radar detection widths in its
global interface combination, because DFS requires a combination with a
single channel. A multi-radio radio always uses channel contexts, and
its global combination multiplies the channel count by the number of
radios. So it loses the radar detection widths as well, while each
per-radio combination keeps them.
mac80211 checks the channel of a radar detection against the global
combination (ieee80211_check_combinations() with radio_idx -1 from
_ieee80211_link_use_channel()). No combination matches, and every CAC on
a multi-radio hwsim radio fails. hostapd reports it as "start_dfs_cac()
failed" and disables the interface.
cfg80211 exempts the global combination of a multi-radio wiphy from the
single channel rule for DFS (wiphy_verify_iface_combinations()), since
it only sums up the radios. Keep the radar detection widths there when
each radio has one channel. With more than one channel per radio, clear
them in the per-radio combination too, which cfg80211 would refuse
otherwise.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
The station hash holds the MLD address of an MLO station. When a driver
neither passes the station nor translates the addresses, a data frame
of an MLO station carries a link address in addr2, and
__ieee80211_rx_handle_packet() does not find the sender. The frame goes
through the per-interface loop, which skips AP_VLAN interfaces. A
4-address MLO station associates and gets its AP_VLAN, but no data
frame of it arrives.
403 looks up the sender in the link station hash when the station hash
has no match, and hands the frame to the interface of that station, as
upstream does since the RX rework.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
mac80211_hwsim accepts CCMP and GCMP keys in mac80211_hwsim_set_key()
and encrypts unicast data frames itself in mac80211_hwsim_tx(), through
ieee80211_encrypt_tx_skb(). It asks mac80211 to reserve tailroom for the
MIC, but not headroom for the CCMP or GCMP header.
For a hardware key without IEEE80211_KEY_FLAG_GENERATE_IV or
IEEE80211_KEY_FLAG_PUT_IV_SPACE, ieee80211_xmit_fast() resizes the frame
with ENCRYPT_NO and reserves only the 802.11 header and
hw.extra_tx_headroom. A locally generated frame usually has room to
spare, but a frame forwarded from a bridge can arrive with none. The
room check in ccmp_encrypt_skb() then warns, ieee80211_encrypt_tx_skb()
returns an error and the frame is freed. An access point that bridges
traffic to its clients sends no downlink unicast data at all.
Reserve the header as driver headroom. IEEE80211_CCMP_HDR_LEN,
IEEE80211_CCMP_256_HDR_LEN and IEEE80211_GCMP_HDR_LEN are all 8 bytes.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
wpas_dpp_check_connect() skipped Network Introduction whenever any
PMKSA for the AP existed, because wpa_sm_pmksa_exists() matches any
AKM. A backhaul STA that had joined with SAE while the AP offered no
DPP AKM kept that SAE PMKSA, and once the AP offered DPP again it
associated with the DPP AKM and no PMKID, which the AP rejected with
status 53. Require a PMKSA of the DPP AKM, under the AP MLD address as
well for an MLD, as patch 163 stores it.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
wpa_supplicant adds the PMKSA it derives in Peer Discovery under the
address of the affiliated AP that answered, but an MLD association looks
it up by the AP MLD address. Whenever the two differ, the Association
Request carries the DPP AKM without a PMKID and the AP rejects it with
status 53. Add the entry under the AP MLD address as well, as the AP side
already does.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
The Multi-AP specification (v6.1, Table 8) makes a mapBackhaulSta
Connector compatible with a mapBackhaulBss one, but
dpp_compatible_netrole() accepts only sta with ap, so a backhaul STA's
Peer Discovery ended with STATUS_NO_MATCH and the DPP AKM could not be
used on the backhaul.
Also report the features "dpp" and, from the patch itself, "dpp-map", so
that a Multi-AP Agent advertises the DPP AKM on a backhaul only where the
running wpad can complete the introduction.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A non-AP MLD that lost its association without a Deauthentication comes
back with a new association. With PMF the AP answers status 30, runs an
SA Query, and allows the next association once the query times out.
The WPA state machine and the station entries of the earlier
association survive, and ieee80211_ml_process_link() then refuses the
partner links ("MLD: link: Station already exists", status 1 or 17), so
the station comes back with one link. IEEE Std 802.11be-2024 11.3.5.3 l)
has those states deleted.
Add a patch that deletes them in handle_assoc() once the SA Query has
timed out, before check_assoc_ies() creates a state machine for the link
that receives the association: it frees the state machine the way
handle_auth() does for a station without PMF, and then runs
ap_sta_re_add(). This covers Open System and SAE authentication on
drivers with full AP client state. Upstream hostap still refuses the
links as of 2026-09-22 (24c033de8775).
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Add the ubus notification "action-frame". It carries the body of a
received frame as hex, from the Category octet, for a subscriber that
forwards the frame rather than a reading of it. Raise it for a BSS
Transition Management Query, a WNM Notification Request and an ANQP
request for the Neighbor Report ANQP-element.
Answer the Neighbor Report ANQP-element (Info ID 272) from the neighbor
report database that the AP keeps for Radio Measurement, not only from
a configured anqp_elem, which still takes precedence. The payload is a
sequence of whole Neighbor Report elements. The element comes before
the elements of the extra requests, stops at 65535 octets, and carries
only the entries with the SSID of the BSS, as
hostapd_send_nei_report_resp() does. The Capability List advertises
Info ID 272 under the same condition.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
ieee80211_mgmt_tx() walks the links of an AP MLD to decide whether a
frame needs an off-channel transmission. It pins the link that holds the
requested channel only when the destination is a station that already
associated as an MLD. A frame to an address the access point does not
know keeps link_id at -1, the link reaches the driver unspecified, and
the driver picks the default link, which holds a different channel and a
different address.
A DPP Authentication Request shows this: the enrollee announces itself
on channel 6, the access point answers under the address of its 5 GHz
link, and the enrollee never sees the frame.
Pin the link whenever an active link holds the requested channel.
ieee80211_tx_skb_tid() warns on a link id for an interface that is not
an MLD and on one that names an inactive link, and active_links is zero
for an interface that is not an MLD, so that one test covers both. A
station MLD that sends from its MLD address to an address other than its
AP gets the same pin.
A link whose own address is the MLD address also matched the frame on
that address and ended the search, so a lower link that uses the MLD
address hid the link with the requested channel. Skip such a link when
the frame names another channel.
Frames to a station keep their present behaviour: the branch runs only
where the caller named a channel, and where the destination is a station
that associated as an MLD the same branch already pinned the link.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
setup() ran wdev.uc set_config once per interface, each time with a
configuration of that interface alone. set_config replaces the whole
configuration of the radio, so each call stopped the interfaces of the
calls before it: with two monitors, or a monitor and an adhoc
interface, on one radio, only the last one stayed up. The configuration
also passed through the shell inside single quotes, so a single quote
in an SSID or a mesh_id broke the command, and two of them made the
text between them run as shell code.
Pass all interfaces in one call, also when the radio has none, so that
removed interfaces stop. Pass the arguments as an array, which system()
runs without a shell.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drop_inactive() kept every name of the state file whose netdev existed,
and the configuration update then stopped it. A name can belong to
another owner by then: the interface moved to another radio, or it is
now an AP of hostapd or a station of wpa_supplicant. The old radio then
deleted the interface of the new owner.
Record the wdev id of each interface in /var/run/wdev-<phy>.id.json,
and keep a name only if the interface dump shows it on this radio with
the recorded id. A state without recorded ids, from an older version,
falls back to the name.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
rrm_beacon_req takes its Dialog Token from the counter of the BSS whose
ubus object the call reached, and the links of an AP MLD share the one
object of their interface. The token alone therefore names the request a
report answers only per interface: two interfaces can hand out the same
token to requests for one station. The beacon-report notification now
carries "ifname", which is that interface for every link of an MLD.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
The beacon-report notification carried the frame's Dialog Token under
"token" and dropped the Measurement Token of the Measurement Report
element, which hostapd_handle_beacon_report() skips before the report.
A subscriber that rebuilds the element put the Dialog Token in its
place. 802.11-2024 9.4.2.20 sets the Measurement Token to that of the
request's Measurement Request element, which hostapd sets to 1. The
notification now carries it as "measurement-token".
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A station answers a Beacon Request with a Radio Measurement Report that
carries the request's Dialog Token (802.11-2024 9.6.6.3), and the
beacon-report notification passes that token on. The caller of
rrm_beacon_req never learnt the token hostapd chose, so it could not
tell a report for its request from one for an earlier request to the
same station. rrm_beacon_req now replies with dialog_token.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A device without UBI, such as an x86 VM or a device on eMMC, can keep its
provisioning data on a block partition named `provisioning`. The data
uses the same header as the UBI volume.
open() and create() prefer the UBI volume and then look for the partition
through the PARTNAME of each block device in sysfs. A commit checks the
flush, because close() reports no error. A partition cannot be removed
from here, so destroy erases the header and the data.
The provision command now exits with an error when a commit or a
destroy fails, for both backends.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
__hostapd_bss_mgmt_enable_f() ended its switch without a return, so a
flag outside the enum returned an undefined value (-Wreturn-type). The
callers pass only the flags of the enum, which all return, so it now
returns false after the switch: such a flag changes nothing.
hostapd_notify_ubus() has no caller (-Wunused-function), and is
removed.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Bringing a netdev up can fail, for example with ENOTUNIQ from
ieee80211_do_open() when another running interface of the wiphy has the
same address. wdev_set_up() ignored the result, and wpa_supplicant's
iface_start() and mld_add(), hostapd's bss_check_mld() and wdev.uc went
on as if the netdev ran. wpa_supplicant and wdev.uc also went on after a
failed netdev creation.
Return the error from wdev_set_up(). On a failure to create the netdev
or to bring it up, stop there; after a failure to bring it up, also
remove the netdev. wpa_supplicant leaves the interface not running for
the next start_pending() or mld_start(), hostapd skips the links of the
AP MLD, and wdev.uc drops it from its state for the next setup.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
iface_reload_config() returned true when the new BSS configuration
equalled the old one, before it checked that the interface existed.
After a setup whose netdev creation or hostapd.add_iface() failed, the
stored configuration has no interface. The next identical configuration
compared equal, and hostapd never started it, also after the cause went
away.
Take an equal configuration as up to date only if its interface runs or
its setup is pending.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
wdev.uc read phydev.phy before it checked that phy_open() found the
phy, so a missing phy stopped the script with "left-hand side
expression is null" instead of the message "PHY ... does not exist".
Check phydev first and drop the phy variable, which nothing reads. Also
use a logical OR in the check of the command.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
ap.uc and supplicant.uc already write dpp_connector, dpp_csign and
dpp_netaccesskey, but the schema did not declare them, so netifd dropped
them before the handlers ran. Declare the three options.
Easy Connect 3.0 section 8.4.2 requires PMF for an association that uses
the DPP AKM, and wpa_supplicant does not enable it by itself. Set
ieee80211w to at least optional on APs and stations that enable dpp.
This also overrides an explicit ieee80211w 0. With sae-compat outside
6 GHz, the base RSNE then advertises PMF, which that mode otherwise
carries only in the RSN override element. On an AP the PMF setting also
enables beacon protection by default. The schema description of dpp
states this.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
The global object of hostapd and wpa_supplicant has no ubus property,
so the shutdown handlers raised a reference error on the disconnect
call. The scripts store their connection in data.ubus.
wpa_supplicant's shutdown() called set_config() with two of its six
arguments. Pass the stored phy parameters. Also release its udebug
ubus binding before the disconnect, as hostapd does.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
hostapd_ubus_add_bss() counted a reference to the ubus context whether
ubus_add_object() succeeded or not, and hostapd_ubus_free_bss() drops
one only for an object with an id. Every BSS whose object could not be
added, such as each further link of an AP MLD, which all ask for the
same name, kept the context referenced after it was freed. Count the
reference only where the object was added.
The context can now go away before such a BSS is freed, and
hostapd_ubus_free_bss() returned without a context before it freed the
name of the object. Free the name in every case.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
On a radio shared with a STA, wifi-scripts generates every AP BSS with
start_disabled=1. The beacons start only when apsta_state goes up.
If the driver disables and enables the interface before that,
hostapd_iface_enable() starts the beacons of every started BSS, on a
channel that the STA possibly does not use.
053-AP-keep-a-start_disabled-BSS-quiet-on-interface-enable skips the
beacon update for a BSS with start_disabled set.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
The modem was started after the LED init script, at the very end of
the boot process, although its driver is ready much earlier. On a
FRITZ!Box 7530 the control application started 61 seconds after power
on, 45 seconds after the driver was loaded, and the line needed
another 90 seconds to synchronize.
The LED is handled by ltq-dsl-base now, so start the modem before the
network. This brings the line up earlier by the time the rest of the
boot process takes.
Assisted-by: Claude:claude-fable-5-1
Link: https://github.com/openwrt/openwrt/pull/25599
Signed-off-by: Nick Hainke <vincent@systemli.org>
The LED init script sets the DSL LED to its configured trigger. If the
modem is in the middle of the handshake or the training at that point,
the LED stops blinking until the line changes its state again. That is
why the DSL control scripts start after the LED init script, at the
very end of the boot process.
Remember the last state of the line in dsl_notify.sh, which gets every
event of the modem, and show it again right after the LED init script,
so that the modem can be started earlier. The state is written before
the LED is updated, so an event during the replay is shown afterwards.
Assisted-by: Claude:claude-fable-5-1
Assisted-by: Claude:claude-opus-5-5
Link: https://github.com/openwrt/openwrt/pull/25599
Signed-off-by: Nick Hainke <vincent@systemli.org>
Run a uhttpd instance in a VRF, using the procd 'vrf' parameter:
config uhttpd
option vrf '<dev>'
The VRF device may not exist at boot, so such an instance is not
started at boot. With a listen address the existing interface trigger
starts it, with a wildcard address any interface coming up does.
Assisted-by: Claude:claude-fable-5-1
Link: https://github.com/openwrt/openwrt/pull/25568
Signed-off-by: Nick Hainke <vincent@systemli.org>
Run a dropbear instance in a VRF, using the procd 'vrf' parameter:
config dropbear
option vrf '<dev>'
dropbear starts before the network, when the VRF device doesn't exist
yet. Don't start the instance at boot, the interface triggers start it
later. An instance without interfaces is started when any interface
comes up.
Assisted-by: Claude:claude-fable-5-1
Link: https://github.com/openwrt/openwrt/pull/25568
Signed-off-by: Nick Hainke <vincent@systemli.org>
Run a dnsmasq instance in a VRF, using the procd 'vrf' parameter:
config dnsmasq
option vrf '<dev>'
At boot the interface options are left out, so an instance in a VRF
would collide with the other instances, and the VRF device may not
exist yet. Don't start it at boot, the interface triggers start it
once its interfaces are up.
So far only the interfaces of the dhcp and relay sections have a
trigger. Add one for the interfaces of an instance in a VRF as well,
and start an instance without interfaces when any interface comes up.
Assisted-by: Claude:claude-fable-5-1
Link: https://github.com/openwrt/openwrt/pull/25568
Signed-off-by: Nick Hainke <vincent@systemli.org>
457721d7544d jail: drop the deferred path's own mount-propagation remount
66a33c82f755 jail: keep locked flags on phase-2 read-only remounts
0925850d765b jail: keep locked flags when remounting a noafile mask
ac855770e3b2 jail: apply root_map_uid to a joined user namespace
7f1b26ce3759 jail: join an external userns after build_jail_fs()
88fe395b2cd5 jail: fail on an unresolvable -j specification
638c2ecfaf8a jail: let a joined namespace replace the created one
56e1a2032e0d jail: factor out the MS_* to MOUNT_ATTR_* translation
8c9df2b8ae32 jail: mount sysfs in the parent when the jail lacks a netns
4021843627a4 jail: log a failing mask mount
fa1f24c84ce7 jail: drop all capabilities for a bundle that names none
5670ff93498d uxc: report every failure with one exit status
6a22d3964822 service: add per-instance 'vrf' option
Allow to set the new 'vrf' instance option with procd_set_param. It
binds all sockets of a service to a VRF device, like 'ip vrf exec':
procd_set_param vrf <dev>
Assisted-by: Claude:claude-opus-5-5
Assisted-by: Claude:claude-fable-5-1
Link: https://github.com/openwrt/openwrt/pull/25568
Signed-off-by: Nick Hainke <vincent@systemli.org>
Rename all functions defined in l2.c and declared in l2.h to use
otto_l2_ for generic helpers and otto_l2_<family>_ for device-specific
helpers. Remove redundant l2 components from the remaining function name.
Update all references throughout the driver, including the rtl930x_hash
prototype in rtl-otto.h and the debugfs DEFINE_SHOW_ATTRIBUTE base.
Use set_port_new_sa_fwd for the RTL930x and RTL931x mode setters to
distinguish them from the port_new_sa_fwd register-address helpers.
This is a naming-only change; function signatures and logic are preserved.
Assisted-by: ChatGPT (OpenAI GPT-6 Astra)
Link: https://github.com/openwrt/openwrt/pull/25699
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Update ppp to 2.5.4.
Changelog: https://github.com/ppp-project/ppp/releases/tag/v2.5.4
Removed upstreamed:
- 501-relax-and-simplify-permission-check.patch
Manually rebased:
- 310-precompile_filter.patch
pppd 2.5.4 now refuses chap/pap-secrets files that are group- or
world-accessible (new default "strict-secrets-files"); such files must
be mode 0600, or "nostrict-secrets-files" restores the old warning.
Signed-off-by: Qingfang Deng <dqfext@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/25213
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>