Skip to content

Commit ae9581c

Browse files
committed
Add ability to list all routes over gRPC
1 parent 9767a74 commit ae9581c

File tree

2 files changed

+48
-15
lines changed

2 files changed

+48
-15
lines changed

cli/dpservice-cli/cmd/list_routes.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,11 @@ type ListRoutesOptions struct {
5050
}
5151

5252
func (o *ListRoutesOptions) AddFlags(fs *pflag.FlagSet) {
53-
fs.Uint32Var(&o.VNI, "vni", o.VNI, "VNI to get the routes from.")
53+
fs.Uint32Var(&o.VNI, "vni", 0, "VNI to get the routes from.")
5454
fs.StringVar(&o.SortBy, "sort-by", "", "Column to sort by.")
5555
}
5656

5757
func (o *ListRoutesOptions) MarkRequiredFlags(cmd *cobra.Command) error {
58-
for _, name := range []string{"vni"} {
59-
if err := cmd.MarkFlagRequired(name); err != nil {
60-
return err
61-
}
62-
}
6358
return nil
6459
}
6560

src/dp_lpm.c

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
223261
int 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

Comments
 (0)