@@ -249,20 +249,10 @@ const union dp_ipv6 *dp_lb_get_backend_ip(struct flow_key *flow_key, uint32_t vn
249249 return & lb_val -> back_end_ips [pos ];
250250}
251251
252- int dp_get_lb_back_ips (const void * id_key , struct dp_grpc_responder * responder )
252+ static int dp_get_single_lb_back_ips (const struct lb_value * lb_val , struct dp_grpc_responder * responder )
253253{
254- struct lb_key * lb_k ;
255- struct lb_value * lb_val ;
256254 struct dpgrpc_lb_target * reply ;
257255
258- if (DP_FAILED (rte_hash_lookup_data (id_map_lb_tbl , id_key , (void * * )& lb_k )))
259- return DP_GRPC_ERR_NO_LB ;
260-
261- if (DP_FAILED (rte_hash_lookup_data (lb_table , lb_k , (void * * )& lb_val )))
262- return DP_GRPC_ERR_NO_BACKIP ;
263-
264- dp_grpc_set_multireply (responder , sizeof (* reply ));
265-
266256 for (int i = 0 ; i < DP_LB_MAX_IPS_PER_VIP ; ++ i ) {
267257 if (!dp_is_ipv6_zero (& lb_val -> back_end_ips [i ])) {
268258 reply = dp_grpc_add_reply (responder );
@@ -271,10 +261,47 @@ int dp_get_lb_back_ips(const void *id_key, struct dp_grpc_responder *responder)
271261 dp_set_ipaddr6 (& reply -> addr , & lb_val -> back_end_ips [i ]);
272262 }
273263 }
264+ return DP_GRPC_OK ;
265+ }
266+
267+ static int dp_get_all_lb_back_ips (struct dp_grpc_responder * responder )
268+ {
269+ uint32_t iter = 0 ;
270+ const struct lb_key * lb_key ;
271+ struct lb_value * lb_val ;
272+ int ret ;
274273
274+ if (rte_hash_count (id_map_lb_tbl ) == 0 )
275+ return DP_GRPC_OK ;
276+
277+ while ((ret = rte_hash_iterate (lb_table , (const void * * )& lb_key , (void * * )& lb_val , & iter )) != - ENOENT ) {
278+ if (DP_FAILED (ret ))
279+ return DP_GRPC_ERR_ITERATOR ;
280+ dp_get_single_lb_back_ips (lb_val , responder );
281+ // ignore errors, try to send as much as possible
282+ }
275283 return DP_GRPC_OK ;
276284}
277285
286+ int dp_get_lb_back_ips (const void * id_key , struct dp_grpc_responder * responder )
287+ {
288+ struct lb_key * lb_k ;
289+ struct lb_value * lb_val ;
290+
291+ dp_grpc_set_multireply (responder , sizeof (struct dpgrpc_lb_target ));
292+
293+ if (!id_key || * (const char * )id_key == '\0' )
294+ return dp_get_all_lb_back_ips (responder );
295+
296+ if (DP_FAILED (rte_hash_lookup_data (id_map_lb_tbl , id_key , (void * * )& lb_k )))
297+ return DP_GRPC_ERR_NO_LB ;
298+
299+ if (DP_FAILED (rte_hash_lookup_data (lb_table , lb_k , (void * * )& lb_val )))
300+ return DP_GRPC_ERR_NO_BACKIP ;
301+
302+ return dp_get_single_lb_back_ips (lb_val , responder );
303+ }
304+
278305int dp_add_lb_back_ip (const void * id_key , const union dp_ipv6 * back_ip )
279306{
280307 struct lb_value * lb_val = NULL ;
0 commit comments