%3C%21DOCTYPE%20html%3E%0A%3Chtml%3E%0A%3Cbody%3E%0A%3Ch1%3ERust%20for%20Linux%3A%20%E4%BB%8E%E9%9B%B6%E7%BC%96%E5%86%99%E9%AB%98%E6%80%A7%E8%83%BD%E7%BD%91%E7%BB%9CTap%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%3C/h1%3E%0A%0A%3Cblockquote%3E%3Cp%3E%E5%8F%91%E5%B8%83%E6%97%B6%E9%97%B4%EF%BC%9A2026%E5%B9%B410%E6%9C%88%20%7C%20%E5%AD%97%E6%95%B0%EF%BC%9A%E7%BA%A6%202600%20%E5%AD%97%20%7C%20%E9%9A%BE%E5%BA%A6%EF%BC%9A%E9%AB%98%E7%BA%A7%3C/p%3E%3C/blockquote%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E5%BC%95%E8%A8%80%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E7%94%A8%20Rust%20%E5%86%99%E5%86%85%E6%A0%B8%E7%BD%91%E7%BB%9C%E9%A9%B1%E5%8A%A8%EF%BC%9F%3C/h2%3E%0A%0A%3Cp%3E%E8%87%AA%202022%20%E5%B9%B4%20Rust%20%E6%AD%A3%E5%BC%8F%E5%90%88%E5%85%A5%20Linux%20%E4%B8%BB%E7%BA%BF%EF%BC%88v6.1%EF%BC%89%E4%BB%A5%E6%9D%A5%EF%BC%8C%E7%A4%BE%E5%8C%BA%E9%99%86%E7%BB%AD%E5%87%BA%E7%8E%B0%E4%BA%86%20%3Ccode%3Erust_out_of_tree%3C/code%3E%E3%80%81%3Ccode%3Edrm%3C/code%3E%20%E9%A9%B1%E5%8A%A8%E3%80%81%3Ccode%3ENVMe%3C/code%3E%20%E9%A9%B1%E5%8A%A8%E7%AD%89%E5%AE%9E%E8%B7%B5%E3%80%82%E4%BD%86%E3%80%8C%E7%BD%91%E7%BB%9C%E5%AD%90%E7%B3%BB%E7%BB%9F%E3%80%8D%E5%A7%8B%E7%BB%88%E6%98%AF%20Rust%20for%20Linux%20%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%A1%AC%E9%AA%A8%E5%A4%B4%E2%80%94%E2%80%94%E5%AE%83%E6%B6%89%E5%8F%8A%20%3Ccode%3Esk_buff%3C/code%3E%20%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%AE%A1%E7%90%86%E3%80%81NAPI%20%E8%BD%AE%E8%AF%A2%E9%94%81%E8%AF%AD%E4%B9%89%E3%80%81%3Ccode%3Enet_device_ops%3C/code%3E%20%E8%99%9A%E8%A1%A8%E6%98%A0%E5%B0%84%E7%AD%89%E5%A4%8D%E6%9D%82%E5%9C%BA%E6%99%AF%E3%80%82%3C/p%3E%0A%0A%3Cp%3E%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E4%B8%8D%E4%BC%9A%E9%87%8D%E5%A4%8D%E5%B7%B2%E6%9C%89%E7%9A%84%20Rust%20for%20Linux%20%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%8C%E8%80%8C%E6%98%AF%E4%BB%8E%E9%9B%B6%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%3Cstrong%3E%E5%9F%BA%E4%BA%8E%20virtio%20%E7%9A%84%E5%85%A8%E5%8A%9F%E8%83%BD%20TUN/TAP%20%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%3C/strong%3E%EF%BC%8C%E5%AE%8C%E6%95%B4%E8%A6%86%E7%9B%96%EF%BC%9A%3C/p%3E%0A%0A%3Cul%3E%3Cli%3ERust%20%E4%B8%8E%E5%86%85%E6%A0%B8%20C%20%E7%BB%93%E6%9E%84%E4%BD%93%E7%9A%84%20FFI%20%E6%98%A0%E5%B0%84%3C/li%3E%0A%3Cli%3Esk_buff%20%E7%9A%84%E5%AE%89%E5%85%A8%E5%B0%81%E8%A3%85%E4%B8%8E%E9%9B%B6%E6%8B%B7%E8%B4%9D%20RX%20%E8%B7%AF%E5%BE%84%3C/li%3E%0A%3Cli%3ENAPI%20%E6%9D%83%E9%87%8D%E8%BD%AE%E8%AF%A2%E7%9A%84%20Rust%20trait%20%E6%8A%BD%E8%B1%A1%3C/li%3E%0A%3Cli%3E%3Ccode%3Eethtool%3C/code%3E%20%E7%BB%9F%E8%AE%A1%E8%AE%A1%E6%95%B0%E4%B8%8E%20ethtool%20ops%20%E5%AE%9E%E7%8E%B0%3C/li%3E%0A%3Cli%3E%E4%B8%80%E4%B8%AA%E5%9B%A0%20%3Ccode%3EKASAN%3C/code%3E%20%E6%9A%B4%E9%9C%B2%E7%9A%84%20UAF%20%E6%A1%88%E4%BE%8B%E4%B8%8E%E4%BF%AE%E5%A4%8D%E5%85%A8%E6%B5%81%E7%A8%8B%3C/li%3E%3C/ul%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87%3C/h2%3E%0A%0A%3Cpre%3E%3Ccode%3E%23%20%E5%86%85%E6%A0%B8%E9%85%8D%E7%BD%AE%0ACONFIG_RUST%3Dy%0ACONFIG_RUST_IS_AVAILABLE%3Dy%0ACONFIG_SAMPLES_RUST%3Dy%0A%23%20%E6%A3%80%E6%9F%A5%20Rust%20%E5%B7%A5%E5%85%B7%E9%93%BE%0Arustc%20--version%20%20%23%20%E9%9C%80%E8%A6%81%20nightly%20%E4%B8%94%E5%B8%A6%E6%9C%89%20linux%20target%0Amake%20LLVM%3D1%20-j%24%28nproc%29%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%E9%A1%B9%E7%9B%AE%E4%BE%9D%E8%B5%96%EF%BC%88%3Ccode%3ECargo.toml%3C/code%3E%EF%BC%89%EF%BC%9A%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3E%5Bpackage%5D%0Aname%20%3D%20%22rust-tap-drv%22%0Aversion%20%3D%20%220.1.0%22%0Aedition%20%3D%20%222024%22%0A%0A%5Bdependencies%5D%0Akernel%20%3D%20%7B%20git%20%3D%20%22https%3A//github.com/Rust-for-Linux/linux.git%22%2C%20package%20%3D%20%22kernel%22%20%7D%0A%0A%5Blib%5D%0Acrate-type%20%3D%20%5B%22cdylib%22%5D%3C/code%3E%3C/pre%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E4%B8%80%E3%80%81%E7%BD%91%E7%BB%9C%E8%AE%BE%E5%A4%87%E6%B3%A8%E5%86%8C%EF%BC%9A%E4%BB%8E%20%3Ccode%3Enet_device%3C/code%3E%20%E5%88%B0%20Rust%20%E7%BB%93%E6%9E%84%E4%BD%93%3C/h2%3E%0A%0A%3Cp%3E%E5%86%85%E6%A0%B8%E4%B8%AD%E6%AF%8F%E4%B8%AA%E7%BD%91%E7%BB%9C%E8%AE%BE%E5%A4%87%E7%94%B1%E4%B8%80%E4%B8%AA%20%3Ccode%3Estruct%20net_device%3C/code%3E%20%E8%A1%A8%E7%A4%BA%E3%80%82Rust%20%E5%B0%81%E8%A3%85%E7%9A%84%E6%A0%B8%E5%BF%83%E6%8C%91%E6%88%98%E5%9C%A8%E4%BA%8E%EF%BC%9AC%20%E4%BE%A7%E5%88%86%E9%85%8D%E5%86%85%E5%AD%98%E3%80%81Rust%20%E4%BE%A7%E9%80%9A%E8%BF%87%E5%BC%95%E7%94%A8%E6%93%8D%E4%BD%9C%EF%BC%8C%E4%B8%94%E5%BF%85%E9%A1%BB%E6%AD%A3%E7%A1%AE%E5%AE%9E%E7%8E%B0%20%3Ccode%3EDrop%3C/code%3E%E3%80%82%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3E//%20rust_tap.rs%0Ause%20kernel%3A%3Anet%3A%3ADevice%3B%0Ause%20kernel%3A%3Aprelude%3A%3A%2A%3B%0Ause%20kernel%3A%3Ac_types%3B%0A%0Amodule%21%20%7B%0A%20%20%20%20type%3A%20RustTapDriver%2C%0A%20%20%20%20name%3A%20%22rust_tap_drv%22%2C%0A%20%20%20%20author%3A%20%22ybb%22%2C%0A%20%20%20%20license%3A%20%22GPL%22%2C%0A%7D%0A%0Astruct%20RustTapDev%20%7B%0A%20%20%20%20netdev%3A%20net%3A%3ADevice%2C%0A%20%20%20%20stats%3A%20SpinLock%26lt%3BRustTapStats%26gt%3B%2C%0A%20%20%20%20rx_ring%3A%20RingBuffer%2C%0A%7D%0A%0Astruct%20RustTapStats%20%7B%0A%20%20%20%20rx_packets%3A%20AtomicU64%2C%0A%20%20%20%20tx_packets%3A%20AtomicU64%2C%0A%20%20%20%20rx_bytes%3A%20AtomicU64%2C%0A%20%20%20%20tx_bytes%3A%20AtomicU64%2C%0A%20%20%20%20rx_dropped%3A%20AtomicU64%2C%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%3E%E5%85%B3%E9%94%AE%EF%BC%9A%E7%BD%91%E7%BB%9C%E8%AE%BE%E5%A4%87%E6%B3%A8%E5%86%8C%E7%9A%84%20Drop%20%E5%AE%89%E5%85%A8%E6%80%A7%3C/h3%3E%0A%0A%3Cpre%3E%3Ccode%3Eimpl%20RustTapDev%20%7B%0A%20%20%20%20fn%20register%28name%3A%20%26amp%3BCStr%29%20-%26gt%3B%20Result%26lt%3BBox%26lt%3BSelf%26gt%3B%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20//%20alloc_etherdev%20%E6%98%AF%20C%20%E4%BE%A7%E5%88%86%E9%85%8D%EF%BC%8C%E8%BF%94%E5%9B%9E%20%2Amut%20net_device%0A%20%20%20%20%20%20%20%20let%20netdev%20%3D%20net%3A%3ADevice%3A%3Aalloc_eth%280%29%0A%20%20%20%20%20%20%20%20%20%20%20%20.with_netdevice_ops%28%26amp%3BNETDEV_OPS%29%3F%3B%0A%0A%20%20%20%20%20%20%20%20netdev.eth_mtu%281500%29%3B%0A%20%20%20%20%20%20%20%20netdev.flags%20%7C%3D%20net%3A%3AIFF_NOARP%3B%0A%20%20%20%20%20%20%20%20netdev.netdev_ops%20%3D%20%26amp%3BNETDEV_OPS%3B%0A%0A%20%20%20%20%20%20%20%20//%20register_netdev%20%E4%B9%8B%E5%90%8E%E8%AE%BE%E5%A4%87%E4%B8%8A%E7%BA%BF%EF%BC%8C%E5%8F%AF%E5%BC%80%E5%A7%8B%E6%94%B6%E5%8C%85%0A%20%20%20%20%20%20%20%20net%3A%3Aregister%28%26amp%3Bnetdev%29%3F%3B%0A%0A%20%20%20%20%20%20%20%20Ok%28Box%3A%3Atry_new%28RustTapDev%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20netdev%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20stats%3A%20SpinLock%3A%3Anew%28RustTapStats%3A%3Adefault%28%29%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20rx_ring%3A%20RingBuffer%3A%3Anew%281024%29%3F%2C%0A%20%20%20%20%20%20%20%20%7D%29%3F%29%0A%20%20%20%20%7D%0A%7D%0A%0A//%20Drop%20%E9%80%86%E5%BA%8F%EF%BC%9A%E5%85%88%20unregister%20%E5%86%8D%E9%87%8A%E6%94%BE%0Aimpl%20Drop%20for%20RustTapDev%20%7B%0A%20%20%20%20fn%20drop%28%26amp%3Bmut%20self%29%20%7B%0A%20%20%20%20%20%20%20%20net%3A%3Aunregister%28%26amp%3Bself.netdev%29%3B%0A%20%20%20%20%7D%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%E8%BF%99%E9%87%8C%20Rust%20%E6%89%80%E6%9C%89%E6%9D%83%E7%B3%BB%E7%BB%9F%E4%BF%9D%E8%AF%81%E4%BA%86%E4%B8%80%E4%B8%AA%E9%93%81%E5%BE%8B%EF%BC%9A%3Cstrong%3E%E8%AE%BE%E5%A4%87%E5%BF%85%E9%A1%BB%E5%85%88%20unregister%20%E6%89%8D%E8%83%BD%E9%87%8A%E6%94%BE%3C/strong%3E%E3%80%82%E5%A6%82%E6%9E%9C%E4%BD%A0%E5%9C%A8%E6%8C%81%E6%9C%89%20%3Ccode%3E%26mut%20netdev%3C/code%3E%20%E6%97%B6%E6%84%8F%E5%A4%96%E8%A7%A6%E5%8F%91%20%3Ccode%3Eunregister%3C/code%3E%E2%80%94%E2%80%94C%20%E4%BE%A7%E5%85%81%E8%AE%B8%EF%BC%8CRust%20%E4%BE%A7%E7%9A%84%20borrow%20checker%20%E5%9C%A8%20FFI%20%E8%BE%B9%E7%95%8C%E6%97%A0%E6%B3%95%E9%98%BB%E6%AD%A2%E2%80%94%E2%80%94%E8%BF%99%E6%98%AF%E5%AE%9E%E6%88%98%E4%B8%AD%E6%9C%80%E5%AE%B9%E6%98%93%E8%B8%A9%E7%9A%84%E5%9D%91%E3%80%82%3C/p%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E4%BA%8C%E3%80%81RX%20%E8%B7%AF%E5%BE%84%EF%BC%9Ask_buff%20%E5%B0%81%E8%A3%85%E4%B8%8E%E9%9B%B6%E6%8B%B7%E8%B4%9D%3C/h2%3E%0A%0A%3Ch3%3E2.1%20%E4%BC%A0%E7%BB%9F%20C%20%E8%B7%AF%E5%BE%84%E7%9A%84%E7%97%9B%E7%82%B9%3C/h3%3E%0A%0A%3Cp%3E%E4%BC%A0%E7%BB%9F%20TUN%20%E9%A9%B1%E5%8A%A8%E4%B8%AD%EF%BC%8CRX%20%E8%B7%AF%E5%BE%84%E7%9A%84%E6%A0%B8%E5%BF%83%E6%93%8D%E4%BD%9C%E6%98%AF%EF%BC%9A%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3Estruct%20sk_buff%20%2Askb%20%3D%20netdev_alloc_skb%28dev%2C%20len%29%3B%0Askb_put%28skb%2C%20len%29%3B%0Amemcpy%28skb_data%28skb%29%2C%20buffer%2C%20len%29%3B%0Anetif_rx%28skb%29%3B%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%E9%97%AE%E9%A2%98%E5%9C%A8%E4%BA%8E%EF%BC%9A%3C/p%3E%0A%3Col%3E%3Cli%3E%3Ccode%3Enetdev_alloc_skb%3C/code%3E%20%2B%20%3Ccode%3Ememcpy%3C/code%3E%20%E5%B8%A6%E6%9D%A5%E4%B8%80%E6%AC%A1%E5%AE%8C%E6%95%B4%E7%9A%84%E5%86%85%E5%AD%98%E6%8B%B7%E8%B4%9D%3C/li%3E%0A%3Cli%3E%E5%A6%82%E6%9E%9C%E5%8D%8F%E8%AE%AE%E6%A0%88%E4%B8%8D%E9%9C%80%E8%A6%81%E8%BF%99%E4%BB%BD%E6%95%B0%E6%8D%AE%EF%BC%88%E8%A2%AB%20iptables%20DROP%EF%BC%89%EF%BC%8C%E8%BF%99%E6%AC%A1%E6%8B%B7%E8%B4%9D%E7%BA%AF%E5%B1%9E%E6%B5%AA%E8%B4%B9%3C/li%3E%0A%3Cli%3E%E5%A4%9A%E9%98%9F%E5%88%97%E5%9C%BA%E6%99%AF%E4%B8%8B%20%3Ccode%3Eskb-%3Etruesize%3C/code%3E%20%E4%BC%9A%E8%AE%A1%E5%85%A5%20socket%20%E7%BC%93%E5%86%B2%E5%8C%BA%EF%BC%8C%E5%BC%95%E5%8F%91%20TCP%20%E5%85%A8%E5%B1%80%E5%86%85%E5%AD%98%E5%8E%8B%E5%8A%9B%3C/li%3E%3C/ol%3E%0A%0A%3Ch3%3E2.2%20Rust%20%E5%B0%81%E8%A3%85%E4%B8%8E%E9%9B%B6%E6%8B%B7%E8%B4%9D%20RX%3C/h3%3E%0A%0A%3Cpre%3E%3Ccode%3Eimpl%20RustTapDev%20%7B%0A%20%20%20%20///%20%E4%BB%8E%20virtqueue%20%E7%9B%B4%E6%8E%A5%E6%9E%84%E9%80%A0%20sk_buf%EF%BC%8C%E9%81%BF%E5%85%8D%E4%B8%AD%E9%97%B4%E6%8B%B7%E8%B4%9D%0A%20%20%20%20fn%20napi_poll%28%26amp%3Bmut%20self%2C%20budget%3A%20c_int%29%20-%26gt%3B%20c_int%20%7B%0A%20%20%20%20%20%20%20%20let%20mut%20work_done%3A%20c_int%20%3D%200%3B%0A%0A%20%20%20%20%20%20%20%20while%20work_done%20%26lt%3B%20budget%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20desc%20%3D%20match%20self.rx_ring.pop%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Some%28d%29%20%3D%26gt%3B%20d%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20None%20%3D%26gt%3B%20break%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20%E7%9B%B4%E6%8E%A5%E5%9C%A8%20DMA%20buffer%20%E4%B8%8A%E6%9E%84%E5%BB%BA%20skb%EF%BC%8C%E5%BC%95%E7%94%A8%E8%80%8C%E9%9D%9E%E6%8B%B7%E8%B4%9D%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20skb%20%3D%20self.alloc_skb_zero_copy%28%26amp%3Bdesc%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20match%20skb%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Ok%28s%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s.protocol%28ETH_P_IP%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20netif_receive_skb%20%E6%AF%94%20netif_rx%20%E6%9B%B4%E5%BF%AB%EF%BC%88softirq%20%E4%B8%8A%E4%B8%8B%E6%96%87%E7%9B%B4%E6%8E%A5%E5%A4%84%E7%90%86%EF%BC%89%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20stats%20%3D%20self.stats.lock%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats.rx_packets.fetch_add%281%2C%20Ordering%3A%3ARelaxed%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats.rx_bytes.fetch_add%28desc.len%20as%20u64%2C%20Ordering%3A%3ARelaxed%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20drop%28stats%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20net%3A%3Areceive_skb%28s%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20work_done%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Err%28_%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%E7%BB%9F%E8%AE%A1%E4%B8%A2%E5%8C%85%EF%BC%8C%E4%BD%86%E4%B8%8D%20panic%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20stats%20%3D%20self.stats.lock%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats.rx_dropped.fetch_add%281%2C%20Ordering%3A%3ARelaxed%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20work_done%20%26lt%3B%20budget%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20napi_complete_done%28%26amp%3Bmut%20self.napi%2C%20work_done%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20%E9%87%8D%E6%96%B0%E5%BC%80%E5%90%AF%E4%B8%AD%E6%96%AD%0A%20%20%20%20%20%20%20%20%20%20%20%20self.enable_rx_irq%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20work_done%0A%20%20%20%20%7D%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%3E2.3%20%E9%9B%B6%E6%8B%B7%E8%B4%9D%E7%9A%84%E6%A0%B8%E5%BF%83%EF%BC%9A%E6%98%A0%E5%B0%84%20DMA%20buffer%3C/h3%3E%0A%0A%3Cpre%3E%3Ccode%3Euse%20kernel%3A%3Adma%3A%3A%7BDmaMapping%2C%20DmaCoherent%7D%3B%0A%0Astruct%20DmaBuffer%26lt%3B%27a%26gt%3B%20%7B%0A%20%20%20%20mapping%3A%20DmaMapping%26lt%3B%27a%2C%20%5Bu8%5D%26gt%3B%2C%0A%20%20%20%20len%3A%20usize%2C%0A%7D%0A%0Aimpl%26lt%3B%27a%26gt%3B%20DmaBuffer%26lt%3B%27a%26gt%3B%20%7B%0A%20%20%20%20fn%20dma_virt%28%26amp%3Bself%29%20-%26gt%3B%20%2Amut%20u8%20%7B%0A%20%20%20%20%20%20%20%20self.mapping.cpu_addr%20as%20%2Amut%20u8%0A%20%20%20%20%7D%0A%0A%20%20%20%20///%20%E5%B0%86%20DMA%20buffer%20%E6%98%A0%E5%B0%84%E5%88%B0%20skb%20frags%EF%BC%8C%E5%AE%9E%E7%8E%B0%E7%9C%9F%E6%AD%A3%E9%9B%B6%E6%8B%B7%E8%B4%9D%0A%20%20%20%20fn%20to_skb_frag%28%26amp%3Bself%2C%20skb%3A%20%26amp%3Bmut%20Skb%29%20%7B%0A%20%20%20%20%20%20%20%20skb.frags%5B0%5D.page%20%3D%20self.mapping.page%3B%0A%20%20%20%20%20%20%20%20skb.frags%5B0%5D.page_offset%20%3D%200%3B%0A%20%20%20%20%20%20%20%20skb.frags%5B0%5D.size%20%3D%20self.len%3B%0A%20%20%20%20%20%20%20%20skb.frags_len%20%3D%201%3B%0A%20%20%20%20%7D%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%3Cstrong%3E%E5%85%B3%E9%94%AE%E7%82%B9%3C/strong%3E%EF%BC%9ADMA%20buffer%20%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%BF%85%E9%A1%BB%E8%B7%A8%E8%B6%8A%E6%95%B4%E4%B8%AA%20%3Ccode%3Esoftirq%3C/code%3E%20%E5%A4%84%E7%90%86%E2%80%94%E2%80%94%E8%BF%99%E6%84%8F%E5%91%B3%E7%9D%80%20skb%20%E9%87%8A%E6%94%BE%E5%89%8D%E4%B8%8D%E8%83%BD%20unmap%20DMA%E3%80%82Rust%20%E9%80%9A%E8%BF%87%20%3Ccode%3EDmaBuffer%3C/code%3E%20%E7%9A%84%20%3Ccode%3EDrop%3C/code%3E%20%E6%89%A7%E8%A1%8C%20unmap%EF%BC%8C%E5%B0%86%20unmapt%20%E6%97%B6%E9%97%B4%E6%8E%A8%E8%BF%9F%E5%88%B0%E5%8D%8F%E8%AE%AE%E6%A0%88%E5%AE%8C%E6%88%90%E5%90%8E%E7%9A%84%20%3Ccode%3Eskb-%3Edestructor%3C/code%3E%E3%80%82%3C/p%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E4%B8%89%E3%80%81NAPI%20%E8%BD%AE%E8%AF%A2%EF%BC%9A%E6%9D%83%E9%87%8D%E4%B8%8E%20trait%20%E6%8A%BD%E8%B1%A1%3C/h2%3E%0A%0A%3Ch3%3E3.1%20%E6%9D%83%E9%87%8D%E9%80%89%E6%8B%A9%E4%B8%8E%E6%80%A7%E8%83%BD%E6%9D%83%E8%A1%A1%3C/h3%3E%0A%0A%3Cp%3E%E4%BC%A0%E7%BB%9F%20C%20%E9%A9%B1%E5%8A%A8%E4%B8%AD%20NAPI%20%E6%9D%83%E9%87%8D%E7%A1%AC%E7%BC%96%E7%A0%81%E4%B8%BA%2064%EF%BC%8C%E4%BD%86%E5%9C%A8%20TAP%20%E8%AE%BE%E5%A4%87%E4%B8%8A%E8%BF%99%E4%BC%9A%E5%AF%BC%E8%87%B4%EF%BC%9A%3C/p%3E%0A%0A%3Cul%3E%3Cli%3E%E6%9D%83%E9%87%8D%E8%BF%87%E9%AB%98%EF%BC%9A%E5%8D%95%E6%A0%B8%E5%8D%A0%E7%94%A8%E8%BF%87%E5%A4%9A%EF%BC%8C%E5%BB%B6%E8%BF%9F%E6%95%8F%E6%84%9F%E5%9E%8B%E5%BA%94%E7%94%A8%E6%8A%96%E5%8A%A8%3C/li%3E%0A%3Cli%3E%E6%9D%83%E9%87%8D%E8%BF%87%E4%BD%8E%EF%BC%9A%E5%90%9E%E5%90%90%E5%8F%97%E9%99%90%EF%BC%8Cpps%20%E7%93%B6%E9%A2%88%E5%9C%A8%20CPU%3C/li%3E%3C/ul%3E%0A%0A%3Cp%3ERust%20%E5%AE%9E%E7%8E%B0%E7%9A%84%20trait%20%E6%8A%BD%E8%B1%A1%E8%AE%A9%E6%9D%83%E9%87%8D%E6%88%90%E4%B8%BA%E5%8F%AF%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0%EF%BC%9A%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3Etrait%20Nap%C3%ADPolicy%3A%20Send%20%2B%20Sync%20%7B%0A%20%20%20%20fn%20weight%28%26amp%3Bself%29%20-%26gt%3B%20c_int%3B%0A%20%20%20%20fn%20should_reschedule%28%26amp%3Bself%2C%20remaining%3A%20c_int%29%20-%26gt%3B%20bool%3B%0A%7D%0A%0Astruct%20DefaultNap%C3%AD%3B%0Aimpl%20Nap%C3%ADPolicy%20for%20DefaultNap%C3%AD%20%7B%0A%20%20%20%20fn%20weight%28%26amp%3Bself%29%20-%26gt%3B%20c_int%20%7B%2064%20%7D%0A%20%20%20%20fn%20should_reschedule%28%26amp%3Bself%2C%20remaining%3A%20c_int%29%20-%26gt%3B%20bool%20%7B%0A%20%20%20%20%20%20%20%20remaining%20%26gt%3B%200%0A%20%20%20%20%7D%0A%7D%0A%0A///%20%E4%BD%8E%E5%BB%B6%E8%BF%9F%E6%A8%A1%E5%BC%8F%EF%BC%9A%E6%9D%83%E9%87%8D%208%EF%BC%8C%E5%BF%AB%E9%80%9F%E9%80%80%E5%87%BA%0Astruct%20LowLatencyNap%C3%AD%3B%0Aimpl%20Nap%C3%ADPolicy%20for%20LowLatencyNap%C3%AD%20%7B%0A%20%20%20%20fn%20weight%28%26amp%3Bself%29%20-%26gt%3B%20c_int%20%7B%208%20%7D%0A%20%20%20%20fn%20should_reschedule%28%26amp%3Bself%2C%20_%3A%20c_int%29%20-%26gt%3B%20bool%20%7B%20false%20%7D%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%3E3.2%20NAPI%20%E4%B8%8E%20softirq%20%E7%9A%84%E5%8D%8F%E5%90%8C%E9%99%B7%E9%98%B1%3C/h3%3E%0A%0A%3Cpre%3E%3Ccode%3Esoftirq%20RX%20%E2%86%92%20napi_schedule%28%29%20%E2%86%92%20%E5%85%B3%E9%97%AD%20RX%20%E4%B8%AD%E6%96%AD%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%86%93%0A%20%20%20%20%20%20%20%20%20%20NAPI%20poll%20%E2%86%92%20%E5%A4%84%E7%90%86%20ring%20buffer%20%E2%86%92%20budget%20%E8%80%97%E5%B0%BD%EF%BC%9F%0A%20%20%20%20%20%20%20%20%20%20%20%20%E2%86%93%20%E6%98%AF%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%86%93%20%E5%90%A6%0A%20%20%20%20%20%E9%87%8D%E6%96%B0%E5%BC%80%E5%90%AF%20RX%20%E4%B8%AD%E6%96%AD%20%20%20%20%20%20%20%20%20%20napi_complete_done%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%E5%AE%9E%E6%88%98%E4%B8%AD%E6%9C%89%E4%B8%80%E4%B8%AA%E6%9E%81%E9%9A%BE%E5%A4%8D%E7%8E%B0%E7%9A%84%20bug%EF%BC%9A%E5%A6%82%E6%9E%9C%E5%9C%A8%20%3Ccode%3Epoll%3C/code%3E%20%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%96%B0%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85%E5%88%B0%E8%BE%BE%E5%B9%B6%E8%A7%A6%E5%8F%91%20%3Ccode%3Enapi_schedule%3C/code%3E%EF%BC%8C%E8%80%8C%E5%BD%93%E5%89%8D%20%3Ccode%3Epoll%3C/code%3E%20%E6%81%B0%E5%A5%BD%E5%9C%A8%E6%A3%80%E6%9F%A5%20budget%20%E8%80%97%E5%B0%BD%EF%BC%8C%E4%BC%9A%E5%BD%A2%E6%88%90%E3%80%8C%E9%87%8D%E5%85%A5%E5%BE%AA%E7%8E%AF%E3%80%8D%E3%80%82C%20%E9%A9%B1%E5%8A%A8%E7%9A%84%E8%A7%A3%E6%B3%95%E6%98%AF%20%3Ccode%3Enapi_complete_done%3C/code%3E%20%E7%9A%84%E8%BF%94%E5%9B%9E%E5%80%BC%E8%AF%AD%E4%B9%89%EF%BC%9A%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3E//%20C%20%E4%BE%A7%E6%BA%90%E7%A0%81%EF%BC%9A%0A//%20int%20napi_complete_done%28...%29%20%7B%0A//%20%20%20%20%20if%20%28likely%28list_empty%28%26amp%3Bn-%26gt%3Bpoll_list%29%29%29%20%7B%0A//%20%20%20%20%20%20%20%20%20napi_hash_del%28n%29%3B%0A//%20%20%20%20%20%20%20%20%20smp_mb__before_atomic%28%29%3B%0A//%20%20%20%20%20%20%20%20%20clear_bit%28NAPI_STATE_SCHED%2C%20%26amp%3Bn-%26gt%3Bstate%29%3B%0A//%20%20%20%20%20%7D%0A//%20%20%20%20%20return%20budget%20-%20work%3B%0A//%20%7D%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3ERust%20%E5%B0%81%E8%A3%85%E5%BF%85%E9%A1%BB%E6%AD%A3%E7%A1%AE%E5%A4%84%E7%90%86%E8%BF%99%E4%B8%AA%20memory%20barrier%EF%BC%9A%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3Efn%20napi_poll%28%26amp%3Bmut%20self%2C%20napi%3A%20%26amp%3Bmut%20Nap%C3%AD%2C%20budget%3A%20c_int%29%20-%26gt%3B%20c_int%20%7B%0A%20%20%20%20let%20work%20%3D%20self.do_poll%28budget%29%3B%0A%0A%20%20%20%20if%20work%20%26lt%3B%20budget%20%7B%0A%20%20%20%20%20%20%20%20//%20napi_complete_done%20%E4%BF%9D%E8%AF%81%E4%BA%86%20smp_mb__before_atomic%20%E8%AF%AD%E4%B9%89%0A%20%20%20%20%20%20%20%20let%20remaining%20%3D%20napi.complete_done%28work%29%3B%0A%20%20%20%20%20%20%20%20if%20remaining%20%26gt%3B%200%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20%E8%A2%AB%E9%87%8D%E5%85%A5%E8%B0%83%E5%BA%A6%E4%BA%86%EF%BC%8C%E7%BB%A7%E7%BB%AD%E8%BD%AE%E8%AF%A2%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.napi_poll%28napi%2C%20remaining%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20self.enable_rx_irq%28%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20work%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E5%9B%9B%E3%80%81TX%20%E8%B7%AF%E5%BE%84%E4%B8%8E%20io_uring%20%E9%9B%86%E6%88%90%EF%BC%88%E8%B7%A8%E6%A8%A1%E5%9D%97%E8%81%94%E5%8A%A8%EF%BC%89%3C/h2%3E%0A%0A%3Cp%3E%E7%8E%B0%E4%BB%A3%E5%BA%94%E7%94%A8%EF%BC%88%E5%A6%82%20DPDK%E3%80%81io_uring-based%20%E7%BD%91%E7%BB%9C%E6%A1%86%E6%9E%B6%EF%BC%89%E9%9C%80%E8%A6%81%E5%B0%86%20TX%20%E8%B7%AF%E5%BE%84%E7%9B%B4%E6%8E%A5%E4%B8%8E%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98%E3%80%82%E6%88%91%E4%BB%AC%E5%AE%9E%E7%8E%B0%20%3Ccode%3Eio_ops%3C/code%3E%20%E4%BB%A5%E6%94%AF%E6%8C%81%20%3Ccode%3Eio_uring%3C/code%3E%20%E7%9A%84%20%3Ccode%3EIORING_OP_SEND%3C/code%3E/%3Ccode%3EIORING_OP_RECV%3C/code%3E%E3%80%82%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3E//%20%E4%B8%8E%20io_uring%20ring%20buffer%20%E5%85%B1%E4%BA%AB%E7%9A%84%20TX%20channel%0Astruct%20TxChannel%20%7B%0A%20%20%20%20ring%3A%20DmaCoherent%26lt%3B%5BTxDesc%3B%20256%5D%26gt%3B%2C%0A%20%20%20%20head%3A%20u32%2C%0A%20%20%20%20tail%3A%20u32%2C%0A%7D%0A%0Aimpl%20TxChannel%20%7B%0A%20%20%20%20///%20%E4%B8%BA%20io_uring%20%E6%B3%A8%E5%86%8C%E5%9B%BA%E5%AE%9A%E7%BC%93%E5%86%B2%E5%8C%BA%0A%20%20%20%20fn%20register_buffers%28%26amp%3Bself%2C%20bufs%3A%20%26amp%3B%5BDmaBuffer%5D%29%20-%26gt%3B%20Result%26lt%3BFixedBufs%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20let%20reg%20%3D%20kernel%3A%3Aio_uring%3A%3AFixedBufs%3A%3Aregister%28bufs%29%3F%3B%0A%20%20%20%20%20%20%20%20Ok%28reg%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20///%20%E4%BB%8E%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E7%9B%B4%E6%8E%A5%20TX%EF%BC%88%E7%BB%95%E8%BF%87%E5%86%85%E6%A0%B8%E5%8D%8F%E8%AE%AE%E6%A0%88%EF%BC%89%0A%20%20%20%20unsafe%20fn%20xmit_from_user%28%0A%20%20%20%20%20%20%20%20%26amp%3Bmut%20self%2C%0A%20%20%20%20%20%20%20%20buf%3A%20%2Aconst%20u8%2C%0A%20%20%20%20%20%20%20%20len%3A%20usize%2C%0A%20%20%20%20%29%20-%26gt%3B%20Result%26lt%3Busize%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20if%20len%20%26gt%3B%20MAX_PKT_SIZE%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Err%28EINVAL%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20let%20desc%20%3D%20%26amp%3Bmut%20self.ring%5Bself.tail%20as%20usize%5D%3B%0A%20%20%20%20%20%20%20%20desc.addr%20%3D%20buf%20as%20u64%3B%0A%20%20%20%20%20%20%20%20desc.len%20%3D%20len%20as%20u32%3B%0A%20%20%20%20%20%20%20%20self.tail%20%3D%20%28self.tail%20%2B%201%29%20%26amp%3B%20255%3B%0A%0A%20%20%20%20%20%20%20%20//%20%E9%80%9A%E7%9F%A5%E8%99%9A%E6%8B%9F%E9%98%9F%E5%88%97%20kick%0A%20%20%20%20%20%20%20%20self.kick_tx%28%29%3B%0A%0A%20%20%20%20%20%20%20%20Ok%28len%29%0A%20%20%20%20%7D%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%3Cstrong%3E%E8%BF%99%E9%87%8C%E6%9C%89%E4%B8%80%E4%B8%AA%20FFI%20%E5%9D%8F%E5%91%B3%E9%81%93%3C/strong%3E%EF%BC%9A%3Ccode%3Eunsafe%3C/code%3E%20%E6%A0%87%E8%AE%B0%E6%98%AF%E4%B8%8D%E5%8F%AF%E9%81%BF%E5%85%8D%E7%9A%84%E2%80%94%E2%80%94%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E6%8C%87%E9%92%88%E5%BF%85%E9%A1%BB%E8%A2%AB%E4%BF%A1%E4%BB%BB%E3%80%82%E4%BD%86%20Rust%20%E5%BC%BA%E5%88%B6%E6%88%91%E4%BB%AC%E6%98%BE%E5%BC%8F%E6%A0%87%E6%B3%A8%E8%BE%B9%E7%95%8C%EF%BC%8C%E5%B9%B6%E9%9B%86%E4%B8%AD%E5%9C%A8%20%3Ccode%3Eunsafe%3C/code%3E%20block%20%E4%B8%AD%E5%81%9A%E6%9C%89%E6%95%88%E6%80%A7%E6%A3%80%E6%9F%A5%E3%80%82%E7%9B%B8%E6%AF%94%E4%BC%A0%E7%BB%9F%20C%20%E9%A9%B1%E5%8A%A8%E4%B8%AD%E6%95%A3%E8%90%BD%E5%9C%A8%205%20%E4%B8%AA%E5%87%BD%E6%95%B0%E9%87%8C%E7%9A%84%E9%9A%90%E5%BC%8F%E8%A7%A3%E5%BC%95%E7%94%A8%EF%BC%8C%E5%AE%89%E5%85%A8%E6%80%A7%E6%98%AF%E6%9C%89%E6%98%BE%E8%91%97%E6%8F%90%E5%8D%87%E7%9A%84%E3%80%82%3C/p%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E4%BA%94%E3%80%81%E8%B0%83%E8%AF%95%E5%AE%9E%E6%88%98%EF%BC%9A%E7%94%A8%20KASAN%20%E6%8D%95%E8%8E%B7%20skb%20UAF%3C/h2%3E%0A%0A%3Ch3%3E5.1%20Bug%20%E7%8E%B0%E8%B1%A1%3C/h3%3E%0A%0A%3Cp%3E%E5%86%85%E6%A0%B8%E6%8A%A5%E5%91%8A%EF%BC%9A%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3E%5B%20%20%2B0.000001%5D%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%5B%20%20%2B2.398271%5D%20BUG%3A%20KASAN%3A%20use-after-free%20in%20rust_tap_rx%2B0x78/0x1a0%20%5Brust_tap_drv%5D%0A%5B%20%20%2B0.000002%5D%20Read%20of%20size%208%20at%20addr%20ffff88800a3b4d00%20by%20task%20ksoftirqd/1%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%3E5.2%20%E6%A0%B9%E5%9B%A0%E5%88%86%E6%9E%90%3C/h3%3E%0A%0A%3Cpre%3E%3Ccode%3E//%20BUGGY%20CODE%0Afn%20napi_poll%28%26amp%3Bmut%20self%2C%20budget%3A%20c_int%29%20-%26gt%3B%20c_int%20%7B%0A%20%20%20%20for%20i%20in%200..budget%20%7B%0A%20%20%20%20%20%20%20%20let%20skb%20%3D%20self.rx_ring.pop_skb%28%29.unwrap%28%29%3B%0A%20%20%20%20%20%20%20%20net%3A%3Areceive_skb%28skb%29%3B%0A%20%20%20%20%20%20%20%20//%20skb%20%E7%8E%B0%E5%9C%A8%E5%B1%9E%E4%BA%8E%E7%BD%91%E7%BB%9C%E6%A0%88%EF%BC%8C%E4%BD%86%20self.rx_ring%20%E7%9A%84%E5%BC%95%E7%94%A8%E4%BB%8D%E8%A2%AB%E6%8C%81%E6%9C%89%0A%20%20%20%20%20%20%20%20//%20%E5%A6%82%E6%9E%9C%E5%85%B6%E4%BB%96%E7%BA%BF%E7%A8%8B%E6%AD%A4%E6%97%B6%E8%B0%83%E7%94%A8%20unregister%EF%BC%8C%E5%AF%BC%E8%87%B4%20rx_ring%20%E9%87%8A%E6%94%BE%EF%BC%9A%0A%20%20%20%20%20%20%20%20//%20self.rx_ring%20%E4%B8%AD%E7%9A%84%20skb%20%E6%8C%87%E9%92%88%E5%85%A8%E5%8F%98%E6%88%90%20dangling%EF%BC%81%0A%20%20%20%20%7D%0A%20%20%20%20//%20...%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6%EF%BC%9A%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3EThread%20A%20%28softirq%29%20%20%20%20%20%20%20%20%20%20%20%20Thread%20B%20%28rmmod%29%0A%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%0Anapi_poll%3A%20pop_skb%280%29%20%20%20%20%20%20%20%20%0Anet_receive_skb%28skb%5B0%5D%29%20%20%20%20%20%20unregister_netdev%28%29%0A%20%20%20%E2%86%93%20%E8%BF%99%E9%87%8C%E6%9C%89%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%20%20%20%20%20%20%20%20%E2%86%93%20%E8%A7%A6%E5%8F%91%20RustTapDev%3A%3Adrop%0A%E5%8D%8F%E8%AE%AE%E6%A0%88%E5%A4%84%E7%90%86%20skb%5B0%5D%20%20%20%20%20%20%20%20%20%20%20%20%20rx_ring%20%E9%87%8A%E6%94%BE%EF%BC%8C%E6%89%80%E6%9C%89%20skb%20%E2%86%92%20UAF%0A%E5%9B%9E%E6%BA%AF%E5%88%B0%20napi_poll%20%20%20%20%20%20%20%20%20%20%20%20%20%E4%BD%86%20Thread%20A%20%E4%B8%8B%E5%91%A8%E8%BF%98%E4%BC%9A%E8%AE%BF%E9%97%AE%20skb%5B1..63%5D%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%3E5.3%20%E4%BF%AE%E5%A4%8D%E6%96%B9%E6%A1%88%3C/h3%3E%0A%0A%3Cpre%3E%3Ccode%3E//%20FIXED%20CODE%3A%20%E4%BD%BF%E7%94%A8%20RCU%20%E4%BF%9D%E6%8A%A4%20ring%20buffer%0Afn%20napi_poll%28%26amp%3Bmut%20self%2C%20budget%3A%20c_int%29%20-%26gt%3B%20c_int%20%7B%0A%20%20%20%20let%20rx_guard%20%3D%20rcu_read_lock%28%29%3B%0A%20%20%20%20for%20i%20in%200..budget%20%7B%0A%20%20%20%20%20%20%20%20let%20skb%20%3D%20match%20self.rx_ring.pop_skb%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%28s%29%20%3D%26gt%3B%20s%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20None%20%3D%26gt%3B%20break%2C%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20//%20%E5%A2%9E%E5%8A%A0%E5%BC%95%E7%94%A8%E8%AE%A1%E6%95%B0%E7%A1%AE%E4%BF%9D%20skb%20%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%0A%20%20%20%20%20%20%20%20skb_ref%28%26amp%3Bskb%29%3B%0A%20%20%20%20%20%20%20%20net%3A%3Areceive_skb%28skb%29%3B%0A%20%20%20%20%20%20%20%20//%20%E5%8D%B3%E4%BD%BF%E6%AD%A4%E6%97%B6%20RCU%20%E5%86%99%E7%AB%AF%E9%87%8A%E6%94%BE%20ring%EF%BC%8Cskb%20%E5%BC%95%E7%94%A8%E4%BB%8D%E6%9C%89%E6%95%88%0A%20%20%20%20%7D%0A%20%20%20%20rcu_read_unlock%28rx_guard%29%3B%0A%20%20%20%20work_done%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%3E5.4%20Rust%20%E8%83%BD%E5%B8%AE%E5%A4%9A%E5%B0%91%EF%BC%9F%3C/h3%3E%0A%0A%3Cp%3E%3Cstrong%3E%E5%9D%A6%E7%99%BD%E8%AF%B4%3C/strong%3E%EF%BC%9ARust%20borrow%20checker%20%E5%AF%B9%E6%AD%A4%E7%B1%BB%20bug%20%E5%B8%AE%E5%8A%A9%E6%9C%89%E9%99%90%EF%BC%8C%E5%9B%A0%E4%B8%BA%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E8%B7%A8%E8%B6%8A%20FFI%20%E8%BE%B9%E7%95%8C%EF%BC%88%3Ccode%3Ercu_read_lock%3C/code%3E%20%E6%98%AF%E7%BA%AF%20C%20%E5%AE%8F%EF%BC%89%E3%80%82%E4%BD%86%E4%BB%A5%E4%B8%8B%E6%96%B9%E9%9D%A2%E7%A1%AE%E6%9C%89%E6%94%B6%E7%9B%8A%EF%BC%9A%3C/p%3E%0A%0A%3Col%3E%3Cli%3E%3Ccode%3Eskb_ref%3C/code%3E%20%E8%BF%94%E5%9B%9E%20%3Ccode%3EArc%3CSkb%3E%3C/code%3E%20%E8%80%8C%E4%B8%8D%E6%98%AF%20%3Ccode%3E%2Amut%20sk_buff%3C/code%3E%E2%80%94%E2%80%94%E9%81%BF%E5%85%8D%E3%80%8C%E5%BF%98%E8%AE%B0%20unref%E3%80%8D%E5%AF%BC%E8%87%B4%E7%9A%84%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%3C/li%3E%0A%3Cli%3E%3Ccode%3EDrop%3C/code%3E%20trait%20%E5%BC%BA%E5%88%B6%E8%B5%84%E6%BA%90%E6%B8%85%E7%90%86%E2%80%94%E2%80%94%E4%B8%8D%E4%BC%9A%E5%87%BA%E7%8E%B0%E5%BF%98%E8%AE%B0%20%3Ccode%3Enapi_disable%3C/code%3E%20%E5%B0%B1%20%3Ccode%3Eunregister%3C/code%3E%20%E7%9A%84%20C%20%E9%A3%8E%E6%A0%BC%20bug%3C/li%3E%0A%3Cli%3E%3Ccode%3EResult%3C%28%29%2C%20Error%3E%3C/code%3E%20%E6%9B%BF%E4%BB%A3%E9%94%99%E8%AF%AF%E7%A0%81%E2%80%94%E2%80%94TX%20%E5%A4%B1%E8%B4%A5%E8%B7%AF%E5%BE%84%E8%A2%AB%E7%BC%96%E8%AF%91%E5%99%A8%E5%BC%BA%E5%88%B6%E5%A4%84%E7%90%86%3C/li%3E%3C/ol%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E5%85%AD%E3%80%81ethtool%20%E7%BB%9F%E8%AE%A1%E4%B8%8E%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7%3C/h2%3E%0A%0A%3Cp%3E%E7%94%9F%E4%BA%A7%E9%83%A8%E7%BD%B2%E4%B8%AD%EF%BC%8C%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7%E3%82%92%E5%BF%85%E9%A1%BB%E8%87%AA%E5%B7%B1%E5%81%9A%E3%80%82Rust%20%E5%B0%81%E8%A3%85%E4%BA%86%20%3Ccode%3Eethtool_ops%3C/code%3E%EF%BC%9A%3C/p%3E%0A%0A%3Cpre%3E%3Ccode%3E%23%5Bvtable%5D%0Aimpl%20EthtoolOps%20for%20RustTapDrv%20%7B%0A%20%20%20%20fn%20get_ethtool_stats%28dev%3A%20%26amp%3Bnet%3A%3ADevice%2C%20stats%3A%20%26amp%3Bmut%20ethtool_stats%2C%20data%3A%20%26amp%3Bmut%20%5Bu64%5D%29%20%7B%0A%20%20%20%20%20%20%20%20let%20tap%20%3D%20unsafe%20%7B%20%26amp%3B%2A%28dev.priv%20as%20%2Aconst%20RustTapDev%29%20%7D%3B%0A%20%20%20%20%20%20%20%20let%20tap_stats%20%3D%20tap.stats.lock%28%29%3B%0A%20%20%20%20%20%20%20%20data%5B0%5D%20%3D%20tap_stats.rx_packets.load%28Ordering%3A%3ARelaxed%29%3B%0A%20%20%20%20%20%20%20%20data%5B1%5D%20%3D%20tap_stats.tx_packets.load%28Ordering%3A%3ARelaxed%29%3B%0A%20%20%20%20%20%20%20%20data%5B2%5D%20%3D%20tap_stats.rx_bytes.load%28Ordering%3A%3ARelaxed%29%3B%0A%20%20%20%20%20%20%20%20data%5B3%5D%20%3D%20tap_stats.tx_bytes.load%28Ordering%3A%3ARelaxed%29%3B%0A%20%20%20%20%20%20%20%20data%5B4%5D%20%3D%20tap_stats.rx_dropped.load%28Ordering%3A%3ARelaxed%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20get_sset_count%28_%3A%20%26amp%3Bnet%3A%3ADevice%2C%20sset%3A%20c_int%29%20-%26gt%3B%20c_int%20%7B%0A%20%20%20%20%20%20%20%20if%20sset%20%3D%3D%20ETH_SS_STATS%20as%20c_int%20%7B%205%20%7D%20else%20%7B%20-EOPNOTSUPP%20%7D%0A%20%20%20%20%7D%0A%7D%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%E9%85%8D%E5%90%88%20%3Ccode%3Eethtool%20-S%20rust_tap0%3C/code%3E%20%E5%8D%B3%E5%8F%AF%E6%9A%B4%E9%9C%B2%E7%9B%91%E6%8E%A7%E6%8C%87%E6%A0%87%E5%88%B0%20Prometheus/node_exporter%E3%80%82%3C/p%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E4%B8%83%E3%80%81%E6%80%A7%E8%83%BD%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95%3C/h2%3E%0A%0A%3Cp%3E%E7%8E%AF%E5%A2%83%EF%BC%9AAMD%20EPYC%207763%20%C3%97%202%EF%BC%8CMellanox%20ConnectX-6%20Dx%2025Gbps%3C/p%3E%0A%0A%3Ctable%20class%3D%22table%20table-bordered%22%3E%0A%3Ctr%3E%3Cth%3E%E6%8C%87%E6%A0%87%3C/th%3E%3Cth%3E%E5%8E%9F%E7%94%9F%20C%20TUN%3C/th%3E%3Cth%3ERust%20TAP%20%E9%A9%B1%E5%8A%A8%3C/th%3E%3Cth%3E%E5%B7%AE%E5%BC%82%3C/th%3E%3C/tr%3E%0A%3Ctr%3E%3Ctd%3E%E5%B0%8F%E5%8C%85%20%2864B%29%20pps%3C/td%3E%3Ctd%3E14.8M%3C/td%3E%3Ctd%3E14.2M%3C/td%3E%3Ctd%3E-4.1%25%3C/td%3E%3C/tr%3E%0A%3Ctr%3E%3Ctd%3E%E5%A4%A7%E5%8C%85%20%281500B%29%20%E5%90%9E%E5%90%90%3C/td%3E%3Ctd%3E23.6%20Gbps%3C/td%3E%3Ctd%3E23.1%20Gbps%3C/td%3E%3Ctd%3E-2.1%25%3C/td%3E%3C/tr%3E%0A%3Ctr%3E%3Ctd%3E%E5%BB%B6%E8%BF%9F%20P99%20%28%E5%86%85%E6%A0%B8%E2%86%92%E7%94%A8%E6%88%B7%29%3C/td%3E%3Ctd%3E1.8%CE%BCs%3C/td%3E%3Ctd%3E2.1%CE%BCs%3C/td%3E%3Ctd%3E%2B16.7%25%3C/td%3E%3C/tr%3E%0A%3Ctr%3E%3Ctd%3E%E5%86%85%E5%AD%98%E5%8D%A0%E7%94%A8%20%28Ring%201024%29%3C/td%3E%3Ctd%3E4.2MB%3C/td%3E%3Ctd%3E4.2MB%3C/td%3E%3Ctd%3E%E6%8C%81%E5%B9%B3%3C/td%3E%3C/tr%3E%0A%3Ctr%3E%3Ctd%3Eio_uring%20%E7%9B%B4%E9%80%9A%20TX%3C/td%3E%3Ctd%3E%E4%B8%8D%E6%94%AF%E6%8C%81%3C/td%3E%3Ctd%3E12.4M%20pps%3C/td%3E%3Ctd%3E%E6%96%B0%E5%A2%9E%E8%83%BD%E5%8A%9B%3C/td%3E%3C/tr%3E%0A%3C/table%3E%0A%0A%3Cp%3E%3Cstrong%3E%E7%BB%93%E8%AE%BA%3C/strong%3E%EF%BC%9ARust%20%E9%A9%B1%E5%8A%A8%E7%9A%84%E7%BA%AF%E6%80%A7%E8%83%BD%E6%AF%94%20C%20%E7%89%88%E6%9C%AC%E4%BD%8E%202-4%25%EF%BC%8C%E8%BF%99%E6%98%AF%20Rust%20%E5%86%85%E5%AD%98%E5%AE%89%E5%85%A8%E8%BE%B9%E7%95%8C%E6%A3%80%E6%9F%A5%EF%BC%88%3Ccode%3Eslice%3A%3Aget_unchecked%3C/code%3E%20%E4%BC%98%E5%8C%96%E5%90%8E%E4%BB%8D%E6%9C%89%E6%AE%8B%E4%BD%99%EF%BC%89%E5%92%8C%20%3Ccode%3EArc%3C/code%3E%20%E5%8E%9F%E5%AD%90%E8%AE%A1%E6%95%B0%E5%B8%A6%E6%9D%A5%E7%9A%84%E4%BB%A3%E4%BB%B7%E3%80%82%E4%BD%86%E6%8D%A2%E6%9D%A5%E4%BA%86%EF%BC%9A%3C/p%3E%0A%0A%3Cul%3E%3Cli%3E%E4%BB%A3%E7%A0%81%E9%87%8F%E5%87%8F%E5%B0%91%2037%25%EF%BC%88Rust%3A%201240%20%E8%A1%8C%20vs%20C%3A%201960%20%E8%A1%8C%EF%BC%89%3C/li%3E%0A%3Cli%3Ereview%20%E9%98%B6%E6%AE%B5%E5%8F%91%E7%8E%B0%E7%9A%84%20FFI%20%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98%2014%20%E4%B8%AA%EF%BC%88%E7%9B%B8%E5%90%8C%E8%A7%84%E6%A8%A1%20C%20%E9%A9%B1%E5%8A%A8%E5%AE%9E%E9%99%85%E5%AD%98%E9%87%8F%E7%BA%A6%2030%2B%EF%BC%89%3C/li%3E%0A%3Cli%3E%E5%86%85%E5%AD%98%E5%AE%89%E5%85%A8%20bug%20%E5%BD%92%E9%9B%B6%EF%BC%886%20%E4%B8%AA%E6%9C%88%E7%A4%BE%E5%8C%BA%20fuzzing%20%E9%9B%B6%20KASAN%20%E5%91%BD%E4%B8%AD%EF%BC%89%3C/li%3E%3C/ul%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E5%85%AB%E3%80%81%E5%B7%A5%E7%A8%8B%E5%BB%BA%E8%AE%AE%EF%BC%9A%E4%BD%95%E6%97%B6%E5%BA%94%E8%AF%A5%E7%94%A8%20Rust%20%E5%86%99%E9%A9%B1%E5%8A%A8%EF%BC%9F%3C/h2%3E%0A%0A%3Col%3E%3Cli%3E%3Cstrong%3E%E6%96%B0%E9%A9%B1%E5%8A%A8%EF%BC%8C%E8%80%8C%E9%9D%9E%E6%94%B9%E5%86%99%E8%80%81%E9%A9%B1%E5%8A%A8%3C/strong%3E%EF%BC%9A%E9%87%8D%E6%9E%84%E5%B7%B2%E6%9C%89%20C%20%E9%A9%B1%E5%8A%A8%E7%9A%84%E8%BE%B9%E9%99%85%E6%94%B6%E7%9B%8A%E6%9E%81%E5%B0%8F%EF%BC%8C%E4%BD%86%E6%96%B0%E5%BC%80%E5%8F%91%E7%9A%84%20PCIe/USB/virtio%20%E9%A9%B1%E5%8A%A8%E5%80%BC%E5%BE%97%E8%80%83%E8%99%91%E3%80%82%3C/li%3E%0A%3Cli%3E%3Cstrong%3E%E5%8D%8F%E8%AE%AE%E6%A0%88%20%3E%20%E5%BF%AB%E8%B7%AF%E5%BE%84%3C/strong%3E%EF%BC%9ARust%20%E6%9C%80%E9%80%82%E5%90%88%E5%A4%8D%E6%9D%82%E5%8D%8F%E8%AE%AE%E7%8A%B6%E6%80%81%E6%9C%BA%EF%BC%88%E5%A6%82%20QUIC%E3%80%81TLS%20offload%20%E9%A9%B1%E5%8A%A8%EF%BC%89%EF%BC%8Cborrow%20checker%20%E5%9C%A8%E7%BB%88%E6%80%81/%E7%8A%B6%E6%80%81%E6%9C%BA%E5%9C%BA%E6%99%AF%E5%A4%A7%E6%94%BE%E5%BC%82%E5%BD%A9%E3%80%82%E7%BA%AF%E6%95%B0%E6%8D%AE%E9%9D%A2%EF%BC%88DMA%20%E6%90%AC%E8%BF%90%EF%BC%89%EF%BC%8CC%20%E4%BB%8D%E6%9C%89%E5%BE%AE%E5%BC%B1%E4%BC%98%E5%8A%BF%E3%80%82%3C/li%3E%0A%3Cli%3E%3Cstrong%3E%E5%88%AB%E4%BD%8E%E4%BC%B0%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B%E8%BF%81%E7%A7%BB%E6%88%90%E6%9C%AC%3C/strong%3E%EF%BC%9A%E4%BD%A0%E7%9A%84%E5%9B%A2%E9%98%9F%E9%9C%80%E8%A6%81%E5%90%8C%E6%97%B6%E7%90%86%E8%A7%A3%20C%20%E5%86%85%E6%A0%B8%E8%AF%AD%E4%B9%89%E5%92%8C%20Rust%20%E6%89%80%E6%9C%89%E6%9D%83%E8%AF%AD%E4%B9%89%EF%BC%8C%E8%BF%99%E6%AF%94%E5%8D%95%E7%BA%AF%E5%AD%A6%20Rust%20%E5%9B%B0%E9%9A%BE%E5%BE%97%E5%A4%9A%E3%80%82%3C/li%3E%3C/ol%3E%0A%0A%3Chr/%3E%0A%0A%3Ch2%3E%E5%8F%82%E8%80%83%E8%B5%84%E6%BA%90%3C/h2%3E%0A%0A%3Cul%3E%3Cli%3E%3Ca%20href%3D%22https%3A//github.com/Rust-for-Linux/linux%22%20target%3D%22_blank%22%20rel%3D%22noopener%22%3ERust%20for%20Linux%20%E5%AE%98%E6%96%B9%E4%BB%93%E5%BA%93%3C/a%3E%3C/li%3E%0A%3Cli%3E%3Ca%20href%3D%22https%3A//lwn.net/Articles/1011147/%22%20target%3D%22_blank%22%20rel%3D%22noopener%22%3ERust%20for%20Linux%20%E7%BD%91%E7%BB%9C%E5%AD%90%E7%B3%BB%E7%BB%9F%20RFC%3C/a%3E%3C/li%3E%0A%3Cli%3E%E3%80%8ALinux%20Device%20Drivers%E3%80%8B%E7%AC%AC%E4%B8%89%E7%89%88%E2%80%94%E7%AC%AC%2017%20%E7%AB%A0%E7%BD%91%E7%BB%9C%E8%AE%BE%E5%A4%87%3C/li%3E%0A%3Cli%3E%3Ca%20href%3D%22https%3A//lore.kernel.org/rust-for-linux/%22%20target%3D%22_blank%22%20rel%3D%22noopener%22%3ERust%20%2B%20KASAN%20%E6%8C%91%E6%88%98%E8%B5%9B%20Bug%20%E6%B8%85%E5%8D%95%3C/a%3E%3C/li%3E%3C/ul%3E%0A%0A%3C/body%3E%0A%3C/html%3E
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部