/* neigh_cache.h
 *
 * Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
 * Author: Pau Espin Pedrol <pespin@sysmocom.de>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
#pragma once

#include <stdint.h>
#include <inttypes.h>

#include <osmocom/core/linuxlist.h>
#include <osmocom/core/timer.h>

#include <osmocom/gsm/gsm23003.h>
#include <osmocom/gprs/gprs_bssgp_rim.h>

////////////////////
// NEIGH CACHE
///////////////////

/* ARFC+BSIC -> CGI PS cache */
struct neigh_cache {
	struct llist_head list; /* list of neigh_cache_entry items */
	struct osmo_timer_list cleanup_timer; /* Timer removing too-old entries */
	struct timespec keep_time_intval;
};

struct neigh_cache_entry_key {
	uint16_t local_lac;
	uint16_t local_ci;
	uint16_t tgt_arfcn;
	uint8_t tgt_bsic;
};
#define NEIGH_CACHE_ENTRY_KEY_FMT "%" PRIu16 "-%" PRIu16 "-%" PRIu16 "-%" PRIu8
#define NEIGH_CACHE_ENTRY_KEY_ARGS(key) (key)->local_lac, (key)->local_ci, (key)->tgt_arfcn, (key)->tgt_bsic

struct neigh_cache_entry {
	struct llist_head list; /* to be included in neigh_cache->list */
	struct timespec update_ts;
	struct neigh_cache_entry_key key;
	struct osmo_cell_global_id_ps value;
};

struct neigh_cache *neigh_cache_alloc(void *ctx);
struct neigh_cache_entry *neigh_cache_add(struct neigh_cache *cache,
					  const struct neigh_cache_entry_key *key,
					  const struct osmo_cell_global_id_ps *value);
struct neigh_cache_entry *neigh_cache_lookup_entry(struct neigh_cache *cache,
						   const struct neigh_cache_entry_key *key);
const struct osmo_cell_global_id_ps *neigh_cache_lookup_value(struct neigh_cache *cache,
							      const struct neigh_cache_entry_key *key);
void neigh_cache_free(struct neigh_cache *cache);


////////////////////
// SI CACHE
///////////////////

/* CGI-PS-> SI cache */
struct si_cache {
	struct llist_head list; /* list of si_cache_entry items */
	struct osmo_timer_list cleanup_timer; /* Timer removing too-old entries */
	struct timespec keep_time_intval;
};

struct si_cache_value {
	uint8_t si_buf[BSSGP_RIM_PSI_LEN * 127]; /* 3GPP TS 48.018 11.3.63.2.1 */
	size_t si_len;
	bool type_psi;
};

struct si_cache_entry {
	struct llist_head list; /* to be included in si_cache->list */
	struct timespec update_ts;
	struct osmo_cell_global_id_ps key;
	struct si_cache_value value;
};

struct si_cache *si_cache_alloc(void *ctx);
struct si_cache_entry *si_cache_add(struct si_cache *cache,
				    const struct osmo_cell_global_id_ps *key,
				    const struct si_cache_value *value);
struct si_cache_entry *si_cache_lookup_entry(struct si_cache *cache,
					     const struct osmo_cell_global_id_ps *key);
const struct si_cache_value *si_cache_lookup_value(struct si_cache *cache,
						   const struct osmo_cell_global_id_ps *key);
void si_cache_free(struct si_cache *cache);
