1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use smoltcp::{
iface::{InterfaceBuilder, NeighborCache, Route, Routes},
phy::{Loopback, Medium},
wire::{EthernetAddress, IpAddress, IpCidr, Ipv4Address},
};
use alloc::collections::BTreeMap;
use alloc::vec::Vec;
use alloc::sync::Arc;
use alloc::string::String;
use lock::Mutex;
use crate::drivers::add_device;
use crate::drivers::all_net;
use zcore_drivers::net::LoopbackInterface;
use zcore_drivers::scheme::NetScheme;
use zcore_drivers::Device;
pub fn init() {
let name = String::from("loopback");
warn!("name : {}", name);
let loopback = Loopback::new(Medium::Ethernet);
let mac: [u8; 6] = [0x52, 0x54, 0x98, 0x76, 0x54, 0x32];
let ethernet_addr = EthernetAddress::from_bytes(&mac);
let ip_addrs = [IpCidr::new(IpAddress::v4(127, 0, 0, 1), 24)];
let default_gateway = Ipv4Address::new(127, 0, 0, 1);
static mut ROUTES_STORAGE: [Option<(IpCidr, Route)>; 1] = [None; 1];
let mut routes = unsafe { Routes::new(&mut ROUTES_STORAGE[..]) };
routes.add_default_ipv4_route(default_gateway).unwrap();
let neighbor_cache = NeighborCache::new(BTreeMap::new());
let iface = InterfaceBuilder::new(loopback)
.ethernet_addr(ethernet_addr)
.ip_addrs(ip_addrs)
.routes(routes)
.neighbor_cache(neighbor_cache)
.finalize();
let loopback_iface = LoopbackInterface {
iface: Arc::new(Mutex::new(iface)),
name,
};
let dev = Device::Net(Arc::new(loopback_iface));
add_device(dev);
}
pub fn get_net_device() -> Vec<Arc<dyn NetScheme>> {
all_net().as_vec().clone()
}