libosmogb  1.9.0.192-1c24.202404212026
Osmocom Gb library
gprs_ns.h
Go to the documentation of this file.
1 
3 #pragma once
4 
5 #include <stdint.h>
6 
7 /* Our Implementation */
8 #include <netinet/in.h>
10 #include <osmocom/core/msgb.h>
11 #include <osmocom/core/timer.h>
12 #include <osmocom/core/select.h>
13 #include <osmocom/gprs/gprs_msgb.h>
14 
16 
17 #define NS_TIMERS_COUNT 8
18 #define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries|tsns-prov)"
19 #define NS_TIMERS_HELP \
20  "(un)blocking Timer (Tns-block) timeout\n" \
21  "(un)blocking Timer (Tns-block) number of retries\n" \
22  "Reset Timer (Tns-reset) timeout\n" \
23  "Reset Timer (Tns-reset) number of retries\n" \
24  "Test Timer (Tns-test) timeout\n" \
25  "Alive Timer (Tns-alive) timeout\n" \
26  "Alive Timer (Tns-alive) number of retries\n" \
27  "SNS Provision Timer (Tsns-prov) timeout\n"
28 
29 /* Educated guess - LLC user payload is 1500 bytes plus possible headers */
30 #define NS_ALLOC_SIZE 3072
31 #define NS_ALLOC_HEADROOM 20
32 
33 enum ns_timeout {
42 };
43 
44 #define NSE_S_BLOCKED 0x0001
45 #define NSE_S_ALIVE 0x0002
46 #define NSE_S_RESET 0x0004
47 
48 #define NS_DESC_B(st) ((st) & NSE_S_BLOCKED ? "BLOCKED" : "UNBLOCKED")
49 #define NS_DESC_A(st) ((st) & NSE_S_ALIVE ? "ALIVE" : "DEAD")
50 #define NS_DESC_R(st) ((st) & NSE_S_RESET ? "RESET" : "UNRESET")
51 
53 enum gprs_ns_ll {
57 };
58 
62 };
63 
65 enum gprs_ns_cs {
71 };
72 
73 struct gprs_nsvc;
75 typedef int gprs_ns_cb_t(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
76  struct msgb *msg, uint16_t bvci);
77 
79 struct gprs_ns_inst {
82 
84  struct llist_head gprs_nsvcs;
85 
89 
91 
93  struct {
94  struct osmo_fd fd;
95  uint32_t local_ip;
96  uint16_t local_port;
97  uint32_t remote_ip;
98  uint16_t remote_port;
99  int dscp;
102  } nsip;
104  struct {
105  struct osmo_fd fd;
106  uint32_t local_ip;
107  unsigned int enabled:1;
108  } frgre;
109 
111 };
112 
114  /* standard timers */
119 };
120 
122 struct gprs_nsvc {
124  struct llist_head list;
126  struct gprs_ns_inst *nsi;
127 
128  uint16_t nsei;
129  uint16_t nsvci;
131  uint32_t state;
132  uint32_t remote_state;
133 
134  struct osmo_timer_list timer;
136  struct timeval timer_started;
138 
139  unsigned int remote_end_is_sgsn:1;
140  unsigned int persistent:1;
141  unsigned int nsvci_is_valid:1;
142 
145 
147  enum gprs_ns_ll ll;
148 
151  union {
152  struct {
153  struct sockaddr_in bts_addr;
154  } ip;
155  struct {
156  struct sockaddr_in bts_addr;
157  } frgre;
158  };
160  uint8_t sig_weight;
162  uint8_t data_weight;
163 };
164 
165 /* Create a new NS protocol instance */
166 struct gprs_ns_inst *gprs_ns_instantiate(gprs_ns_cb_t *cb, void *ctx);
167 
168 /* Close a NS protocol instance */
169 void gprs_ns_close(struct gprs_ns_inst *nsi);
170 
171 /* Close and Destroy a NS protocol instance */
172 void gprs_ns_destroy(struct gprs_ns_inst *nsi);
173 
174 /* Listen for incoming GPRS packets via NS/UDP */
175 int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi);
176 
177 /* Establish a connection (from the BSS) to the SGSN */
179  struct sockaddr_in *dest,
180  uint16_t nsei, uint16_t nsvci);
181 
182 /* Establish a connection (from the BSS) to the SGSN using IP SNS */
183 struct gprs_nsvc *gprs_ns_nsip_connect_sns(struct gprs_ns_inst *nsi, struct sockaddr_in *dest,
184  uint16_t nsei, uint16_t nsvci);
185 
186 struct sockaddr_in;
187 
188 /* main function for higher layers (BSSGP) to send NS messages */
189 int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg);
190 
191 /* Receive incoming NS message from underlying transport layer */
192 int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
193  struct sockaddr_in *saddr, enum gprs_ns_ll ll);
194 
195 
196 int gprs_ns_tx_alive(struct gprs_nsvc *nsvc);
197 int gprs_ns_tx_alive_ack(struct gprs_nsvc *nsvc);
198 int gprs_ns_tx_reset(struct gprs_nsvc *nsvc, uint8_t cause);
199 int gprs_ns_tx_block(struct gprs_nsvc *nsvc, uint8_t cause);
200 int gprs_ns_tx_unblock(struct gprs_nsvc *nsvc);
201 
202 /* Listen for incoming GPRS packets via NS/FR/GRE */
203 int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi);
204 
205 struct gprs_nsvc *gprs_nsvc_create2(struct gprs_ns_inst *nsi, uint16_t nsvci,
206  uint8_t sig_weight, uint8_t data_weight);
207 void gprs_nsvc_delete(struct gprs_nsvc *nsvc);
208 struct gprs_nsvc *gprs_nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei);
209 struct gprs_nsvc *gprs_nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci);
210 struct gprs_nsvc *gprs_nsvc_by_rem_addr(struct gprs_ns_inst *nsi, const struct sockaddr_in *sin);
211 
212 /* Initiate a RESET procedure (including timer start, ...)*/
213 int gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause);
214 
215 /* Add NS-specific VTY stuff */
216 int gprs_ns_vty_init(struct gprs_ns_inst *nsi);
217 
218 /* Resturn peer info as string (NOTE: the buffer is allocated statically) */
219 const char *gprs_ns_ll_str(const struct gprs_nsvc *nsvc);
220 /* Return peer info in user-supplied buffer */
221 char *gprs_ns_ll_str_buf(char *buf, size_t buf_len, const struct gprs_nsvc *nsvc);
222 char *gprs_ns_ll_str_c(const void *ctx, const struct gprs_nsvc *nsvc);
223 
224 /* Copy the link layer info from other into nsvc */
225 void gprs_ns_ll_copy(struct gprs_nsvc *nsvc, struct gprs_nsvc *other);
226 
227 /* Clear the link layer info (will never match a real link then) */
228 void gprs_ns_ll_clear(struct gprs_nsvc *nsvc);
229 
230 struct msgb *gprs_ns_msgb_alloc(void);
231 
232 enum signal_ns {
236  S_NS_ALIVE_EXP, /* Tns-alive expired more than N times */
237  S_NS_REPLACED, /* nsvc object is replaced (sets old_nsvc) */
238  S_NS_MISMATCH, /* got an unexpected IE (sets msg, pdu_type, ie_type) */
239  S_SNS_CONFIGURED, /* IP-SNS configuration completed */
240 };
241 
242 extern const struct value_string gprs_ns_signal_ns_names[];
243 const char *gprs_ns_cause_str(enum ns_cause cause);
244 
246  struct gprs_nsvc *nsvc;
248  uint8_t cause;
249  uint8_t pdu_type;
250  uint8_t ie_type;
251  struct msgb *msg;
252 };
253 
254 void gprs_ns_set_log_ss(int ss);
255 
256 char *gprs_nsvc_state_append(char *s, struct gprs_nsvc *nsvc);
257 
uint16_t bvci
Definition: gprs_msgb.h:8
uint16_t nsei
Identifiers of a BTS, equal to 'struct bssgp_bts_ctx'.
Definition: gprs_msgb.h:7
gprs_ns_cs
Osmocom NS VC create status.
Definition: gprs_ns.h:65
@ GPRS_NS_CS_FOUND
A NSVC object has been found.
Definition: gprs_ns.h:67
@ GPRS_NS_CS_CREATED
A NSVC object has been created.
Definition: gprs_ns.h:66
@ GPRS_NS_CS_REJECTED
Rejected and answered message.
Definition: gprs_ns.h:68
@ GPRS_NS_CS_SKIPPED
Skipped message.
Definition: gprs_ns.h:69
@ GPRS_NS_CS_ERROR
Failed to process message.
Definition: gprs_ns.h:70
nsvc_timer_mode
Definition: gprs_ns.h:113
@ NSVC_TIMER_TNS_RESET
Definition: gprs_ns.h:117
@ NSVC_TIMER_TNS_ALIVE
Definition: gprs_ns.h:116
@ NSVC_TIMER_TNS_TEST
Definition: gprs_ns.h:115
@ _NSVC_TIMER_NR
Definition: gprs_ns.h:118
signal_ns
Definition: gprs_ns.h:232
@ S_SNS_CONFIGURED
Definition: gprs_ns.h:239
@ S_NS_MISMATCH
Definition: gprs_ns.h:238
@ S_NS_UNBLOCK
Definition: gprs_ns.h:235
@ S_NS_ALIVE_EXP
Definition: gprs_ns.h:236
@ S_NS_RESET
Definition: gprs_ns.h:233
@ S_NS_BLOCK
Definition: gprs_ns.h:234
@ S_NS_REPLACED
Definition: gprs_ns.h:237
int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi)
Definition: gprs_ns_frgre.c:326
int gprs_ns_vty_init(struct gprs_ns_inst *nsi)
Definition: gprs_ns_vty.c:635
gprs_ns_evt
Osmoco NS events.
Definition: gprs_ns.h:60
@ GPRS_NS_EVT_UNIT_DATA
Definition: gprs_ns.h:61
#define NS_TIMERS_COUNT
Definition: gprs_ns.h:17
gprs_ns_ll
Osmocom NS link layer types.
Definition: gprs_ns.h:53
@ GPRS_NS_LL_FR_GRE
NS/FR/GRE/IP.
Definition: gprs_ns.h:56
@ GPRS_NS_LL_UDP
NS/UDP/IP.
Definition: gprs_ns.h:54
@ GPRS_NS_LL_E1
NS/E1.
Definition: gprs_ns.h:55
int gprs_ns_cb_t(enum gprs_ns_evt event, struct gprs_nsvc *nsvc, struct msgb *msg, uint16_t bvci)
Osmocom GPRS callback function type.
Definition: gprs_ns.h:75
ns_timeout
Definition: gprs_ns.h:33
@ NS_TOUT_TSNS_PROV
Definition: gprs_ns.h:41
@ NS_TOUT_TNS_BLOCK
Definition: gprs_ns.h:34
@ NS_TOUT_TNS_RESET
Definition: gprs_ns.h:36
@ NS_TOUT_TNS_BLOCK_RETRIES
Definition: gprs_ns.h:35
@ NS_TOUT_TNS_TEST
Definition: gprs_ns.h:38
@ NS_TOUT_TNS_ALIVE_RETRIES
Definition: gprs_ns.h:40
@ NS_TOUT_TNS_RESET_RETRIES
Definition: gprs_ns.h:37
@ NS_TOUT_TNS_ALIVE
Definition: gprs_ns.h:39
ns_cause
NS Cause (TS 08.16, Section 10.3.2, Table 13)
Definition: gsm_08_16.h:83
int gprs_ns_tx_unblock(struct gprs_nsvc *nsvc)
Transmit a NS-UNBLOCK on a given NS-VC.
Definition: gprs_ns.c:691
char * gprs_nsvc_state_append(char *s, struct gprs_nsvc *nsvc)
Append the nsvc state to a talloc string.
Definition: gprs_ns.c:2214
int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi)
Create a listening socket for GPRS NS/UDP/IP.
Definition: gprs_ns.c:2048
int gprs_ns_tx_reset(struct gprs_nsvc *nsvc, uint8_t cause)
Transmit a NS-RESET on a given NSVC.
Definition: gprs_ns.c:537
struct gprs_nsvc * gprs_nsvc_by_nsei(struct gprs_ns_inst *nsi, uint16_t nsei)
Lookup struct gprs_nsvc based on NSEI.
Definition: gprs_ns.c:254
struct gprs_nsvc * gprs_nsvc_create2(struct gprs_ns_inst *nsi, uint16_t nsvci, uint8_t sig_weight, uint8_t data_weight)
Create a new NS-VC (Virtual Circuit) within given instance.
Definition: gprs_ns.c:311
char * gprs_ns_ll_str_buf(char *buf, size_t buf_len, const struct gprs_nsvc *nsvc)
Definition: gprs_ns.c:1525
const char * gprs_ns_cause_str(enum ns_cause cause)
Obtain a human-readable string for NS cause value.
Definition: gprs_ns.c:445
void gprs_ns_ll_clear(struct gprs_nsvc *nsvc)
Definition: gprs_ns.c:1576
void gprs_nsvc_delete(struct gprs_nsvc *nsvc)
Delete given NS-VC.
Definition: gprs_ns.c:353
struct gprs_nsvc * gprs_nsvc_by_nsvci(struct gprs_ns_inst *nsi, uint16_t nsvci)
Lookup struct gprs_nsvc based on NSVCI.
Definition: gprs_ns.c:239
int gprs_nsvc_reset(struct gprs_nsvc *nsvc, uint8_t cause)
Initiate a RESET procedure.
Definition: gprs_ns.c:2103
const char * gprs_ns_ll_str(const struct gprs_nsvc *nsvc)
Definition: gprs_ns.c:1546
void gprs_ns_close(struct gprs_ns_inst *nsi)
Definition: gprs_ns.c:1922
void gprs_ns_set_log_ss(int ss)
Definition: gprs_ns.c:2201
int gprs_ns_tx_block(struct gprs_nsvc *nsvc, uint8_t cause)
Transmit a NS-BLOCK on a given NS-VC.
Definition: gprs_ns.c:626
struct gprs_nsvc * gprs_nsvc_by_rem_addr(struct gprs_ns_inst *nsi, const struct sockaddr_in *sin)
Lookup NS-VC based on specified remote peer socket addr.
Definition: gprs_ns.c:291
uint8_t data_weight
Definition: gsm_08_16.h:3
void gprs_ns_ll_copy(struct gprs_nsvc *nsvc, struct gprs_nsvc *other)
Definition: gprs_ns.c:1560
uint8_t sig_weight
Definition: gsm_08_16.h:2
int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg, struct sockaddr_in *saddr, enum gprs_ns_ll ll)
Receive incoming NS message from underlying transport layer.
Definition: gprs_ns.c:1494
struct gprs_ns_inst * gprs_ns_instantiate(gprs_ns_cb_t *cb, void *ctx)
Create a new GPRS NS instance.
Definition: gprs_ns.c:1882
int gprs_ns_tx_alive_ack(struct gprs_nsvc *nsvc)
Transmit a NS-ALIVE-ACK on a given NS-VC.
Definition: gprs_ns.c:720
struct gprs_nsvc * gprs_ns_nsip_connect(struct gprs_ns_inst *nsi, struct sockaddr_in *dest, uint16_t nsei, uint16_t nsvci)
Establish a NS connection (from the BSS) to the SGSN.
Definition: gprs_ns.c:2137
char * gprs_ns_ll_str_c(const void *ctx, const struct gprs_nsvc *nsvc)
Definition: gprs_ns.c:1552
int gprs_ns_tx_alive(struct gprs_nsvc *nsvc)
Transmit a NS-ALIVE on a given NS-VC.
Definition: gprs_ns.c:707
struct msgb * gprs_ns_msgb_alloc(void)
Definition: gprs_ns.c:206
struct gprs_nsvc * gprs_ns_nsip_connect_sns(struct gprs_ns_inst *nsi, struct sockaddr_in *dest, uint16_t nsei, uint16_t nsvci)
Establish a NS connection (from the BSS) to the SGSN using SNS auto-configuration.
Definition: gprs_ns.c:2168
const struct value_string gprs_ns_signal_ns_names[]
Definition: gprs_ns.c:182
int gprs_ns_sendmsg(struct gprs_ns_inst *nsi, struct msgb *msg)
High-level function for transmitting a NS-UNITDATA messsage.
Definition: gprs_ns.c:1079
void gprs_ns_destroy(struct gprs_ns_inst *nsi)
Destroy an entire NS instance.
Definition: gprs_ns.c:1946
event
GPRS Networks Service (NS) messages on the Gb interface.
An instance of the NS protocol stack.
Definition: gprs_ns.h:79
uint32_t local_ip
Definition: gprs_ns.h:95
struct llist_head gprs_nsvcs
linked lists of all NSVC in this instance
Definition: gprs_ns.h:84
gprs_ns_cb_t * cb
callback to the user for incoming UNIT DATA IND
Definition: gprs_ns.h:81
uint32_t remote_ip
Definition: gprs_ns.h:97
uint16_t timeout[NS_TIMERS_COUNT]
Definition: gprs_ns.h:90
int dscp
Definition: gprs_ns.h:99
uint16_t remote_port
Definition: gprs_ns.h:98
unsigned int enabled
Definition: gprs_ns.h:107
uint16_t local_port
Definition: gprs_ns.h:96
struct osmo_fsm_inst * bss_sns_fi
Definition: gprs_ns.h:110
struct gprs_ns_inst::@14 nsip
NS-over-IP specific bits.
struct gprs_nsvc * unknown_nsvc
a NSVC object that's needed to deal with packets for unknown NSVC
Definition: gprs_ns.h:88
struct gprs_ns_inst::@15 frgre
NS-over-FR-over-GRE-over-IP specific bits.
bool use_reset_block_unblock
IPA compatibility: NS-RESET/BLOCK/UNBLOCK even on IP-SNS.
Definition: gprs_ns.h:101
struct osmo_fd fd
Definition: gprs_ns.h:94
Structure representing a single NS-VC.
Definition: gprs_ns.h:122
unsigned int remote_end_is_sgsn
Definition: gprs_ns.h:139
struct osmo_stat_item_group * statg
Definition: gprs_ns.h:144
enum gprs_ns_ll ll
which link-layer are we based on?
Definition: gprs_ns.h:147
struct gprs_ns_inst * nsi
pointer to NS Instance
Definition: gprs_ns.h:126
struct osmo_timer_list timer
Definition: gprs_ns.h:134
struct sockaddr_in bts_addr
Definition: gprs_ns.h:153
int alive_retries
Definition: gprs_ns.h:137
struct timeval timer_started
Definition: gprs_ns.h:136
enum nsvc_timer_mode timer_mode
Definition: gprs_ns.h:135
uint32_t state
uniquely identifies NS-VC at SGSN
Definition: gprs_ns.h:131
uint16_t nsvci
end-to-end significance
Definition: gprs_ns.h:129
struct gprs_nsvc::@16::@19 frgre
unsigned int persistent
Definition: gprs_ns.h:140
uint32_t remote_state
Definition: gprs_ns.h:132
uint8_t sig_weight
signalling weight.
Definition: gprs_ns.h:160
struct llist_head list
list of NS-VCs within NS Instance
Definition: gprs_ns.h:124
unsigned int nsvci_is_valid
Definition: gprs_ns.h:141
struct gprs_nsvc::@16::@18 ip
uint8_t data_weight
signaling weight.
Definition: gprs_ns.h:162
uint16_t nsei
Definition: gprs_ns.h:128
struct rate_ctr_group * ctrg
Definition: gprs_ns.h:143
Definition: gprs_ns.h:245
uint8_t pdu_type
Definition: gprs_ns.h:249
uint8_t cause
Definition: gprs_ns.h:248
struct gprs_nsvc * old_nsvc
Definition: gprs_ns.h:247
uint8_t ie_type
Definition: gprs_ns.h:250
struct gprs_nsvc * nsvc
Definition: gprs_ns.h:246
struct msgb * msg
Definition: gprs_ns.h:251