@@ -49,58 +49,71 @@ impl Capture {
49
49
0 ,
50
50
)
51
51
. unwrap ( ) ;
52
- Some ( meta)
52
+ return Some ( meta) ;
53
53
}
54
- Linktype :: LINUX_SLL => {
55
- let mut meta = MetaPacket :: empty ( ) ;
56
- meta. update (
57
- // remove 2 bytes to fake ethernet header
58
- & packet. data [ 2 ..] ,
59
- true ,
60
- true ,
61
- Duration :: new (
62
- packet. header . ts . tv_sec as u64 ,
63
- packet. header . ts . tv_usec as u32 * 1000 ,
64
- ) ,
65
- 0 ,
66
- )
67
- . unwrap ( ) ;
54
+ _ => ( ) ,
55
+ }
68
56
69
- // fake mac with ip
70
- let mut data = ( & packet. data [ 2 ..] ) . to_vec ( ) ;
71
- ( & mut data[ 0 ..12 ] ) . fill ( 0 ) ;
72
- match meta. lookup_key . dst_ip {
73
- IpAddr :: V4 ( ip) => {
74
- data[ 0 ..4 ] . copy_from_slice ( & ip. octets ( ) ) ;
75
- }
76
- IpAddr :: V6 ( ip) => {
77
- data[ 0 ..6 ] . copy_from_slice ( & ip. octets ( ) [ 0 ..6 ] ) ;
78
- }
79
- }
80
- match meta. lookup_key . src_ip {
81
- IpAddr :: V4 ( ip) => {
82
- data[ 6 ..10 ] . copy_from_slice ( & ip. octets ( ) ) ;
83
- }
84
- IpAddr :: V6 ( ip) => {
85
- data[ 6 ..12 ] . copy_from_slice ( & ip. octets ( ) [ 0 ..6 ] ) ;
86
- }
87
- }
88
- let mut meta = MetaPacket :: empty ( ) ;
89
- meta. update (
90
- data,
91
- true ,
92
- true ,
93
- Duration :: new (
94
- packet. header . ts . tv_sec as u64 ,
95
- packet. header . ts . tv_usec as u32 * 1000 ,
96
- ) ,
97
- 0 ,
98
- )
99
- . unwrap ( ) ;
100
- Some ( meta)
57
+ // change SLL header to look like ethernet header just before L3 header
58
+ let mut data = match dl_type {
59
+ // 2 bytes longer than ethernet header
60
+ Linktype :: LINUX_SLL => ( & packet. data [ 2 ..] ) . to_vec ( ) ,
61
+ Linktype :: LINUX_SLL2 => {
62
+ // 6 bytes longer, and L3 type is in first 2 bytes
63
+ let mut data = ( & packet. data [ 6 ..] ) . to_vec ( ) ;
64
+ data[ 12 ..14 ] . copy_from_slice ( & packet. data [ 0 ..2 ] ) ;
65
+ data
101
66
}
102
67
_ => unimplemented ! ( ) ,
68
+ } ;
69
+
70
+ let mut meta = MetaPacket :: empty ( ) ;
71
+ meta. update (
72
+ & data[ ..] ,
73
+ true ,
74
+ true ,
75
+ Duration :: new (
76
+ packet. header . ts . tv_sec as u64 ,
77
+ packet. header . ts . tv_usec as u32 * 1000 ,
78
+ ) ,
79
+ 0 ,
80
+ )
81
+ . unwrap ( ) ;
82
+
83
+ let src_ip = meta. lookup_key . src_ip ;
84
+ let dst_ip = meta. lookup_key . dst_ip ;
85
+ // fake mac with ip
86
+ ( & mut data[ 0 ..12 ] ) . fill ( 0 ) ;
87
+ match dst_ip {
88
+ IpAddr :: V4 ( ip) => {
89
+ data[ 0 ..4 ] . copy_from_slice ( & ip. octets ( ) ) ;
90
+ }
91
+ IpAddr :: V6 ( ip) => {
92
+ data[ 0 ..6 ] . copy_from_slice ( & ip. octets ( ) [ 0 ..6 ] ) ;
93
+ }
103
94
}
95
+ match src_ip {
96
+ IpAddr :: V4 ( ip) => {
97
+ data[ 6 ..10 ] . copy_from_slice ( & ip. octets ( ) ) ;
98
+ }
99
+ IpAddr :: V6 ( ip) => {
100
+ data[ 6 ..12 ] . copy_from_slice ( & ip. octets ( ) [ 0 ..6 ] ) ;
101
+ }
102
+ }
103
+
104
+ let mut meta = MetaPacket :: empty ( ) ;
105
+ meta. update (
106
+ data,
107
+ true ,
108
+ true ,
109
+ Duration :: new (
110
+ packet. header . ts . tv_sec as u64 ,
111
+ packet. header . ts . tv_usec as u32 * 1000 ,
112
+ ) ,
113
+ 0 ,
114
+ )
115
+ . unwrap ( ) ;
116
+ Some ( meta)
104
117
}
105
118
}
106
119
0 commit comments