Skip to content

Commit

Permalink
socket: add netlink for socket
Browse files Browse the repository at this point in the history
Signed-off-by: rayylee <rayylee@foxmail.com>
  • Loading branch information
hbuxiaofei committed Apr 6, 2024
1 parent 25fa14a commit 9fcd168
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 13 deletions.
35 changes: 34 additions & 1 deletion modules/axnet/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,43 @@ pub use self::net_impl::UdpSocket;
pub use self::net_impl::{bench_receive, bench_transmit};
pub use self::net_impl::{dns_query, from_core_sockaddr, into_core_sockaddr, poll_interfaces};
pub use smoltcp::time::Duration;
pub use smoltcp::wire::{IpAddress as IpAddr, IpEndpoint as SocketAddr, Ipv4Address as Ipv4Addr};
pub use smoltcp::wire::{IpAddress as IpAddr, IpEndpoint, Ipv4Address as Ipv4Addr};

mod netlink;
pub use netlink::NlSocket;

use axdriver::{prelude::*, AxDeviceContainer};

#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
pub struct SocketAddr {
pub addr: IpAddr,
pub port: u16,
}

impl SocketAddr {
pub fn new(addr: IpAddr, port: u16) -> Self {
SocketAddr { addr, port }
}
}

impl Into<IpEndpoint> for SocketAddr {
fn into(self) -> IpEndpoint {
IpEndpoint {
addr: self.addr,
port: self.port,
}
}
}

impl From<IpEndpoint> for SocketAddr {
fn from(ie: IpEndpoint) -> Self {
SocketAddr {
addr: ie.addr,
port: ie.port,
}
}
}

/// Initializes the network subsystem by NIC devices.
pub fn init_network(mut net_devs: AxDeviceContainer<AxNetDevice>) {
info!("Initialize network subsystem...");
Expand Down
2 changes: 1 addition & 1 deletion modules/axnet/src/smoltcp_impl/loopback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ fn snoop_tcp_from_ip(buffer: &[u8], sockets: &mut SocketSet) -> Result<(), smolt
let is_first = tcp_packet.syn() && !tcp_packet.ack();
if is_first {
// create a socket for the first incoming TCP packet, as the later accept() returns.
LISTEN_TABLE.incoming_tcp_packet(src_addr, dst_addr, sockets);
LISTEN_TABLE.incoming_tcp_packet(src_addr.into(), dst_addr.into(), sockets);
}
}
Ok(())
Expand Down
7 changes: 5 additions & 2 deletions ulib/axstarry/src/syscall_net/imp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,11 +324,11 @@ pub fn syscall_sendto(args: [usize; 6]) -> SyscallResult {
s.bind(into_core_sockaddr(SocketAddr::new(
IpAddr::v4(0, 0, 0, 0),
0,
)))
).into()))
.unwrap();
}
match addr {
Some(addr) => s.send_to(buf, into_core_sockaddr(addr)),
Some(addr) => s.send_to(buf, into_core_sockaddr(addr.into())),
None => {
// not connected and no target is given
if s.peer_addr().is_err() {
Expand All @@ -349,6 +349,9 @@ pub fn syscall_sendto(args: [usize; 6]) -> SyscallResult {

s.send(buf)
}
SocketInner::Netlink(_) => {
todo!()
}
};

match send_result {
Expand Down
48 changes: 39 additions & 9 deletions ulib/axstarry/src/syscall_net/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use axfs::api::{FileIO, FileIOType, OpenFlags, Read, Write};
use axlog::warn;
use axnet::{
from_core_sockaddr, into_core_sockaddr, poll_interfaces, IpAddr, SocketAddr, TcpSocket,
UdpSocket,
UdpSocket, NlSocket,
};
use axsync::Mutex;
use num_enum::TryFromPrimitive;
Expand All @@ -28,6 +28,7 @@ pub const SOCKET_TYPE_MASK: usize = 0xFF;
pub enum Domain {
AF_UNIX = 1,
AF_INET = 2,
AF_NETLINK = 16,
}

#[derive(TryFromPrimitive, PartialEq, Eq, Clone, Debug)]
Expand Down Expand Up @@ -158,6 +159,7 @@ impl SocketOption {
"[setsockopt()] set keep-alive for tcp socket not created, ignored"
),
}),
SocketInner::Netlink(_) => todo!(),
};
drop(inner);
socket.set_recv_buf_size(opt_value as u64);
Expand Down Expand Up @@ -251,6 +253,7 @@ impl SocketOption {
);
0},
}),
SocketInner::Netlink(_) => todo!(),
};
drop(inner);

Expand Down Expand Up @@ -389,6 +392,8 @@ pub enum SocketInner {
Tcp(TcpSocket),
/// UDP socket
Udp(UdpSocket),
/// Netlink socket
Netlink(NlSocket),
}

impl Socket {
Expand Down Expand Up @@ -443,6 +448,7 @@ impl Socket {
SocketInner::Tcp(TcpSocket::new())
}
SocketType::SOCK_DGRAM => SocketInner::Udp(UdpSocket::new()),
SocketType::SOCK_RAW => SocketInner::Netlink(NlSocket::new()),
_ => unimplemented!(),
};
Self {
Expand All @@ -466,6 +472,7 @@ impl Socket {
match &*inner {
SocketInner::Tcp(s) => s.set_nonblocking(nonblocking),
SocketInner::Udp(s) => s.set_nonblocking(nonblocking),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -475,6 +482,7 @@ impl Socket {
match &*inner {
SocketInner::Tcp(s) => s.is_nonblocking(),
SocketInner::Udp(s) => s.is_nonblocking(),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -484,6 +492,7 @@ impl Socket {
match &*inner {
SocketInner::Tcp(s) => s.is_connected(),
SocketInner::Udp(s) => s.with_socket(|s| s.is_open()),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -493,8 +502,10 @@ impl Socket {
match &*inner {
SocketInner::Tcp(s) => s.local_addr(),
SocketInner::Udp(s) => s.local_addr(),
SocketInner::Netlink(_) => todo!(),
}
.map(from_core_sockaddr)
.map(SocketAddr::from)
}

/// Return peer address.
Expand All @@ -503,16 +514,19 @@ impl Socket {
match &*inner {
SocketInner::Tcp(s) => s.peer_addr(),
SocketInner::Udp(s) => s.peer_addr(),
SocketInner::Netlink(_) => todo!(),
}
.map(from_core_sockaddr)
.map(SocketAddr::from)
}

/// Bind the socket to the given address.
pub fn bind(&self, addr: SocketAddr) -> AxResult {
let inner = self.inner.lock();
match &*inner {
SocketInner::Tcp(s) => s.bind(into_core_sockaddr(addr)),
SocketInner::Udp(s) => s.bind(into_core_sockaddr(addr)),
SocketInner::Tcp(s) => s.bind(into_core_sockaddr(addr.into())),
SocketInner::Udp(s) => s.bind(into_core_sockaddr(addr.into())),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -531,6 +545,7 @@ impl Socket {
match &*inner {
SocketInner::Tcp(s) => s.listen(),
SocketInner::Udp(_) => Err(AxError::Unsupported),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -545,6 +560,7 @@ impl Socket {
let new_socket = match &*inner {
SocketInner::Tcp(s) => s.accept()?,
SocketInner::Udp(_) => Err(AxError::Unsupported)?,
SocketInner::Netlink(_) => todo!(),
};
let addr = new_socket.peer_addr()?;

Expand All @@ -561,16 +577,17 @@ impl Socket {
recv_buf_size: AtomicU64::new(64 * 1024),
congestion: Mutex::new(String::from("reno")),
},
from_core_sockaddr(addr),
from_core_sockaddr(addr).into(),
))
}

/// Connect to the given address.
pub fn connect(&self, addr: SocketAddr) -> AxResult {
let inner = self.inner.lock();
match &*inner {
SocketInner::Tcp(s) => s.connect(into_core_sockaddr(addr)),
SocketInner::Udp(s) => s.connect(into_core_sockaddr(addr)),
SocketInner::Tcp(s) => s.connect(into_core_sockaddr(addr.into())),
SocketInner::Udp(s) => s.connect(into_core_sockaddr(addr.into())),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -581,6 +598,7 @@ impl Socket {
match &*inner {
SocketInner::Tcp(s) => s.local_addr().is_ok(),
SocketInner::Udp(s) => s.local_addr().is_ok(),
SocketInner::Netlink(_) => todo!(),
}
}
#[allow(unused)]
Expand All @@ -589,7 +607,8 @@ impl Socket {
let inner = self.inner.lock();
match &*inner {
SocketInner::Tcp(s) => s.send(buf),
SocketInner::Udp(s) => s.send_to(buf, into_core_sockaddr(addr)),
SocketInner::Udp(s) => s.send_to(buf, into_core_sockaddr(addr.into())),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -605,15 +624,19 @@ impl Socket {
None => s.recv(buf),
}
.map(|len| (len, from_core_sockaddr(addr)))
.map(|(len, sa)| (len, SocketAddr::from(sa)))
}
SocketInner::Udp(s) => match self.get_recv_timeout() {
Some(time) => s
.recv_from_timeout(buf, time.turn_to_ticks())
.map(|(val, addr)| (val, from_core_sockaddr(addr))),
.map(|(val, addr)| (val, from_core_sockaddr(addr)))
.map(|(val, sa)| (val, SocketAddr::from(sa))),
None => s
.recv_from(buf)
.map(|(val, addr)| (val, from_core_sockaddr(addr))),
.map(|(val, addr)| (val, from_core_sockaddr(addr)))
.map(|(val, sa)| (val, SocketAddr::from(sa))),
},
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -625,6 +648,7 @@ impl Socket {
s.shutdown();
}
SocketInner::Tcp(s) => s.close(),
SocketInner::Netlink(_) => todo!(),
};
}

Expand All @@ -640,6 +664,7 @@ impl Socket {
s.abort();
}
}),
SocketInner::Netlink(_) => todo!(),
}
}
}
Expand All @@ -650,6 +675,7 @@ impl FileIO for Socket {
match &mut *inner {
SocketInner::Tcp(s) => s.read(buf),
SocketInner::Udp(s) => s.read(buf),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -658,6 +684,7 @@ impl FileIO for Socket {
match &mut *inner {
SocketInner::Tcp(s) => s.write(buf),
SocketInner::Udp(s) => s.write(buf),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -671,6 +698,7 @@ impl FileIO for Socket {
match &*inner {
SocketInner::Tcp(s) => s.poll().map_or(false, |p| p.readable),
SocketInner::Udp(s) => s.poll().map_or(false, |p| p.readable),
SocketInner::Netlink(_) => todo!(),
}
}

Expand All @@ -680,6 +708,7 @@ impl FileIO for Socket {
match &*inner {
SocketInner::Tcp(s) => s.poll().map_or(false, |p| p.writable),
SocketInner::Udp(s) => s.poll().map_or(false, |p| p.writable),
SocketInner::Netlink(_) => todo!(),
}
}

Expand Down Expand Up @@ -735,6 +764,7 @@ pub unsafe fn socket_address_from(addr: *const u8) -> SocketAddr {
let addr = IpAddr::v4(a[0], a[1], a[2], a[3]);
SocketAddr { addr, port }
}
Domain::AF_NETLINK => unimplemented!(),
}
}
/// Only support INET (ipv4)
Expand Down

0 comments on commit 9fcd168

Please sign in to comment.