aboutsummaryrefslogtreecommitdiffstats
path: root/include/osmocom/hlr/proxy_mm.h
blob: de68f60fc2f2bdf70d806f33e62f94b02ee05a2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#pragma once

#include <osmocom/core/linuxlist.h>
#include <osmocom/hlr/proxy.h>

enum proxy_mm_fsm_event {
	PROXY_MM_EV_SUBSCR_INVALID,
	PROXY_MM_EV_RX_GSUP_LU,
	PROXY_MM_EV_RX_GSUP_SAI,
	PROXY_MM_EV_RX_SUBSCR_DATA,
	PROXY_MM_EV_RX_GSUP_ISD_RESULT,
	PROXY_MM_EV_RX_AUTH_TUPLES,
};

enum proxy_to_home_fsm_event {
	PROXY_TO_HOME_EV_HOME_HLR_RESOLVED,
	PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ,
	PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT,
	PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT,
	PROXY_TO_HOME_EV_CHECK_TUPLES,
	PROXY_TO_HOME_EV_CONFIRM_LU,
};

extern struct llist_head proxy_mm_list;

struct proxy_mm_auth_cache {
	struct llist_head entry;
	uint64_t db_id;
	struct osmo_auth_vector	auth_vectors[OSMO_GSUP_MAX_NUM_AUTH_INFO];
	size_t num_auth_vectors;
	unsigned int sent_to_vlr_count;
};

struct proxy_mm {
	struct llist_head entry;
	struct osmo_gsup_peer_id vlr_name;
	char imsi[GSM23003_IMSI_MAX_DIGITS+1];
	bool is_ps;
	struct osmo_fsm_inst *mm_fi;
	struct osmo_fsm_inst *to_home_fi;
	struct llist_head auth_cache;
};

struct proxy_mm *proxy_mm_alloc(const struct osmo_gsup_peer_id *vlr_name,
				bool is_ps,
				const char *imsi);

void proxy_mm_add_auth_vectors(struct proxy_mm *proxy_mm,
			       const struct osmo_auth_vector *auth_vectors, size_t num_auth_vectors);
struct proxy_mm_auth_cache *proxy_mm_get_auth_vectors(struct proxy_mm *proxy_mm);
void proxy_mm_use_auth_vectors(struct proxy_mm *proxy_mm, struct proxy_mm_auth_cache *ac);
void proxy_mm_discard_auth_vectors(struct proxy_mm *proxy_mm, struct proxy_mm_auth_cache *ac);

bool proxy_mm_subscriber_data_known(const struct proxy_mm *proxy_mm);