1#![cfg_attr(docsrs, feature(doc_cfg), feature(doc_auto_cfg))]
70
71use std::{
72 fs::File,
73 io::{self, Read, Write},
74 net::{SocketAddrV4, TcpListener, TcpStream, UdpSocket},
75};
76
77pub use w5500_ll::{self, Registers};
78
79use w5500_ll::{
80 net::{Eui48Addr, Ipv4Addr},
81 BufferSize, Mode, Protocol, Reg, Sn, SnReg, SocketCommand, SocketInterrupt, SocketMode,
82 SocketStatus, SOCKETS, VERSION,
83};
84
85const SOCKET_SPACING: u8 = 0x04;
87
88const NUM_SOCKETS: usize = SOCKETS.len();
89const DEFAULT_BUF_SIZE: usize = BufferSize::KB2.size_in_bytes();
90
91#[derive(Debug)]
92enum SocketType {
93 Udp(UdpSocket),
94 TcpListener(TcpListener),
95 TcpStream(TcpStream),
96}
97
98impl PartialEq for SocketType {
99 fn eq(&self, other: &Self) -> bool {
100 matches!(
101 (self, other),
102 (Self::Udp(_), Self::Udp(_))
103 | (Self::TcpListener(_), Self::TcpListener(_))
104 | (Self::TcpStream(_), Self::TcpStream(_))
105 )
106 }
107}
108
109#[derive(PartialEq, Eq)]
110enum BlockType {
111 Common,
112 Socket(Sn),
113 Tx(Sn),
114 Rx(Sn),
115}
116impl std::fmt::Display for BlockType {
117 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
118 match self {
119 BlockType::Common => write!(f, "REG"),
120 BlockType::Socket(n) => {
121 write!(f, "SN{}", u8::from(*n))
122 }
123 BlockType::Tx(n) => {
124 write!(f, "TX{}", u8::from(*n))
125 }
126 BlockType::Rx(n) => {
127 write!(f, "RX{}", u8::from(*n))
128 }
129 }
130 }
131}
132
133fn block_type(block: u8) -> BlockType {
134 if block == 0 {
135 BlockType::Common
136 } else {
137 let sn_val: u8 = block / SOCKET_SPACING;
138 let sn: Sn =
139 Sn::try_from(sn_val).unwrap_or_else(|_| panic!("Invalid block address: 0x{block:02X}"));
140 match block - (sn_val * SOCKET_SPACING) {
141 1 => BlockType::Socket(sn),
142 2 => BlockType::Tx(sn),
143 3 => BlockType::Rx(sn),
144 _ => panic!("Invalid block address: 0x{block:02X}"),
145 }
146 }
147}
148
149#[derive(Debug, PartialEq, Eq)]
150struct CommonRegs {
151 mr: u8,
152 gar: Ipv4Addr,
153 subr: Ipv4Addr,
154 shar: Eui48Addr,
155 sipr: Ipv4Addr,
156 intlevel: u16,
157 ir: u8,
158 imr: u8,
159 sir: u8,
160 simr: u8,
161 rtr: u16,
162 rcr: u8,
163 ptimer: u8,
164 pmagic: u8,
165 phar: Eui48Addr,
166 psid: u16,
167 pmru: u16,
168 uipr: Ipv4Addr,
169 uportr: u16,
170 phycfgr: u8,
171 versionr: u8,
172}
173
174impl CommonRegs {
175 const RESET: Self = Self {
177 mr: 0x00,
178 gar: Ipv4Addr::UNSPECIFIED,
179 subr: Ipv4Addr::UNSPECIFIED,
180 shar: Eui48Addr::UNSPECIFIED,
181 sipr: Ipv4Addr::UNSPECIFIED,
182 intlevel: 0x00,
183 ir: 0x00,
184 imr: 0x00,
185 sir: 0x00,
186 simr: 0x00,
187 rtr: 0x07D0,
188 rcr: 0x08,
189 ptimer: 0x0028,
190 pmagic: 0x00,
191 phar: Eui48Addr::UNSPECIFIED,
192 psid: 0x00,
193 pmru: 0xFFFF,
194 uipr: Ipv4Addr::UNSPECIFIED,
195 uportr: 0x0000,
196 phycfgr: 0b10111111,
197 versionr: VERSION,
198 };
199}
200
201#[derive(Debug, PartialEq, Eq)]
202struct SocketRegs {
203 mr: u8,
204 cr: u8,
205 ir: SocketInterrupt,
206 sr: SocketStatus,
207 port: u16,
208 dhar: Eui48Addr,
209 dipr: Ipv4Addr,
210 dport: u16,
211 mssr: u16,
212 tos: u8,
213 ttl: u8,
214 rxbuf_size: BufferSize,
215 txbuf_size: BufferSize,
216 tx_fsr: u16,
217 tx_rd: u16,
218 tx_wr: u16,
219 rx_rsr: u16,
220 rx_rd: u16,
221 rx_wr: u16,
222 imr: u8,
223 frag: u16,
224 kpalvtr: u8,
225}
226
227impl SocketRegs {
228 const RESET: Self = Self {
230 mr: 0x00,
231 cr: 0x00,
232 ir: SocketInterrupt::DEFAULT,
233 sr: SocketStatus::Closed,
234 port: 0x0000,
235 dhar: Eui48Addr::new(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF),
236 dipr: Ipv4Addr::UNSPECIFIED,
237 dport: 0x00,
238 mssr: 0x0000,
239 tos: 0x00,
240 ttl: 0x80,
241 rxbuf_size: BufferSize::KB2,
242 txbuf_size: BufferSize::KB2,
243 tx_fsr: 0x0800,
244 tx_rd: 0x0000,
245 tx_wr: 0x0000,
246 rx_rsr: 0x0000,
247 rx_rd: 0x0000,
248 rx_wr: 0x0000,
249 imr: 0xFF,
250 frag: 0x4000,
251 kpalvtr: 0x00,
252 };
253
254 pub fn dest(&self) -> std::net::SocketAddrV4 {
255 SocketAddrV4::new(self.dipr, self.dport)
256 }
257}
258
259#[derive(Debug)]
260struct Socket {
261 regs: SocketRegs,
262 tx_buf: Vec<u8>,
263 rx_buf: Vec<u8>,
264 inner: Option<SocketType>,
265 client: Option<TcpStream>,
266}
267
268impl PartialEq for Socket {
269 fn eq(&self, other: &Self) -> bool {
270 self.regs == other.regs
271 && self.tx_buf == other.tx_buf
272 && self.rx_buf == other.rx_buf
273 && self.inner == other.inner
274 && ((self.client.is_some() && other.client.is_some())
275 || (self.client.is_none() && other.client.is_none()))
276 }
277}
278
279impl Default for Socket {
280 fn default() -> Self {
281 Self {
282 regs: SocketRegs::RESET,
283 tx_buf: vec![0; DEFAULT_BUF_SIZE],
284 rx_buf: vec![0; DEFAULT_BUF_SIZE],
285 inner: None,
286 client: None,
287 }
288 }
289}
290
291#[derive(Debug)]
293pub struct W5500 {
294 regs: CommonRegs,
295 sn: [Socket; NUM_SOCKETS],
296 socket_buffer_logging: bool,
297 corpus: Option<File>,
298}
299
300impl PartialEq for W5500 {
301 fn eq(&self, other: &Self) -> bool {
302 self.regs == other.regs
303 && self.sn == other.sn
304 && self.socket_buffer_logging == other.socket_buffer_logging
305 && ((self.corpus.is_some() && other.corpus.is_some())
306 || (self.corpus.is_none() && other.corpus.is_none()))
307 }
308}
309
310impl W5500 {
311 pub fn set_socket_buffer_logging(&mut self, enable: bool) {
329 self.socket_buffer_logging = enable
330 }
331
332 pub fn set_corpus_file(&mut self, file: File) {
348 self.corpus.replace(file);
349 }
350
351 fn log_byte(&mut self, byte: u8) {
352 if let Some(mut file) = self.corpus.as_ref() {
353 file.write_all(&[byte])
354 .expect("failed to write to read log");
355 }
356 }
357
358 fn reset(&mut self) {
359 *self = Self::default();
360 }
361
362 fn socket_cmd_open(&mut self, sn: Sn) -> io::Result<()> {
363 let sipr = self.regs.sipr;
364 let socket = self.socket_mut(sn);
365
366 socket.regs.rx_wr = 0;
368 socket.regs.rx_rd = 0;
369 socket.regs.tx_rd = 0;
370 socket.regs.tx_wr = 0;
371
372 let mr = SocketMode::from(socket.regs.mr);
373
374 match mr.protocol() {
375 Ok(Protocol::Closed) => {
376 log::error!("[{sn:?}] ignoring OPEN command, socket protocol is not yet")
377 }
378 Ok(Protocol::Tcp) => {
379 socket.inner = None;
380 self.sim_set_sn_sr(sn, SocketStatus::Init);
381 }
382 Ok(Protocol::Udp) => {
383 let local = SocketAddrV4::new(sipr, socket.regs.port);
384 log::info!("[{sn:?}] binding UDP socket to {local}");
385
386 match UdpSocket::bind(local) {
387 Ok(udp_socket) => {
388 log::info!("[{sn:?}] bound to {local}");
389 udp_socket.set_nonblocking(true)?;
390 udp_socket.set_ttl(socket.regs.ttl.into())?;
391 socket.inner = Some(SocketType::Udp(udp_socket));
392 self.sim_set_sn_sr(sn, SocketStatus::Udp);
393 }
394 Err(e) => {
395 log::warn!("[{sn:?}] failed to bind socket {local}: {e}");
396 self.sim_set_sn_sr(sn, SocketStatus::Closed);
397 }
398 }
399 }
400 Ok(Protocol::Macraw) => {
401 if sn == Sn::Sn0 {
402 unimplemented!("MACRAW")
403 } else {
404 log::error!("[{sn:?}] ignoring OPEN command, MACRAW can only be used on Sn0")
405 }
406 }
407 Err(x) => log::error!("[{sn:?}] ignoring OPEN command, invalid protocol bits {x:#02X}"),
408 }
409 Ok(())
410 }
411
412 fn socket_cmd_connect(&mut self, sn: Sn) -> io::Result<()> {
413 let socket = self.socket_mut(sn);
414 assert_eq!(socket.regs.sr, SocketStatus::Init);
415
416 let addr = socket.regs.dest();
417 log::info!("[{sn:?}] opening a TCP stream to {addr}");
418
419 match TcpStream::connect(addr) {
420 Ok(stream) => {
421 log::info!("[{sn:?}] established TCP connection with {addr}");
422 stream.set_nonblocking(true)?;
423 stream.set_ttl(socket.regs.ttl.into())?;
424 socket.inner = Some(SocketType::TcpStream(stream));
425 self.raise_sn_ir(sn, SocketInterrupt::CON_MASK);
426 self.sim_set_sn_sr(sn, SocketStatus::Established);
427 }
428 Err(e) => {
429 log::warn!("[{sn:?}] TCP stream to {addr} failed: {e}");
430 self.raise_sn_ir(sn, SocketInterrupt::DISCON_MASK);
431 self.sim_set_sn_sr(sn, SocketStatus::Closed);
432 }
433 }
434
435 Ok(())
436 }
437
438 fn socket_cmd_listen(&mut self, sn: Sn) -> io::Result<()> {
439 let socket = self.socket_mut(sn);
440 assert_eq!(socket.regs.sr, SocketStatus::Init);
441
442 let addr = std::net::SocketAddrV4::new(std::net::Ipv4Addr::LOCALHOST, socket.regs.port);
443 log::info!("[{sn:?}] Opening a TCP listener on port {addr}");
444 match TcpListener::bind(addr) {
445 Ok(listener) => {
446 log::info!("[{sn:?}] Bound listener on {addr}");
447 listener.set_nonblocking(true)?;
448 listener.set_ttl(socket.regs.ttl.into())?;
449 socket.inner = Some(SocketType::TcpListener(listener));
450 self.sim_set_sn_sr(sn, SocketStatus::Listen);
451 }
452 Err(e) => {
453 log::warn!("[{sn:?}] TCP listener failed to bind to {addr}: {e}");
454 self.sim_set_sn_sr(sn, SocketStatus::Closed);
455 self.raise_sn_ir(sn, SocketInterrupt::TIMEOUT_MASK);
456 }
457 }
458
459 Ok(())
460 }
461
462 fn socket(&self, sn: Sn) -> &Socket {
463 &self.sn[usize::from(sn)]
464 }
465
466 fn socket_mut(&mut self, sn: Sn) -> &mut Socket {
467 &mut self.sn[usize::from(sn)]
468 }
469
470 fn sim_set_sn_sr(&mut self, sn: Sn, status: SocketStatus) {
471 let socket: &mut Socket = self.socket_mut(sn);
472 let old: SocketStatus = socket.regs.sr;
473 socket.regs.sr = status;
474 if old != status {
475 log::info!("[{sn:?}] {old:?} -> {status:?}");
476 }
477 }
478
479 fn socket_cmd_close(&mut self, sn: Sn) {
480 let socket = self.socket_mut(sn);
481 socket.inner = None;
482 self.sim_set_sn_sr(sn, SocketStatus::Closed);
483 }
484
485 fn socket_cmd_send(&mut self, sn: Sn) -> io::Result<()> {
486 let socket = self.socket_mut(sn);
487 let tail: usize = socket.regs.tx_rd.into();
488 let head: usize = socket.regs.tx_wr.into();
489 if head == tail {
490 log::error!("[{sn:?}] nothing to send");
491 return Ok(());
492 }
493 let size: usize = if head >= tail {
494 head - tail
495 } else {
496 usize::from(u16::MAX) + head - tail
497 };
498
499 log::debug!("[{sn:?}] tx_rd=0x{tail:04X}");
500 log::debug!("[{sn:?}] tx_wr=0x{head:04X}");
501 log::debug!("[{sn:?}] size=0x{size:04X}");
502
503 debug_assert!(
504 size <= socket.regs.txbuf_size.size_in_bytes(),
505 "[{sn:?}] Send data size exceeds buffer size",
506 );
507
508 let mut local_tx_buf: Vec<u8> = Vec::with_capacity(size);
509
510 if head >= tail {
512 for buffer_adr in tail..head {
513 let buf_idx = buffer_adr % socket.tx_buf.len();
514 local_tx_buf.push(socket.tx_buf[buf_idx]);
515 }
516 } else {
517 for buffer_adr in tail..usize::from(u16::MAX) {
518 let buf_idx = buffer_adr % socket.tx_buf.len();
519 local_tx_buf.push(socket.tx_buf[buf_idx]);
520 }
521 for buffer_adr in 0..head {
522 let buf_idx = buffer_adr % socket.tx_buf.len();
523 local_tx_buf.push(socket.tx_buf[buf_idx]);
524 }
525 }
526
527 debug_assert!(!local_tx_buf.is_empty());
528
529 let dest = socket.regs.dest();
530
531 match socket.inner {
532 Some(SocketType::TcpStream(ref mut stream)) => {
533 stream.write_all(&local_tx_buf)?;
534 stream.flush()?;
535 }
536 Some(SocketType::Udp(ref mut udp)) => {
537 log::info!("[{sn:?}] sending to {dest}");
538 let num: usize = udp.send_to(&local_tx_buf, dest)?;
539 assert_eq!(num, local_tx_buf.len());
540 }
541 Some(SocketType::TcpListener(_)) => {
542 if let Some(ref mut stream) = socket.client {
543 stream.write_all(&local_tx_buf)?;
544 stream.flush()?;
545 }
546 }
547 None => {
548 panic!("[{sn:?}] Unable to send data, socket is closed")
549 }
550 }
551
552 socket.regs.tx_rd = socket.regs.tx_wr;
553
554 Ok(())
555 }
556
557 fn socket_cmd_recv(&mut self, sn: Sn) -> io::Result<()> {
561 let socket = self.socket_mut(sn);
562 socket.regs.rx_rsr = {
563 if socket.regs.rx_wr >= socket.regs.rx_rd {
564 socket.regs.rx_wr - socket.regs.rx_rd
565 } else {
566 u16::try_from(socket.regs.rxbuf_size.size_in_bytes()).unwrap() - socket.regs.rx_wr
567 + socket.regs.rx_rd
568 }
569 };
570
571 Ok(())
572 }
573
574 fn sim_set_sn_rx_buf(&mut self, sn: Sn, data: &[u8]) {
575 let socket = self.socket_mut(sn);
576 let buf_len: usize = socket.rx_buf.len();
577
578 for byte in data.iter() {
579 let buf_idx: usize = usize::from(socket.regs.rx_wr) % buf_len;
580 if usize::from(socket.regs.rx_rsr).saturating_add(1) > buf_len {
581 log::error!("[{sn:?}] RX buffer overflow");
582 return;
583 }
584 socket.rx_buf[buf_idx] = *byte;
585 socket.regs.rx_wr = socket.regs.rx_wr.wrapping_add(1);
586 socket.regs.rx_rsr = socket.regs.rx_rsr.checked_add(1).unwrap();
587 }
588 }
589
590 fn raise_sn_ir(&mut self, sn: Sn, int: u8) {
591 self.regs.sir |= sn.bitmask();
592 self.socket_mut(sn).regs.ir =
593 SocketInterrupt::from(u8::from(self.socket(sn).regs.ir) | int);
594 }
595
596 fn check_socket(&mut self, sn: Sn) -> io::Result<()> {
597 let socket = self.socket_mut(sn);
598 let bufsize: usize = socket.regs.rxbuf_size.size_in_bytes();
599 let mut buf: Vec<u8> = vec![0; bufsize];
600
601 match socket.inner {
602 Some(SocketType::Udp(ref udp)) => match udp.recv_from(&mut buf) {
603 Ok((num, origin)) => {
604 let origin = match origin {
605 std::net::SocketAddr::V4(origin) => origin,
606 other => {
607 panic!("Internal error, got a non-IPV4 addr from recv_from: {other:?}")
608 }
609 };
610 log::info!("[{sn:?}] recv datagram of len {num} from {origin}");
611 let num: u16 = u16::try_from(num).unwrap_or(u16::MAX);
612 self.sim_set_sn_rx_buf(sn, &origin.ip().octets());
614 self.sim_set_sn_rx_buf(sn, &origin.port().to_be_bytes());
615 self.sim_set_sn_rx_buf(sn, &num.to_be_bytes());
616 self.sim_set_sn_rx_buf(sn, &buf[..usize::from(num)]);
618 self.raise_sn_ir(sn, SocketInterrupt::RECV_MASK);
619 }
620 Err(e) => match e.kind() {
621 io::ErrorKind::WouldBlock => {}
622 _ => return Err(e),
623 },
624 },
625 Some(SocketType::TcpStream(ref mut stream)) => match stream.read(&mut buf) {
626 Ok(num @ 1..=usize::MAX) => {
627 log::info!("[{sn:?}] recv {num} bytes");
628 self.sim_set_sn_rx_buf(sn, &buf[..num]);
629 self.raise_sn_ir(sn, SocketInterrupt::RECV_MASK);
630 }
631 Err(e) => match e.kind() {
632 io::ErrorKind::WouldBlock => {}
633 _ => return Err(e),
634 },
635 _ => {}
636 },
637 Some(SocketType::TcpListener(ref mut listener)) => {
638 if let Some(ref mut stream) = socket.client {
639 match stream.read(&mut buf) {
640 Ok(num @ 1..=usize::MAX) => {
641 log::info!("[{sn:?}] recv {num} bytes");
642 self.sim_set_sn_rx_buf(sn, &buf[..num]);
643 self.raise_sn_ir(sn, SocketInterrupt::RECV_MASK);
644 }
645 Err(e) => match e.kind() {
646 io::ErrorKind::WouldBlock => {}
647 _ => return Err(e),
648 },
649 _ => {}
650 }
651 } else {
652 match listener.accept() {
653 Ok((stream, addr)) => {
654 log::info!("[{sn:?}] Accepted a new stream from {addr}");
655 stream.set_nonblocking(true)?;
656 socket.client = Some(stream);
657 self.raise_sn_ir(sn, SocketInterrupt::CON_MASK);
658 self.sim_set_sn_sr(sn, SocketStatus::Established);
659 }
660 Err(e) => match e.kind() {
661 io::ErrorKind::WouldBlock => {}
662 _ => return Err(e),
663 },
664 }
665 }
666 }
667 None => {}
668 };
669 Ok(())
670 }
671
672 fn common_reg_rd(&self, addr: u16) -> u8 {
673 let decoded = Reg::try_from(addr);
674
675 let ret: u8 = match decoded {
676 Ok(Reg::MR) => self.regs.mr,
677 Ok(Reg::GAR0) => self.regs.gar.octets()[0],
678 Ok(Reg::GAR1) => self.regs.gar.octets()[1],
679 Ok(Reg::GAR2) => self.regs.gar.octets()[2],
680 Ok(Reg::GAR3) => self.regs.gar.octets()[3],
681 Ok(Reg::SUBR0) => self.regs.subr.octets()[0],
682 Ok(Reg::SUBR1) => self.regs.subr.octets()[1],
683 Ok(Reg::SUBR2) => self.regs.subr.octets()[2],
684 Ok(Reg::SUBR3) => self.regs.subr.octets()[3],
685 Ok(Reg::SHAR0) => self.regs.shar.octets[0],
686 Ok(Reg::SHAR1) => self.regs.shar.octets[1],
687 Ok(Reg::SHAR2) => self.regs.shar.octets[2],
688 Ok(Reg::SHAR3) => self.regs.shar.octets[3],
689 Ok(Reg::SHAR4) => self.regs.shar.octets[4],
690 Ok(Reg::SHAR5) => self.regs.shar.octets[5],
691 Ok(Reg::SIPR0) => self.regs.sipr.octets()[0],
692 Ok(Reg::SIPR1) => self.regs.sipr.octets()[1],
693 Ok(Reg::SIPR2) => self.regs.sipr.octets()[2],
694 Ok(Reg::SIPR3) => self.regs.sipr.octets()[3],
695 Ok(Reg::INTLEVEL0) => self.regs.intlevel.to_be_bytes()[0],
696 Ok(Reg::INTLEVEL1) => self.regs.intlevel.to_be_bytes()[1],
697 Ok(Reg::IR) => self.regs.ir,
698 Ok(Reg::IMR) => self.regs.imr,
699 Ok(Reg::SIR) => self.regs.sir,
700 Ok(Reg::SIMR) => self.regs.simr,
701 Ok(Reg::RTR0) => self.regs.rtr.to_be_bytes()[0],
702 Ok(Reg::RTR1) => self.regs.rtr.to_be_bytes()[1],
703 Ok(Reg::RCR) => self.regs.rcr,
704 Ok(Reg::PTIMER) => self.regs.ptimer,
705 Ok(Reg::PMAGIC) => self.regs.pmagic,
706 Ok(Reg::PHAR0) => self.regs.phar.octets[0],
707 Ok(Reg::PHAR1) => self.regs.phar.octets[1],
708 Ok(Reg::PHAR2) => self.regs.phar.octets[2],
709 Ok(Reg::PHAR3) => self.regs.phar.octets[3],
710 Ok(Reg::PHAR4) => self.regs.phar.octets[4],
711 Ok(Reg::PHAR5) => self.regs.phar.octets[5],
712 Ok(Reg::PSID0) => self.regs.psid.to_be_bytes()[0],
713 Ok(Reg::PSID1) => self.regs.psid.to_be_bytes()[1],
714 Ok(Reg::PMRU0) => self.regs.pmru.to_be_bytes()[0],
715 Ok(Reg::PMRU1) => self.regs.pmru.to_be_bytes()[1],
716 Ok(Reg::UIPR0) => self.regs.uipr.octets()[0],
717 Ok(Reg::UIPR1) => self.regs.uipr.octets()[1],
718 Ok(Reg::UIPR2) => self.regs.uipr.octets()[2],
719 Ok(Reg::UIPR3) => self.regs.uipr.octets()[3],
720 Ok(Reg::UPORTR0) => self.regs.uportr.to_be_bytes()[0],
721 Ok(Reg::UPORTR1) => self.regs.uportr.to_be_bytes()[1],
722 Ok(Reg::PHYCFGR) => self.regs.phycfgr,
723 Ok(Reg::VERSIONR) => self.regs.versionr,
724 Err(_) => 0x00,
725 };
726
727 let (name, level): (String, log::Level) = match decoded {
728 Ok(reg) => (format!("{reg:?}"), log::Level::Trace),
729 Err(_) => (String::from("INVALID"), log::Level::Error),
730 };
731 log::log!(level, "[R] [COM] {addr:04X} -> {ret:02X} {name}");
732
733 ret
734 }
735
736 fn common_reg_wr(&mut self, addr: u16, byte: u8) -> io::Result<()> {
737 let decoded = Reg::try_from(addr);
738
739 match decoded {
740 Ok(Reg::MR) => {
741 self.regs.mr = byte;
742 if byte & Mode::RST_MASK != 0 {
743 self.reset()
744 }
745 let mode: Mode = byte.into();
746 if mode.wol_enabled() != Mode::default().wol_enabled() {
747 log::warn!("[W] [COM] MR wake on lan bit unimplemented");
748 }
749 if mode.pb_enabled() != Mode::default().pb_enabled() {
750 log::warn!("[W] [COM] MR ping block bit unimplemented");
751 }
752 if mode.pppoe_enabled() != Mode::default().pppoe_enabled() {
753 log::warn!("[W] [COM] MR PPPoE bit unimplemented");
754 }
755 if mode.farp_enabled() != Mode::default().farp_enabled() {
756 log::warn!("[W] [COM] MR force ARP bit unimplemented");
757 }
758 }
759 Ok(Reg::GAR0) => {
760 let [_, b, c, d] = self.regs.gar.octets();
761 self.regs.gar = Ipv4Addr::new(byte, b, c, d);
762 }
763 Ok(Reg::GAR1) => {
764 let [a, _, c, d] = self.regs.gar.octets();
765 self.regs.gar = Ipv4Addr::new(a, byte, c, d);
766 }
767 Ok(Reg::GAR2) => {
768 let [a, b, _, d] = self.regs.gar.octets();
769 self.regs.gar = Ipv4Addr::new(a, b, byte, d);
770 }
771 Ok(Reg::GAR3) => {
772 let [a, b, c, _] = self.regs.gar.octets();
773 self.regs.gar = Ipv4Addr::new(a, b, c, byte);
774 }
775 Ok(Reg::SUBR0) => {
776 let [_, b, c, d] = self.regs.subr.octets();
777 self.regs.subr = Ipv4Addr::new(byte, b, c, d);
778 }
779 Ok(Reg::SUBR1) => {
780 let [a, _, c, d] = self.regs.subr.octets();
781 self.regs.subr = Ipv4Addr::new(a, byte, c, d);
782 }
783 Ok(Reg::SUBR2) => {
784 let [a, b, _, d] = self.regs.subr.octets();
785 self.regs.subr = Ipv4Addr::new(a, b, byte, d);
786 }
787 Ok(Reg::SUBR3) => {
788 let [a, b, c, _] = self.regs.subr.octets();
789 self.regs.subr = Ipv4Addr::new(a, b, c, byte);
790 }
791 Ok(Reg::SHAR0) => self.regs.shar.octets[0] = byte,
792 Ok(Reg::SHAR1) => self.regs.shar.octets[1] = byte,
793 Ok(Reg::SHAR2) => self.regs.shar.octets[2] = byte,
794 Ok(Reg::SHAR3) => self.regs.shar.octets[3] = byte,
795 Ok(Reg::SHAR4) => self.regs.shar.octets[4] = byte,
796 Ok(Reg::SHAR5) => self.regs.shar.octets[5] = byte,
797 Ok(Reg::SIPR0) => {
798 let [_, b, c, d] = self.regs.sipr.octets();
799 self.regs.sipr = Ipv4Addr::new(byte, b, c, d);
800 }
801 Ok(Reg::SIPR1) => {
802 let [a, _, c, d] = self.regs.sipr.octets();
803 self.regs.sipr = Ipv4Addr::new(a, byte, c, d);
804 }
805 Ok(Reg::SIPR2) => {
806 let [a, b, _, d] = self.regs.sipr.octets();
807 self.regs.sipr = Ipv4Addr::new(a, b, byte, d);
808 }
809 Ok(Reg::SIPR3) => {
810 let [a, b, c, _] = self.regs.sipr.octets();
811 self.regs.sipr = Ipv4Addr::new(a, b, c, byte);
812 }
813 Ok(Reg::INTLEVEL0) => {
814 self.regs.intlevel &= 0x00FF;
815 self.regs.intlevel |= u16::from(byte) << 8;
816 }
817 Ok(Reg::INTLEVEL1) => {
818 self.regs.intlevel &= 0xFF00;
819 self.regs.intlevel |= u16::from(byte);
820 }
821 Ok(Reg::IR) => self.regs.ir = byte,
822 Ok(Reg::IMR) => self.regs.imr = byte,
823 Ok(Reg::SIR) => self.regs.sir = byte,
824 Ok(Reg::SIMR) => self.regs.simr = byte,
825 Ok(Reg::RTR0) => {
826 self.regs.rtr &= 0x00FF;
827 self.regs.rtr |= u16::from(byte) << 8;
828 }
829 Ok(Reg::RTR1) => {
830 self.regs.rtr &= 0xFF00;
831 self.regs.rtr |= u16::from(byte);
832 }
833 Ok(Reg::RCR) => self.regs.rcr = byte,
834 Ok(Reg::PTIMER) => self.regs.ptimer = byte,
835 Ok(Reg::PMAGIC) => self.regs.pmagic = byte,
836 Ok(Reg::PHAR0) => self.regs.phar.octets[0] = byte,
837 Ok(Reg::PHAR1) => self.regs.phar.octets[1] = byte,
838 Ok(Reg::PHAR2) => self.regs.phar.octets[2] = byte,
839 Ok(Reg::PHAR3) => self.regs.phar.octets[3] = byte,
840 Ok(Reg::PHAR4) => self.regs.phar.octets[4] = byte,
841 Ok(Reg::PHAR5) => self.regs.phar.octets[5] = byte,
842 Ok(Reg::PSID0) => {
843 self.regs.psid &= 0x00FF;
844 self.regs.psid |= u16::from(byte) << 8;
845 }
846 Ok(Reg::PSID1) => {
847 self.regs.psid &= 0xFF00;
848 self.regs.psid |= u16::from(byte);
849 }
850 Ok(Reg::PMRU0) => {
851 self.regs.pmru &= 0x00FF;
852 self.regs.pmru |= u16::from(byte) << 8;
853 }
854 Ok(Reg::PMRU1) => {
855 self.regs.pmru &= 0xFF00;
856 self.regs.pmru |= u16::from(byte);
857 }
858 Ok(Reg::UIPR0) => (),
859 Ok(Reg::UIPR1) => (),
860 Ok(Reg::UIPR2) => (),
861 Ok(Reg::UIPR3) => (),
862 Ok(Reg::UPORTR0) => (),
863 Ok(Reg::UPORTR1) => (),
864 Ok(Reg::PHYCFGR) => self.regs.phycfgr = byte,
865 Ok(Reg::VERSIONR) => (),
866 Err(_) => (),
867 };
868
869 let (name, level): (String, log::Level) = match decoded {
870 Ok(reg) => {
871 if reg.is_ro() {
872 (format!("{reg:?} is read-only"), log::Level::Error)
873 } else {
874 (format!("{reg:?}"), log::Level::Trace)
875 }
876 }
877 Err(_) => (String::from("INVALID"), log::Level::Error),
878 };
879
880 log::log!(level, "[W] [COM] {addr:04X} <- {byte:02X} {name}");
881
882 Ok(())
883 }
884
885 fn socket_reg_rd(&mut self, addr: u16, sn: Sn) -> io::Result<u8> {
886 let decoded = SnReg::try_from(addr);
887 let socket: &Socket = self.socket(sn);
888
889 let ret: u8 = match decoded {
890 Ok(SnReg::MR) => socket.regs.mr,
891 Ok(SnReg::CR) => socket.regs.cr,
892 Ok(SnReg::IR) => socket.regs.ir.into(),
893 Ok(SnReg::SR) => socket.regs.sr.into(),
894 Ok(SnReg::PORT0) => socket.regs.port.to_be_bytes()[0],
895 Ok(SnReg::PORT1) => socket.regs.port.to_be_bytes()[1],
896 Ok(SnReg::DHAR0) => socket.regs.dhar.octets[0],
897 Ok(SnReg::DHAR1) => socket.regs.dhar.octets[1],
898 Ok(SnReg::DHAR2) => socket.regs.dhar.octets[2],
899 Ok(SnReg::DHAR3) => socket.regs.dhar.octets[3],
900 Ok(SnReg::DHAR4) => socket.regs.dhar.octets[4],
901 Ok(SnReg::DHAR5) => socket.regs.dhar.octets[5],
902 Ok(SnReg::DIPR0) => socket.regs.dipr.octets()[0],
903 Ok(SnReg::DIPR1) => socket.regs.dipr.octets()[1],
904 Ok(SnReg::DIPR2) => socket.regs.dipr.octets()[2],
905 Ok(SnReg::DIPR3) => socket.regs.dipr.octets()[3],
906 Ok(SnReg::DPORT0) => socket.regs.dport.to_be_bytes()[0],
907 Ok(SnReg::DPORT1) => socket.regs.dport.to_be_bytes()[1],
908 Ok(SnReg::MSSR0) => socket.regs.mssr.to_be_bytes()[0],
909 Ok(SnReg::MSSR1) => socket.regs.mssr.to_be_bytes()[1],
910 Ok(SnReg::TOS) => socket.regs.tos,
911 Ok(SnReg::TTL) => socket.regs.ttl,
912 Ok(SnReg::RXBUF_SIZE) => socket.regs.rxbuf_size.into(),
913 Ok(SnReg::TXBUF_SIZE) => socket.regs.txbuf_size.into(),
914 Ok(SnReg::TX_FSR0) => socket.regs.tx_fsr.to_be_bytes()[0],
915 Ok(SnReg::TX_FSR1) => socket.regs.tx_fsr.to_be_bytes()[1],
916 Ok(SnReg::TX_RD0) => socket.regs.tx_rd.to_be_bytes()[0],
917 Ok(SnReg::TX_RD1) => socket.regs.tx_rd.to_be_bytes()[1],
918 Ok(SnReg::TX_WR0) => socket.regs.tx_wr.to_be_bytes()[0],
919 Ok(SnReg::TX_WR1) => socket.regs.tx_wr.to_be_bytes()[1],
920 Ok(SnReg::RX_RSR0) => socket.regs.rx_rsr.to_be_bytes()[0],
921 Ok(SnReg::RX_RSR1) => socket.regs.rx_rsr.to_be_bytes()[1],
922 Ok(SnReg::RX_RD0) => socket.regs.rx_rd.to_be_bytes()[0],
923 Ok(SnReg::RX_RD1) => socket.regs.rx_rd.to_be_bytes()[1],
924 Ok(SnReg::RX_WR0) => socket.regs.rx_wr.to_be_bytes()[0],
925 Ok(SnReg::RX_WR1) => socket.regs.rx_wr.to_be_bytes()[1],
926 Ok(SnReg::IMR) => socket.regs.imr,
927 Ok(SnReg::FRAG0) => socket.regs.frag.to_be_bytes()[0],
928 Ok(SnReg::FRAG1) => socket.regs.frag.to_be_bytes()[1],
929 Ok(SnReg::KPALVTR) => socket.regs.kpalvtr,
930 Err(_) => 0x00,
931 };
932
933 let (name, level): (String, log::Level) = match decoded {
934 Ok(reg) => (format!("{reg:?}"), log::Level::Trace),
935 Err(_) => (String::from("INVALID"), log::Level::Error),
936 };
937 log::log!(level, "[R] [{sn:?}] {addr:04X} -> {ret:02X} {name}");
938
939 if !matches!(decoded, Ok(SnReg::RX_RSR0)) {
940 self.check_socket(sn)?;
941 }
942
943 Ok(ret)
944 }
945
946 fn socket_reg_wr(&mut self, addr: u16, byte: u8, sn: Sn) -> io::Result<()> {
947 let decoded = SnReg::try_from(addr);
948 let socket: &mut Socket = self.socket_mut(sn);
949
950 match decoded {
951 Ok(SnReg::MR) => {
952 socket.regs.mr = byte;
953 }
954 Ok(SnReg::CR) => match SocketCommand::try_from(byte) {
955 Ok(SocketCommand::Open) => self.socket_cmd_open(sn)?,
956 Ok(SocketCommand::Connect) => self.socket_cmd_connect(sn)?,
957 Ok(SocketCommand::Close) => self.socket_cmd_close(sn),
958 Ok(SocketCommand::Send) => self.socket_cmd_send(sn)?,
959 Ok(SocketCommand::Recv) => self.socket_cmd_recv(sn)?,
960 Ok(SocketCommand::Listen) => self.socket_cmd_listen(sn)?,
961 cmd => unimplemented!("[W] [{sn:?}] command {cmd:?}"),
962 },
963 Ok(SnReg::IR) => {
964 let ir: SocketInterrupt = byte.into();
965
966 if socket.regs.ir.con_raised() & ir.con_raised() {
967 log::debug!("[{sn:?}] clearing CON_MASK interrupt");
968 socket.regs.ir = (!SocketInterrupt::CON_MASK & u8::from(socket.regs.ir)).into();
969 }
970 if socket.regs.ir.discon_raised() & ir.discon_raised() {
971 log::debug!("[{sn:?}] clearing DISCON_MASK interrupt");
972 socket.regs.ir =
973 (!SocketInterrupt::DISCON_MASK & u8::from(socket.regs.ir)).into();
974 }
975 if socket.regs.ir.recv_raised() & ir.recv_raised() {
976 log::debug!("[{sn:?}] clearing RECV_MASK interrupt");
977 socket.regs.ir =
978 (!SocketInterrupt::RECV_MASK & u8::from(socket.regs.ir)).into();
979 }
980 if socket.regs.ir.timeout_raised() & ir.timeout_raised() {
981 log::debug!("[{sn:?}] clearing TIMEOUT_MASK interrupt");
982 socket.regs.ir =
983 (!SocketInterrupt::TIMEOUT_MASK & u8::from(socket.regs.ir)).into();
984 }
985 if socket.regs.ir.sendok_raised() & ir.sendok_raised() {
986 log::debug!("[{sn:?}] clearing SENDOK_MASK interrupt");
987 socket.regs.ir =
988 (!SocketInterrupt::SENDOK_MASK & u8::from(socket.regs.ir)).into();
989 }
990
991 if u8::from(socket.regs.ir) & socket.regs.imr & 0x1F == 0 {
992 self.regs.sir &= !sn.bitmask();
993 }
994 }
995 Ok(SnReg::SR) => (),
996 Ok(SnReg::PORT0) => {
997 socket.regs.port &= 0x00FF;
998 socket.regs.port |= u16::from(byte) << 8;
999 }
1000 Ok(SnReg::PORT1) => {
1001 socket.regs.port &= 0xFF00;
1002 socket.regs.port |= u16::from(byte);
1003 }
1004 Ok(SnReg::DHAR0) => socket.regs.dhar.octets[0] = byte,
1005 Ok(SnReg::DHAR1) => socket.regs.dhar.octets[1] = byte,
1006 Ok(SnReg::DHAR2) => socket.regs.dhar.octets[2] = byte,
1007 Ok(SnReg::DHAR3) => socket.regs.dhar.octets[3] = byte,
1008 Ok(SnReg::DHAR4) => socket.regs.dhar.octets[4] = byte,
1009 Ok(SnReg::DHAR5) => socket.regs.dhar.octets[5] = byte,
1010 Ok(SnReg::DIPR0) => {
1011 let [_, b, c, d] = socket.regs.dipr.octets();
1012 socket.regs.dipr = Ipv4Addr::new(byte, b, c, d);
1013 }
1014 Ok(SnReg::DIPR1) => {
1015 let [a, _, c, d] = socket.regs.dipr.octets();
1016 socket.regs.dipr = Ipv4Addr::new(a, byte, c, d);
1017 }
1018 Ok(SnReg::DIPR2) => {
1019 let [a, b, _, d] = socket.regs.dipr.octets();
1020 socket.regs.dipr = Ipv4Addr::new(a, b, byte, d);
1021 }
1022 Ok(SnReg::DIPR3) => {
1023 let [a, b, c, _] = socket.regs.dipr.octets();
1024 socket.regs.dipr = Ipv4Addr::new(a, b, c, byte);
1025 }
1026 Ok(SnReg::DPORT0) => {
1027 socket.regs.dport &= 0x00FF;
1028 socket.regs.dport |= u16::from(byte) << 8;
1029 }
1030 Ok(SnReg::DPORT1) => {
1031 socket.regs.dport &= 0xFF00;
1032 socket.regs.dport |= u16::from(byte);
1033 }
1034 Ok(SnReg::MSSR0) => todo!(),
1035 Ok(SnReg::MSSR1) => todo!(),
1036 Ok(SnReg::TOS) => todo!(),
1037 Ok(SnReg::TTL) => socket.regs.ttl = byte,
1038 Ok(SnReg::RXBUF_SIZE) => {
1039 socket.regs.rxbuf_size = match BufferSize::try_from(byte) {
1040 Ok(bs) => {
1041 socket.rx_buf.resize(bs.size_in_bytes(), 0);
1042 bs
1043 }
1044 Err(e) => panic!("RX buffer size of {e:#02X} is invalid"),
1045 }
1046 }
1047 Ok(SnReg::TXBUF_SIZE) => {
1048 socket.regs.txbuf_size = match BufferSize::try_from(byte) {
1049 Ok(bs) => {
1050 socket.tx_buf.resize(bs.size_in_bytes(), 0);
1051 bs
1052 }
1053 Err(e) => panic!("TX buffer size of {e:#02X} is invalid"),
1054 }
1055 }
1056 Ok(SnReg::TX_FSR0) => (),
1057 Ok(SnReg::TX_FSR1) => (),
1058 Ok(SnReg::TX_RD0) => (),
1059 Ok(SnReg::TX_RD1) => (),
1060 Ok(SnReg::TX_WR0) => {
1061 socket.regs.tx_wr &= 0x00FF;
1062 socket.regs.tx_wr |= u16::from(byte) << 8;
1063 }
1064 Ok(SnReg::TX_WR1) => {
1065 socket.regs.tx_wr &= 0xFF00;
1066 socket.regs.tx_wr |= u16::from(byte);
1067 }
1068 Ok(SnReg::RX_RSR0) => (),
1069 Ok(SnReg::RX_RSR1) => (),
1070 Ok(SnReg::RX_RD0) => {
1071 socket.regs.rx_rd &= 0x00FF;
1072 socket.regs.rx_rd |= u16::from(byte) << 8;
1073 }
1074 Ok(SnReg::RX_RD1) => {
1075 socket.regs.rx_rd &= 0xFF00;
1076 socket.regs.rx_rd |= u16::from(byte);
1077 }
1078 Ok(SnReg::RX_WR0) => todo!(),
1079 Ok(SnReg::RX_WR1) => todo!(),
1080 Ok(SnReg::IMR) => socket.regs.imr = byte,
1081 Ok(SnReg::FRAG0) => todo!(),
1082 Ok(SnReg::FRAG1) => todo!(),
1083 Ok(SnReg::KPALVTR) => todo!(),
1084 Err(_) => (),
1085 }
1086
1087 let (name, level): (String, log::Level) = match decoded {
1088 Ok(reg) => {
1089 if reg.is_ro() {
1090 (format!("{reg:?} is read-only"), log::Level::Error)
1091 } else {
1092 (format!("{reg:?}"), log::Level::Trace)
1093 }
1094 }
1095 Err(_) => (String::from("INVALID"), log::Level::Error),
1096 };
1097
1098 log::log!(level, "[W] [{sn:?}] {addr:04X} <- {byte:02X} {name}");
1099
1100 Ok(())
1101 }
1102}
1103
1104impl Default for W5500 {
1105 fn default() -> Self {
1106 Self {
1107 regs: CommonRegs::RESET,
1108 sn: Default::default(),
1109 socket_buffer_logging: true,
1110 corpus: None,
1111 }
1112 }
1113}
1114
1115impl Registers for W5500 {
1116 type Error = std::io::ErrorKind;
1117
1118 fn read(&mut self, addr: u16, block: u8, data: &mut [u8]) -> Result<(), Self::Error> {
1119 let mut addr: u16 = addr;
1120
1121 match block_type(block) {
1122 BlockType::Common => {
1123 data.iter_mut().for_each(|byte| {
1124 *byte = self.common_reg_rd(addr);
1125 self.log_byte(*byte);
1126 addr = addr.wrapping_add(1);
1127 });
1128 Ok(())
1129 }
1130 BlockType::Socket(sn) => {
1131 for byte in data.iter_mut() {
1132 *byte = self.socket_reg_rd(addr, sn).map_err(|e| e.kind())?;
1133 self.log_byte(*byte);
1134 addr = addr.wrapping_add(1);
1135 }
1136 Ok(())
1137 }
1138 BlockType::Rx(sn) => {
1139 data.iter_mut().for_each(|byte| {
1140 let buf_size: usize = self.sn[usize::from(sn)].rx_buf.len();
1141 *byte = self.sn[usize::from(sn)].rx_buf[usize::from(addr) % buf_size];
1142 self.log_byte(*byte);
1143 if self.socket_buffer_logging {
1144 log::trace!("[R] [RXB] {addr:04X} -> {:02X}", *byte);
1145 }
1146 addr = addr.wrapping_add(1);
1147 });
1148 Ok(())
1149 }
1150 BlockType::Tx(sn) => {
1151 data.iter_mut().for_each(|byte| {
1152 let buf_size: usize = self.sn[usize::from(sn)].tx_buf.len();
1153 *byte = self.sn[usize::from(sn)].tx_buf[usize::from(addr) % buf_size];
1154 self.log_byte(*byte);
1155 if self.socket_buffer_logging {
1156 log::trace!("[R] [TXB] {addr:04X} -> {:02X}", *byte);
1157 }
1158 addr = addr.wrapping_add(1);
1159 });
1160 Ok(())
1161 }
1162 }
1163 }
1164
1165 fn write(&mut self, addr: u16, block: u8, data: &[u8]) -> Result<(), Self::Error> {
1167 let mut addr: u16 = addr;
1168
1169 match block_type(block) {
1170 BlockType::Common => {
1171 for byte in data {
1172 self.common_reg_wr(addr, *byte).map_err(|e| e.kind())?;
1173 addr = addr.wrapping_add(1);
1174 }
1175 Ok(())
1176 }
1177 BlockType::Socket(sn) => {
1178 for byte in data {
1179 self.socket_reg_wr(addr, *byte, sn).map_err(|e| e.kind())?;
1180 addr = addr.wrapping_add(1);
1181 }
1182 Ok(())
1183 }
1184 BlockType::Rx(sn) => {
1185 data.iter().for_each(|byte| {
1186 if self.socket_buffer_logging {
1187 log::trace!("[W] [RXB] {addr:04X} <- {:02X}", *byte);
1188 }
1189 let buf_size: usize = self.sn[usize::from(sn)].rx_buf.len();
1190 self.sn[usize::from(sn)].rx_buf[usize::from(addr) % buf_size] = *byte;
1191 addr = addr.wrapping_add(1);
1192 });
1193 Ok(())
1194 }
1195 BlockType::Tx(sn) => {
1196 data.iter().for_each(|byte| {
1197 if self.socket_buffer_logging {
1198 log::trace!("[W] [TXB] {addr:04X} <- {:02X}", *byte);
1199 }
1200 let buf_size: usize = self.sn[usize::from(sn)].tx_buf.len();
1201 self.sn[usize::from(sn)].tx_buf[usize::from(addr) % buf_size] = *byte;
1202 addr = addr.wrapping_add(1);
1203 });
1204 Ok(())
1205 }
1206 }
1207 }
1208}
1209
1210impl w5500_ll::aio::Registers for W5500 {
1211 type Error = std::io::ErrorKind;
1212
1213 async fn read(&mut self, address: u16, block: u8, data: &mut [u8]) -> Result<(), Self::Error> {
1214 w5500_ll::Registers::read(self, address, block, data)
1215 }
1216
1217 async fn write(&mut self, address: u16, block: u8, data: &[u8]) -> Result<(), Self::Error> {
1218 w5500_ll::Registers::write(self, address, block, data)
1219 }
1220}