smoltcp
smoltcp 介绍
smoltcp 在 arceos 上的实现分析
SOCKET_SET.poll_interfaces()调用ETH0.poll()。ETH0.poll()调用dev.poll()并且对 buf 进行snoop_tcp_packet处理。dev.poll()不断从真实网卡里接收 packet 并将其 push_back 到rx_buf_queue中。dev 有个
receive方法不断从rx_buf_queue队列中 pop 出 packet。dev 实现了
smoltcp::phy::Devicetrait 中的receive方法通过调用 dev 的receive方法从队列中拿出 packet 用来消耗。在
SOCKET_SET调用poll_interfaces()后应当在队列中有 packets。随后在
TcpSocket::recv()中继续调用SOCKET_SET.with_socket_mut::<tcp::Socket, _, _>(handle, f|socket|{...})。在
InterfaceWrapper::poll()中也调用了iface.poll()。iface 是 smoltcp 的 Interface 类型,poll()方法的作用是传输在给定 sockets 中缓存的 packets,接收在设备缓存在设备中的 packets。在
Interface::poll()方法中调用了self.socket_ingress()和self.socket_egress()方法。socket_ingress()从 device 中receive()一个rx_token然后对于这个rx_token进行 consume,若为Ethernet的话则进行process_ethernet以及dispatch的处理。process_ethernet()进行预处理将其变成Packet结构,在process_ethernet()中调用process_ipv4(),随后process_ipv4()调用process_tcp()并将其放入Socket.rx_buffer中 。