@@ -47,6 +47,37 @@ static int connected_socket_v4(void)
47
47
return -1 ;
48
48
}
49
49
50
+ static void compare_cookies (struct bpf_map * src , struct bpf_map * dst )
51
+ {
52
+ __u32 i , max_entries = bpf_map__max_entries (src );
53
+ int err , duration , src_fd , dst_fd ;
54
+
55
+ src_fd = bpf_map__fd (src );
56
+ dst_fd = bpf_map__fd (dst );
57
+
58
+ for (i = 0 ; i < max_entries ; i ++ ) {
59
+ __u64 src_cookie , dst_cookie ;
60
+
61
+ err = bpf_map_lookup_elem (src_fd , & i , & src_cookie );
62
+ if (err && errno == ENOENT ) {
63
+ err = bpf_map_lookup_elem (dst_fd , & i , & dst_cookie );
64
+ CHECK (!err , "map_lookup_elem(dst)" , "element %u not deleted\n" , i );
65
+ CHECK (err && errno != ENOENT , "map_lookup_elem(dst)" , "%s\n" ,
66
+ strerror (errno ));
67
+ continue ;
68
+ }
69
+ if (CHECK (err , "lookup_elem(src)" , "%s\n" , strerror (errno )))
70
+ continue ;
71
+
72
+ err = bpf_map_lookup_elem (dst_fd , & i , & dst_cookie );
73
+ if (CHECK (err , "lookup_elem(dst)" , "%s\n" , strerror (errno )))
74
+ continue ;
75
+
76
+ CHECK (dst_cookie != src_cookie , "cookie mismatch" ,
77
+ "%llu != %llu (pos %u)\n" , dst_cookie , src_cookie , i );
78
+ }
79
+ }
80
+
50
81
/* Create a map, populate it with one socket, and free the map. */
51
82
static void test_sockmap_create_update_free (enum bpf_map_type map_type )
52
83
{
@@ -106,9 +137,9 @@ static void test_skmsg_helpers(enum bpf_map_type map_type)
106
137
static void test_sockmap_update (enum bpf_map_type map_type )
107
138
{
108
139
struct bpf_prog_test_run_attr tattr ;
109
- int err , prog , src , dst , duration = 0 ;
140
+ int err , prog , src , duration = 0 ;
110
141
struct test_sockmap_update * skel ;
111
- __u64 src_cookie , dst_cookie ;
142
+ struct bpf_map * dst_map ;
112
143
const __u32 zero = 0 ;
113
144
char dummy [14 ] = {0 };
114
145
__s64 sk ;
@@ -124,18 +155,14 @@ static void test_sockmap_update(enum bpf_map_type map_type)
124
155
prog = bpf_program__fd (skel -> progs .copy_sock_map );
125
156
src = bpf_map__fd (skel -> maps .src );
126
157
if (map_type == BPF_MAP_TYPE_SOCKMAP )
127
- dst = bpf_map__fd ( skel -> maps .dst_sock_map ) ;
158
+ dst_map = skel -> maps .dst_sock_map ;
128
159
else
129
- dst = bpf_map__fd ( skel -> maps .dst_sock_hash ) ;
160
+ dst_map = skel -> maps .dst_sock_hash ;
130
161
131
162
err = bpf_map_update_elem (src , & zero , & sk , BPF_NOEXIST );
132
163
if (CHECK (err , "update_elem(src)" , "errno=%u\n" , errno ))
133
164
goto out ;
134
165
135
- err = bpf_map_lookup_elem (src , & zero , & src_cookie );
136
- if (CHECK (err , "lookup_elem(src, cookie)" , "errno=%u\n" , errno ))
137
- goto out ;
138
-
139
166
tattr = (struct bpf_prog_test_run_attr ){
140
167
.prog_fd = prog ,
141
168
.repeat = 1 ,
@@ -148,12 +175,7 @@ static void test_sockmap_update(enum bpf_map_type map_type)
148
175
"errno=%u retval=%u\n" , errno , tattr .retval ))
149
176
goto out ;
150
177
151
- err = bpf_map_lookup_elem (dst , & zero , & dst_cookie );
152
- if (CHECK (err , "lookup_elem(dst, cookie)" , "errno=%u\n" , errno ))
153
- goto out ;
154
-
155
- CHECK (dst_cookie != src_cookie , "cookie mismatch" , "%llu != %llu\n" ,
156
- dst_cookie , src_cookie );
178
+ compare_cookies (skel -> maps .src , dst_map );
157
179
158
180
out :
159
181
test_sockmap_update__destroy (skel );
0 commit comments