Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
R
railgun-routing-client
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Railgun
railgun-routing-client
Commits
b4ca6a52
Commit
b4ca6a52
authored
Dec 17, 2025
by
nanamicat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
clean
parent
5c51e2b7
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
107 additions
and
140 deletions
+107
-140
config/config.json
config/config.json
+0
-10
rustfmt.toml
rustfmt.toml
+1
-0
src/connection.rs
src/connection.rs
+8
-8
src/data.rs
src/data.rs
+30
-31
src/gateway_group.rs
src/gateway_group.rs
+25
-25
src/main.rs
src/main.rs
+15
-24
src/protocol.rs
src/protocol.rs
+5
-2
src/route_writer.rs
src/route_writer.rs
+3
-3
src/router.rs
src/router.rs
+3
-3
src/server.rs
src/server.rs
+15
-30
src/settings.rs
src/settings.rs
+2
-4
No files found.
config/config.json
deleted
100644 → 0
View file @
5c51e2b7
{
"id"
:
99
,
"server"
:
"43.142.53.161:500"
,
"port"
:
495
,
"timeout"
:
10
,
"history"
:
100
,
"interval"
:
1000
,
"table"
:
2000
,
"proto"
:
250
}
rustfmt.toml
0 → 100644
View file @
b4ca6a52
max_width
=
180
\ No newline at end of file
src/connection.rs
View file @
b4ca6a52
...
@@ -2,12 +2,12 @@ use serde_derive::Deserialize;
...
@@ -2,12 +2,12 @@ use serde_derive::Deserialize;
#[derive(Deserialize)]
#[derive(Deserialize)]
pub
(
crate
)
struct
Connection
{
pub
(
crate
)
struct
Connection
{
pub
metric
:
u32
,
// pub metric: u32,
pub
protocol
:
Schema
,
// pub protocol: Schema,
}
#[derive(Deserialize)]
pub
(
crate
)
enum
Schema
{
IP
,
UDP
,
TCP
,
}
}
// #[derive(Deserialize)]
// pub(crate) enum Schema {
// IP,
// UDP,
// TCP,
// }
src/data.rs
View file @
b4ca6a52
use
serde
::
Deserialize
;
use
serde
::
Deserialize
;
use
std
::
collections
::
HashSet
;
#[derive(Deserialize)]
#[derive(Deserialize)]
#[serde(rename_all
=
"camelCase"
)]
#[serde(rename_all
=
"camelCase"
)]
pub
struct
Router
{
pub
struct
Router
{
pub
id
:
u8
,
pub
id
:
u8
,
pub
name
:
String
,
//
pub name: String,
pub
address
:
String
,
//
pub address: String,
pub
location
:
String
,
//
pub location: String,
pub
user
:
String
,
//
pub user: String,
pub
host
:
String
,
//
pub host: String,
pub
ssh_port
:
u16
,
//
pub ssh_port: u16,
pub
ssh_system
:
Option
<
u16
>
,
//
pub ssh_system: Option<u16>,
pub
next_mark
:
u16
,
//
pub next_mark: u16,
pub
dest_mark
:
u16
,
//
pub dest_mark: u16,
pub
port
:
u16
,
//
pub port: u16,
pub
port2
:
u16
,
//
pub port2: u16,
pub
wg_private_key
:
Option
<
String
>
,
//
pub wg_private_key: Option<String>,
pub
masq_interfaces
:
Vec
<
String
>
,
//
pub masq_interfaces: Vec<String>,
pub
os
:
String
,
//
pub os: String,
pub
arch
:
String
,
//
pub arch: String,
pub
ocserv_port
:
u16
,
//
pub ocserv_port: u16,
pub
offset
:
u16
,
//
pub offset: u16,
pub
offset2
:
u16
,
//
pub offset2: u16,
}
}
#[derive(Deserialize)]
//
#[derive(Deserialize)]
#[serde(rename_all
=
"camelCase"
)]
//
#[serde(rename_all = "camelCase")]
pub
struct
GatewayGroup
{
//
pub struct GatewayGroup {
pub
id
:
u16
,
//
pub id: u16,
pub
name
:
String
,
//
pub name: String,
pub
description
:
String
,
//
pub description: String,
pub
children
:
HashSet
<
String
>
,
//
pub children: HashSet<String>,
pub
dest_mark
:
u16
,
//
pub dest_mark: u16,
pub
location_prefix
:
Vec
<
String
>
,
//
pub location_prefix: Vec<String>,
pub
include_routers
:
HashSet
<
String
>
,
//
pub include_routers: HashSet<String>,
pub
exclude_routers
:
HashSet
<
String
>
,
//
pub exclude_routers: HashSet<String>,
}
//
}
src/gateway_group.rs
View file @
b4ca6a52
use
std
::
collections
::{
HashMap
,
HashSet
}
;
// use std::collections::HashSet
;
//
use
crate
::
data
::{
GatewayGroup
,
Router
};
//
use crate::data::{GatewayGroup, Router};
//
impl
GatewayGroup
{
//
impl GatewayGroup {
pub
fn
routers
(
&
self
,
groups
:
&
[
GatewayGroup
],
routers
:
&
[
Router
])
->
HashSet
<
u8
>
{
//
pub fn routers(&self, groups: &[GatewayGroup], routers: &[Router]) -> HashSet<u8> {
routers
//
routers
.iter
()
//
.iter()
.filter
(|
r
|
self
.include_routers
.contains
(
&
r
.name
))
//
.filter(|r| self.include_routers.contains(&r.name))
.chain
(
//
.chain(
self
.location_prefix
//
self.location_prefix
.iter
()
//
.iter()
.flat_map
(|
p
|
routers
.iter
()
.filter
(
move
|
r
|
r
.location
.starts_with
(
p
))),
//
.flat_map(|p| routers.iter().filter(move |r| r.location.starts_with(p))),
)
//
)
.filter
(|
r
|
!
self
.exclude_routers
.contains
(
&
r
.name
))
//
.filter(|r| !self.exclude_routers.contains(&r.name))
.map
(|
r
|
r
.id
)
//
.map(|r| r.id)
.chain
(
//
.chain(
groups
//
groups
.iter
()
//
.iter()
.filter
(|
g
|
self
.children
.contains
(
&
g
.name
))
//
.filter(|g| self.children.contains(&g.name))
.flat_map
(|
g1
|
g1
.routers
(
groups
,
routers
)),
//
.flat_map(|g1| g1.routers(groups, routers)),
)
//
)
.collect
()
//
.collect()
}
//
}
}
//
}
src/main.rs
View file @
b4ca6a52
...
@@ -7,7 +7,6 @@ use crate::settings::{Settings, INTERVAL};
...
@@ -7,7 +7,6 @@ use crate::settings::{Settings, INTERVAL};
use
config
::
Config
;
use
config
::
Config
;
use
std
::
collections
::
HashMap
;
use
std
::
collections
::
HashMap
;
use
std
::
fs
;
use
std
::
fs
;
use
std
::
net
::{
IpAddr
,
Ipv6Addr
,
SocketAddr
};
use
std
::
time
::
SystemTime
;
use
std
::
time
::
SystemTime
;
use
tokio
::
net
::
UdpSocket
;
use
tokio
::
net
::
UdpSocket
;
use
tokio
::
time
;
use
tokio
::
time
;
...
@@ -23,20 +22,10 @@ mod settings;
...
@@ -23,20 +22,10 @@ mod settings;
#[tokio::main]
#[tokio::main]
async
fn
main
()
->
anyhow
::
Result
<
()
>
{
async
fn
main
()
->
anyhow
::
Result
<
()
>
{
let
config
:
Settings
=
Config
::
builder
()
let
config
:
Settings
=
Config
::
builder
()
.add_source
(
config
::
Environment
::
default
())
.build
()
?
.try_deserialize
()
?
;
.add_source
(
config
::
File
::
with_name
(
"config/config.json"
))
.add_source
(
config
::
Environment
::
with_prefix
(
"RAILGUN"
))
.build
()
?
.try_deserialize
()
?
;
let
routers_data
=
serde_json
::
from_slice
::
<
Vec
<
RouterData
>>
(
&
fs
::
read
(
"import/Router.json"
)
?
)
?
;
let
routers_data
=
serde_json
::
from_slice
::
<
Vec
<
RouterData
>>
(
&
fs
::
read
(
"import/Router.json"
)
?
)
?
;
let
mut
routers
:
HashMap
<
u8
,
Router
>
=
routers_data
let
mut
routers
:
HashMap
<
u8
,
Router
>
=
routers_data
.iter
()
.map
(|
r
|
(
r
.id
,
Router
::
new
(
r
,
&
config
)))
.collect
();
.iter
()
let
connections
=
serde_json
::
from_slice
::
<
HashMap
<
u8
,
HashMap
<
u8
,
Connection
>>>
(
&
fs
::
read
(
"import/connections.json"
)
?
)
?
;
.map
(|
r
|
(
r
.id
,
Router
::
new
(
r
,
&
config
)))
.collect
();
let
connections
=
serde_json
::
from_slice
::
<
HashMap
<
u8
,
HashMap
<
u8
,
Connection
>>>
(
&
fs
::
read
(
"import/connections.json"
,
)
?
)
?
;
// let groups: Vec<GatewayGroup> = serde_json::from_slice(&fs::read("import/GatewayGroup.json")?)?;
// let groups: Vec<GatewayGroup> = serde_json::from_slice(&fs::read("import/GatewayGroup.json")?)?;
let
mut
server
=
Server
::
new
(
let
mut
server
=
Server
::
new
(
...
@@ -49,31 +38,32 @@ async fn main() -> anyhow::Result<()> {
...
@@ -49,31 +38,32 @@ async fn main() -> anyhow::Result<()> {
let
mut
hello
=
Hello
{
time
:
0
};
let
mut
hello
=
Hello
{
time
:
0
};
let
socket
=
UdpSocket
::
bind
(
SocketAddr
::
new
(
let
socket
=
UdpSocket
::
bind
(
config
.bind
)
.await
?
;
IpAddr
::
V6
(
Ipv6Addr
::
UNSPECIFIED
),
config
.port
,
))
.await
?
;
let
mut
timer
=
time
::
interval
(
INTERVAL
);
let
mut
timer
=
time
::
interval
(
INTERVAL
);
let
mut
buf
=
[
0
;
1500
];
let
mut
buf
=
[
0
;
1500
];
let
mut
syn
:
bool
=
true
;
loop
{
loop
{
tokio
::
select!
{
tokio
::
select!
{
biased
;
// 优先处理上面的
biased
;
// 优先处理上面的
Ok
((
len
,
src
))
=
socket
.recv_from
(
&
mut
buf
)
=>
{
result
=
socket
.recv_from
(
&
mut
buf
)
=>
{
let
(
len
,
src
)
=
result
?
;
if
src
==
config
.server
{
if
src
==
config
.server
{
// from server
// from server
let
(
message
,
_
):
(
Change
,
usize
)
=
bincode
::
decode_from_slice
(
&
buf
[
..
len
],
bincode
::
config
::
standard
())
?
;
let
(
message
,
_
):
(
Change
,
usize
)
=
bincode
::
decode_from_slice
(
&
buf
[
..
len
],
bincode
::
config
::
standard
())
?
;
server
.on_message
(
&
socket
,
&
message
,
&
mut
routers
,
&
hello
);
server
.on_message
(
&
message
);
let
report
=
Report
{
let
report
=
Report
{
id
:
config
.id
,
id
:
config
.id
,
syn
:
message
.rst
,
ack
:
server
.ack
,
ack
:
server
.ack
,
peers
:
Vec
::
new
()
peers
:
Vec
::
new
()
};
};
let
message
=
bincode
::
encode_to_vec
(
&
report
,
bincode
::
config
::
standard
())
?
;
let
message
=
bincode
::
encode_to_vec
(
&
report
,
bincode
::
config
::
standard
())
?
;
let
_
=
socket
.send_to
(
message
.as_slice
(),
config
.server
);
let
_
=
socket
.send_to
(
message
.as_slice
(),
config
.server
)
.await
;
syn
=
false
;
}
else
if
let
Some
(
peer
)
=
Router
::
get
(
&
mut
routers
,
src
){
}
else
if
let
Some
(
peer
)
=
Router
::
get
(
&
mut
routers
,
src
){
// from client
// from client
let
(
message
,
_
):
(
Hello
,
usize
)
=
bincode
::
decode_from_slice
(
&
buf
[
..
len
],
bincode
::
config
::
standard
())
?
;
let
(
message
,
_
):
(
Hello
,
usize
)
=
bincode
::
decode_from_slice
(
&
buf
[
..
len
],
bincode
::
config
::
standard
())
?
;
...
@@ -87,12 +77,13 @@ async fn main() -> anyhow::Result<()> {
...
@@ -87,12 +77,13 @@ async fn main() -> anyhow::Result<()> {
let
message
=
bincode
::
encode_to_vec
(
&
hello
,
bincode
::
config
::
standard
())
?
;
let
message
=
bincode
::
encode_to_vec
(
&
hello
,
bincode
::
config
::
standard
())
?
;
for
id
in
connections
[
&
config
.id
]
.keys
()
{
for
id
in
connections
[
&
config
.id
]
.keys
()
{
let
router
=
&
routers
[
id
];
let
router
=
&
routers
[
id
];
let
_
=
socket
.send_to
(
message
.as_slice
(),
router
.link_address
);
let
_
=
socket
.send_to
(
message
.as_slice
(),
router
.link_address
)
.await
;
}
}
// to server
// to server
let
report
=
Report
{
let
report
=
Report
{
id
:
config
.id
,
id
:
config
.id
,
syn
,
ack
:
server
.ack
,
ack
:
server
.ack
,
peers
:
connections
peers
:
connections
.iter
()
.iter
()
...
@@ -101,7 +92,7 @@ async fn main() -> anyhow::Result<()> {
...
@@ -101,7 +92,7 @@ async fn main() -> anyhow::Result<()> {
.collect
(),
.collect
(),
};
};
let
message
=
bincode
::
encode_to_vec
(
&
report
,
bincode
::
config
::
standard
())
?
;
let
message
=
bincode
::
encode_to_vec
(
&
report
,
bincode
::
config
::
standard
())
?
;
let
_
=
socket
.send_to
(
message
.as_slice
(),
config
.server
);
let
_
=
socket
.send_to
(
message
.as_slice
(),
config
.server
)
.await
;
}
}
}
}
}
}
...
...
src/protocol.rs
View file @
b4ca6a52
use
std
::
collections
::
BTreeMap
;
use
bincode
::{
Decode
,
Encode
};
use
bincode
::{
Decode
,
Encode
};
#[derive(Encode,
Decode)]
#[derive(Encode,
Decode)]
...
@@ -9,6 +10,7 @@ pub struct Hello {
...
@@ -9,6 +10,7 @@ pub struct Hello {
pub
struct
Report
{
pub
struct
Report
{
pub
id
:
u8
,
pub
id
:
u8
,
pub
ack
:
u8
,
pub
ack
:
u8
,
pub
syn
:
bool
,
pub
peers
:
Vec
<
PeerQuality
>
,
pub
peers
:
Vec
<
PeerQuality
>
,
}
}
...
@@ -22,6 +24,7 @@ pub struct PeerQuality {
...
@@ -22,6 +24,7 @@ pub struct PeerQuality {
#[derive(Encode,
Decode)]
#[derive(Encode,
Decode)]
pub
struct
Change
{
pub
struct
Change
{
pub
seq
:
u8
,
pub
seq
:
u8
,
pub
via
:
Vec
<
(
u8
,
u8
)
>
,
pub
rst
:
bool
,
pub
plan
:
Vec
<
(
u8
,
u8
)
>
,
pub
via
:
BTreeMap
<
u8
,
u8
>
,
pub
plan
:
BTreeMap
<
u8
,
BTreeMap
<
u8
,
u8
>>
,
}
}
src/route_writer.rs
View file @
b4ca6a52
use
rtnetlink
::{
new_connection
,
Error
,
Handle
};
//
use rtnetlink::{new_connection, Error, Handle};
use
std
::
collections
::
HashMap
;
//
use std::collections::HashMap;
//
// struct RouteWriter {
// struct RouteWriter {
// via: HashMap<u8, u8>,
// via: HashMap<u8, u8>,
// plan: HashMap<u16, u8>,
// plan: HashMap<u16, u8>,
...
...
src/router.rs
View file @
b4ca6a52
...
@@ -27,8 +27,8 @@ impl Router {
...
@@ -27,8 +27,8 @@ impl Router {
pub
fn
new
(
data
:
&
RouterData
,
config
:
&
Settings
)
->
Router
{
pub
fn
new
(
data
:
&
RouterData
,
config
:
&
Settings
)
->
Router
{
Router
{
Router
{
link_address
:
SocketAddr
::
new
(
link_address
:
SocketAddr
::
new
(
IpAddr
::
from
([
1
69
,
254
,
data
.id
,
config
.id
]),
IpAddr
::
from
([
1
0
,
200
,
data
.id
,
config
.id
]),
config
.
port
,
config
.
bind
.port
()
,
),
),
quality
:
PeerQuality
{
quality
:
PeerQuality
{
reliability
:
0
,
reliability
:
0
,
...
@@ -79,7 +79,7 @@ impl Router {
...
@@ -79,7 +79,7 @@ impl Router {
self
.history
.push
(
Some
(
delay
));
self
.history
.push
(
Some
(
delay
));
if
(
self
.history
.len
()
>
HISTORY
as
usize
)
{
if
self
.history
.len
()
>
HISTORY
as
usize
{
self
.history
.drain
(
0
..
self
.history
.len
()
-
HISTORY
as
usize
);
self
.history
.drain
(
0
..
self
.history
.len
()
-
HISTORY
as
usize
);
}
}
...
...
src/server.rs
View file @
b4ca6a52
use
std
::
collections
::{
HashMap
,
HashSet
};
use
crate
::
protocol
::
Change
;
use
tokio
::
net
::
UdpSocket
;
use
crate
::
protocol
::{
Change
,
Hello
,
Report
};
use
crate
::
router
::
Router
;
pub
struct
Server
{
pub
struct
Server
{
pub
(
crate
)
ack
:
u8
,
pub
(
crate
)
ack
:
u8
,
...
@@ -16,45 +11,35 @@ impl Server {
...
@@ -16,45 +11,35 @@ impl Server {
pub
fn
on_message
(
pub
fn
on_message
(
&
mut
self
,
&
mut
self
,
socket
:
&
UdpSocket
,
message
:
&
Change
,
message
:
&
Change
,
routers
:
&
mut
HashMap
<
u8
,
Router
>
,
//
routers: &mut HashMap<u8, Router>,
self_peer
:
&
Hello
,
//
self_peer: &Hello,
)
{
)
{
if
message
.
seq
==
0
{
if
message
.
rst
{
self
.ack
=
0
;
self
.ack
=
message
.seq
;
// RouteWriter::reset();
// RouteWriter::reset();
}
}
if
self
.ack
!=
message
.seq
{
if
self
.ack
!=
message
.seq
{
println!
(
println!
(
"server seq={}, local ack={}"
,
message
.seq
,
self
.ack
);
"seq mismatch rejected, server seq={}, local ack={}"
,
message
.seq
,
self
.ack
);
return
;
return
;
}
}
for
(
to
,
via
)
in
message
.via
.iter
()
{
//
for (to, via) in message.via.iter() {
// RouteWriter::set_via(*to, *via);
// RouteWriter::set_via(*to, *via);
}
//
}
// if let Some(plan) = message.plan.as_ref() {
// if let Some(plan) = message.plan.as_ref() {
for
(
group_id
,
to
)
in
message
.plan
.iter
()
{
//
for (group_id, to) in message.plan.iter() {
// RouteWriter::set_plan(&GatewayGroup::all()[*group_id], *to);
// RouteWriter::set_plan(&GatewayGroup::all()[*group_id], *to);
}
//
}
// }
// }
// RouteWriter::commit();
// RouteWriter::commit();
self
.ack
+=
1
;
self
.ack
+=
1
;
self
.update
(
socket
,
routers
,
self_peer
);
//
self.update(socket, routers, self_peer);
}
}
pub
fn
update
(
// pub fn update(&mut self, socket: &UdpSocket, routers: &mut HashMap<u8, Router>, hello: &Hello) {
&
mut
self
,
// }
socket
:
&
UdpSocket
,
routers
:
&
mut
HashMap
<
u8
,
Router
>
,
hello
:
&
Hello
,
)
{
}
}
}
src/settings.rs
View file @
b4ca6a52
use
serde
::
Deserialize
;
use
std
::
net
::
SocketAddr
;
use
std
::
net
::
SocketAddr
;
use
std
::
time
::
Duration
;
use
std
::
time
::
Duration
;
use
config
::
Config
;
use
serde
::
Deserialize
;
use
tokio
::
time
;
#[derive(Deserialize)]
#[derive(Deserialize)]
pub
struct
Settings
{
pub
struct
Settings
{
pub
id
:
u8
,
pub
id
:
u8
,
pub
server
:
SocketAddr
,
pub
server
:
SocketAddr
,
pub
port
:
u16
,
pub
bind
:
SocketAddr
,
// pub TIMEOUT: u32,
// pub TIMEOUT: u32,
// pub history: usize,
// pub history: usize,
// pub INTERVAL: u64,
// pub INTERVAL: u64,
...
...
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