@@ -41,11 +41,7 @@ static struct bpf_object *obj;
4141static __u32 index_zero ;
4242static int epfd ;
4343
44- static union sa46 {
45- struct sockaddr_in6 v6 ;
46- struct sockaddr_in v4 ;
47- sa_family_t family ;
48- } srv_sa ;
44+ static struct sockaddr_storage srv_sa ;
4945
5046#define RET_IF (condition , tag , format ...) ({ \
5147 if (CHECK_FAIL(condition)) { \
@@ -135,24 +131,24 @@ static int prepare_bpf_obj(void)
135131 return 0 ;
136132}
137133
138- static void sa46_init_loopback ( union sa46 * sa , sa_family_t family )
134+ static void ss_init_loopback ( struct sockaddr_storage * sa , sa_family_t family )
139135{
140136 memset (sa , 0 , sizeof (* sa ));
141- sa -> family = family ;
142- if (sa -> family == AF_INET6 )
143- sa -> v6 . sin6_addr = in6addr_loopback ;
137+ sa -> ss_family = family ;
138+ if (sa -> ss_family == AF_INET6 )
139+ (( struct sockaddr_in6 * ) sa ) -> sin6_addr = in6addr_loopback ;
144140 else
145- sa -> v4 . sin_addr .s_addr = htonl (INADDR_LOOPBACK );
141+ (( struct sockaddr_in * ) sa ) -> sin_addr .s_addr = htonl (INADDR_LOOPBACK );
146142}
147143
148- static void sa46_init_inany ( union sa46 * sa , sa_family_t family )
144+ static void ss_init_inany ( struct sockaddr_storage * sa , sa_family_t family )
149145{
150146 memset (sa , 0 , sizeof (* sa ));
151- sa -> family = family ;
152- if (sa -> family == AF_INET6 )
153- sa -> v6 . sin6_addr = in6addr_any ;
147+ sa -> ss_family = family ;
148+ if (sa -> ss_family == AF_INET6 )
149+ (( struct sockaddr_in6 * ) sa ) -> sin6_addr = in6addr_any ;
154150 else
155- sa -> v4 . sin_addr .s_addr = INADDR_ANY ;
151+ (( struct sockaddr_in * ) sa ) -> sin_addr .s_addr = INADDR_ANY ;
156152}
157153
158154static int read_int_sysctl (const char * sysctl )
@@ -228,7 +224,7 @@ static void check_data(int type, sa_family_t family, const struct cmd *cmd,
228224 int cli_fd )
229225{
230226 struct data_check expected = {}, result ;
231- union sa46 cli_sa ;
227+ struct sockaddr_storage cli_sa ;
232228 socklen_t addrlen ;
233229 int err ;
234230
@@ -251,26 +247,32 @@ static void check_data(int type, sa_family_t family, const struct cmd *cmd,
251247 }
252248
253249 if (family == AF_INET6 ) {
250+ struct sockaddr_in6 * srv_v6 = (struct sockaddr_in6 * )& srv_sa ;
251+ struct sockaddr_in6 * cli_v6 = (struct sockaddr_in6 * )& cli_sa ;
252+
254253 expected .eth_protocol = htons (ETH_P_IPV6 );
255- expected .bind_inany = !srv_sa . v6 . sin6_addr .s6_addr32 [3 ] &&
256- !srv_sa . v6 . sin6_addr .s6_addr32 [2 ] &&
257- !srv_sa . v6 . sin6_addr .s6_addr32 [1 ] &&
258- !srv_sa . v6 . sin6_addr .s6_addr32 [0 ];
254+ expected .bind_inany = !srv_v6 -> sin6_addr .s6_addr32 [3 ] &&
255+ !srv_v6 -> sin6_addr .s6_addr32 [2 ] &&
256+ !srv_v6 -> sin6_addr .s6_addr32 [1 ] &&
257+ !srv_v6 -> sin6_addr .s6_addr32 [0 ];
259258
260- memcpy (& expected .skb_addrs [0 ], cli_sa . v6 . sin6_addr .s6_addr32 ,
261- sizeof (cli_sa . v6 . sin6_addr ));
259+ memcpy (& expected .skb_addrs [0 ], cli_v6 -> sin6_addr .s6_addr32 ,
260+ sizeof (cli_v6 -> sin6_addr ));
262261 memcpy (& expected .skb_addrs [4 ], & in6addr_loopback ,
263262 sizeof (in6addr_loopback ));
264- expected .skb_ports [0 ] = cli_sa . v6 . sin6_port ;
265- expected .skb_ports [1 ] = srv_sa . v6 . sin6_port ;
263+ expected .skb_ports [0 ] = cli_v6 -> sin6_port ;
264+ expected .skb_ports [1 ] = srv_v6 -> sin6_port ;
266265 } else {
266+ struct sockaddr_in * srv_v4 = (struct sockaddr_in * )& srv_sa ;
267+ struct sockaddr_in * cli_v4 = (struct sockaddr_in * )& cli_sa ;
268+
267269 expected .eth_protocol = htons (ETH_P_IP );
268- expected .bind_inany = !srv_sa . v4 . sin_addr .s_addr ;
270+ expected .bind_inany = !srv_v4 -> sin_addr .s_addr ;
269271
270- expected .skb_addrs [0 ] = cli_sa . v4 . sin_addr .s_addr ;
272+ expected .skb_addrs [0 ] = cli_v4 -> sin_addr .s_addr ;
271273 expected .skb_addrs [1 ] = htonl (INADDR_LOOPBACK );
272- expected .skb_ports [0 ] = cli_sa . v4 . sin_port ;
273- expected .skb_ports [1 ] = srv_sa . v4 . sin_port ;
274+ expected .skb_ports [0 ] = cli_v4 -> sin_port ;
275+ expected .skb_ports [1 ] = srv_v4 -> sin_port ;
274276 }
275277
276278 if (memcmp (& result , & expected , offsetof(struct data_check ,
@@ -364,16 +366,15 @@ static void check_results(void)
364366static int send_data (int type , sa_family_t family , void * data , size_t len ,
365367 enum result expected )
366368{
367- union sa46 cli_sa ;
369+ struct sockaddr_storage cli_sa ;
368370 int fd , err ;
369371
370372 fd = socket (family , type , 0 );
371373 RET_ERR (fd == -1 , "socket()" , "fd:%d errno:%d\n" , fd , errno );
372374
373- sa46_init_loopback (& cli_sa , family );
375+ ss_init_loopback (& cli_sa , family );
374376 err = bind (fd , (struct sockaddr * )& cli_sa , sizeof (cli_sa ));
375377 RET_ERR (fd == -1 , "bind(cli_sa)" , "err:%d errno:%d\n" , err , errno );
376-
377378 err = sendto (fd , data , len , MSG_FASTOPEN , (struct sockaddr * )& srv_sa ,
378379 sizeof (srv_sa ));
379380 RET_ERR (err != len && expected >= PASS ,
@@ -589,9 +590,9 @@ static void prepare_sk_fds(int type, sa_family_t family, bool inany)
589590 socklen_t addrlen ;
590591
591592 if (inany )
592- sa46_init_inany (& srv_sa , family );
593+ ss_init_inany (& srv_sa , family );
593594 else
594- sa46_init_loopback (& srv_sa , family );
595+ ss_init_loopback (& srv_sa , family );
595596 addrlen = sizeof (srv_sa );
596597
597598 /*
0 commit comments