blob: e7d1b1cbed637586b9b75acbe57520101be66147 [file] [log] [blame]
Harald Welte323e4f62010-05-01 11:28:43 +02001#ifndef _GB_PROXY_H
2#define _GB_PROXY_H
3
Harald Welte323e4f62010-05-01 11:28:43 +02004
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +01005#include <osmocom/core/msgb.h>
Harald Welte323e4f62010-05-01 11:28:43 +02006
Harald Weltecfb6b282012-06-16 14:59:56 +08007#include <osmocom/gprs/gprs_ns.h>
Harald Weltebd9591f2010-05-19 19:45:32 +02008#include <osmocom/vty/command.h>
Harald Welte323e4f62010-05-01 11:28:43 +02009
Holger Hans Peter Freyther5e94f7f2014-08-04 16:27:11 +020010#include <sys/types.h>
11#include <regex.h>
12
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +020013struct rate_ctr_group;
14
Jacob Erlbeck0727f9a2014-05-28 10:59:10 +020015enum gbproxy_patch_mode {
16 GBPROX_PATCH_DEFAULT,
17 GBPROX_PATCH_BSSGP, /*!< BSGGP messages only */
18 GBPROX_PATCH_LLC_ATTACH_REQ, /*!< BSSGP and Attach Request */
19 GBPROX_PATCH_LLC_ATTACH, /*!< BSSGP and Attach Request/Response */
20 GBPROX_PATCH_LLC_GMM, /*!< BSSGP and all GMM msgs */
Jacob Erlbeck5620c6d2014-05-23 20:48:07 +020021 GBPROX_PATCH_LLC_GSM, /*!< BSSGP and all GMM and GSM msgs */
Jacob Erlbeck0727f9a2014-05-28 10:59:10 +020022 GBPROX_PATCH_LLC, /*!< BSSGP and all supported LLC msgs */
23};
24
Harald Welte323e4f62010-05-01 11:28:43 +020025struct gbproxy_config {
26 /* parsed from config file */
Holger Hans Peter Freyther7eb8a9a2011-04-18 17:04:00 +020027 uint16_t nsip_sgsn_nsei;
Harald Welte323e4f62010-05-01 11:28:43 +020028
29 /* misc */
30 struct gprs_ns_inst *nsi;
Jacob Erlbeck2504bc42014-05-19 10:14:58 +020031
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +020032 /* Linked list of all Gb peers (except SGSN) */
33 struct llist_head bts_peers;
34
Holger Hans Peter Freyther98e753f2014-08-04 11:19:56 +020035 /* Counter */
36 struct rate_ctr_group *ctrg;
37
Jacob Erlbeck2504bc42014-05-19 10:14:58 +020038 /* force mcc/mnc */
39 int core_mnc;
40 int core_mcc;
Jacob Erlbeck5620c6d2014-05-23 20:48:07 +020041 uint8_t* core_apn;
42 size_t core_apn_size;
Jacob Erlbeck43037632014-06-06 18:49:23 +020043 char * match_re;
Jacob Erlbeck0727f9a2014-05-28 10:59:10 +020044 enum gbproxy_patch_mode patch_mode;
Jacob Erlbeck43037632014-06-06 18:49:23 +020045 int tlli_max_age;
46 int tlli_max_len;
Jacob Erlbeck383c8412014-08-12 16:30:30 +020047 int patch_ptmsi;
Holger Hans Peter Freyther5e94f7f2014-08-04 16:27:11 +020048
49 /* IMSI checking/matching */
50 int check_imsi;
51 regex_t imsi_re_comp;
Jacob Erlbeck4c47f2f2014-08-11 19:12:24 +020052
53 /* Used to generate identifiers */
54 unsigned bss_ptmsi_state;
55 unsigned sgsn_tlli_state;
Harald Welte323e4f62010-05-01 11:28:43 +020056};
57
Holger Hans Peter Freytherd64bf222014-08-04 11:35:32 +020058struct gbproxy_patch_state {
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +020059 int local_mnc;
60 int local_mcc;
61
62 /* List of TLLIs for which patching is enabled */
63 struct llist_head enabled_tllis;
64 int enabled_tllis_count;
65};
66
Holger Hans Peter Freytherd64bf222014-08-04 11:35:32 +020067struct gbproxy_peer {
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +020068 struct llist_head list;
69
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +020070 /* point back to the config */
71 struct gbproxy_config *cfg;
72
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +020073 /* NSEI of the peer entity */
74 uint16_t nsei;
75
76 /* BVCI used for Point-to-Point to this peer */
77 uint16_t bvci;
78 int blocked;
79
80 /* Routeing Area that this peer is part of (raw 04.08 encoding) */
81 uint8_t ra[6];
82
83 /* Counter */
84 struct rate_ctr_group *ctrg;
85
Holger Hans Peter Freytherd64bf222014-08-04 11:35:32 +020086 struct gbproxy_patch_state patch_state;
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +020087};
88
Jacob Erlbeck383c8412014-08-12 16:30:30 +020089struct gbproxy_tlli_state {
90 uint32_t current;
91 uint32_t assigned;
92 int bss_validated;
93 int net_validated;
94
95 uint32_t ptmsi;
96};
97
Holger Hans Peter Freytherd64bf222014-08-04 11:35:32 +020098struct gbproxy_tlli_info {
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +020099 struct llist_head list;
100
Jacob Erlbeck383c8412014-08-12 16:30:30 +0200101 struct gbproxy_tlli_state tlli;
102 struct gbproxy_tlli_state sgsn_tlli;
103
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +0200104 time_t timestamp;
105 uint8_t *mi_data;
106 size_t mi_data_len;
Jacob Erlbeck9ac42ba2014-08-06 18:55:15 +0200107
Jacob Erlbeck383c8412014-08-12 16:30:30 +0200108
Jacob Erlbeck9ac42ba2014-08-06 18:55:15 +0200109 int enable_patching;
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +0200110};
111
112
Harald Welte323e4f62010-05-01 11:28:43 +0200113/* gb_proxy_vty .c */
114
115int gbproxy_vty_init(void);
116int gbproxy_parse_config(const char *config_file, struct gbproxy_config *cfg);
117
118
119/* gb_proxy.c */
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +0200120int gbproxy_init_config(struct gbproxy_config *cfg);
Harald Welte323e4f62010-05-01 11:28:43 +0200121
122/* Main input function for Gb proxy */
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +0200123int gbprox_rcvmsg(struct gbproxy_config *cfg, struct msgb *msg, uint16_t nsei, uint16_t ns_bvci, uint16_t nsvci);
Harald Welte323e4f62010-05-01 11:28:43 +0200124
Harald Welte5bb0d362010-05-11 06:34:24 +0200125int gbprox_signal(unsigned int subsys, unsigned int signal,
126 void *handler_data, void *signal_data);
Harald Welte9ee404a2010-05-14 11:53:08 +0000127
128/* Reset all persistent NS-VC's */
129int gbprox_reset_persistent_nsvcs(struct gprs_ns_inst *nsi);
130
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +0200131void gbprox_reset(struct gbproxy_config *cfg);
Jacob Erlbeck5620c6d2014-05-23 20:48:07 +0200132
Holger Hans Peter Freyther5e94f7f2014-08-04 16:27:11 +0200133int gbprox_set_patch_filter(struct gbproxy_config *cfg, const char *filter,
134 const char **err_msg);
Jacob Erlbeck581728f2014-08-14 08:57:04 +0200135void gbprox_clear_patch_filter(struct gbproxy_config *cfg);
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +0200136
Holger Hans Peter Freytherd64bf222014-08-04 11:35:32 +0200137void gbprox_delete_tlli(struct gbproxy_peer *peer,
138 struct gbproxy_tlli_info *tlli_info);
139int gbprox_remove_stale_tllis(struct gbproxy_peer *peer, time_t now);
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +0200140int gbprox_cleanup_peers(struct gbproxy_config *cfg, uint16_t nsei, uint16_t bvci);
Holger Hans Peter Freyther5eaf1a22014-08-04 11:10:09 +0200141
Holger Hans Peter Freyther7d9c1df2014-08-04 15:42:36 +0200142struct gbproxy_peer *gbprox_peer_by_nsei(struct gbproxy_config *cfg, uint16_t nsei);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +0200143
Jacob Erlbeck31132872014-08-11 17:26:21 +0200144struct gbproxy_tlli_info *gbprox_find_tlli(struct gbproxy_peer *peer,
145 uint32_t tlli);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +0200146struct gbproxy_tlli_info *gbprox_find_tlli_by_mi(struct gbproxy_peer *peer,
Jacob Erlbeckccc59702014-08-07 20:18:47 +0200147 const uint8_t *mi_data,
148 size_t mi_data_len);
Jacob Erlbeck383c8412014-08-12 16:30:30 +0200149struct gbproxy_tlli_info *gbprox_find_tlli_by_sgsn_tlli(
150 struct gbproxy_peer *peer,
151 uint32_t tlli);
Jacob Erlbeckccc59702014-08-07 20:18:47 +0200152struct gbproxy_tlli_info *gbprox_register_tlli(
153 struct gbproxy_peer *peer, uint32_t tlli,
154 const uint8_t *imsi, size_t imsi_len, time_t now);
Holger Hans Peter Freyther60fa5b92014-08-04 17:10:08 +0200155struct gbproxy_peer *gbproxy_peer_alloc(struct gbproxy_config *cfg, uint16_t bvci);
156void gbproxy_peer_free(struct gbproxy_peer *peer);
157
Jacob Erlbeckb6799772014-08-07 10:46:29 +0200158int gbprox_check_imsi(struct gbproxy_peer *peer,
159 const uint8_t *imsi, size_t imsi_len);
Harald Welte323e4f62010-05-01 11:28:43 +0200160#endif