@@ -26,10 +26,11 @@ use sh::hio::{self, HStdout};
2626use 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} ;
3435use stm32f7:: stm32f7x6:: { CorePeripherals , Interrupt , Peripherals } ;
3536use stm32f7_discovery:: {
@@ -49,7 +50,6 @@ static ALLOCATOR: CortexMHeap = CortexMHeap::empty();
4950
5051const HEAP_SIZE : usize = 50 * 1024 ; // in bytes
5152const ETH_ADDR : EthernetAddress = EthernetAddress ( [ 0x00 , 0x08 , 0xdc , 0xab , 0xcd , 0xef ] ) ;
52- const IP_ADDR : Ipv4Address = Ipv4Address ( [ 141 , 52 , 46 , 198 ] ) ;
5353
5454#[ entry]
5555fn 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