aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-03-17 15:36:06 +0100
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-03-17 15:36:06 +0100
commit0653235b277c8b9b0a6f54db52490bcbad7ea8d1 (patch)
tree902b35fbfbaa0be26a09fdf6c350270d8de77417
parentf8338ce8049441908f9cdc646332dbee49a95176 (diff)
write a 'lease' file
-rw-r--r--Cargo.lock45
-rw-r--r--Cargo.toml2
-rw-r--r--src/client.rs32
-rw-r--r--src/error.rs8
-rw-r--r--src/main.rs21
5 files changed, 97 insertions, 11 deletions
diff --git a/Cargo.lock b/Cargo.lock
index b6a6eea..a47c684 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -288,6 +288,12 @@ dependencies = [
]
[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
name = "kernel32-sys"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -586,6 +592,8 @@ dependencies = [
"md5",
"pppoe",
"rand",
+ "serde",
+ "serde_json",
"thiserror",
"tun-tap",
]
@@ -606,6 +614,12 @@ dependencies = [
]
[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
name = "scoped-tls"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -633,6 +647,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]]
+name = "serde"
+version = "1.0.156"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.156"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
name = "shlex"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index a73effe..8b245d1 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,5 +12,7 @@ byteorder = "1.4.3"
md5 = "0.7.0"
pppoe = { git = "https://github.com/rsdsl/pppoe-rs", version = "0.1.0", features = ["socket"] }
rand = "0.8.5"
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
thiserror = "1.0"
tun-tap = "0.1.3"
diff --git a/src/client.rs b/src/client.rs
index 84baf10..a31d0fc 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -21,10 +21,11 @@ use pppoe::HeaderBuilder;
use pppoe::Packet;
use pppoe::Socket;
use pppoe::Tag;
+use serde::{Deserialize, Serialize};
const BROADCAST: [u8; 6] = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff];
-#[derive(Clone, Copy, Debug, PartialEq)]
+#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct IpConfig {
pub addr: Ipv4Addr,
pub dns1: Ipv4Addr,
@@ -81,10 +82,14 @@ impl Client {
})
}
- pub fn run(self, ip_tx: mpsc::Sender<Vec<u8>>) -> Result<()> {
+ pub fn run(
+ self,
+ ip_tx: mpsc::Sender<Vec<u8>>,
+ ipchange_tx: mpsc::Sender<IpConfig>,
+ ) -> Result<()> {
if !self.inner.read().unwrap().started {
let clt = self.clone();
- let handle = thread::spawn(move || clt.recv_loop(ip_tx));
+ let handle = thread::spawn(move || clt.recv_loop(ip_tx, ipchange_tx));
self.discover()?;
@@ -369,14 +374,19 @@ impl Client {
Ok(())
}
- fn handle_ppp(&self, header: &Header, ip_tx: &mpsc::Sender<Vec<u8>>) -> Result<()> {
+ fn handle_ppp(
+ &self,
+ header: &Header,
+ ip_tx: &mpsc::Sender<Vec<u8>>,
+ ipchange_tx: &mpsc::Sender<IpConfig>,
+ ) -> Result<()> {
let ppp = ppp::Header::with_buffer(header.payload())?;
let protocol = ppp.protocol();
match protocol {
LCP => self.handle_lcp(ppp),
CHAP => self.handle_chap(ppp),
- IPCP => self.handle_ipcp(ppp),
+ IPCP => self.handle_ipcp(ppp, ipchange_tx),
IPV4 => self.handle_ipv4(ppp, ip_tx),
_ => Err(Error::InvalidProtocol(protocol)),
}
@@ -553,7 +563,7 @@ impl Client {
}
}
- fn handle_ipcp(&self, header: ppp::Header) -> Result<()> {
+ fn handle_ipcp(&self, header: ppp::Header, tx: &mpsc::Sender<IpConfig>) -> Result<()> {
let ipcp = ipcp::Header::with_buffer(header.payload())?;
let ipcp_code = ipcp.code();
@@ -578,6 +588,7 @@ impl Client {
.ok_or(Error::MissingIpAddr)?;
self.set_ip_config(ip_config);
+ tx.send(ip_config)?;
let limit = ipcp.payload().len();
@@ -642,6 +653,7 @@ impl Client {
.ok_or(Error::MissingSecondaryDns)?;
self.set_ip_config(ip_config);
+ tx.send(ip_config)?;
println!("ip configuration acknowledged by peer, options: {:?}", opts);
println!(
@@ -695,7 +707,11 @@ impl Client {
Ok(())
}
- fn recv_loop(&self, ip_tx: mpsc::Sender<Vec<u8>>) -> Result<()> {
+ fn recv_loop(
+ &self,
+ ip_tx: mpsc::Sender<Vec<u8>>,
+ ipchange_tx: mpsc::Sender<IpConfig>,
+ ) -> Result<()> {
loop {
let mut buf = [0; 1024];
@@ -713,7 +729,7 @@ impl Client {
match match code {
PPP => {
if let State::Session(_) = self.state() {
- self.handle_ppp(header, &ip_tx)
+ self.handle_ppp(header, &ip_tx, &ipchange_tx)
} else {
Err(Error::UnexpectedPpp)
}
diff --git a/src/error.rs b/src/error.rs
index f6c4104..72c38d2 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -1,3 +1,5 @@
+use crate::client::IpConfig;
+
use std::io;
use std::string;
use std::sync::mpsc;
@@ -49,13 +51,17 @@ pub enum Error {
#[error("failed to convert string from UTF-8")]
Utf8(#[from] string::FromUtf8Error),
#[error("mpsc send error")]
- MpscSend(#[from] mpsc::SendError<Vec<u8>>),
+ MpscSendBytes(#[from] mpsc::SendError<Vec<u8>>),
+ #[error("mpsc send error")]
+ MpscSendIpConfig(#[from] mpsc::SendError<IpConfig>),
#[error("mpsc receive error")]
MpscRecv(#[from] mpsc::RecvError),
#[error("pppoe error: {0:?}")]
Pppoe(pppoe::error::Error),
#[error("pppoe parse error: {0:?}")]
PppoeParse(pppoe::error::ParseError),
+ #[error("serde json error")]
+ SerdeJson(#[from] serde_json::Error),
}
impl From<pppoe::error::Error> for Error {
diff --git a/src/main.rs b/src/main.rs
index 8194b0f..ae127bc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,7 +1,8 @@
-use rsdsl_pppoe::client::Client;
+use rsdsl_pppoe::client::{Client, IpConfig};
use rsdsl_pppoe::error::{Error, Result};
use std::env;
+use std::fs::File;
use std::sync::mpsc;
use std::sync::Arc;
use std::thread;
@@ -53,6 +54,15 @@ fn ppp2tun(rx: mpsc::Receiver<Vec<u8>>, tun: Arc<Iface>) -> Result<()> {
}
}
+fn write_config(rx: mpsc::Receiver<IpConfig>) -> Result<()> {
+ loop {
+ let ip_config = rx.recv()?;
+
+ let mut file = File::create("/data/pppoe.ip_config")?;
+ serde_json::to_writer_pretty(&mut file, &ip_config)?;
+ }
+}
+
fn main() -> Result<()> {
let link = env::args().nth(1).ok_or(Error::MissingInterface)?;
@@ -72,7 +82,14 @@ fn main() -> Result<()> {
Err(e) => panic!("ppp2tun error: {}", e),
});
+ let (ipchange_tx, ipchange_rx) = mpsc::channel();
+ thread::spawn(move || match write_config(ipchange_rx) {
+ Ok(_) => unreachable!(),
+ Err(e) => panic!("write_config error: {}", e),
+ });
+
+ // clone tx so that ppp2tun doesn't panic when ppp link closes
#[allow(clippy::redundant_clone)]
- clt.run(tx.clone())?; // clone so that ppp2tun doesn't panic when ppp link closes
+ clt.run(tx.clone(), ipchange_tx)?;
Ok(())
}