@@ -16,8 +16,10 @@ use pnet::util::MacAddr;
16
16
17
17
use tokio_tun:: Tun ;
18
18
use tokio:: io:: WriteHalf ;
19
+ use tokio:: io:: AsyncReadExt ;
19
20
use tokio:: io:: AsyncWriteExt ;
20
21
//use tokio::io::Write;
22
+ use tokio_tun:: TunBuilder ;
21
23
22
24
//use std::env;
23
25
//use std::io::{self, Write};
@@ -52,6 +54,7 @@ fn send_ipv4_packet(
52
54
//tx: &TxSender,
53
55
writer : & mut tokio:: io:: WriteHalf < Tun > ,
54
56
) {
57
+ println ! ( "send" ) ;
55
58
let buf_size = MutableIpv4Packet :: minimum_packet_size ( ) + payload. len ( ) ;
56
59
let mut ip_packet = MutableIpv4Packet :: owned ( vec ! [ 0u8 ; buf_size] ) . unwrap ( ) ;
57
60
@@ -75,7 +78,7 @@ fn send_ipv4_packet(
75
78
//writer.write(ip_packet.packet());
76
79
//let r = writer.write(ip_packet.packet());
77
80
//writer.flush();
78
- writer. write ( ip_packet. packet ( ) ) ;
81
+ writer. write_all ( ip_packet. packet ( ) ) ;
79
82
writer. flush ( ) ;
80
83
//println!("send:{:?}", ret);
81
84
@@ -105,7 +108,13 @@ fn send_ipv4_packet(
105
108
//};
106
109
}
107
110
108
- fn handle_icmp_packet ( interface_name : & str , source : IpAddr , destination : IpAddr , packet : & [ u8 ] , writer : & mut tokio:: io:: WriteHalf < Tun > ) {
111
+ fn handle_icmp_packet ( interface_name : & str , source : IpAddr , destination : IpAddr ,
112
+ packet : & [ u8 ] ,
113
+ recv_packet : & [ u8 ] ,
114
+ writer : & mut tokio:: io:: WriteHalf < Tun > ) {
115
+
116
+ writer. write_all ( & recv_packet) ;
117
+
109
118
let icmp_packet = IcmpPacket :: new ( packet) ;
110
119
if let Some ( icmp_packet) = icmp_packet {
111
120
match icmp_packet. get_icmp_type ( ) {
@@ -121,6 +130,8 @@ fn handle_icmp_packet(interface_name: &str, source: IpAddr, destination: IpAddr,
121
130
) ;
122
131
}
123
132
IcmpTypes :: EchoRequest => {
133
+ println ! ( "recv" ) ;
134
+ writer. write_all ( & recv_packet) ;
124
135
let echo_request_packet = echo_request:: EchoRequestPacket :: new ( packet) . unwrap ( ) ;
125
136
println ! (
126
137
"[{}]: ICMP echo request {} -> {} (seq={:?}, id={:?})" ,
@@ -156,6 +167,7 @@ fn handle_icmp_packet(interface_name: &str, source: IpAddr, destination: IpAddr,
156
167
//////////////////////////////////////////
157
168
*/
158
169
let mut echo_reply_packet =
170
+
159
171
echo_reply:: MutableEchoReplyPacket :: owned ( packet. to_vec ( ) ) . unwrap ( ) ;
160
172
echo_reply_packet. set_icmp_type ( IcmpTypes :: EchoReply ) ;
161
173
let icmp_packet = IcmpPacket :: new ( echo_reply_packet. packet ( ) ) . unwrap ( ) ;
@@ -229,6 +241,7 @@ pub fn handle_transport_protocol(
229
241
destination : IpAddr ,
230
242
protocol : IpNextHeaderProtocol ,
231
243
packet : & [ u8 ] ,
244
+ recv_packet : & [ u8 ] ,
232
245
writer : & mut tokio:: io:: WriteHalf < Tun > ,
233
246
) {
234
247
match protocol {
@@ -239,7 +252,7 @@ pub fn handle_transport_protocol(
239
252
handle_tcp_packet ( interface_name, source, destination, packet, writer)
240
253
}
241
254
IpNextHeaderProtocols :: Icmp => {
242
- handle_icmp_packet ( interface_name, source, destination, packet, writer)
255
+ handle_icmp_packet ( interface_name, source, destination, packet, recv_packet , writer)
243
256
}
244
257
IpNextHeaderProtocols :: Icmpv6 => {
245
258
handle_icmpv6_packet ( interface_name, source, destination, packet, writer)
@@ -259,6 +272,21 @@ pub fn handle_transport_protocol(
259
272
}
260
273
}
261
274
275
+ pub async fn handle_transport_protocol2 (
276
+ interface_name : & str ,
277
+ source : IpAddr ,
278
+ destination : IpAddr ,
279
+ protocol : IpNextHeaderProtocol ,
280
+ packet : & [ u8 ] ,
281
+ recv_packet : & [ u8 ] ,
282
+ //writer: &mut tokio::io::WriteHalf<Tun>,
283
+ tun : Tun ,
284
+ ) {
285
+ let ( mut reader, mut _writer) = tokio:: io:: split ( tun) ;
286
+
287
+ //_writer.write(&recv_packet);
288
+ }
289
+
262
290
pub fn handle_ipv4_packet ( interface_name : & str , ethernet : & EthernetPacket , writer : & mut tokio:: io:: WriteHalf < Tun > ) {
263
291
let header = Ipv4Packet :: new ( ethernet. payload ( ) ) ;
264
292
if let Some ( header) = header {
@@ -268,6 +296,7 @@ pub fn handle_ipv4_packet(interface_name: &str, ethernet: &EthernetPacket, write
268
296
IpAddr :: V4 ( header. get_destination ( ) ) ,
269
297
header. get_next_level_protocol ( ) ,
270
298
header. payload ( ) ,
299
+ header. payload ( ) ,
271
300
writer,
272
301
) ;
273
302
} else {
@@ -284,6 +313,7 @@ pub fn handle_ipv6_packet(interface_name: &str, ethernet: &EthernetPacket, write
284
313
IpAddr :: V6 ( header. get_destination ( ) ) ,
285
314
header. get_next_header ( ) ,
286
315
header. payload ( ) ,
316
+ header. payload ( ) ,
287
317
writer,
288
318
) ;
289
319
} else {
0 commit comments