blob: 6e93178aff504c85da210a435099151c1f8d7b96 [file] [log] [blame]
Harald Welte288be162010-05-01 16:48:27 +02001#ifndef _SGSN_H
2#define _SGSN_H
3
Harald Welte288be162010-05-01 16:48:27 +02004
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +01005#include <osmocom/core/msgb.h>
Alexander Couzensf23e2db2020-07-27 22:39:58 +02006#include <osmocom/core/select.h>
Max93408ae2016-06-28 14:10:16 +02007#include <osmocom/crypt/gprs_cipher.h>
Alexander Couzensf23e2db2020-07-27 22:39:58 +02008#include <osmocom/gprs/gprs_ns2.h>
Pau Espin Pedrole5c89982021-05-03 18:16:42 +02009#include <osmocom/gprs/gprs_bssgp.h>
10
Pau Espin Pedrol58101ea2023-01-09 12:29:27 +010011#include <osmocom/sgsn/auth.h>
Pau Espin Pedrole5c89982021-05-03 18:16:42 +020012#include <osmocom/sgsn/gtp_mme.h>
Harald Welte0b588be2018-07-30 18:25:31 +020013#include <osmocom/gsm/oap_client.h>
Harald Weltef4b2c4c2018-09-16 07:53:41 +020014#include <osmocom/gsupclient/gsup_client.h>
Neels Hofmeyr396f2e62017-09-04 15:13:25 +020015#include <osmocom/sgsn/common.h>
Harald Welte288be162010-05-01 16:48:27 +020016
Pau Espin Pedrolf44dfa82023-01-09 13:01:00 +010017#include "../../config.h"
Neels Hofmeyr69e356b2018-03-15 13:00:35 +010018
19#if BUILD_IU
20#include <osmocom/ranap/iu_client.h>
21#endif
22
Holger Hans Peter Freyther66e71062015-05-25 01:21:50 +080023#include <ares.h>
Maxc005db72017-10-27 18:43:29 +020024#include <gtp.h>
Holger Hans Peter Freyther66e71062015-05-25 01:21:50 +080025
Holger Hans Peter Freyther39c430e2015-05-25 12:26:49 +080026struct hostent;
Jacob Erlbeck39f040d2014-12-18 12:46:47 +010027
Pau Espin Pedrol58101ea2023-01-09 12:29:27 +010028#define SGSN_ERROR_CAUSE_NONE (-1)
29
Jacob Erlbeck106f5472014-11-04 10:08:37 +010030enum sgsn_auth_policy {
31 SGSN_AUTH_POLICY_OPEN,
32 SGSN_AUTH_POLICY_CLOSED,
Jacob Erlbeckbe2c8d92014-11-12 10:18:09 +010033 SGSN_AUTH_POLICY_ACL_ONLY,
34 SGSN_AUTH_POLICY_REMOTE
Jacob Erlbeck106f5472014-11-04 10:08:37 +010035};
36
Alexander Couzens14314bd2016-07-05 09:52:52 +020037
38enum sgsn_rate_ctr_keys {
Alexander Couzens4e699a92016-07-05 11:04:27 +020039 CTR_LLC_DL_BYTES,
40 CTR_LLC_UL_BYTES,
41 CTR_LLC_DL_PACKETS,
42 CTR_LLC_UL_PACKETS,
Alexander Couzens14314bd2016-07-05 09:52:52 +020043 CTR_GPRS_ATTACH_REQUEST,
44 CTR_GPRS_ATTACH_ACKED,
45 CTR_GPRS_ATTACH_REJECTED,
46 CTR_GPRS_DETACH_REQUEST,
47 CTR_GPRS_DETACH_ACKED,
48 CTR_GPRS_ROUTING_AREA_REQUEST,
49 CTR_GPRS_ROUTING_AREA_ACKED,
50 CTR_GPRS_ROUTING_AREA_REJECT,
51 /* PDP single packet counter / GSM 04.08 9.5.1 - 9.5.9 */
52 CTR_PDP_ACTIVATE_REQUEST,
53 CTR_PDP_ACTIVATE_REJECT,
54 CTR_PDP_ACTIVATE_ACCEPT,
55 CTR_PDP_REQUEST_ACTIVATE, /* unused */
56 CTR_PDP_REQUEST_ACTIVATE_REJ, /* unused */
57 CTR_PDP_MODIFY_REQUEST, /* unsued */
58 CTR_PDP_MODIFY_ACCEPT, /* unused */
59 CTR_PDP_DL_DEACTIVATE_REQUEST,
60 CTR_PDP_DL_DEACTIVATE_ACCEPT,
61 CTR_PDP_UL_DEACTIVATE_REQUEST,
62 CTR_PDP_UL_DEACTIVATE_ACCEPT,
63};
64
Holger Hans Peter Freyther4f5b8232015-05-05 22:25:48 +020065struct sgsn_cdr {
66 char *filename;
Pau Espin Pedrol2e9ea502017-11-29 14:01:35 +010067 bool trap;
Holger Hans Peter Freyther4f5b8232015-05-05 22:25:48 +020068 int interval;
69};
70
Harald Welte288be162010-05-01 16:48:27 +020071struct sgsn_config {
72 /* parsed from config file */
Harald Welte288be162010-05-01 16:48:27 +020073
Harald Welte2720e732010-05-17 00:44:57 +020074 char *gtp_statedir;
75 struct sockaddr_in gtp_listenaddr;
76
Harald Welte288be162010-05-01 16:48:27 +020077 /* misc */
Alexander Couzensf23e2db2020-07-27 22:39:58 +020078 struct gprs_ns2_inst *nsi;
Harald Welte7f6da482013-03-19 11:00:13 +010079
Pau Espin Pedrol86b630c2023-01-09 18:29:21 +010080 char *crypt_cipher_plugin_path;
Jacob Erlbeck106f5472014-11-04 10:08:37 +010081 enum sgsn_auth_policy auth_policy;
Neels Hofmeyr340a7e92022-03-07 15:37:24 +010082 uint8_t gea_encryption_mask;
Neels Hofmeyr3c7656a2022-03-07 15:38:59 +010083 uint8_t uea_encryption_mask;
Harald Welte7f6da482013-03-19 11:00:13 +010084 struct llist_head imsi_acl;
Jacob Erlbeck39f040d2014-12-18 12:46:47 +010085
86 struct sockaddr_in gsup_server_addr;
87 int gsup_server_port;
Jacob Erlbeck9d4f46c2014-12-17 13:20:08 +010088
Pau Espin Pedrold1463bc2019-06-13 19:03:25 +020089 /* Only meaningful if auth_policy is SGSN_AUTH_POLICY_REMOTE */
Jacob Erlbeck9d4f46c2014-12-17 13:20:08 +010090 int require_authentication;
Pau Espin Pedrold1463bc2019-06-13 19:03:25 +020091
Jacob Erlbeck771573c2014-12-19 18:08:48 +010092 int require_update_location;
Holger Hans Peter Freyther4f5b8232015-05-05 22:25:48 +020093
94 /* CDR configuration */
95 struct sgsn_cdr cdr;
Holger Hans Peter Freyther39c430e2015-05-25 12:26:49 +080096
Pau Espin Pedrola299d652019-08-14 19:11:10 +020097 /* Timer defintions */
98 struct osmo_tdef *T_defs;
Pau Espin Pedrol85011262022-11-02 20:23:09 +010099 struct osmo_tdef *T_defs_gtp;
Harald Welte94508822015-08-15 19:08:21 +0200100
Holger Hans Peter Freyther39c430e2015-05-25 12:26:49 +0800101 int dynamic_lookup;
Neels Hofmeyr9c534fd2015-10-12 11:57:37 +0200102
Harald Welte0b588be2018-07-30 18:25:31 +0200103 struct osmo_oap_client_config oap;
Philippf1f34362016-08-26 17:00:21 +0200104
105 /* RFC1144 TCP/IP header compression */
106 struct {
107 int active;
108 int passive;
109 int s01;
110 } pcomp_rfc1144;
Philipp73f83d52016-09-02 13:38:01 +0200111
112 /* V.42vis data compression */
113 struct {
114 int active;
115 int passive;
116 int p0;
117 int p1;
118 int p2;
119 } dcomp_v42bis;
Neels Hofmeyr2188a772016-05-20 21:59:55 +0200120
Neels Hofmeyr69e356b2018-03-15 13:00:35 +0100121#if BUILD_IU
Neels Hofmeyr2188a772016-05-20 21:59:55 +0200122 struct {
Neels Hofmeyr69e356b2018-03-15 13:00:35 +0100123 enum ranap_nsap_addr_enc rab_assign_addr_enc;
Pau Espin Pedrol2c908992019-08-19 19:06:06 +0200124 uint32_t cs7_instance;
Neels Hofmeyr2188a772016-05-20 21:59:55 +0200125 } iu;
Neels Hofmeyr69e356b2018-03-15 13:00:35 +0100126#endif
Stefan Sperling88220092018-12-11 14:42:00 +0100127
128 /* This is transmitted as IPA Serial Number tag, which is used for GSUP routing (e.g. in OsmoHLR).
129 * This name must be set in a multi-SGSN network, and it must be unique to each SGSN.
130 * If no name is set, the IPA Serial Number will be the same as the Unit Name,
131 * and will be of the form 'SGSN-00-00-00-00-00-00' */
132 char *sgsn_ipa_name;
Harald Welte288be162010-05-01 16:48:27 +0200133};
134
Harald Welte2720e732010-05-17 00:44:57 +0200135struct sgsn_instance {
136 char *config_file;
137 struct sgsn_config cfg;
138 /* File descriptor wrappers for LibGTP */
Pablo Neira Ayuso4db92992011-05-06 12:11:23 +0200139 struct osmo_fd gtp_fd0;
140 struct osmo_fd gtp_fd1c;
141 struct osmo_fd gtp_fd1u;
Harald Welte2720e732010-05-17 00:44:57 +0200142 /* GSN instance for libgtp */
143 struct gsn_t *gsn;
Jacob Erlbeck39f040d2014-12-18 12:46:47 +0100144 /* Subscriber */
Harald Weltef4b2c4c2018-09-16 07:53:41 +0200145 struct osmo_gsup_client *gsup_client;
Jacob Erlbeck81ffb742015-01-23 11:33:51 +0100146 /* LLME inactivity timer */
147 struct osmo_timer_list llme_timer;
Holger Hans Peter Freyther66e71062015-05-25 01:21:50 +0800148
149 /* c-ares event loop integration */
150 struct osmo_timer_list ares_timer;
151 struct llist_head ares_fds;
152 ares_channel ares_channel;
Holger Hans Peter Freythera5a6da42015-05-25 15:20:27 +0800153 struct ares_addr_node *ares_servers;
Alexander Couzens14314bd2016-07-05 09:52:52 +0200154
155 struct rate_ctr_group *rate_ctrs;
Pau Espin Pedrole5c89982021-05-03 18:16:42 +0200156
Pau Espin Pedrolfd4d4352023-01-05 19:37:05 +0100157 struct llist_head apn_list; /* list of struct sgsn_apn_ctx */
Pau Espin Pedrol44bde6b2023-01-05 17:23:26 +0100158 struct llist_head ggsn_list; /* list of struct sgsn_ggsn_ctx */
Pau Espin Pedrole5c89982021-05-03 18:16:42 +0200159 struct llist_head mme_list; /* list of struct sgsn_mme_ctx */
Pau Espin Pedrol93bc5182023-01-09 13:57:31 +0100160 struct llist_head mm_list; /* list of struct sgsn_mm_ctx */
Pau Espin Pedrol15a52d92023-01-05 20:26:31 +0100161 struct llist_head pdp_list; /* list of struct sgsn_pdp_ctx */
Pau Espin Pedrole659f752023-01-05 17:20:37 +0100162
163 struct ctrl_handle *ctrlh;
Harald Welte2720e732010-05-17 00:44:57 +0200164};
165
Harald Welte8fc1a462010-05-17 00:53:10 +0200166extern struct sgsn_instance *sgsn;
Pau Espin Pedrol164a1ee2023-01-11 12:42:31 +0100167extern void *tall_sgsn_ctx;
Harald Welte288be162010-05-01 16:48:27 +0200168
Pau Espin Pedrolfd9e82d2023-01-09 12:00:17 +0100169/*
170 * ctrl interface related work (sgsn_ctrl.c)
171 */
172int sgsn_ctrl_cmds_install(void);
173
Harald Welte288be162010-05-01 16:48:27 +0200174/* sgsn_vty.c */
175
Neels Hofmeyrc9a352f2017-07-20 14:41:20 +0200176int sgsn_vty_init(struct sgsn_config *cfg);
177int sgsn_parse_config(const char *config_file);
Maxc005db72017-10-27 18:43:29 +0200178char *sgsn_gtp_ntoa(struct ul16_t *ul);
Harald Welte288be162010-05-01 16:48:27 +0200179
180/* sgsn.c */
Pau Espin Pedrole659f752023-01-05 17:20:37 +0100181struct sgsn_instance *sgsn_instance_alloc(void *talloc_ctx);
182int sgsn_inst_init(struct sgsn_instance *sgsn);
Holger Hans Peter Freyther4f5b8232015-05-05 22:25:48 +0200183/*
184 * CDR related functionality
185 */
186int sgsn_cdr_init(struct sgsn_instance *sgsn);
Pau Espin Pedrole659f752023-01-05 17:20:37 +0100187void sgsn_cdr_release(struct sgsn_instance *sgsn);
Holger Hans Peter Freyther4f5b8232015-05-05 22:25:48 +0200188
Holger Hans Peter Freyther66e71062015-05-25 01:21:50 +0800189
190/*
191 * C-ARES related functionality
192 */
193int sgsn_ares_init(struct sgsn_instance *sgsn);
194int sgsn_ares_query(struct sgsn_instance *sgsm, const char *name, ares_host_callback cb, void *data);
195
Harald Welte288be162010-05-01 16:48:27 +0200196#endif