Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pcrf json dbi #1

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
58 changes: 58 additions & 0 deletions lib/dbi/dbi-private.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <[email protected]>
* Author: Alexander Couzens <[email protected]>
*
* This file is part of Open5GS.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>.
*/

#if !defined(OGS_DBI_INSIDE) && !defined(OGS_DBI_COMPILATION)
#error "This header cannot be included directly."
#endif

#ifndef OGS_DBI_PRIVATE_H
#define OGS_DBI_PRIVATE_H

#ifdef __cplusplus
extern "C" {
#endif

struct ogs_dbi_s {
const char *name;
void (*final)(void);
/* session */
int (*session_data)(char *supi, ogs_s_nssai_t *s_nssai, char *dnn,
ogs_session_data_t *data);
/* ims */
int (*msisdn_data)(char *imsi_or_msisdn_bcd, ogs_msisdn_data_t *msisdn_data);
int (*ims_data)(char *supi, ogs_ims_data_t *ims_data);
/* subscription */
int (*auth_info)(char *supi, ogs_dbi_auth_info_t *auth_info);
int (*update_sqn)(char *supi, uint64_t sqn);
int (*increment_sqn)(char *supi);
int (*update_imeisv)(char *supi, char *imeisv);
int (*subscription_data)(char *supi,
ogs_subscription_data_t *subscription_data);
};
typedef struct ogs_dbi_s ogs_dbi_t;

int ogs_dbi_deselect_interface(void);
int ogs_dbi_select_interface(const char *dbi_name);

#ifdef __cplusplus
}
#endif

#endif /* OGS_DBI_PRIVATE_H */
144 changes: 144 additions & 0 deletions lib/dbi/dbi.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
/*
* Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <[email protected]>
* Author: Alexander Couzens <[email protected]>
*
* This file is part of Open5GS.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 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, see <https://www.gnu.org/licenses/>.
*/

#include "ogs-dbi.h"

#include "dbi-private.h"
#include "dbi-config-private.h"

#ifdef WITH_MONGOC
#include "mongo/mongo-private.h"
#endif
#include "json/json-private.h"

int __ogs_dbi_domain;

static ogs_dbi_t *dbi_interfaces[] = {
#ifdef WITH_MONGOC
&ogs_dbi_mongo_interface,
#endif
&ogs_dbi_json_interface,
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so how is one or the other selected for use? I don't recall seeing any explanation anywhere.

NULL,
};

static ogs_dbi_t *dbi_selected;

int ogs_dbi_deselect_interface()
{
dbi_selected = NULL;

return 0;
}

int ogs_dbi_select_interface(const char *dbi_name)
{
ogs_dbi_t *dbi;
int i;
ogs_assert(dbi_name);

for (i = 0; i < OGS_ARRAY_SIZE(dbi_interfaces); i++) {
dbi = dbi_interfaces[i];
if (!ogs_strcasecmp(dbi->name, dbi_name)) {
dbi_selected = dbi;
return 0;
}
}

ogs_error("Couldn't find dbi interface %s", dbi_name);
return -1;
}

void ogs_dbi_final(void)
{
if (!dbi_selected)
return;

dbi_selected->final();
}

/* ims */
int ogs_dbi_msisdn_data(
char *imsi_or_msisdn_bcd, ogs_msisdn_data_t *msisdn_data)
{
ogs_assert(dbi_selected);
if (!dbi_selected->msisdn_data)
return OGS_ERROR;
return dbi_selected->msisdn_data(imsi_or_msisdn_bcd, msisdn_data);
}

int ogs_dbi_ims_data(char *supi, ogs_ims_data_t *ims_data)
{
ogs_assert(dbi_selected);
if (!dbi_selected->ims_data)
return OGS_ERROR;
return dbi_selected->ims_data(supi, ims_data);
}

/* session */
int ogs_dbi_session_data(char *supi, ogs_s_nssai_t *s_nssai, char *dnn,
ogs_session_data_t *session_data)
{
ogs_assert(dbi_selected);
if (!dbi_selected->session_data)
return OGS_ERROR;
return dbi_selected->session_data(supi, s_nssai, dnn, session_data);
}

/* subscription */
int ogs_dbi_auth_info(char *supi, ogs_dbi_auth_info_t *auth_info)
{
ogs_assert(dbi_selected);
if (!dbi_selected->auth_info)
return OGS_ERROR;
return dbi_selected->auth_info(supi, auth_info);
}

int ogs_dbi_update_sqn(char *supi, uint64_t sqn)
{
ogs_assert(dbi_selected);
if (!dbi_selected->update_sqn)
return OGS_ERROR;
return dbi_selected->update_sqn(supi, sqn);
}

int ogs_dbi_increment_sqn(char *supi)
{
ogs_assert(dbi_selected);
if (!dbi_selected->increment_sqn)
return OGS_ERROR;
return dbi_selected->increment_sqn(supi);
}

int ogs_dbi_update_imeisv(char *supi, char *imeisv)
{
ogs_assert(dbi_selected);
if (!dbi_selected->update_imeisv)
return OGS_ERROR;
return dbi_selected->update_imeisv(supi, imeisv);
}

int ogs_dbi_subscription_data(char *supi,
ogs_subscription_data_t *subscription_data)
{
ogs_assert(dbi_selected);
if (!dbi_selected->subscription_data)
return OGS_ERROR;
return dbi_selected->subscription_data(supi, subscription_data);
}
Loading