Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
N
netstack
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
11
Issues
11
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
redox-os
netstack
Commits
7ddadca8
Commit
7ddadca8
authored
Jun 19, 2018
by
Jeremy Soller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into 'master'
Update smoltcp Closes
#30
See merge request
!30
parents
40a8cb7d
f9d6f5d8
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
334 additions
and
73 deletions
+334
-73
Cargo.lock
Cargo.lock
+271
-28
Cargo.toml
Cargo.toml
+1
-1
icmp.rs
src/smolnetd/scheme/icmp.rs
+17
-18
ip.rs
src/smolnetd/scheme/ip.rs
+9
-9
mod.rs
src/smolnetd/scheme/mod.rs
+5
-3
mod.rs
src/smolnetd/scheme/netcfg/mod.rs
+22
-5
udp.rs
src/smolnetd/scheme/udp.rs
+9
-9
No files found.
Cargo.lock
View file @
7ddadca8
This diff is collapsed.
Click to expand it.
Cargo.toml
View file @
7ddadca8
...
...
@@ -28,7 +28,7 @@ features = ["release_max_level_off"]
[dependencies.smoltcp]
git
=
"https://github.com/m-labs/smoltcp.git"
rev
=
"
c418b60b5db93753999ae51d33ec4dc1d1631c69
"
rev
=
"
d23aee483f2dc78e8070d2ad53e400cd0dcb9ae1
"
default-features
=
false
features
=
[
"std"
,
"socket-raw"
,
"proto-ipv4"
,
"socket-udp"
,
"socket-tcp"
,
"socket-icmp"
]
...
...
src/smolnetd/scheme/icmp.rs
View file @
7ddadca8
use
smoltcp
::
socket
::{
IcmpEndpoint
,
IcmpPacket
Buffer
,
IcmpSocket
,
IcmpSocketBuffer
,
SocketHandle
};
use
smoltcp
::
socket
::{
IcmpEndpoint
,
IcmpPacket
Metadata
,
IcmpSocket
,
IcmpSocketBuffer
,
SocketHandle
};
use
smoltcp
::
wire
::{
Icmpv4Packet
,
Icmpv4Repr
,
IpAddress
,
IpEndpoint
};
use
std
::
mem
;
use
std
::
str
;
...
...
@@ -86,16 +86,15 @@ impl<'a, 'b> SchemeSocket for IcmpSocket<'a, 'b> {
let
ip
=
IpAddress
::
from_str
(
addr
)
.map_err
(|
_
|
syscall
::
Error
::
new
(
syscall
::
EINVAL
))
?
;
let
mut
rx_packets
=
Vec
::
with_capacity
(
Smolnetd
::
SOCKET_BUFFER_SIZE
);
let
mut
tx_packets
=
Vec
::
with_capacity
(
Smolnetd
::
SOCKET_BUFFER_SIZE
);
for
_
in
0
..
Smolnetd
::
SOCKET_BUFFER_SIZE
{
rx_packets
.push
(
IcmpPacketBuffer
::
new
(
vec!
[
0
;
NetworkDevice
::
MTU
]));
tx_packets
.push
(
IcmpPacketBuffer
::
new
(
vec!
[
0
;
NetworkDevice
::
MTU
]));
}
let
socket
=
IcmpSocket
::
new
(
IcmpSocketBuffer
::
new
(
rx_packets
),
IcmpSocketBuffer
::
new
(
tx_packets
),
IcmpSocketBuffer
::
new
(
vec!
[
IcmpPacketMetadata
::
EMPTY
;
Smolnetd
::
SOCKET_BUFFER_SIZE
],
vec!
[
0
;
NetworkDevice
::
MTU
*
Smolnetd
::
SOCKET_BUFFER_SIZE
]
),
IcmpSocketBuffer
::
new
(
vec!
[
IcmpPacketMetadata
::
EMPTY
;
Smolnetd
::
SOCKET_BUFFER_SIZE
],
vec!
[
0
;
NetworkDevice
::
MTU
*
Smolnetd
::
SOCKET_BUFFER_SIZE
]
)
);
let
handle
=
socket_set
.add
(
socket
);
let
mut
icmp_socket
=
socket_set
.get
::
<
IcmpSocket
>
(
handle
);
...
...
@@ -119,15 +118,15 @@ impl<'a, 'b> SchemeSocket for IcmpSocket<'a, 'b> {
let
ip
=
IpAddress
::
from_str
(
addr
)
.map_err
(|
_
|
syscall
::
Error
::
new
(
syscall
::
EINVAL
))
?
;
let
mut
rx_packets
=
Vec
::
with_capacity
(
Smolnetd
::
SOCKET_BUFFER_SIZE
);
let
mut
tx_packets
=
Vec
::
with_capacity
(
Smolnetd
::
SOCKET_BUFFER_SIZE
);
for
_
in
0
..
Smolnetd
::
SOCKET_BUFFER_SIZE
{
rx_packets
.push
(
IcmpPacketBuffer
::
new
(
vec!
[
0
;
NetworkDevice
::
MTU
]));
}
let
socket
=
IcmpSocket
::
new
(
IcmpSocketBuffer
::
new
(
rx_packets
),
IcmpSocketBuffer
::
new
(
tx_packets
),
IcmpSocketBuffer
::
new
(
vec!
[
IcmpPacketMetadata
::
EMPTY
;
Smolnetd
::
SOCKET_BUFFER_SIZE
],
vec!
[
0
;
NetworkDevice
::
MTU
*
Smolnetd
::
SOCKET_BUFFER_SIZE
]
),
IcmpSocketBuffer
::
new
(
vec!
[
IcmpPacketMetadata
::
EMPTY
;
Smolnetd
::
SOCKET_BUFFER_SIZE
],
vec!
[
0
;
NetworkDevice
::
MTU
*
Smolnetd
::
SOCKET_BUFFER_SIZE
]
)
);
let
handle
=
socket_set
.add
(
socket
);
let
mut
icmp_socket
=
socket_set
.get
::
<
IcmpSocket
>
(
handle
);
...
...
src/smolnetd/scheme/ip.rs
View file @
7ddadca8
use
smoltcp
::
socket
::{
RawPacket
Buffer
,
RawSocket
,
RawSocketBuffer
,
SocketHandle
};
use
smoltcp
::
socket
::{
RawPacket
Metadata
,
RawSocket
,
RawSocketBuffer
,
SocketHandle
};
use
smoltcp
::
wire
::{
IpProtocol
,
IpVersion
};
use
std
::
str
;
use
syscall
::{
Error
as
SyscallError
,
Result
as
SyscallResult
};
...
...
@@ -61,14 +61,14 @@ impl<'a, 'b> SchemeSocket for RawSocket<'a, 'b> {
let
proto
=
u8
::
from_str_radix
(
path
,
16
)
.or_else
(|
_
|
Err
(
SyscallError
::
new
(
syscall
::
ENOENT
)))
?
;
let
mut
rx_packets
=
Vec
::
with_capacity
(
Smolnetd
::
SOCKET_BUFFER_SIZE
);
let
mut
tx_packets
=
Vec
::
with_capacity
(
Smolnetd
::
SOCKET_BUFFER_SIZE
);
for
_
in
0
..
Smolnetd
::
SOCKET_BUFFER_SIZE
{
rx_packets
.push
(
RawPacketBuffer
::
new
(
vec!
[
0
;
NetworkDevice
::
MTU
])
);
tx_packets
.push
(
RawPacketBuffer
::
new
(
vec!
[
0
;
NetworkDevice
::
MTU
]));
}
let
rx_buffer
=
RawSocketBuffer
::
new
(
rx_packets
);
let
tx_buffer
=
RawSocketBuffer
::
new
(
tx_packets
);
let
rx_buffer
=
RawSocketBuffer
::
new
(
vec!
[
RawPacketMetadata
::
EMPTY
;
Smolnetd
::
SOCKET_BUFFER_SIZE
],
vec!
[
0
;
NetworkDevice
::
MTU
*
Smolnetd
::
SOCKET_BUFFER_SIZE
]
);
let
tx_buffer
=
RawSocketBuffer
::
new
(
vec!
[
RawPacketMetadata
::
EMPTY
;
Smolnetd
::
SOCKET_BUFFER_SIZE
],
vec!
[
0
;
NetworkDevice
::
MTU
*
Smolnetd
::
SOCKET_BUFFER_SIZE
]
);
let
ip_socket
=
RawSocket
::
new
(
IpVersion
::
Ipv4
,
IpProtocol
::
from
(
proto
),
...
...
src/smolnetd/scheme/mod.rs
View file @
7ddadca8
use
netutils
::
getcfg
;
use
smoltcp
;
use
smoltcp
::
iface
::{
EthernetInterface
,
EthernetInterfaceBuilder
,
NeighborCache
};
use
smoltcp
::
iface
::{
EthernetInterface
,
EthernetInterfaceBuilder
,
NeighborCache
,
Routes
};
use
smoltcp
::
socket
::
SocketSet
as
SmoltcpSocketSet
;
use
smoltcp
::
time
::{
Duration
,
Instant
};
use
smoltcp
::
wire
::{
EthernetAddress
,
IpAddress
,
IpCidr
,
IpEndpoint
,
Ipv4Address
};
...
...
@@ -31,7 +31,7 @@ mod icmp;
mod
netcfg
;
type
SocketSet
=
SmoltcpSocketSet
<
'static
,
'static
,
'static
>
;
type
Interface
=
Rc
<
RefCell
<
EthernetInterface
<
'static
,
'static
,
NetworkDevice
>>>
;
type
Interface
=
Rc
<
RefCell
<
EthernetInterface
<
'static
,
'static
,
'static
,
NetworkDevice
>>>
;
const
MAX_DURATION
:
Duration
=
Duration
{
millis
:
::
std
::
u64
::
MAX
};
const
MIN_DURATION
:
Duration
=
Duration
{
millis
:
0
};
...
...
@@ -89,11 +89,13 @@ impl Smolnetd {
hardware_addr
,
Rc
::
clone
(
&
buffer_pool
),
);
let
mut
routes
=
Routes
::
new
(
BTreeMap
::
new
());
routes
.add_default_ipv4_route
(
default_gw
)
.expect
(
"Failed to add default gateway"
);
let
iface
=
EthernetInterfaceBuilder
::
new
(
network_device
)
.neighbor_cache
(
NeighborCache
::
new
(
BTreeMap
::
new
()))
.ethernet_addr
(
hardware_addr
)
.ip_addrs
(
protocol_addrs
)
.
ipv4_gateway
(
default_gw
)
.
routes
(
routes
)
.finalize
();
let
iface
=
Rc
::
new
(
RefCell
::
new
(
iface
));
let
socket_set
=
Rc
::
new
(
RefCell
::
new
(
SocketSet
::
new
(
vec!
[])));
...
...
src/smolnetd/scheme/netcfg/mod.rs
View file @
7ddadca8
...
...
@@ -2,7 +2,7 @@
mod
nodes
;
mod
notifier
;
use
smoltcp
::
wire
::{
EthernetAddress
,
IpCidr
,
Ipv4Address
};
use
smoltcp
::
wire
::{
IpAddress
,
EthernetAddress
,
IpCidr
,
Ipv4Address
};
use
std
::
cell
::
RefCell
;
use
std
::
collections
::
BTreeMap
;
use
std
::
fs
::
File
;
...
...
@@ -23,6 +23,11 @@ use super::{post_fevent, Interface};
const
WRITE_BUFFER_MAX_SIZE
:
usize
=
0xffff
;
fn
gateway_cidr
()
->
IpCidr
{
// TODO: const fn
IpCidr
::
new
(
IpAddress
::
v4
(
0
,
0
,
0
,
0
),
0
)
}
fn
parse_default_gw
(
value
:
&
str
)
->
SyscallResult
<
Ipv4Address
>
{
let
mut
routes
=
value
.lines
();
if
let
Some
(
route
)
=
routes
.next
()
{
...
...
@@ -75,7 +80,11 @@ fn mk_root_node(iface: Interface, notifier: NotifierRef, dns_config: DNSConfigRe
"route"
=>
{
"list"
=>
{
ro
[
iface
]
||
{
if
let
Some
(
ip
)
=
iface
.borrow
()
.ipv4_gateway
()
{
let
mut
gateway
=
None
;
iface
.borrow_mut
()
.routes_mut
()
.update
(|
map
|
{
gateway
=
map
.get
(
&
gateway_cidr
())
.map
(|
route
|
route
.via_router
);
});
if
let
Some
(
ip
)
=
gateway
{
format!
(
"default via {}
\n
"
,
ip
)
}
else
{
String
::
new
()
...
...
@@ -98,7 +107,9 @@ fn mk_root_node(iface: Interface, notifier: NotifierRef, dns_config: DNSConfigRe
}
|
cur_value
|
{
if
let
Some
(
default_gw
)
=
*
cur_value
{
iface
.borrow_mut
()
.set_ipv4_gateway
(
Some
(
default_gw
));
if
iface
.borrow_mut
()
.routes_mut
()
.add_default_ipv4_route
(
default_gw
)
.is_err
()
{
return
Err
(
SyscallError
::
new
(
syscall
::
EINVAL
));
}
notifier
.borrow_mut
()
.schedule_notify
(
"route/list"
);
Ok
(())
}
else
{
...
...
@@ -123,10 +134,16 @@ fn mk_root_node(iface: Interface, notifier: NotifierRef, dns_config: DNSConfigRe
|
cur_value
|
{
if
let
Some
(
default_gw
)
=
*
cur_value
{
let
mut
iface
=
iface
.borrow_mut
();
if
iface
.ipv4_gateway
()
!=
Some
(
default_gw
)
{
let
mut
gateway
=
None
;
iface
.routes_mut
()
.update
(|
map
|
{
gateway
=
map
.get
(
&
gateway_cidr
())
.map
(|
route
|
route
.via_router
);
});
if
gateway
!=
Some
(
IpAddress
::
Ipv4
(
default_gw
))
{
return
Err
(
SyscallError
::
new
(
syscall
::
EINVAL
));
}
iface
.set_ipv4_gateway
(
None
);
iface
.routes_mut
()
.update
(|
map
|
{
map
.remove
(
&
gateway_cidr
());
});
notifier
.borrow_mut
()
.schedule_notify
(
"route/list"
);
Ok
(())
}
else
{
...
...
src/smolnetd/scheme/udp.rs
View file @
7ddadca8
use
smoltcp
::
socket
::{
SocketHandle
,
UdpPacket
Buffer
,
UdpSocket
,
UdpSocketBuffer
};
use
smoltcp
::
socket
::{
SocketHandle
,
UdpPacket
Metadata
,
UdpSocket
,
UdpSocketBuffer
};
use
smoltcp
::
wire
::
IpEndpoint
;
use
std
::
str
;
use
syscall
::{
Error
as
SyscallError
,
Result
as
SyscallResult
};
...
...
@@ -66,14 +66,14 @@ impl<'a, 'b> SchemeSocket for UdpSocket<'a, 'b> {
return
Err
(
SyscallError
::
new
(
syscall
::
EACCES
));
}
let
mut
rx_packets
=
Vec
::
with_capacity
(
Smolnetd
::
SOCKET_BUFFER_SIZE
);
let
mut
tx_packets
=
Vec
::
with_capacity
(
Smolnetd
::
SOCKET_BUFFER_SIZE
);
for
_
in
0
..
Smolnetd
::
SOCKET_BUFFER_SIZE
{
rx_packets
.push
(
UdpPacketBuffer
::
new
(
vec!
[
0
;
NetworkDevice
::
MTU
])
);
tx_packets
.push
(
UdpPacketBuffer
::
new
(
vec!
[
0
;
NetworkDevice
::
MTU
]));
}
let
rx_buffer
=
UdpSocketBuffer
::
new
(
rx_packets
);
let
tx_buffer
=
UdpSocketBuffer
::
new
(
tx_packets
);
let
rx_buffer
=
UdpSocketBuffer
::
new
(
vec!
[
UdpPacketMetadata
::
EMPTY
;
Smolnetd
::
SOCKET_BUFFER_SIZE
],
vec!
[
0
;
NetworkDevice
::
MTU
*
Smolnetd
::
SOCKET_BUFFER_SIZE
]
);
let
tx_buffer
=
UdpSocketBuffer
::
new
(
vec!
[
UdpPacketMetadata
::
EMPTY
;
Smolnetd
::
SOCKET_BUFFER_SIZE
],
vec!
[
0
;
NetworkDevice
::
MTU
*
Smolnetd
::
SOCKET_BUFFER_SIZE
]
);
let
udp_socket
=
UdpSocket
::
new
(
rx_buffer
,
tx_buffer
);
if
local_endpoint
.port
==
0
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment