diff --git a/src/command_parser.rs b/src/command_parser.rs index e92e69a..db1ea8f 100644 --- a/src/command_parser.rs +++ b/src/command_parser.rs @@ -100,6 +100,7 @@ pub enum ShowCommand { Pid, SteinhartHart, PostFilter, + Ipv4, } #[derive(Debug, Clone, PartialEq)] @@ -494,27 +495,32 @@ fn ipv4_addr(input: &[u8]) -> IResult<&[u8], Result<[u8; 4], Error>> { fn ipv4(input: &[u8]) -> IResult<&[u8], Result> { let (input, _) = tag("ipv4")(input)?; - let (input, _) = whitespace(input)?; - let (input, address) = ipv4_addr(input)?; - let (input, _) = tag("/")(input)?; - let (input, mask_len) = unsigned(input)?; - let (input, gateway) = alt(( + alt(( |input| { let (input, _) = whitespace(input)?; - let (input, gateway) = ipv4_addr(input)?; - Ok((input, gateway.map(Some))) - }, - value(Ok(None), end), - ))(input)?; + let (input, address) = ipv4_addr(input)?; + let (input, _) = tag("/")(input)?; + let (input, mask_len) = unsigned(input)?; + let (input, gateway) = alt(( + |input| { + let (input, _) = whitespace(input)?; + let (input, gateway) = ipv4_addr(input)?; + Ok((input, gateway.map(Some))) + }, + value(Ok(None), end), + ))(input)?; - let result = move || { - Ok(Command::Ipv4(Ipv4Config { - address: address?, - mask_len: mask_len? as u8, - gateway: gateway?, - })) - }; - Ok((input, result())) + let result = move || { + Ok(Command::Ipv4(Ipv4Config { + address: address?, + mask_len: mask_len? as u8, + gateway: gateway?, + })) + }; + Ok((input, result())) + }, + value(Ok(Command::Show(ShowCommand::Ipv4)), end), + ))(input) } fn command(input: &[u8]) -> IResult<&[u8], Result> { @@ -579,6 +585,12 @@ mod test { assert_eq!(command, Ok(Command::Save { channel: Some(0) })); } + #[test] + fn parse_show_ipv4() { + let command = Command::parse(b"ipv4"); + assert_eq!(command, Ok(Command::Show(ShowCommand::Ipv4))); + } + #[test] fn parse_ipv4() { let command = Command::parse(b"ipv4 192.168.1.26/24"); diff --git a/src/main.rs b/src/main.rs index 238d88d..6823992 100644 --- a/src/main.rs +++ b/src/main.rs @@ -183,7 +183,7 @@ fn main() -> ! { let hwaddr = EthernetAddress(eui48); info!("EEPROM MAC address: {}", hwaddr); - net::run(clocks, dp.ETHERNET_MAC, dp.ETHERNET_DMA, eth_pins, hwaddr, ipv4_config, |iface| { + net::run(clocks, dp.ETHERNET_MAC, dp.ETHERNET_DMA, eth_pins, hwaddr, ipv4_config.clone(), |iface| { Server::::run(iface, |server| { leds.r1.off(); @@ -280,6 +280,12 @@ fn main() -> ! { } } } + Command::Show(ShowCommand::Ipv4) => { + let (cidr, gateway) = net::split_ipv4_config(ipv4_config.clone()); + let _ = write!(socket, "{{\"addr\":\"{}\"", cidr); + gateway.map(|gateway| write!(socket, ",\"gateway\":\"{}\"", gateway)); + let _ = writeln!(socket, "}}"); + } Command::PwmPid { channel } => { channels.channel_state(channel).pid_engaged = true; leds.g3.on();