Skip to content

net: l2: ppp: act on a received Protocol-Reject - #1

Open
ShahriarAhnaf wants to merge 455 commits into
mainfrom
fix/ppp-protocol-reject
Open

net: l2: ppp: act on a received Protocol-Reject#1
ShahriarAhnaf wants to merge 455 commits into
mainfrom
fix/ppp-protocol-reject

Conversation

@ShahriarAhnaf

@ShahriarAhnaf ShahriarAhnaf commented Aug 27, 2026

Copy link
Copy Markdown

Review copy, scoped to this fork only. Not intended to be opened against zephyrproject-rtos/zephyr yet.

ppp_fsm_recv_protocol_rej() logged the LCP state and returned NET_DROP, so a received Protocol-Reject was ignored: the rejected protocol kept retransmitting until Max-Configure (RFC 1661 §5.7 says it MUST stop), and the fallthrough to ppp_fsm_input()'s default branch answered a valid Protocol-Reject with a Code-Reject.

Read the Rejected-Protocol field and dispatch to the matching FSM's proto_reject callback (already registered by IPCP/IPV6CP/PAP, never invoked). Per §4.2 a Protocol-Reject of a network-layer protocol is RXJ+ (LCP stays up); per §5.7 one outside LCP Opened is discarded. Matches pppd's lcp_rprotrej().

Found running a Zephyr PPP client against a peer that rejects IPV6CP: link came up 30s late, and the client wrongly Code-Rejected a valid Protocol-Reject.

Note: ppp_fsm_proto_reject() in fsm.c is unused — that's the RXJ- (Protocol-Reject of LCP itself) case, not this one.

Verified: west twister -p mps2/an385 -T tests/net/ppp/driver — 4/4 pass; fails on both assertions with the fix reverted. checkpatch clean.

kartben and others added 30 commits August 26, 2026 15:48
The FIFO decoder mapped the SLAVEn tag index directly onto the
compile-time sensor hub list, ignoring the runtime detected-device
mapping (shub_ext), so frames were decoded as the wrong channel when
a compiled-in external sensor was not populated. Carry shub_ext and
num_ext_dev in the FIFO header and index through them, and fix the
off-by-one bounds check in lsm6dsv16x_shub_type().

Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Assisted-by: Claude:fable-5
On sensor_clock_get_cycles() failure, the submit-sample path called
rtio_iodev_sqe_err() and then jumped to the shared err label, which
called rtio_iodev_sqe_err() again on the same (already freed) SQE.
Drop the first call so the err block performs the single completion.

Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Assisted-by: Claude:fable-5
The streaming path wrote full interrupt-route structs containing only
its own bit, so arming the DRDY stream trigger cleared the FIFO
watermark/full routing and vice versa, silently losing events when both
are requested. Read-modify-write the route as the trigger path already
does. Also honor the trigger disable flag in the DRDY path, which
unconditionally enabled the route even when asked to disable it.

Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Assisted-by: Claude:fable-5
This commit updates the usage of ring_buf to utilize the new
put_ptr/commit/get_ptr/consume pattern instead of the traditional
claim/finish approach. This change is part of a larger refactor aimed at
streamlining the ring_buf API and improving its efficiency.

Signed-off-by: Måns Ansgariusson <mansgariusson@gmail.com>
Migrate the SSH transport TX path off the deprecated claim/finish API to
the new _ptr/commit/consume pattern.

Signed-off-by: Måns Ansgariusson <mansgariusson@gmail.com>
This commit updates the usage of ring_buf to utilize the new
put_ptr/commit/get_ptr/consume pattern instead of the traditional
claim/finish approach. This change is part of a larger refactor aimed at
streamlining the ring_buf API and improving its efficiency.

Signed-off-by: Måns Ansgariusson <mansgariusson@gmail.com>
This commit updates the usage of ring_buf to utilize the new
put_ptr/commit/get_ptr/consume pattern instead of the traditional
claim/finish approach. This change is part of a larger refactor aimed at
streamlining the ring_buf API and improving its efficiency.

Signed-off-by: Måns Ansgariusson <mansgariusson@gmail.com>
This commit updates the usage of ring_buf to utilize the new
put_ptr/commit/get_ptr/consume pattern instead of the traditional
claim/finish approach. This change is part of a larger refactor aimed at
streamlining the ring_buf API and improving its efficiency.

Signed-off-by: Måns Ansgariusson <mansgariusson@gmail.com>
This commit updates the usage of ring_buf to utilize the new
put_ptr/commit/get_ptr/consume pattern instead of the traditional
claim/finish approach. This change is part of a larger refactor aimed at
streamlining the ring_buf API and improving its efficiency.

Signed-off-by: Måns Ansgariusson <mansgariusson@gmail.com>
This commit updates the usage of ring_buf to utilize the new
put_ptr/commit/get_ptr/consume pattern instead of the traditional
claim/finish approach. This change is part of a larger refactor aimed at
streamlining the ring_buf API and improving its efficiency.

Signed-off-by: Måns Ansgariusson <mansgariusson@gmail.com>
From v2.3.0.

Signed-off-by: Tomi Fontanilles <tomi.fontanilles@nordicsemi.no>
From v2.3.0.

Signed-off-by: Tomi Fontanilles <tomi.fontanilles@nordicsemi.no>
In conjunction with the TF-M 2.3.1 update.

Signed-off-by: Tomi Fontanilles <tomi.fontanilles@nordicsemi.no>
From v2.3.0 to v2.3.1.

Signed-off-by: Tomi Fontanilles <tomi.fontanilles@nordicsemi.no>
The ep->unicast_group was never assigned and thus
has_been_connected was never set for the BAP unicast groups.
Change to use the stream->group instead.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
Remove the unused references to the unicast group
and broadcast source.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
Add the CIG parameters of the unicast group (SDU intervals, transport
latencies, framing, packing and, when CONFIG_BT_ISO_TEST_PARAMS is
enabled, the flush timeouts and the ISO interval) as well as the
has_been_connected state to struct bt_bap_unicast_group_info, so that
applications can retrieve all relevant information about a group.

The framing is stored internally using the ISO values, and is converted
back to the BAP QoS configuration values when reported.

The existing bsim tests for bt_bap_unicast_group_get_info have been
expanded to verify the new values, including for a group with
asymmetric parameters and for a reconfigured group.

Assisted-by: Copilot coding agent

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
bt_bap_unicast_group_info has new fields.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
bt_bap_unicast_group_reconfig did not properly set the fields
related to CONFIG_BT_ISO_TEST_PARAMS nor packing.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
Move the responder role check outside the is_bip_primary_connect()
conditional so it applies to all connection types. Remove the
initiator role check from the secondary path since a responder role
is valid for secondary connections initiated by the remote device.

This ensures that a BIP instance configured as responder cannot
initiate any client connections, regardless of connection type.

Signed-off-by: Cheng Chang <cheng.chang@nxp.com>
…ress

The BIS data path setup event read the advertising address directly
from the host-internal bt_le_ext_adv structure. Use the public API
instead.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Johan Hedberg <johan.hedberg@silabs.com>
bt_le_ext_adv_get_info() handed out a pointer to the advertising set's
random_addr, which is only written when a per-set random address is
programmed. When the set advertises with a public identity address the
reported address was never populated, and with a controller without the
extended advertising feature it was never written at all.

Instead of adding a second address field alongside random_addr, widen
the meaning of the existing one: rename it to adv_addr, the address the
set advertises with regardless of type. The per-set random address
cases keep being updated in bt_id_set_adv_random_addr(), so the
reported address stays correct across RPA and NRPA rotation, and
le_update_private_addr() refreshes the legacy advertiser, which
advertises with the device-wide random address.

The cases that do not program a per-set address - a public identity
address, and the device-wide random address on controllers without the
extended advertising feature, e.g. an RPA set through
bt_id_set_private_addr() when privacy is enabled - are saved by a new
bt_id_save_adv_addr(), which the advertising parameter setting calls
once the controller has accepted the parameters. Saving only at that
point ensures a failed parameter update does not overwrite the reported
address with one the controller never took into use.

Widening the field is safe for the existing readers: the connection
responder address and OOB paths that read it only execute in
configurations where the set advertises with a random address, in which
case the value is unchanged, and a pending random address is programmed
from the field before bt_id_save_adv_addr() runs.

For the BT_HCI_OWN_ADDR_RPA_OR_* types the controller substitutes a
locally generated RPA whenever the peer is in the resolving list, which
the host cannot observe; the configured fallback address is reported in
that case, as documented on the info struct.

Fixes: zephyrproject-rtos#112667

Assisted-by: Claude:claude-fable-5
Signed-off-by: Johan Hedberg <johan.hedberg@silabs.com>
Add a unit test suite for bt_id_save_adv_addr(), covering the public
identity address types, the device-wide random address fallback on a
controller without the extended advertising feature - including an RPA
set through bt_id_set_private_addr() when privacy is enabled - and
that a per-set random address is left untouched.

Also extend the legacy branch test of bt_id_set_adv_random_addr() to
assert the saved address, not just the return value.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Johan Hedberg <johan.hedberg@silabs.com>
The kit_pse84_eval low-power comparator loopback test drives the
comparator in ULP mode against the local VREF with hysteresis disabled.
On some boards the slow ULP comparator glitches as the GPIO loopback
edge crosses VREF, latching a spurious falling-edge event and failing
test_trigger_falling_edge_pending. Enable hysteresis to reject the
near-threshold glitches.

Assisted-by: AI (GitHub Copilot)
Signed-off-by: Bill Waters <bill.waters@infineon.com>
i2c_baudrate_calc() clamps BAUD to its maximum when the requested bitrate
cannot be reached and reports success. On this board with a 72 MHz SERCOM
core clock, a node asking for 100 kHz got 137.1 kHz, measured with a logic
analyzer. The same branch catches the unsigned subtraction wrapping, which
it does for any reference clock below roughly 12 times the bitrate: a 1 MHz
reference asked for 400 kHz produces 1.9 kHz. Both directions are now an
error rather than a silent substitution. Clamping downwards is left alone -
a slower bus is always within spec.

The subtraction is guarded instead of being checked after the fact, so the
two directions are told apart before BAUD is computed. Every bitrate the
reference clock is too slow to reach now fails in one place, the clamped
ones included, and a bitrate too slow for the register keeps failing as
before. Both speed ranges run the same two tests with their own limits.
Reachable bitrates keep the BAUD values they had; the clamps are no loss
either, since each produced exactly the registers that the smallest valid
BAUD of its range produces.

The refusal reaches the caller as -EINVAL rather than -EIO: a configuration
that cannot be satisfied is not a transfer failure, and a caller that
retries on -EIO would otherwise retry forever. The other -EIO in the
function is left alone - a reference clock that reads back as zero really
is a failure to talk to the hardware.

Signed-off-by: Arkadiusz Grzelka <devitwise@gmail.com>
Moves to the mapped partition binding as fixed partitions for
bootable slots is being deprecated

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
Moves to the mapped partition binding as fixed partitions for
bootable slots is being deprecated

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
Moves to the mapped partition binding as fixed partitions for
bootable slots is being deprecated

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
Moves to the mapped partition binding as fixed partitions for
bootable slots is being deprecated

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
Moves to the mapped partition binding as fixed partitions for
bootable slots is being deprecated

Signed-off-by: Jamie McCrae <jamie.mccrae@nordicsemi.no>
sylvioalves and others added 27 commits August 27, 2026 21:23
Add the esp32c61_devkitc board: an entry-level board carrying
a wroom-1 n8r2 module with 8 MB flash and 2 MB psram. The
board devicetree enables uart, gpio, spi, i2c, watchdog and
entropy; further peripherals are exercised through the driver
test overlays. Board documentation and the soc features page
are included, along with openocd support.

Assisted-by: Claude:opus-4-8
Signed-off-by: Sylvio Alves <sylvio.alves@espressif.com>
Add esp32c61 overlays for the counter, spi loopback, adc,
pwm, dma loop transfer and gpio basic api driver tests, and
mark the features as supported on the esp32c61 devkitc
board. All suites pass on hardware; the spi and dma tests
run in dma mode, and the gpio port loopback suite needs
gpio4 jumpered to gpio5.

Signed-off-by: Sylvio Alves <sylvio.alves@espressif.com>
Add the wakeup pin overlay and disable retained memory, which
the chip does not provide, so the sample builds and runs.

Assisted-by: Claude:opus-4-8
Signed-off-by: Sylvio Alves <sylvio.alves@espressif.com>
The counter alarm sample resolves the espressif counter node
through the driver Kconfig, but no soc overlay enabled the
timer on the esp32c61, so the build failed with no counter
device found. Add the overlay enabling timer0 and its counter
child, matching the other espressif socs.

Assisted-by: Claude:opus-4-8
Signed-off-by: Sylvio Alves <sylvio.alves@espressif.com>
The path to STM32_Programmer_CLI inside the STM32CubeProgrammer macOS
app has changed between versions. Remove the architecture
based guess and instead check both subdirectories for existence.
Update the test accordingly.

Link: 21d3ec1

Link: d8d90c0

Signed-off-by: Mayank Chadha <mayankchadha1998@gmail.com>
memcpy does not take NULL pointers, so in the case that dataptr is NULL,
even if length is 0, we should omit the call.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
The CMake build system targets `flash`, `debug`, `debugserver`, `attach`
and `rtt` were deprecated in Zephyr 4.3 and are removed here as part of
the 4.5 deprecation removal cycle. They were thin wrappers that shelled
out to the corresponding west command, so users must now call `west
flash`, `west debug`, `west debugserver`, `west attach` and `west rtt`
directly. Note that `west build -t <target>` and `ninja <target>` are the
same mechanism, so both spellings are affected.

The generator loop was the only consumer of the `WEST_DIR` lookup and of
cmake/flash/check_runner_dependencies.cmake, so both are removed as well.
The runners.yaml generation in cmake/flash/CMakeLists.txt is kept: it is
what the west commands read, and it is also included directly by the
Nordic UICR helper projects.

The `run`, `run_<emulator>` and emulation `debugserver` targets are
provided by cmake/emu and are not affected.

Documentation that told users to run `ninja flash`, `ninja debug` or
`ninja attach` is updated to the equivalent west command, and the
zephyr-app-commands directive now rejects the removed goals when the
cmake tool is selected, so the docs cannot regress.

The now-unused RUNNERS_DEPS variable and the
check_runner_dependencies.cmake helper, which only existed to serve those
targets, are removed as well.

Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Assisted-by: Claude:opus-5
Since recover-bus-on-init DT property if of boolean type, use of
dt_compat_any_has_prop() without an explicit value argument of True
makes that function to always return true and
CONFIG_I2C_MCUX_LPI2C_BUS_RECOVERY and
CONFIG_I2C_MCUX_FLEXCOMM_BUS_RECOVERY configuration options always enabled
(when their dependencies are met).

Set function argument value to True to get the expected behavior.

Signed-off-by: Etienne Carriere <etienne.carriere@st.com>
The dai_config_set()/dai_config_update() syscall verifiers copied the
user-space bespoke configuration blob into a fixed stack buffer of
CONFIG_DAI_MAX_BESPOKE_CFG_SIZE bytes and rejected anything larger with
-EINVAL. This turns out to be too limiting and we need to support larger
configuration objects.

Decouple the stack buffer size from the maximum allowed blob size and
change implementation such that objects up to DAI_BESPOKE_CFG_STACK_SIZE
are validated on the stack as before, but for larger objects,
k_malloc'ed kernel buffer is used instead.

Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Use newly added support for min-len/max-len
Introduced by zephyrproject-rtos#109854

Signed-off-by: Kyle Micallef Bonnici <kyle.bonnici@nordicsemi.no>
Add stites-infineon as a collaborator for the Infineon Platform
and the hal_infineon west project.  This user is part of Infineon's
Zephr Integration team and has been contributing driver updates for
new and existing Infineon devices.

Signed-off-by: Zayne Stites <Zayne.Stites@infineon.com>
The <zephyr/mgmt/hawkbit.h> redirect header was deprecated in Zephyr 4.0
when the hawkBit API was split into per-topic headers, and has emitted a
window. Include <zephyr/mgmt/hawkbit/hawkbit.h>,
<zephyr/mgmt/hawkbit/config.h> and <zephyr/mgmt/hawkbit/autohandler.h>
directly instead. Nothing in-tree still used the old path.

Also drop the now-stale MAINTAINERS.yml entry for the removed header;
the hawkBit area's directory glob covers the per-topic headers.

Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Assisted-by: Claude:fable-5
The functions uart_silabs_ll2cfg_*() have never been used. Probably the
original author wrote them for the completeness since their
uart_silabs_cfg2ll counterparts were required.

Orphan function generate warning that could in turn generate error with
-Werror.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
The functions eusart_silabs_ll2cfg_*() have never been used. Probably the
original author wrote them for the completeness since their
eusart_silabs_cfg2ll counterparts were required.

Orphan function generate warning that could in turn generate error with
-Werror.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
Enable FlexComm2 as I2C and add the NXP MMA8652FC 3-axis accelerometer at
0x1d, which the fxos8700 driver detects by WHOAMI. The part has no
magnetometer, so the driver is defaulted to accelerometer-only mode.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Marvin Gnad <marvin.gnad@gmail.com>
The Ensemble SoCs use the Synopsys DesignWare GPIO controller, with one
eight pin controller instance per port and one interrupt line per pin.

Add the controllers common to every Ensemble SoC: GPIO0 to GPIO8 and
LPGPIO. LPGPIO sits in the Always-On domain and is only two pins wide on
the E1C, so it is described here at that width and widened by the layer
that describes the larger devices.

As with the other peripherals in this layer, the interrupt routing is
kept out of the resource description and lives in the NVIC and GIC
specific files, since the same controller is reached through the NVIC
from an RTSS cluster and through the GIC from the APSS cluster.

The interrupt lines are described here for completeness, but the hardware
requires the GPIO debounce logic to be enabled for interrupt detection to
work correctly, which in turn needs the debounce clock running. That
clock is off after reset and nothing turns it on, so enabling it is left
to a follow-up change.

Signed-off-by: Silesh C V <silesh@alifsemi.com>
The E4, E6 and E8 devices carry more GPIO than the minimum common subset:
GPIO9 to GPIO14 in the peripheral domain. They also carry the full eight
pin wide LPGPIO rather than the two pins available on the E1C.

Note that GPIO16 and GPIO17 are left out as they are not bonded out on
every package this layer covers.

As with the ports in the common layer, the interrupt lines are described
for completeness, but the hardware requires the GPIO debounce logic to be
enabled for interrupt detection to work correctly, which in turn needs
the debounce clock running. Enabling it is left to a follow-up change.

Signed-off-by: Silesh C V <silesh@alifsemi.com>
The AppKit carries a multicolor LED and a five position navigation
joystick. Wire up the three LED channels and all five joystick switches,
so that the blinky and button samples run on the board out of the box.

The three board targets differ only in the cluster they build for and in
the console they use, so describe the on-board peripherals once in
ensemble_e8_ak_common.dtsi rather than three times. Each target keeps
what genuinely differs: its SoC and cluster includes, its compatible and
chosen block, and the UART routed to the debug connector for that
cluster. The common file has to be included after the SoC, cluster and
pinctrl dtsi, since every node it references comes from one of those.

The DesignWare GPIO driver does not implement both edge triggering, which
the interrupt driven mode of the GPIO keys driver requires, so the keys
are polled instead. Polling can be dropped once the driver gains both
edge support.

Signed-off-by: Silesh C V <silesh@alifsemi.com>
Add 'ranges' and related properties to the Flash controller node for the
R7FA4M1AB3CFM SoC.

Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
Add 'ranges' and related properties to the Flash controller node for the
R7FA6M5BH3CFC SoC.

Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
Update the partition nodes in the arduino/portenta_c33 and arduino/uno_r4
device tree files to use the "zephyr,mapped-partition" binding instead of
"fixed-partition".

Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
Fixes touch controller coordinate manipulation properties according to
touchscreen-common.yaml.

Signed-off-by: Fabian Blatz <fabianblatz@gmail.com>
Clarify that the properties are slightly different for the touch screen
controller then for the LVGL input pointer binding.

Signed-off-by: Fabian Blatz <fabianblatz@gmail.com>
Fixes the help text of the lvgl pointer input device binding to mention the
correct property names for touch devices.

Signed-off-by: Fabian Blatz <fabianblatz@gmail.com>
The SoC and board hooks are selected by the
SoC or the board. They also implemt them.
Remove the ability to enable them regularly
by the user as the build would then fail, because
the board or SoC has not implemented them.

Signed-off-by: Fin Maaß <f.maass@vogl-electronic.com>
ppp_fsm_recv_protocol_rej() only logged the current LCP state and
returned NET_DROP, so a Protocol-Reject was effectively ignored. This
has two consequences.

The rejected protocol never learns that the peer rejected it. RFC 1661
chapter 5.7 says that upon reception of a Protocol-Reject the
implementation MUST stop sending packets of the indicated protocol at
the earliest opportunity, but the rejected NCP keeps retransmitting its
Configure-Request until Max-Configure is reached. With the default
settings that is ten retransmissions three seconds apart, so bringing
up the link is delayed by half a minute for every protocol the peer
does not implement.

Returning NET_DROP also makes the generic dispatcher in ppp_fsm_input()
fall through to its default branch, which answers with a Code-Reject.
Code 8 is a perfectly valid LCP code, so we reject a packet we are
required to understand.

Read the Rejected-Protocol field and hand the event to the matching
FSM through its proto_reject callback. The callbacks were already
registered by IPCP, IPV6CP and PAP but nothing ever invoked them. As
described in RFC 1661 chapter 4.2, a Protocol-Reject of a network layer
protocol is an RXJ+ event which leaves LCP itself running, so LCP stays
up and the remaining protocols continue to negotiate. Per chapter 5.7 a
Protocol-Reject received outside the LCP Opened state is silently
discarded. Both paths now return NET_OK so that no Code-Reject is
emitted.

Assisted-by: Claude:claude-sonnet-5 Simantic
Signed-off-by: Ahnaf Shahriar <shahriarahnaf007@gmail.com>
When CONFIG_NET_TEST is enabled the PPP driver drops the packet in
ppp_send() because there is no UART to write it to. That leaves the
tests with no way of checking what the PPP stack actually sends.

Add an optional callback, registered with
ppp_driver_register_send_cb(), that is invoked with the outgoing packet
before it is dropped. The callback is only compiled in for
CONFIG_NET_TEST builds and nothing changes when it is not registered.

Assisted-by: Claude:claude-sonnet-5 Simantic
Signed-off-by: Ahnaf Shahriar <shahriarahnaf007@gmail.com>
@ShahriarAhnaf
ShahriarAhnaf force-pushed the fix/ppp-protocol-reject branch from 89e5a02 to e02c643 Compare August 27, 2026 23:03
Add a test case that drives the PPP link into the network phase, waits
for IPCP and IPV6CP to send their Configure-Request, and then feeds an
LCP Protocol-Reject rejecting IPV6CP.

The test asserts the two requirements of RFC 1661 chapter 5.7: no
Code-Reject is sent in response to the Protocol-Reject, and IPV6CP
sends nothing more once it has been rejected, checked over a period
longer than the FSM restart timer. It also asserts that IPCP keeps
negotiating, so that rejecting one network protocol does not take the
link down.

Both assertions fail without the ppp_fsm_recv_protocol_rej() fix.

Assisted-by: Claude:claude-sonnet-5 Simantic
Signed-off-by: Ahnaf Shahriar <shahriarahnaf007@gmail.com>
@ShahriarAhnaf
ShahriarAhnaf force-pushed the fix/ppp-protocol-reject branch from e02c643 to 11eb275 Compare August 27, 2026 23:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.