Skip to content

Commit 6650509

Browse files
committed
Update polling.rs for DHCP code
1 parent 7ec98e4 commit 6650509

File tree

2 files changed

+67
-25
lines changed

2 files changed

+67
-25
lines changed

src/bin/async-await.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ where
520520
let mut sockets = SocketSet::new(Vec::new());
521521

522522
let dhcp_rx_buffer = RawSocketBuffer::new(
523-
[RawPacketMetadata::EMPTY; 2],
523+
[RawPacketMetadata::EMPTY; 1],
524524
vec![0; 1500]
525525
);
526526
let dhcp_tx_buffer = RawSocketBuffer::new(

src/bin/polling.rs

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ use sh::hio::{self, HStdout};
2626
use smoltcp::{
2727
socket::{
2828
Socket, SocketSet, TcpSocket, TcpSocketBuffer, UdpPacketMetadata, UdpSocket,
29-
UdpSocketBuffer,
29+
UdpSocketBuffer, RawSocketBuffer, RawPacketMetadata,
3030
},
3131
time::Instant,
32-
wire::{EthernetAddress, IpAddress, IpEndpoint, Ipv4Address},
32+
wire::{EthernetAddress, IpEndpoint, Ipv4Address, IpCidr},
33+
dhcp::Dhcpv4Client,
3334
};
3435
use stm32f7::stm32f7x6::{CorePeripherals, Interrupt, Peripherals};
3536
use stm32f7_discovery::{
@@ -49,7 +50,6 @@ static ALLOCATOR: CortexMHeap = CortexMHeap::empty();
4950

5051
const HEAP_SIZE: usize = 50 * 1024; // in bytes
5152
const ETH_ADDR: EthernetAddress = EthernetAddress([0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef]);
52-
const IP_ADDR: Ipv4Address = Ipv4Address([141, 52, 46, 198]);
5353

5454
#[entry]
5555
fn main() -> ! {
@@ -146,27 +146,25 @@ fn main() -> ! {
146146
&mut ethernet_dma,
147147
ETH_ADDR,
148148
)
149-
.map(|device| device.into_interface(IP_ADDR));
149+
.map(|device| {
150+
let iface = device.into_interface();
151+
let prev_ip_addr = iface.ipv4_addr().unwrap();
152+
(iface, prev_ip_addr)
153+
});
150154
if let Err(e) = ethernet_interface {
151155
println!("ethernet init failed: {:?}", e);
152156
};
153157

154158
let mut sockets = SocketSet::new(Vec::new());
155-
156-
if ethernet_interface.is_ok() {
157-
let endpoint = IpEndpoint::new(IpAddress::Ipv4(IP_ADDR), 15);
158-
let udp_rx_buffer = UdpSocketBuffer::new(vec![UdpPacketMetadata::EMPTY; 3], vec![0u8; 256]);
159-
let udp_tx_buffer = UdpSocketBuffer::new(vec![UdpPacketMetadata::EMPTY; 1], vec![0u8; 128]);
160-
let mut example_udp_socket = UdpSocket::new(udp_rx_buffer, udp_tx_buffer);
161-
example_udp_socket.bind(endpoint).unwrap();
162-
sockets.add(example_udp_socket);
163-
164-
let tcp_rx_buffer = TcpSocketBuffer::new(vec![0; ethernet::MTU]);
165-
let tcp_tx_buffer = TcpSocketBuffer::new(vec![0; ethernet::MTU]);
166-
let mut example_tcp_socket = TcpSocket::new(tcp_rx_buffer, tcp_tx_buffer);
167-
example_tcp_socket.listen(endpoint).unwrap();
168-
sockets.add(example_tcp_socket);
169-
}
159+
let dhcp_rx_buffer = RawSocketBuffer::new(
160+
[RawPacketMetadata::EMPTY; 1],
161+
vec![0; 1500]
162+
);
163+
let dhcp_tx_buffer = RawSocketBuffer::new(
164+
[RawPacketMetadata::EMPTY; 1],
165+
vec![0; 3000]
166+
);
167+
let mut dhcp = Dhcpv4Client::new(&mut sockets, dhcp_rx_buffer, dhcp_tx_buffer, Instant::from_millis(system_clock::ms() as i64));
170168

171169
let mut previous_button_state = pins.button.get();
172170
let mut audio_writer = AudioWriter::new();
@@ -202,13 +200,16 @@ fn main() -> ! {
202200
audio_writer.set_next_col(&mut layer_1, data0, data1);
203201

204202
// handle new ethernet packets
205-
if let Ok(ref mut eth) = ethernet_interface {
206-
match eth.poll(
203+
if let Ok((ref mut iface, ref mut prev_ip_addr)) = ethernet_interface {
204+
let timestamp = Instant::from_millis(system_clock::ms() as i64);
205+
match iface.poll(
207206
&mut sockets,
208-
Instant::from_millis(system_clock::ms() as i64),
207+
timestamp,
209208
) {
210-
Err(::smoltcp::Error::Exhausted) => continue,
211-
Err(::smoltcp::Error::Unrecognized) => {}
209+
Err(::smoltcp::Error::Exhausted) => {
210+
continue;
211+
}
212+
Err(::smoltcp::Error::Unrecognized) => {print!("U")}
212213
Err(e) => println!("Network error: {:?}", e),
213214
Ok(socket_changed) => {
214215
if socket_changed {
@@ -218,6 +219,47 @@ fn main() -> ! {
218219
}
219220
}
220221
}
222+
223+
dhcp.poll(iface, &mut sockets, timestamp)
224+
.unwrap_or_else(|e| println!("DHCP: {:?}", e));
225+
let ip_addr = iface.ipv4_addr().unwrap();
226+
if ip_addr != *prev_ip_addr {
227+
println!("Assigned a new IPv4 address: {}", ip_addr);
228+
iface.routes_mut()
229+
.update(|routes_map| {
230+
routes_map.get(&IpCidr::new(Ipv4Address::UNSPECIFIED.into(), 0))
231+
.map(|default_route| {
232+
println!("Default gateway: {}", default_route.via_router);
233+
});
234+
});
235+
for dns_server in dhcp.dns_servers() {
236+
println!("DNS servers: {}", dns_server);
237+
}
238+
239+
// TODO delete old sockets
240+
241+
// add new sockets
242+
let endpoint = IpEndpoint::new(ip_addr.into(), 15);
243+
244+
let udp_rx_buffer =
245+
UdpSocketBuffer::new(vec![UdpPacketMetadata::EMPTY; 3], vec![0u8; 256]);
246+
let udp_tx_buffer =
247+
UdpSocketBuffer::new(vec![UdpPacketMetadata::EMPTY; 1], vec![0u8; 128]);
248+
let mut example_udp_socket = UdpSocket::new(udp_rx_buffer, udp_tx_buffer);
249+
example_udp_socket.bind(endpoint).unwrap();
250+
sockets.add(example_udp_socket);
251+
252+
let tcp_rx_buffer = TcpSocketBuffer::new(vec![0; ethernet::MTU]);
253+
let tcp_tx_buffer = TcpSocketBuffer::new(vec![0; ethernet::MTU]);
254+
let mut example_tcp_socket = TcpSocket::new(tcp_rx_buffer, tcp_tx_buffer);
255+
example_tcp_socket.listen(endpoint).unwrap();
256+
sockets.add(example_tcp_socket);
257+
258+
*prev_ip_addr = ip_addr;
259+
}
260+
let mut timeout = dhcp.next_poll(timestamp);
261+
iface.poll_delay(&sockets, timestamp).map(|sockets_timeout| timeout = sockets_timeout);
262+
// TODO await next interrupt
221263
}
222264

223265
// Initialize the SD Card on insert and deinitialize on extract.

0 commit comments

Comments
 (0)