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
72
73
74
75
76
77
78
79
80
81
82
83
84
#![no_std]
#![feature(const_btree_new)]
#[cfg(feature = "role_center")]
extern crate alloc;
mod address;
mod consts;
mod datagram;
mod history;
mod sender;
mod socket;
pub use address::Addr;
use consts::*;
pub use datagram::set_index;
use datagram::{Datagram, DatagramHeader};
use history::History;
use log::warn;
pub use socket::*;
use spin::Once;
use unmp::protocol::{Protocol, Respose};
static HISTORY: History = History::new();
static ETP: Once<Protocol> = Once::new();
pub fn init() {
if let Ok(protocol) = Protocol::new(PROTOCOL_ID) {
ETP.call_once(|| protocol);
task_stream::spawn(async move {
loop {
let etp=ETP.get().unwrap();
if let Some(rep) = etp.recv().await {
let Respose { data, conn } = rep;
let datagram = Datagram::parse(&data);
if let Ok(datagram) = datagram {
let head = datagram.head();
if head.control() < 0x80 {
let mut is_repeat = false;
if head.control() & (1 << 1) == (1 << 1) {
if !HISTORY.add(&datagram) {
is_repeat = true;
}
}
if head.control() & (1 << 0) == (1 << 0) {
let mut res = DatagramHeader::new(
head.dstport(),
head.srcport(),
Some(head.index()),
);
res.set_control(0x81 | (is_repeat as u8) << 1);
let buf = res.generate(&[]);
let dst_conn = conn.clone();
task_stream::spawn(async move {
let _err = etp.send( &buf, &dst_conn).await;
});
}
if is_repeat {
return;
}
let addr = Addr::new(conn, head.srcport());
socket::when_recv(&datagram, addr)
} else {
sender::finish(head.index()).await;
}
}
} else {
warn!("etp recver exit.");
return;
}
}
})
} else {
warn!("can't crate etp.")
}
}