bound.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. use crate::{
  2. filesystem::epoll::EPollEventType,
  3. net::socket::{
  4. netlink::{
  5. addr::NetlinkSocketAddr,
  6. common::bound::BoundNetlink,
  7. message::ProtocolSegment,
  8. route::{kern::NetlinkRouteKernelSocket, message::RouteNlMessage},
  9. },
  10. utils::datagram_common,
  11. PMSG,
  12. },
  13. };
  14. use system_error::SystemError;
  15. impl datagram_common::Bound for BoundNetlink<RouteNlMessage> {
  16. type Endpoint = NetlinkSocketAddr;
  17. fn bind(&mut self, endpoint: &Self::Endpoint) -> Result<(), SystemError> {
  18. self.bind_common(endpoint)
  19. }
  20. fn local_endpoint(&self) -> Self::Endpoint {
  21. self.handle.addr()
  22. }
  23. fn remote_endpoint(&self) -> Option<Self::Endpoint> {
  24. Some(self.remote_addr)
  25. }
  26. fn set_remote_endpoint(&mut self, endpoint: &Self::Endpoint) {
  27. self.remote_addr = *endpoint;
  28. }
  29. fn try_send(
  30. &self,
  31. buf: &[u8],
  32. to: &Self::Endpoint,
  33. _flags: crate::net::socket::PMSG,
  34. ) -> Result<usize, SystemError> {
  35. if *to != NetlinkSocketAddr::new_unspecified() {
  36. return Err(SystemError::ENOTCONN);
  37. }
  38. let sum_lens = buf.len();
  39. let mut nlmsg = match RouteNlMessage::read_from(buf) {
  40. Ok(msg) => msg,
  41. Err(e) if e == SystemError::EFAULT => {
  42. // 说明这个时候 buf 不是一个完整的 netlink 消息
  43. return Err(e);
  44. }
  45. Err(e) => {
  46. // 传播错误,静默处理
  47. log::warn!(
  48. "netlink_send: failed to read netlink message from buffer: {:?}",
  49. e
  50. );
  51. return Ok(sum_lens);
  52. }
  53. };
  54. let local_port = self.handle.port();
  55. for segment in nlmsg.segments_mut() {
  56. let header = segment.header_mut();
  57. if header.pid == 0 {
  58. header.pid = local_port;
  59. }
  60. }
  61. let Some(route_kernel) = self
  62. .netns
  63. .get_netlink_kernel_socket_by_protocol(nlmsg.protocol().into())
  64. else {
  65. log::warn!("No route kernel socket available in net namespace");
  66. return Ok(sum_lens);
  67. };
  68. let route_kernel_socket = route_kernel
  69. .as_any_ref()
  70. .downcast_ref::<NetlinkRouteKernelSocket>()
  71. .unwrap();
  72. route_kernel_socket.request(&nlmsg, local_port, self.netns());
  73. Ok(sum_lens)
  74. }
  75. fn try_recv(
  76. &self,
  77. writer: &mut [u8],
  78. flags: crate::net::socket::PMSG,
  79. ) -> Result<(usize, Self::Endpoint), SystemError> {
  80. let mut receive_queue = self.receive_queue.0.lock();
  81. let Some(res) = receive_queue.front() else {
  82. return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
  83. };
  84. let len = {
  85. let max = writer.len();
  86. res.total_len().min(max)
  87. };
  88. let _copied = res.write_to(writer)?;
  89. if !flags.contains(PMSG::PEEK) {
  90. receive_queue.pop_front();
  91. }
  92. // todo 目前这个信息只能来自内核
  93. let remote = NetlinkSocketAddr::new_unspecified();
  94. Ok((len, remote))
  95. }
  96. fn check_io_events(&self) -> EPollEventType {
  97. self.check_io_events_common()
  98. }
  99. }