4
4
//! For build and run instructions, see README.md
5
5
//!
6
6
//! This example starts a TCP listening server at the address 10.0.0.1/24, on port 80, that
7
- //! should transmit `Hello ` to any connecting client, and then close the connection.
7
+ //! should transmit `hello ` to any connecting client, and then close the connection.
8
8
9
9
use defmt_rtt as _;
10
10
use panic_probe as _;
11
11
12
12
use cortex_m_rt:: { entry, exception} ;
13
+ use smoltcp:: iface:: { Config , Interface , SocketSet , SocketStorage } ;
13
14
use stm32_eth:: stm32:: { interrupt, CorePeripherals , Peripherals , SYST } ;
14
15
15
16
use core:: cell:: RefCell ;
16
17
use cortex_m:: interrupt:: Mutex ;
17
18
18
- use smoltcp:: iface:: { InterfaceBuilder , NeighborCache } ;
19
- use smoltcp:: socket:: { TcpSocket , TcpSocketBuffer } ;
19
+ use smoltcp:: socket:: tcp:: { Socket as TcpSocket , SocketBuffer as TcpSocketBuffer } ;
20
20
use smoltcp:: time:: Instant ;
21
- use smoltcp:: wire:: { EthernetAddress , IpAddress , IpCidr , Ipv4Address } ;
21
+ use smoltcp:: wire:: { EthernetAddress , IpCidr , Ipv4Address , Ipv4Cidr } ;
22
22
23
23
pub mod common;
24
24
@@ -27,6 +27,7 @@ use stm32_eth::{
27
27
Parts ,
28
28
} ;
29
29
30
+ const IP_ADDRESS : Ipv4Address = Ipv4Address :: new ( 10 , 0 , 0 , 1 ) ;
30
31
const SRC_MAC : [ u8 ; 6 ] = [ 0x00 , 0x00 , 0xDE , 0xAD , 0xBE , 0xEF ] ;
31
32
32
33
static TIME : Mutex < RefCell < u64 > > = Mutex :: new ( RefCell :: new ( 0 ) ) ;
@@ -62,27 +63,26 @@ fn main() -> ! {
62
63
. unwrap ( ) ;
63
64
dma. enable_interrupt ( ) ;
64
65
65
- let local_addr = Ipv4Address :: new ( 10 , 0 , 0 , 1 ) ;
66
- let ip_addr = IpCidr :: new ( IpAddress :: from ( local_addr) , 24 ) ;
67
- let mut ip_addrs = [ ip_addr] ;
68
- let mut neighbor_storage = [ None ; 16 ] ;
69
- let neighbor_cache = NeighborCache :: new ( & mut neighbor_storage[ ..] ) ;
70
66
let ethernet_addr = EthernetAddress ( SRC_MAC ) ;
71
67
72
- let mut sockets: [ _ ; 1 ] = Default :: default ( ) ;
73
- let mut iface = InterfaceBuilder :: new ( & mut dma, & mut sockets[ ..] )
74
- . hardware_addr ( ethernet_addr. into ( ) )
75
- . ip_addrs ( & mut ip_addrs[ ..] )
76
- . neighbor_cache ( neighbor_cache)
77
- . finalize ( ) ;
68
+ let mut config = Config :: new ( ) ;
69
+ config. hardware_addr = Some ( ethernet_addr. into ( ) ) ;
70
+ let mut iface = Interface :: new ( config, & mut & mut dma) ;
71
+
72
+ iface. update_ip_addrs ( |addr| {
73
+ addr. push ( IpCidr :: Ipv4 ( Ipv4Cidr :: new ( IP_ADDRESS , 24 ) ) ) . ok ( ) ;
74
+ } ) ;
75
+
76
+ let mut sockets = [ SocketStorage :: EMPTY ] ;
77
+ let mut sockets = SocketSet :: new ( & mut sockets[ ..] ) ;
78
78
79
79
let mut server_rx_buffer = [ 0 ; 512 ] ;
80
80
let mut server_tx_buffer = [ 0 ; 512 ] ;
81
81
let server_socket = TcpSocket :: new (
82
82
TcpSocketBuffer :: new ( & mut server_rx_buffer[ ..] ) ,
83
83
TcpSocketBuffer :: new ( & mut server_tx_buffer[ ..] ) ,
84
84
) ;
85
- let server_handle = iface . add_socket ( server_socket) ;
85
+ let server_handle = sockets . add ( server_socket) ;
86
86
87
87
loop {
88
88
let time: u64 = cortex_m:: interrupt:: free ( |cs| * TIME . borrow ( cs) . borrow ( ) ) ;
@@ -91,31 +91,43 @@ fn main() -> ! {
91
91
* eth_pending = false ;
92
92
} ) ;
93
93
94
- iface. poll ( Instant :: from_millis ( time as i64 ) ) . ok ( ) ;
94
+ iface. poll (
95
+ Instant :: from_millis ( time as i64 ) ,
96
+ & mut & mut dma,
97
+ & mut sockets,
98
+ ) ;
95
99
96
- let socket = iface . get_socket :: < TcpSocket > ( server_handle) ;
100
+ let socket = sockets . get_mut :: < TcpSocket > ( server_handle) ;
97
101
98
102
if !socket. is_listening ( ) && !socket. is_open ( ) {
99
103
socket. abort ( ) ;
100
104
if let Err ( e) = socket. listen ( 80 ) {
101
105
defmt:: error!( "TCP listen error: {:?}" , e)
102
106
} else {
103
- defmt:: info!( "Listening at {}:80..." , ip_addr ) ;
107
+ defmt:: info!( "Listening at {}:80..." , IP_ADDRESS ) ;
104
108
}
105
109
} else {
106
110
match socket. send_slice ( b"hello\n " ) {
107
111
Ok ( _) => {
108
- while iface . get_socket :: < TcpSocket > ( server_handle) . send_queue ( ) != 0 {
112
+ while sockets . get :: < TcpSocket > ( server_handle) . send_queue ( ) != 0 {
109
113
// Poll to get the message out of the door
110
- iface. poll ( Instant :: from_millis ( time as i64 + 1 ) ) . ok ( ) ;
114
+ iface. poll (
115
+ Instant :: from_millis ( time as i64 + 1 ) ,
116
+ & mut & mut dma,
117
+ & mut sockets,
118
+ ) ;
111
119
}
112
120
113
121
// Abort the connection
114
- let socket = iface . get_socket :: < TcpSocket > ( server_handle) ;
122
+ let socket = sockets . get_mut :: < TcpSocket > ( server_handle) ;
115
123
socket. abort ( ) ;
116
124
defmt:: info!( "Transmitted hello! Closing socket..." ) ;
117
125
118
- iface. poll ( Instant :: from_millis ( time as i64 + 1 ) ) . ok ( ) ;
126
+ iface. poll (
127
+ Instant :: from_millis ( time as i64 ) ,
128
+ & mut & mut dma,
129
+ & mut sockets,
130
+ ) ;
119
131
}
120
132
Err ( _) => { }
121
133
}
0 commit comments