@@ -26,10 +26,11 @@ use sh::hio::{self, HStdout};
26
26
use smoltcp:: {
27
27
socket:: {
28
28
Socket , SocketSet , TcpSocket , TcpSocketBuffer , UdpPacketMetadata , UdpSocket ,
29
- UdpSocketBuffer ,
29
+ UdpSocketBuffer , RawSocketBuffer , RawPacketMetadata ,
30
30
} ,
31
31
time:: Instant ,
32
- wire:: { EthernetAddress , IpAddress , IpEndpoint , Ipv4Address } ,
32
+ wire:: { EthernetAddress , IpEndpoint , Ipv4Address , IpCidr } ,
33
+ dhcp:: Dhcpv4Client ,
33
34
} ;
34
35
use stm32f7:: stm32f7x6:: { CorePeripherals , Interrupt , Peripherals } ;
35
36
use stm32f7_discovery:: {
@@ -49,7 +50,6 @@ static ALLOCATOR: CortexMHeap = CortexMHeap::empty();
49
50
50
51
const HEAP_SIZE : usize = 50 * 1024 ; // in bytes
51
52
const ETH_ADDR : EthernetAddress = EthernetAddress ( [ 0x00 , 0x08 , 0xdc , 0xab , 0xcd , 0xef ] ) ;
52
- const IP_ADDR : Ipv4Address = Ipv4Address ( [ 141 , 52 , 46 , 198 ] ) ;
53
53
54
54
#[ entry]
55
55
fn main ( ) -> ! {
@@ -146,27 +146,25 @@ fn main() -> ! {
146
146
& mut ethernet_dma,
147
147
ETH_ADDR ,
148
148
)
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
+ } ) ;
150
154
if let Err ( e) = ethernet_interface {
151
155
println ! ( "ethernet init failed: {:?}" , e) ;
152
156
} ;
153
157
154
158
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 ) ) ;
170
168
171
169
let mut previous_button_state = pins. button . get ( ) ;
172
170
let mut audio_writer = AudioWriter :: new ( ) ;
@@ -202,13 +200,16 @@ fn main() -> ! {
202
200
audio_writer. set_next_col ( & mut layer_1, data0, data1) ;
203
201
204
202
// 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 (
207
206
& mut sockets,
208
- Instant :: from_millis ( system_clock :: ms ( ) as i64 ) ,
207
+ timestamp ,
209
208
) {
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" ) }
212
213
Err ( e) => println ! ( "Network error: {:?}" , e) ,
213
214
Ok ( socket_changed) => {
214
215
if socket_changed {
@@ -218,6 +219,47 @@ fn main() -> ! {
218
219
}
219
220
}
220
221
}
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
221
263
}
222
264
223
265
// Initialize the SD Card on insert and deinitialize on extract.
0 commit comments