diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-08-25 19:49:28 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-08-25 20:45:23 +0200 |
| commit | 623f37a27368c53d782cc9819c180bdf45f15612 (patch) | |
| tree | 1fbfe14b0f851f18391655ae85a26a73f02bf8e7 /embassy-net-ppp/src | |
| parent | a026db3f570cae504dc5da6c7055afc52e122930 (diff) | |
net-ppp: add callback for IP configuration.
Diffstat (limited to 'embassy-net-ppp/src')
| -rw-r--r-- | embassy-net-ppp/src/lib.rs | 20 |
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; | |||
| 13 | use embassy_net_driver_channel::driver::LinkState; | 13 | use embassy_net_driver_channel::driver::LinkState; |
| 14 | use embedded_io_async::{BufRead, Write, WriteAllError}; | 14 | use embedded_io_async::{BufRead, Write, WriteAllError}; |
| 15 | use ppproto::pppos::{BufferFullError, PPPoS, PPPoSAction}; | 15 | use ppproto::pppos::{BufferFullError, PPPoS, PPPoSAction}; |
| 16 | pub use ppproto::Config; | 16 | pub use ppproto::{Config, Ipv4Status}; |
| 17 | 17 | ||
| 18 | const MTU: usize = 1500; | 18 | const 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) => { |
