@@ -190,19 +190,12 @@ static int dp_list_route_entry(struct rte_rib_node *node,
190190 return DP_GRPC_OK ;
191191}
192192
193- int dp_list_routes (const struct dp_port * port , uint32_t vni , bool ext_routes ,
194- struct dp_grpc_responder * responder )
193+ static int dp_list_route_table (const struct dp_port * port , struct rte_rib * root , bool ext_routes ,
194+ struct dp_grpc_responder * responder )
195195{
196196 struct rte_rib_node * node ;
197- struct rte_rib * root ;
198197 int ret ;
199198
200- root = dp_get_vni_route4_table (vni );
201- if (!root )
202- return DP_GRPC_ERR_NO_VNI ;
203-
204- dp_grpc_set_multireply (responder , sizeof (struct dpgrpc_route ));
205-
206199 node = rte_rib_lookup_exact (root , RTE_IPV4 (0 , 0 , 0 , 0 ), 0 );
207200 if (node ) {
208201 ret = dp_list_route_entry (node , port , ext_routes , responder );
@@ -220,6 +213,51 @@ int dp_list_routes(const struct dp_port *port, uint32_t vni, bool ext_routes,
220213 return DP_GRPC_OK ;
221214}
222215
216+ static int dp_list_single_route_table (const struct dp_port * port , uint32_t vni , bool ext_routes ,
217+ struct dp_grpc_responder * responder )
218+ {
219+ struct rte_rib * root ;
220+
221+ root = dp_get_vni_route4_table (vni );
222+ if (!root )
223+ return DP_GRPC_ERR_NO_VNI ;
224+
225+ return dp_list_route_table (port , root , ext_routes , responder );
226+ }
227+
228+ static int dp_list_all_route_tables (const struct dp_port * port , bool ext_routes ,
229+ struct dp_grpc_responder * responder )
230+ {
231+ struct dp_vni_data * vni_data ;
232+ const struct dp_vni_key * vni_key ;
233+ uint32_t iter = 0 ;
234+ int32_t ret ;
235+
236+ if (rte_hash_count (vni_handle_tbl ) == 0 )
237+ return DP_GRPC_OK ;
238+
239+ while ((ret = rte_hash_iterate (vni_handle_tbl , (const void * * )& vni_key , (void * * )& vni_data , & iter )) != - ENOENT ) {
240+ if (DP_FAILED (ret )) {
241+ DPS_LOG_ERR ("Cannot iterate VNI table" , DP_LOG_RET (ret ));
242+ return DP_GRPC_ERR_ITERATOR ;
243+ }
244+ dp_list_single_route_table (port , vni_key -> vni , ext_routes , responder );
245+ // ignore errors, show as much as possible
246+ }
247+ return DP_GRPC_OK ;
248+ }
249+
250+ int dp_list_routes (const struct dp_port * port , uint32_t vni , bool ext_routes ,
251+ struct dp_grpc_responder * responder )
252+ {
253+ dp_grpc_set_multireply (responder , sizeof (struct dpgrpc_route ));
254+
255+ if (vni == 0 )
256+ return dp_list_all_route_tables (port , ext_routes , responder );
257+ else
258+ return dp_list_single_route_table (port , vni , ext_routes , responder );
259+ }
260+
223261int dp_add_route6 (const struct dp_port * port , uint32_t vni , uint32_t t_vni , const union dp_ipv6 * ipv6 ,
224262 const union dp_ipv6 * t_ip6 , uint8_t depth )
225263{
0 commit comments