blob: 57b2978ff636605ce3fd240947d8cb9e5e36b3ba [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>
Max93408ae2016-06-28 14:10:16 +02006#include <osmocom/crypt/gprs_cipher.h>
Harald Welteea34a4e2012-06-16 14:59:56 +08007#include <osmocom/gprs/gprs_ns.h>
Harald Welte6abf94e2010-05-18 10:35:06 +02008#include <openbsc/gprs_sgsn.h>
Neels Hofmeyr11ecc932016-12-08 21:29:23 +01009#include <openbsc/oap_client.h>
Neels Hofmeyr84da6b12016-05-20 21:59:55 +020010#include <openbsc/common.h>
Harald Welte288be162010-05-01 16:48:27 +020011
Holger Hans Peter Freyther66e71062015-05-25 01:21:50 +080012#include <ares.h>
13
Jacob Erlbeck39f040d2014-12-18 12:46:47 +010014struct gprs_gsup_client;
Holger Hans Peter Freyther39c430e2015-05-25 12:26:49 +080015struct hostent;
Jacob Erlbeck39f040d2014-12-18 12:46:47 +010016
Jacob Erlbeck106f5472014-11-04 10:08:37 +010017enum sgsn_auth_policy {
18 SGSN_AUTH_POLICY_OPEN,
19 SGSN_AUTH_POLICY_CLOSED,
Jacob Erlbeckbe2c8d92014-11-12 10:18:09 +010020 SGSN_AUTH_POLICY_ACL_ONLY,
21 SGSN_AUTH_POLICY_REMOTE
Jacob Erlbeck106f5472014-11-04 10:08:37 +010022};
23
Alexander Couzens14314bd2016-07-05 09:52:52 +020024
25enum sgsn_rate_ctr_keys {
Alexander Couzens4e699a92016-07-05 11:04:27 +020026 CTR_LLC_DL_BYTES,
27 CTR_LLC_UL_BYTES,
28 CTR_LLC_DL_PACKETS,
29 CTR_LLC_UL_PACKETS,
Alexander Couzens14314bd2016-07-05 09:52:52 +020030 CTR_GPRS_ATTACH_REQUEST,
31 CTR_GPRS_ATTACH_ACKED,
32 CTR_GPRS_ATTACH_REJECTED,
33 CTR_GPRS_DETACH_REQUEST,
34 CTR_GPRS_DETACH_ACKED,
35 CTR_GPRS_ROUTING_AREA_REQUEST,
36 CTR_GPRS_ROUTING_AREA_ACKED,
37 CTR_GPRS_ROUTING_AREA_REJECT,
38 /* PDP single packet counter / GSM 04.08 9.5.1 - 9.5.9 */
39 CTR_PDP_ACTIVATE_REQUEST,
40 CTR_PDP_ACTIVATE_REJECT,
41 CTR_PDP_ACTIVATE_ACCEPT,
42 CTR_PDP_REQUEST_ACTIVATE, /* unused */
43 CTR_PDP_REQUEST_ACTIVATE_REJ, /* unused */
44 CTR_PDP_MODIFY_REQUEST, /* unsued */
45 CTR_PDP_MODIFY_ACCEPT, /* unused */
46 CTR_PDP_DL_DEACTIVATE_REQUEST,
47 CTR_PDP_DL_DEACTIVATE_ACCEPT,
48 CTR_PDP_UL_DEACTIVATE_REQUEST,
49 CTR_PDP_UL_DEACTIVATE_ACCEPT,
50};
51
Holger Hans Peter Freyther4f5b8232015-05-05 22:25:48 +020052struct sgsn_cdr {
53 char *filename;
54 int interval;
55};
56
Harald Welte288be162010-05-01 16:48:27 +020057struct sgsn_config {
58 /* parsed from config file */
Harald Welte288be162010-05-01 16:48:27 +020059
Harald Welte2720e732010-05-17 00:44:57 +020060 char *gtp_statedir;
61 struct sockaddr_in gtp_listenaddr;
62
Harald Welte288be162010-05-01 16:48:27 +020063 /* misc */
64 struct gprs_ns_inst *nsi;
Harald Welte7f6da482013-03-19 11:00:13 +010065
Jacob Erlbeck106f5472014-11-04 10:08:37 +010066 enum sgsn_auth_policy auth_policy;
Max93408ae2016-06-28 14:10:16 +020067 enum gprs_ciph_algo cipher;
Harald Welte7f6da482013-03-19 11:00:13 +010068 struct llist_head imsi_acl;
Jacob Erlbeck39f040d2014-12-18 12:46:47 +010069
70 struct sockaddr_in gsup_server_addr;
71 int gsup_server_port;
Jacob Erlbeck9d4f46c2014-12-17 13:20:08 +010072
73 int require_authentication;
Jacob Erlbeck771573c2014-12-19 18:08:48 +010074 int require_update_location;
Holger Hans Peter Freyther4f5b8232015-05-05 22:25:48 +020075
76 /* CDR configuration */
77 struct sgsn_cdr cdr;
Holger Hans Peter Freyther39c430e2015-05-25 12:26:49 +080078
Harald Welte94508822015-08-15 19:08:21 +020079 struct {
80 int T3312;
81 int T3322;
82 int T3350;
83 int T3360;
84 int T3370;
85 int T3313;
86 int T3314;
87 int T3316;
88 int T3385;
89 int T3386;
90 int T3395;
91 int T3397;
92 } timers;
93
Holger Hans Peter Freyther39c430e2015-05-25 12:26:49 +080094 int dynamic_lookup;
Neels Hofmeyr9c534fd2015-10-12 11:57:37 +020095
Neels Hofmeyr49012f12016-12-08 21:30:34 +010096 struct oap_client_config oap;
Philippf1f34362016-08-26 17:00:21 +020097
98 /* RFC1144 TCP/IP header compression */
99 struct {
100 int active;
101 int passive;
102 int s01;
103 } pcomp_rfc1144;
Philipp73f83d52016-09-02 13:38:01 +0200104
105 /* V.42vis data compression */
106 struct {
107 int active;
108 int passive;
109 int p0;
110 int p1;
111 int p2;
112 } dcomp_v42bis;
Neels Hofmeyr84da6b12016-05-20 21:59:55 +0200113
114 struct {
115 enum nsap_addr_enc rab_assign_addr_enc;
116 } iu;
Harald Welte288be162010-05-01 16:48:27 +0200117};
118
Harald Welte2720e732010-05-17 00:44:57 +0200119struct sgsn_instance {
120 char *config_file;
121 struct sgsn_config cfg;
122 /* File descriptor wrappers for LibGTP */
Pablo Neira Ayuso4db92992011-05-06 12:11:23 +0200123 struct osmo_fd gtp_fd0;
124 struct osmo_fd gtp_fd1c;
125 struct osmo_fd gtp_fd1u;
Harald Welte2720e732010-05-17 00:44:57 +0200126 /* Timer for libGTP */
Pablo Neira Ayusobf540cb2011-05-06 12:11:06 +0200127 struct osmo_timer_list gtp_timer;
Harald Welte2720e732010-05-17 00:44:57 +0200128 /* GSN instance for libgtp */
129 struct gsn_t *gsn;
Jacob Erlbeck39f040d2014-12-18 12:46:47 +0100130 /* Subscriber */
Neels Hofmeyr814fef02016-12-08 21:19:57 +0100131 struct gsup_client *gsup_client;
Jacob Erlbeck81ffb742015-01-23 11:33:51 +0100132 /* LLME inactivity timer */
133 struct osmo_timer_list llme_timer;
Holger Hans Peter Freyther66e71062015-05-25 01:21:50 +0800134
135 /* c-ares event loop integration */
136 struct osmo_timer_list ares_timer;
137 struct llist_head ares_fds;
138 ares_channel ares_channel;
Holger Hans Peter Freythera5a6da42015-05-25 15:20:27 +0800139 struct ares_addr_node *ares_servers;
Alexander Couzens14314bd2016-07-05 09:52:52 +0200140
141 struct rate_ctr_group *rate_ctrs;
Harald Welte2720e732010-05-17 00:44:57 +0200142};
143
Harald Welte8fc1a462010-05-17 00:53:10 +0200144extern struct sgsn_instance *sgsn;
Harald Welte288be162010-05-01 16:48:27 +0200145
146/* sgsn_vty.c */
147
Neels Hofmeyr42836752017-07-20 14:41:20 +0200148int sgsn_vty_init(struct sgsn_config *cfg);
149int sgsn_parse_config(const char *config_file);
Harald Welte288be162010-05-01 16:48:27 +0200150
151/* sgsn.c */
152
153/* Main input function for Gb proxy */
154int sgsn_rcvmsg(struct msgb *msg, struct gprs_nsvc *nsvc, uint16_t ns_bvci);
155
Harald Welte6abf94e2010-05-18 10:35:06 +0200156
Harald Welte77289c22010-05-18 14:32:29 +0200157struct sgsn_pdp_ctx *sgsn_create_pdp_ctx(struct sgsn_ggsn_ctx *ggsn,
Harald Welte6abf94e2010-05-18 10:35:06 +0200158 struct sgsn_mm_ctx *mmctx,
159 uint16_t nsapi,
160 struct tlv_parsed *tp);
Harald Welte77289c22010-05-18 14:32:29 +0200161int sgsn_delete_pdp_ctx(struct sgsn_pdp_ctx *pctx);
Daniel Willmann21b269f2016-05-11 12:43:47 +0200162void sgsn_pdp_upd_gtp_u(struct sgsn_pdp_ctx *pdp, void *addr, size_t alen);
Harald Welte77289c22010-05-18 14:32:29 +0200163
Harald Welteebabdea2010-06-01 18:28:10 +0200164/* gprs_sndcp.c */
165
166/* Entry point for the SNSM-ACTIVATE.indication */
167int sndcp_sm_activate_ind(struct gprs_llc_lle *lle, uint8_t nsapi);
Harald Weltece22f922010-06-03 21:21:21 +0200168/* Entry point for the SNSM-DEACTIVATE.indication */
169int sndcp_sm_deactivate_ind(struct gprs_llc_lle *lle, uint8_t nsapi);
Harald Welteebabdea2010-06-01 18:28:10 +0200170/* Called by SNDCP when it has received/re-assembled a N-PDU */
Harald Welte8911cef2010-07-01 19:56:19 +0200171int sgsn_rx_sndcp_ud_ind(struct gprs_ra_id *ra_id, int32_t tlli, uint8_t nsapi,
172 struct msgb *msg, uint32_t npdu_len, uint8_t *npdu);
Harald Weltebb1c8052010-06-03 06:38:38 +0200173int sndcp_unitdata_req(struct msgb *msg, struct gprs_llc_lle *lle, uint8_t nsapi,
174 void *mmcontext);
Holger Hans Peter Freyther3dccda52011-10-14 23:42:13 +0200175int sndcp_llunitdata_ind(struct msgb *msg, struct gprs_llc_lle *lle,
176 uint8_t *hdr, uint16_t len);
Harald Welteebabdea2010-06-01 18:28:10 +0200177
Holger Hans Peter Freyther4f5b8232015-05-05 22:25:48 +0200178
179/*
180 * CDR related functionality
181 */
182int sgsn_cdr_init(struct sgsn_instance *sgsn);
183
Holger Hans Peter Freyther66e71062015-05-25 01:21:50 +0800184
185/*
186 * C-ARES related functionality
187 */
188int sgsn_ares_init(struct sgsn_instance *sgsn);
189int sgsn_ares_query(struct sgsn_instance *sgsm, const char *name, ares_host_callback cb, void *data);
190
Harald Welte288be162010-05-01 16:48:27 +0200191#endif