aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-11-04 22:23:04 +0100
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-11-04 22:23:04 +0100
commit81cb0c56cc462d12b1212ea6bbb7f79c07e36f55 (patch)
tree304aaa853dcf7a957765a49afc70040cacd2e53e
parent71a2b6ca461989e0d2a31c4dd129ee59d8e0e344 (diff)
implement PPPoE session handling
-rw-r--r--src/supervisor.rs51
1 files changed, 31 insertions, 20 deletions
diff --git a/src/supervisor.rs b/src/supervisor.rs
index 73a381e..ab82599 100644
--- a/src/supervisor.rs
+++ b/src/supervisor.rs
@@ -209,8 +209,7 @@ impl Client {
/// Blocks the caller forever unless a panic occurs.
pub async fn run(&mut self) -> Result<()> {
let sock_disc = self.new_discovery_socket()?;
- let mut ctl = None;
- let mut ppp_dev = None;
+ let mut session_fds: Option<SessionFds> = None;
let mut pppoe_buf = [0; 1522];
let mut link_buf = [0; 1494];
@@ -242,10 +241,14 @@ impl Client {
let is_active = *pppoe_rx.borrow_and_update();
if is_active {
- todo!("setup session (fds)");
+ session_fds = Some(self.new_session_fds()?);
self.lcp.up();
} else {
- todo!("erase session (fds)");
+ session_fds = None;
+
+ self.session_id = 0;
+ self.remote = MacAddr::BROADCAST;
+
self.lcp.down();
}
}
@@ -353,7 +356,7 @@ impl Client {
self.handle_pppoe(pkt);
}
- Some(result) = option_read_with(ctl.as_ref(), &mut link_buf) => {
+ Some(result) = option_read_with(session_fds.as_ref().map(|fds| fds.link()), &mut link_buf) => {
let n = result?;
let mut link_buf = &link_buf[..n];
@@ -362,7 +365,7 @@ impl Client {
self.handle_ppp(pkt);
}
- Some(result) = option_read_with(ppp_dev.as_ref(), &mut net_buf) => {
+ Some(result) = option_read_with(session_fds.as_ref().map(|fds| fds.network()), &mut net_buf) => {
let n = result?;
let mut net_buf = &net_buf[..n];
@@ -385,16 +388,20 @@ impl Client {
ty: PppoeType::Padi,
ac_cookie: None,
}),
- PppoeData::Pado(pado) => Some(PppoePacket {
- ty: PppoeType::Pado,
- ac_cookie: pado.tags.into_iter().find_map(|tag| {
- if let PppoeVal::AcCookie(ac_cookie) = tag.data {
- Some(ac_cookie)
- } else {
- None
- }
- }),
- }),
+ PppoeData::Pado(pado) => {
+ self.remote = pkt.src_mac;
+
+ Some(PppoePacket {
+ ty: PppoeType::Pado,
+ ac_cookie: pado.tags.into_iter().find_map(|tag| {
+ if let PppoeVal::AcCookie(ac_cookie) = tag.data {
+ Some(ac_cookie)
+ } else {
+ None
+ }
+ }),
+ })
+ }
PppoeData::Padr(padr) => Some(PppoePacket {
ty: PppoeType::Padr,
ac_cookie: padr.tags.into_iter().find_map(|tag| {
@@ -405,10 +412,14 @@ impl Client {
}
}),
}),
- PppoeData::Pads(_) => Some(PppoePacket {
- ty: PppoeType::Pads,
- ac_cookie: None,
- }),
+ PppoeData::Pads(_) => {
+ self.session_id = pkt.session_id;
+
+ Some(PppoePacket {
+ ty: PppoeType::Pads,
+ ac_cookie: None,
+ })
+ }
PppoeData::Padt(_) => Some(PppoePacket {
ty: PppoeType::Padt,
ac_cookie: None,