aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-net-ppp/src/lib.rs20
1 files changed, 16 insertions, 4 deletions
diff --git a/embassy-net-ppp/src/lib.rs b/embassy-net-ppp/src/lib.rs
index e3b208ee6..ca87fbaea 100644
--- a/embassy-net-ppp/src/lib.rs
+++ b/embassy-net-ppp/src/lib.rs
@@ -13,7 +13,7 @@ use embassy_net_driver_channel as ch;
13use embassy_net_driver_channel::driver::LinkState; 13use embassy_net_driver_channel::driver::LinkState;
14use embedded_io_async::{BufRead, Write, WriteAllError}; 14use embedded_io_async::{BufRead, Write, WriteAllError};
15use ppproto::pppos::{BufferFullError, PPPoS, PPPoSAction}; 15use ppproto::pppos::{BufferFullError, PPPoS, PPPoSAction};
16pub use ppproto::Config; 16pub use ppproto::{Config, Ipv4Status};
17 17
18const MTU: usize = 1500; 18const MTU: usize = 1500;
19 19
@@ -79,6 +79,7 @@ impl<'d> Runner<'d> {
79 &mut self, 79 &mut self,
80 mut rw: RW, 80 mut rw: RW,
81 config: ppproto::Config<'_>, 81 config: ppproto::Config<'_>,
82 mut on_ipv4_up: impl FnMut(Ipv4Status),
82 ) -> Result<Infallible, RunError<RW::Error>> { 83 ) -> Result<Infallible, RunError<RW::Error>> {
83 let mut ppp = PPPoS::new(config); 84 let mut ppp = PPPoS::new(config);
84 ppp.open().unwrap(); 85 ppp.open().unwrap();
@@ -91,6 +92,7 @@ impl<'d> Runner<'d> {
91 let mut tx_buf = [0; 2048]; 92 let mut tx_buf = [0; 2048];
92 93
93 let mut needs_poll = true; 94 let mut needs_poll = true;
95 let mut was_up = false;
94 96
95 loop { 97 loop {
96 let rx_fut = async { 98 let rx_fut = async {
@@ -124,9 +126,19 @@ impl<'d> Runner<'d> {
124 PPPoSAction::Transmit(n) => rw.write_all(&tx_buf[..n]).await?, 126 PPPoSAction::Transmit(n) => rw.write_all(&tx_buf[..n]).await?,
125 } 127 }
126 128
127 match ppp.status().phase { 129 let status = ppp.status();
128 ppproto::Phase::Open => state_chan.set_link_state(LinkState::Up), 130 match status.phase {
129 _ => state_chan.set_link_state(LinkState::Down), 131 ppproto::Phase::Open => {
132 if !was_up {
133 on_ipv4_up(status.ipv4.unwrap());
134 }
135 was_up = true;
136 state_chan.set_link_state(LinkState::Up);
137 }
138 _ => {
139 was_up = false;
140 state_chan.set_link_state(LinkState::Down);
141 }
130 } 142 }
131 } 143 }
132 Either::Second(pkt) => { 144 Either::Second(pkt) => {