blob: 6155b305017369769bb703a9d1962472844846aa [file] [log] [blame]
Harald Weltedda21ed2017-08-12 15:07:02 +02001#pragma once
2
3#include <stdint.h>
4#include <stdbool.h>
5#include <osmocom/core/utils.h>
6#include <osmocom/core/linuxlist.h>
7#include <osmocom/core/select.h>
8#include <osmocom/core/timer.h>
Pau Espin Pedrol421f22e2019-08-20 12:52:13 +02009#include <osmocom/ctrl/control_if.h>
Harald Weltedda21ed2017-08-12 15:07:02 +020010
11#include "../lib/tun.h"
12#include "../lib/ippool.h"
13#include "../lib/syserr.h"
14#include "../lib/in46_addr.h"
15#include "../gtp/gtp.h"
16
17#define APN_TYPE_IPv4 0x01 /* v4-only */
18#define APN_TYPE_IPv6 0x02 /* v6-only */
19#define APN_TYPE_IPv4v6 0x04 /* v4v6 dual-stack */
20
21struct ggsn_ctx;
22
23struct apn_ctx_ip {
24 struct {
25 struct in46_prefix ifconfig_prefix;
Pau Espin Pedrol37c45e32017-12-14 14:09:13 +010026 struct in46_prefix ll_prefix;
Harald Weltedda21ed2017-08-12 15:07:02 +020027 struct in46_prefix static_prefix;
28 struct in46_prefix dynamic_prefix;
29 /* v4 DNS server names */
30 struct in46_addr dns[2];
31 } cfg;
32
33 /* v4 address pool */
34 struct ippool_t *pool;
35};
36
37struct apn_name {
38 struct llist_head list;
39 char *name;
40};
41
42enum apn_gtpu_mode {
43 APN_GTPU_MODE_TUN = 0, /* default */
44 APN_GTPU_MODE_KERNEL_GTP,
45};
46
47struct apn_ctx {
48 /* list of APNs inside GGSN */
49 struct llist_head list;
50 /* back-pointer to GGSN */
51 struct ggsn_ctx *ggsn;
52
53 bool started;
54
55 struct {
56 /* Primary name */
57 char *name;
58 /* Description string */
59 char *description;
60 /* List of secondary APN names */
61 struct llist_head name_list;
62 /* types supported address types on this APN */
63 uint32_t apn_type_mask;
64 /* GTP-U via TUN device or in Linux kernel */
65 enum apn_gtpu_mode gtpu_mode;
66 /* administratively shut-down (true) or not (false) */
67 bool shutdown;
Harald Welte93fed3b2017-09-24 11:43:17 +080068 /* transmit G-PDU sequeence numbers (true) or not (false) */
69 bool tx_gpdu_seq;
Harald Weltedda21ed2017-08-12 15:07:02 +020070 } cfg;
71
72 /* corresponding tun device */
73 struct {
74 struct {
75 /* name of the network device */
76 char *dev_name;
77 /* ip-up and ip-down script names/paths */
78 char *ipup_script;
79 char *ipdown_script;
80 } cfg;
81 struct tun_t *tun;
82 struct osmo_fd fd;
83 } tun;
84
Harald Weltef85fe972017-09-24 20:00:34 +080085 /* ipv6 link-local address */
86 struct in6_addr v6_lladdr;
87
Harald Weltedda21ed2017-08-12 15:07:02 +020088 struct apn_ctx_ip v4;
89 struct apn_ctx_ip v6;
90};
91
92struct ggsn_ctx {
93 /* global list of GGSNs */
94 struct llist_head list;
95
96 /* list of APNs in this GGSN */
97 struct llist_head apn_list;
98
99 bool started;
100
101 struct {
102 char *name;
103 /* Description string */
104 char *description;
105 /* an APN that shall be used as default for any non-matching APN */
106 struct apn_ctx *default_apn;
107 /* ADdress to which we listen for GTP */
108 struct in46_addr listen_addr;
Harald Welte98146772017-09-05 17:41:20 +0200109 /* Local GTP-C address advertised in GTP */
110 struct in46_addr gtpc_addr;
111 /* Local GTP-U address advertised in GTP */
112 struct in46_addr gtpu_addr;
Harald Weltedda21ed2017-08-12 15:07:02 +0200113 /* directory for state file */
114 char *state_dir;
115 /* administratively shut-down (true) or not (false) */
116 bool shutdown;
117 } cfg;
118
119 /* The libgtp (G)GSN instance, i.e. what listens to GTP */
120 struct gsn_t *gsn;
121
122 /* osmo-fd for gsn */
123 struct osmo_fd gtp_fd0;
124 struct osmo_fd gtp_fd1c;
125 struct osmo_fd gtp_fd1u;
126
127 struct osmo_timer_list gtp_timer;
128};
129
130/* ggsn_vty.c */
131extern struct llist_head g_ggsn_list;
132extern struct vty_app_info g_vty_info;
133extern int ggsn_vty_init(void);
134struct ggsn_ctx *ggsn_find(const char *name);
135struct ggsn_ctx *ggsn_find_or_create(void *ctx, const char *name);
136struct apn_ctx *ggsn_find_apn(struct ggsn_ctx *ggsn, const char *name);
137struct apn_ctx *ggsn_find_or_create_apn(struct ggsn_ctx *ggsn, const char *name);
138
Pau Espin Pedrol421f22e2019-08-20 12:52:13 +0200139/* ggsn_main.c */
140extern struct ctrl_handle *g_ctrlh;
Harald Weltedda21ed2017-08-12 15:07:02 +0200141extern void *tall_ggsn_ctx;
Pau Espin Pedrol421f22e2019-08-20 12:52:13 +0200142
143/* ggsn.c */
Harald Weltedda21ed2017-08-12 15:07:02 +0200144extern int ggsn_start(struct ggsn_ctx *ggsn);
145extern int ggsn_stop(struct ggsn_ctx *ggsn);
146extern int apn_start(struct apn_ctx *apn);
Pau Espin Pedrol72ab4bc2019-05-29 19:08:26 +0200147extern int apn_stop(struct apn_ctx *apn);
Pau Espin Pedrolf7884e82019-08-20 12:06:13 +0200148
149#define LOGPAPN(level, apn, fmt, args...) \
150 LOGP(DGGSN, level, "APN(%s): " fmt, (apn)->cfg.name, ## args)
151
152#define LOGPGGSN(level, ggsn, fmt, args...) \
153 LOGP(DGGSN, level, "GGSN(%s): " fmt, (ggsn)->cfg.name, ## args)
154
155#define LOGPPDP(level, pdp, fmt, args...) LOGPDPX(DGGSN, level, pdp, fmt, ## args)
Pau Espin Pedrol012d51e2019-08-20 13:43:38 +0200156
157#define LOGTUN(level, tun, fmt, args...) \
158 LOGP(DTUN, level, "TUN(%s): " fmt, (tun)->devname, ## args)