1
- use std:: { ffi :: CStr , mem:: MaybeUninit , net:: UdpSocket , num:: NonZeroU32 , time:: Duration } ;
1
+ use std:: { mem:: MaybeUninit , net:: UdpSocket , num:: NonZeroU32 , time:: Duration } ;
2
2
3
3
use aya:: {
4
4
maps:: { Array , CpuMap , XskMap } ,
@@ -9,11 +9,11 @@ use object::{Object, ObjectSection, ObjectSymbol, SymbolSection};
9
9
use test_log:: test;
10
10
use xdpilone:: { BufIdx , IfInfo , Socket , SocketConfig , Umem , UmemConfig } ;
11
11
12
- use crate :: utils:: NetNsGuard ;
12
+ use crate :: utils:: { NetNsGuard , IP_ADDR_1 , IP_ADDR_2 } ;
13
13
14
14
#[ test]
15
15
fn af_xdp ( ) {
16
- let _netns = NetNsGuard :: new ( ) ;
16
+ let netns = NetNsGuard :: new ( ) ;
17
17
18
18
let mut bpf = Ebpf :: load ( crate :: REDIRECT ) . unwrap ( ) ;
19
19
let mut socks: XskMap < _ > = bpf. take_map ( "SOCKS" ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;
@@ -24,7 +24,8 @@ fn af_xdp() {
24
24
. try_into ( )
25
25
. unwrap ( ) ;
26
26
xdp. load ( ) . unwrap ( ) ;
27
- xdp. attach ( "lo" , XdpFlags :: default ( ) ) . unwrap ( ) ;
27
+ xdp. attach_to_if_index ( netns. if_idx2 , XdpFlags :: default ( ) )
28
+ . unwrap ( ) ;
28
29
29
30
// So this needs to be page aligned. Pages are 4k on all mainstream architectures except for
30
31
// Apple Silicon which uses 16k pages. So let's align on that for tests to run natively there.
@@ -41,9 +42,7 @@ fn af_xdp() {
41
42
} ;
42
43
43
44
let mut iface = IfInfo :: invalid ( ) ;
44
- iface
45
- . from_name ( CStr :: from_bytes_with_nul ( b"lo\0 " ) . unwrap ( ) )
46
- . unwrap ( ) ;
45
+ iface. from_ifindex ( netns. if_idx1 ) . unwrap ( ) ;
47
46
let sock = Socket :: with_shared ( & iface, & umem) . unwrap ( ) ;
48
47
49
48
let mut fq_cq = umem. fq_cq ( & sock) . unwrap ( ) ; // Fill Queue / Completion Queue
@@ -66,9 +65,12 @@ fn af_xdp() {
66
65
writer. insert_once ( frame. offset ) ;
67
66
writer. commit ( ) ;
68
67
69
- let sock = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
70
- let port = sock. local_addr ( ) . unwrap ( ) . port ( ) ;
71
- sock. send_to ( b"hello AF_XDP" , "127.0.0.1:1777" ) . unwrap ( ) ;
68
+ let sock = UdpSocket :: bind ( ( IP_ADDR_1 , 0 ) ) . unwrap ( ) ;
69
+ let src_port = sock. local_addr ( ) . unwrap ( ) . port ( ) ;
70
+
71
+ const DST_PORT : u16 = 1777 ;
72
+ sock. send_to ( b"hello AF_XDP" , ( IP_ADDR_2 , DST_PORT ) )
73
+ . unwrap ( ) ;
72
74
73
75
assert_eq ! ( rx. available( ) , 1 ) ;
74
76
let desc = rx. receive ( 1 ) . read ( ) . unwrap ( ) ;
@@ -81,8 +83,8 @@ fn af_xdp() {
81
83
let ( ip, buf) = buf. split_at ( 20 ) ;
82
84
assert_eq ! ( ip[ 9 ] , 17 ) ; // UDP
83
85
let ( udp, payload) = buf. split_at ( 8 ) ;
84
- assert_eq ! ( & udp[ 0 ..2 ] , port . to_be_bytes( ) . as_slice( ) ) ; // Source
85
- assert_eq ! ( & udp[ 2 ..4 ] , 1777u16 . to_be_bytes( ) . as_slice( ) ) ; // Dest
86
+ assert_eq ! ( & udp[ 0 ..2 ] , src_port . to_be_bytes( ) . as_slice( ) ) ; // Source
87
+ assert_eq ! ( & udp[ 2 ..4 ] , DST_PORT . to_be_bytes( ) . as_slice( ) ) ; // Dest
86
88
assert_eq ! ( payload, b"hello AF_XDP" ) ;
87
89
}
88
90
@@ -134,7 +136,7 @@ fn map_load() {
134
136
135
137
#[ test]
136
138
fn cpumap_chain ( ) {
137
- let _netns = NetNsGuard :: new ( ) ;
139
+ let netns = NetNsGuard :: new ( ) ;
138
140
139
141
let mut bpf = Ebpf :: load ( crate :: REDIRECT ) . unwrap ( ) ;
140
142
@@ -157,20 +159,24 @@ fn cpumap_chain() {
157
159
// Load the main program
158
160
let xdp: & mut Xdp = bpf. program_mut ( "redirect_cpu" ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;
159
161
xdp. load ( ) . unwrap ( ) ;
160
- xdp. attach ( "lo" , XdpFlags :: default ( ) ) . unwrap ( ) ;
162
+ xdp. attach_to_if_index ( netns. if_idx2 , XdpFlags :: default ( ) )
163
+ . unwrap ( ) ;
161
164
162
165
const PAYLOAD : & str = "hello cpumap" ;
163
166
164
- let sock = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
165
- let addr = sock. local_addr ( ) . unwrap ( ) ;
166
- sock. set_read_timeout ( Some ( Duration :: from_secs ( 60 ) ) )
167
+ let sock1 = UdpSocket :: bind ( ( IP_ADDR_1 , 0 ) ) . unwrap ( ) ;
168
+ let sock2 = UdpSocket :: bind ( ( IP_ADDR_2 , 0 ) ) . unwrap ( ) ;
169
+ sock2
170
+ . set_read_timeout ( Some ( Duration :: from_secs ( 60 ) ) )
171
+ . unwrap ( ) ;
172
+ sock1
173
+ . send_to ( PAYLOAD . as_bytes ( ) , sock2. local_addr ( ) . unwrap ( ) )
167
174
. unwrap ( ) ;
168
- sock. send_to ( PAYLOAD . as_bytes ( ) , addr) . unwrap ( ) ;
169
175
170
176
// Read back the packet to ensure it went through the entire network stack, including our two
171
177
// probes.
172
178
let mut buf = [ 0u8 ; PAYLOAD . len ( ) + 1 ] ;
173
- let n = sock . recv ( & mut buf) . unwrap ( ) ;
179
+ let n = sock2 . recv ( & mut buf) . unwrap ( ) ;
174
180
175
181
assert_eq ! ( & buf[ ..n] , PAYLOAD . as_bytes( ) ) ;
176
182
assert_eq ! ( hits. get( & 0 , 0 ) . unwrap( ) , 1 ) ;
0 commit comments