]> git.proxmox.com Git - mirror_frr.git/blobdiff - ripngd/ripng_nb_state.c
Merge pull request #12196 from opensourcerouting/xref-vtysh
[mirror_frr.git] / ripngd / ripng_nb_state.c
index 167077ea29f2e971667a7c07ee5bf6b0d73db7f0..02a00ac429b9842e6fc012052ebd6b35b23eef9c 100644 (file)
 /*
  * XPath: /frr-ripngd:ripngd/instance/state/neighbors/neighbor
  */
-const void *
-ripngd_instance_state_neighbors_neighbor_get_next(const void *parent_list_entry,
-                                                 const void *list_entry)
+const void *ripngd_instance_state_neighbors_neighbor_get_next(
+       struct nb_cb_get_next_args *args)
 {
-       const struct ripng *ripng = parent_list_entry;
+       const struct ripng *ripng = args->parent_list_entry;
        struct listnode *node;
 
-       if (list_entry == NULL)
+       if (args->list_entry == NULL)
                node = listhead(ripng->peer_list);
        else
-               node = listnextnode((struct listnode *)list_entry);
+               node = listnextnode((struct listnode *)args->list_entry);
 
        return node;
 }
 
 int ripngd_instance_state_neighbors_neighbor_get_keys(
-       const void *list_entry, struct yang_list_keys *keys)
+       struct nb_cb_get_keys_args *args)
 {
-       const struct listnode *node = list_entry;
+       const struct listnode *node = args->list_entry;
        const struct ripng_peer *peer = listgetdata(node);
 
-       keys->num = 1;
-       (void)inet_ntop(AF_INET6, &peer->addr, keys->key[0],
-                       sizeof(keys->key[0]));
+       args->keys->num = 1;
+       (void)inet_ntop(AF_INET6, &peer->addr, args->keys->key[0],
+                       sizeof(args->keys->key[0]));
 
        return NB_OK;
 }
 
 const void *ripngd_instance_state_neighbors_neighbor_lookup_entry(
-       const void *parent_list_entry, const struct yang_list_keys *keys)
+       struct nb_cb_lookup_entry_args *args)
 {
-       const struct ripng *ripng = parent_list_entry;
+       const struct ripng *ripng = args->parent_list_entry;
        struct in6_addr address;
        struct ripng_peer *peer;
        struct listnode *node;
 
-       yang_str2ipv6(keys->key[0], &address);
+       yang_str2ipv6(args->keys->key[0], &address);
 
        for (ALL_LIST_ELEMENTS_RO(ripng->peer_list, node, peer)) {
                if (IPV6_ADDR_SAME(&peer->addr, &address))
@@ -88,19 +87,19 @@ const void *ripngd_instance_state_neighbors_neighbor_lookup_entry(
  * XPath: /frr-ripngd:ripngd/instance/state/neighbors/neighbor/address
  */
 struct yang_data *ripngd_instance_state_neighbors_neighbor_address_get_elem(
-       const char *xpath, const void *list_entry)
+       struct nb_cb_get_elem_args *args)
 {
-       const struct listnode *node = list_entry;
+       const struct listnode *node = args->list_entry;
        const struct ripng_peer *peer = listgetdata(node);
 
-       return yang_data_new_ipv6(xpath, &peer->addr);
+       return yang_data_new_ipv6(args->xpath, &peer->addr);
 }
 
 /*
  * XPath: /frr-ripngd:ripngd/instance/state/neighbors/neighbor/last-update
  */
 struct yang_data *ripngd_instance_state_neighbors_neighbor_last_update_get_elem(
-       const char *xpath, const void *list_entry)
+       struct nb_cb_get_elem_args *args)
 {
        /* TODO: yang:date-and-time is tricky */
        return NULL;
@@ -111,12 +110,12 @@ struct yang_data *ripngd_instance_state_neighbors_neighbor_last_update_get_elem(
  */
 struct yang_data *
 ripngd_instance_state_neighbors_neighbor_bad_packets_rcvd_get_elem(
-       const char *xpath, const void *list_entry)
+       struct nb_cb_get_elem_args *args)
 {
-       const struct listnode *node = list_entry;
+       const struct listnode *node = args->list_entry;
        const struct ripng_peer *peer = listgetdata(node);
 
-       return yang_data_new_uint32(xpath, peer->recv_badpackets);
+       return yang_data_new_uint32(args->xpath, peer->recv_badpackets);
 }
 
 /*
@@ -124,53 +123,54 @@ ripngd_instance_state_neighbors_neighbor_bad_packets_rcvd_get_elem(
  */
 struct yang_data *
 ripngd_instance_state_neighbors_neighbor_bad_routes_rcvd_get_elem(
-       const char *xpath, const void *list_entry)
+       struct nb_cb_get_elem_args *args)
 {
-       const struct listnode *node = list_entry;
+       const struct listnode *node = args->list_entry;
        const struct ripng_peer *peer = listgetdata(node);
 
-       return yang_data_new_uint32(xpath, peer->recv_badroutes);
+       return yang_data_new_uint32(args->xpath, peer->recv_badroutes);
 }
 
 /*
  * XPath: /frr-ripngd:ripngd/instance/state/routes/route
  */
 const void *
-ripngd_instance_state_routes_route_get_next(const void *parent_list_entry,
-                                           const void *list_entry)
+ripngd_instance_state_routes_route_get_next(struct nb_cb_get_next_args *args)
 {
-       const struct ripng *ripng = parent_list_entry;
+       const struct ripng *ripng = args->parent_list_entry;
        struct agg_node *rn;
 
-       if (list_entry == NULL)
+       if (args->list_entry == NULL)
                rn = agg_route_top(ripng->table);
        else
-               rn = agg_route_next((struct agg_node *)list_entry);
+               rn = agg_route_next((struct agg_node *)args->list_entry);
+       /* Optimization: skip empty route nodes. */
        while (rn && rn->info == NULL)
                rn = agg_route_next(rn);
 
        return rn;
 }
 
-int ripngd_instance_state_routes_route_get_keys(const void *list_entry,
-                                               struct yang_list_keys *keys)
+int ripngd_instance_state_routes_route_get_keys(
+       struct nb_cb_get_keys_args *args)
 {
-       const struct agg_node *rn = list_entry;
+       const struct agg_node *rn = args->list_entry;
 
-       keys->num = 1;
-       (void)prefix2str(&rn->p, keys->key[0], sizeof(keys->key[0]));
+       args->keys->num = 1;
+       (void)prefix2str(agg_node_get_prefix(rn), args->keys->key[0],
+                        sizeof(args->keys->key[0]));
 
        return NB_OK;
 }
 
 const void *ripngd_instance_state_routes_route_lookup_entry(
-       const void *parent_list_entry, const struct yang_list_keys *keys)
+       struct nb_cb_lookup_entry_args *args)
 {
-       const struct ripng *ripng = parent_list_entry;
+       const struct ripng *ripng = args->parent_list_entry;
        struct prefix prefix;
        struct agg_node *rn;
 
-       yang_str2ipv6p(keys->key[0], &prefix);
+       yang_str2ipv6p(args->keys->key[0], &prefix);
 
        rn = agg_node_lookup(ripng->table, &prefix);
        if (!rn || !rn->info)
@@ -184,53 +184,50 @@ const void *ripngd_instance_state_routes_route_lookup_entry(
 /*
  * XPath: /frr-ripngd:ripngd/instance/state/routes/route/prefix
  */
-struct yang_data *
-ripngd_instance_state_routes_route_prefix_get_elem(const char *xpath,
-                                                  const void *list_entry)
+struct yang_data *ripngd_instance_state_routes_route_prefix_get_elem(
+       struct nb_cb_get_elem_args *args)
 {
-       const struct agg_node *rn = list_entry;
+       const struct agg_node *rn = args->list_entry;
        const struct ripng_info *rinfo = listnode_head(rn->info);
 
-       return yang_data_new_ipv6p(xpath, &rinfo->rp->p);
+       return yang_data_new_ipv6p(args->xpath, agg_node_get_prefix(rinfo->rp));
 }
 
 /*
  * XPath: /frr-ripngd:ripngd/instance/state/routes/route/next-hop
  */
-struct yang_data *
-ripngd_instance_state_routes_route_next_hop_get_elem(const char *xpath,
-                                                    const void *list_entry)
+struct yang_data *ripngd_instance_state_routes_route_next_hop_get_elem(
+       struct nb_cb_get_elem_args *args)
 {
-       const struct agg_node *rn = list_entry;
+       const struct agg_node *rn = args->list_entry;
        const struct ripng_info *rinfo = listnode_head(rn->info);
 
-       return yang_data_new_ipv6(xpath, &rinfo->nexthop);
+       return yang_data_new_ipv6(args->xpath, &rinfo->nexthop);
 }
 
 /*
  * XPath: /frr-ripngd:ripngd/instance/state/routes/route/interface
  */
-struct yang_data *
-ripngd_instance_state_routes_route_interface_get_elem(const char *xpath,
-                                                     const void *list_entry)
+struct yang_data *ripngd_instance_state_routes_route_interface_get_elem(
+       struct nb_cb_get_elem_args *args)
 {
-       const struct agg_node *rn = list_entry;
+       const struct agg_node *rn = args->list_entry;
        const struct ripng_info *rinfo = listnode_head(rn->info);
        const struct ripng *ripng = ripng_info_get_instance(rinfo);
 
        return yang_data_new_string(
-               xpath, ifindex2ifname(rinfo->ifindex, ripng->vrf->vrf_id));
+               args->xpath,
+               ifindex2ifname(rinfo->ifindex, ripng->vrf->vrf_id));
 }
 
 /*
  * XPath: /frr-ripngd:ripngd/instance/state/routes/route/metric
  */
-struct yang_data *
-ripngd_instance_state_routes_route_metric_get_elem(const char *xpath,
-                                                  const void *list_entry)
+struct yang_data *ripngd_instance_state_routes_route_metric_get_elem(
+       struct nb_cb_get_elem_args *args)
 {
-       const struct agg_node *rn = list_entry;
+       const struct agg_node *rn = args->list_entry;
        const struct ripng_info *rinfo = listnode_head(rn->info);
 
-       return yang_data_new_uint8(xpath, rinfo->metric);
+       return yang_data_new_uint8(args->xpath, rinfo->metric);
 }