/* SPDX-License-Identifier: Apache-2.0
 * Copyright(c) 2022 Cisco Systems, Inc.
 */

#ifndef included_stat_segment_shared_h
#define included_stat_segment_shared_h

typedef enum
{
  STAT_DIR_TYPE_ILLEGAL = 0,
  STAT_DIR_TYPE_SCALAR_INDEX,
  STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE,
  STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED,
  STAT_DIR_TYPE_ERROR_INDEX,
  STAT_DIR_TYPE_NAME_VECTOR,
  STAT_DIR_TYPE_EMPTY,
  STAT_DIR_TYPE_SYMLINK,
} stat_directory_type_t;

typedef struct
{
  stat_directory_type_t type;
  union
  {
    struct
    {
      uint32_t index1;
      uint32_t index2;
    };
    uint64_t index;
    uint64_t value;
    void *data;
    uint8_t **string_vector;
  };
#define VLIB_STATS_MAX_NAME_SZ 128
  char name[VLIB_STATS_MAX_NAME_SZ];
} vlib_stats_entry_t;

/*
 * Shared header first in the shared memory segment.
 */
typedef struct
{
  uint64_t version;
  void *base;
  volatile uint64_t epoch;
  volatile uint64_t in_progress;
  volatile vlib_stats_entry_t *directory_vector;
  volatile uint64_t **error_vector;
} vlib_stats_shared_header_t;

#endif /* included_stat_segment_shared_h */
