File tree 3 files changed +54
-4
lines changed
3 files changed +54
-4
lines changed Original file line number Diff line number Diff line change @@ -5,6 +5,7 @@ pub struct Config {
5
5
max_packets_read : usize ,
6
6
snaplen : u32 ,
7
7
buffer_size : u32 ,
8
+ datalink : Option < i32 > ,
8
9
bpf : Option < String > ,
9
10
buffer_for : std:: time:: Duration ,
10
11
blocking : bool ,
@@ -29,6 +30,15 @@ impl Config {
29
30
self
30
31
}
31
32
33
+ pub fn datalink ( & self ) -> & Option < i32 > {
34
+ & self . datalink
35
+ }
36
+
37
+ pub fn with_datalink_type ( & mut self , datalink : i32 ) -> & mut Self {
38
+ self . datalink = Some ( datalink) ;
39
+ self
40
+ }
41
+
32
42
pub fn buffer_size ( & self ) -> u32 {
33
43
self . buffer_size
34
44
}
@@ -69,6 +79,7 @@ impl Config {
69
79
max_packets_read : usize ,
70
80
snaplen : u32 ,
71
81
buffer_size : u32 ,
82
+ datalink : Option < i32 > ,
72
83
bpf : Option < String > ,
73
84
buffer_for : std:: time:: Duration ,
74
85
blocking : bool ,
@@ -77,6 +88,7 @@ impl Config {
77
88
max_packets_read,
78
89
snaplen,
79
90
buffer_size,
91
+ datalink,
80
92
bpf,
81
93
buffer_for,
82
94
blocking,
@@ -90,6 +102,7 @@ impl Default for Config {
90
102
max_packets_read : 1000 ,
91
103
snaplen : 65535 ,
92
104
buffer_size : 16777216 ,
105
+ datalink : None ,
93
106
bpf : None ,
94
107
buffer_for : std:: time:: Duration :: from_millis ( 100 ) ,
95
108
blocking : false ,
Original file line number Diff line number Diff line change @@ -157,6 +157,23 @@ impl Handle {
157
157
}
158
158
}
159
159
160
+ pub fn set_datalink ( & self , datalink : i32 ) -> Result < & Self , Error > {
161
+ if 0 != unsafe { pcap_sys:: pcap_set_datalink ( self . handle , datalink as _ ) } {
162
+ Err ( pcap_util:: convert_libpcap_error ( self . handle ) )
163
+ } else {
164
+ Ok ( self )
165
+ }
166
+ }
167
+
168
+ pub fn get_datalink ( & self ) -> Result < i32 , Error > {
169
+ let r = unsafe { pcap_sys:: pcap_datalink ( self . handle ) } ;
170
+ if r < 0 {
171
+ Err ( pcap_util:: convert_libpcap_error ( self . handle ) )
172
+ } else {
173
+ Ok ( r)
174
+ }
175
+ }
176
+
160
177
pub fn compile_bpf ( & self , bpf : & str ) -> Result < Bpf , Error > {
161
178
let mut bpf_program = pcap_sys:: bpf_program {
162
179
bf_len : 0 ,
@@ -297,6 +314,7 @@ mod tests {
297
314
298
315
assert ! ( handle. is_ok( ) ) ;
299
316
}
317
+
300
318
#[ test]
301
319
fn open_dead ( ) {
302
320
let _ = env_logger:: try_init ( ) ;
@@ -305,6 +323,22 @@ mod tests {
305
323
306
324
assert ! ( handle. is_ok( ) ) ;
307
325
}
326
+
327
+ #[ test]
328
+ fn set_datalink ( ) {
329
+ let _ = env_logger:: try_init ( ) ;
330
+
331
+ let handle = Handle :: dead ( 0 , 0 ) . unwrap ( ) ;
332
+
333
+ assert_eq ! ( handle. get_datalink( ) . unwrap( ) , 0 ) ;
334
+
335
+ let r = handle. set_datalink ( 108 ) ;
336
+
337
+ assert ! ( r. is_err( ) ) ;
338
+
339
+ assert ! ( format!( "{:?}" , r. err( ) . unwrap( ) ) . contains( "not one of the DLTs supported" ) ) ;
340
+ }
341
+
308
342
#[ test]
309
343
fn bpf_compile ( ) {
310
344
let _ = env_logger:: try_init ( ) ;
Original file line number Diff line number Diff line change @@ -28,13 +28,16 @@ impl PacketStream {
28
28
let live_capture = handle. is_live_capture ( ) ;
29
29
30
30
if live_capture {
31
- let h = handle
31
+ handle
32
32
. set_snaplen ( config. snaplen ( ) ) ?
33
33
. set_promiscuous ( ) ?
34
- . set_buffer_size ( config. buffer_size ( ) ) ?
35
- . activate ( ) ?;
34
+ . set_buffer_size ( config. buffer_size ( ) ) ?;
35
+ if let Some ( datalink) = config. datalink ( ) {
36
+ handle. set_datalink ( * datalink) ?;
37
+ }
38
+ handle. activate ( ) ?;
36
39
if !config. blocking ( ) {
37
- h . set_non_block ( ) ?;
40
+ handle . set_non_block ( ) ?;
38
41
}
39
42
40
43
if let Some ( bpf) = config. bpf ( ) {
You can’t perform that action at this time.
0 commit comments