libosmogb  1.4.0.160-7619
Osmocom Gb library
gprs_ns2.h
Go to the documentation of this file.
1 
4 #pragma once
5 
6 #include <stdint.h>
7 #include <netinet/in.h>
8 
9 #include <osmocom/core/prim.h>
10 
11 struct osmo_sockaddr;
12 struct osmo_sockaddr_str;
13 
14 struct gprs_ns2_inst;
15 struct gprs_ns2_nse;
16 struct gprs_ns2_vc;
17 struct gprs_ns2_vc_bind;
18 struct gprs_ns2_vc_driver;
19 struct gprs_ns_ie_ip4_elem;
20 struct gprs_ns_ie_ip6_elem;
21 
30 };
31 
37 };
38 
45 };
46 
53  /* osmocom own causes */
56 };
57 
63 };
64 
66  struct osmo_prim_hdr oph;
67 
68  uint16_t nsei;
69  uint16_t bvci;
70 
71  union {
72  struct {
74  /* TODO: implement resource distribution
75  * add place holder for the link selector */
80  struct {
83  struct {
85  /* 48.016 5.2.2.6 transfer capability */
86  int transfer;
87  /* osmocom specific */
88  /* Persistent NSE/NSVC are configured by vty */
89  bool persistent;
90  /* Only true on the first time it's available.
91  * Allow the BSSGP layer to reset persistent NSE */
92  bool first;
93  } status;
94  } u;
95 };
96 
97 /* instance */
98 struct gprs_ns2_inst *gprs_ns2_instantiate(void *ctx, osmo_prim_cb cb, void *cb_data);
99 void gprs_ns2_free(struct gprs_ns2_inst *inst);
101 
102 /* Entrypoint for primitives from the NS USER */
103 int gprs_ns2_recv_prim(struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph);
104 
106 typedef int (*gprs_ns2_foreach_nsvc_cb)(struct gprs_ns2_vc *nsvc, void *ctx);
107 
109  gprs_ns2_foreach_nsvc_cb cb, void *cb_data);
110 struct gprs_ns2_nse *gprs_ns2_nse_by_nsei(struct gprs_ns2_inst *nsi, uint16_t nsei);
111 struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei);
112 uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse);
113 void gprs_ns2_free_nse(struct gprs_ns2_nse *nse);
114 void gprs_ns2_free_nses(struct gprs_ns2_inst *nsi);
115 
116 /* create vc */
117 void gprs_ns2_free_nsvc(struct gprs_ns2_vc *nsvc);
118 struct gprs_ns2_vc *gprs_ns2_nsvc_by_nsvci(struct gprs_ns2_inst *nsi, uint16_t nsvci);
119 
120 /* IP VL driver */
121 int gprs_ns2_ip_bind(struct gprs_ns2_inst *nsi,
122  const struct osmo_sockaddr *local,
123  int dscp,
124  struct gprs_ns2_vc_bind **result);
126  const struct osmo_sockaddr *sockaddr);
127 void gprs_ns2_bind_set_mode(struct gprs_ns2_vc_bind *bind, enum gprs_ns2_vc_mode mode);
128 
129 /* create a VC connection */
131  const struct osmo_sockaddr *remote,
132  struct gprs_ns2_nse *nse,
133  uint16_t nsvci);
134 
136  const struct osmo_sockaddr *remote,
137  uint16_t nsei,
138  uint16_t nsvci);
140  const struct osmo_sockaddr *remote,
141  struct gprs_ns2_nse *nse,
142  uint16_t nsvci);
143 
145 void gprs_ns2_free_binds(struct gprs_ns2_inst *nsi);
146 
147 /* create a VC SNS connection */
149  const struct osmo_sockaddr *remote,
150  uint16_t nsei);
151 const struct osmo_sockaddr *gprs_ns2_nse_sns_remote(struct gprs_ns2_nse *nse);
152 
153 const struct osmo_sockaddr *gprs_ns2_ip_vc_remote(const struct gprs_ns2_vc *nsvc);
154 const struct osmo_sockaddr *gprs_ns2_ip_vc_local(const struct gprs_ns2_vc *nsvc);
155 bool gprs_ns2_ip_vc_equal(const struct gprs_ns2_vc *nsvc,
156  const struct osmo_sockaddr *local,
157  const struct osmo_sockaddr *remote,
158  uint16_t nsvci);
159 const struct osmo_sockaddr *gprs_ns2_ip_bind_sockaddr(struct gprs_ns2_vc_bind *bind);
160 int gprs_ns2_is_ip_bind(struct gprs_ns2_vc_bind *bind);
161 int gprs_ns2_ip_bind_set_dscp(struct gprs_ns2_vc_bind *bind, int dscp);
163  struct gprs_ns2_vc_bind *bind,
164  const struct osmo_sockaddr *saddr);
165 
166 int gprs_ns2_frgre_bind(struct gprs_ns2_inst *nsi,
167  const struct osmo_sockaddr *local,
168  int dscp,
169  struct gprs_ns2_vc_bind **result);
171 
173  struct gprs_ns2_nse *nse,
174  const struct osmo_sockaddr *sockaddr);
176 const char *gprs_ns2_cause_str(int cause);
177 const char *gprs_ns2_ll_str(struct gprs_ns2_vc *nsvc);
178 char *gprs_ns2_ll_str_buf(char *buf, size_t buf_len, struct gprs_ns2_vc *nsvc);
179 char *gprs_ns2_ll_str_c(const void *ctx, struct gprs_ns2_vc *nsvc);
180 
181 /* vty */
182 int gprs_ns2_vty_init(struct gprs_ns2_inst *nsi,
183  const struct osmo_sockaddr_str *default_bind);
184 int gprs_ns2_vty_create();
185 void gprs_ns2_vty_force_vc_mode(bool force, enum gprs_ns2_vc_mode mode, const char *reason);
186 
187 
uint16_t nsei
Identifiers of a BTS, equal to 'struct bssgp_bts_ctx'.
Definition: gprs_msgb.h:7
int gprs_ns2_is_frgre_bind(struct gprs_ns2_vc_bind *bind)
determine if given bind is for FR-GRE encapsulation.
Definition: gprs_ns2_frgre.c:529
int gprs_ns2_is_ip_bind(struct gprs_ns2_vc_bind *bind)
Is the given bind an IP bind?
Definition: gprs_ns2_udp.c:473
int gprs_ns2_vty_create()
gprs_ns2_vty_create parse the vty tree into ns nodes It has to be in different steps to ensure the bi...
Definition: gprs_ns2_vty.c:763
struct gprs_ns2_vc * gprs_ns2_nsvc_by_sockaddr_bind(struct gprs_ns2_vc_bind *bind, const struct osmo_sockaddr *saddr)
Find a NS-VC by its remote socket address.
Definition: gprs_ns2_udp.c:113
int gprs_ns2_ip_bind(struct gprs_ns2_inst *nsi, const struct osmo_sockaddr *local, int dscp, struct gprs_ns2_vc_bind **result)
Bind to an IPv4/IPv6 address.
Definition: gprs_ns2_udp.c:300
gprs_ns2_vc_mode
Definition: gprs_ns2.h:22
@ NS2_VC_MODE_ALIVE
The VC will only use ALIVE/ACK (no RESET/BLOCK/UNBLOCK), which is for Gb-IP interface compliant to 3G...
Definition: gprs_ns2.h:29
@ NS2_VC_MODE_BLOCKRESET
The VC will use RESET/BLOCK/UNBLOCK to start the connection and do ALIVE/ACK.
Definition: gprs_ns2.h:26
int(* gprs_ns2_foreach_nsvc_cb)(struct gprs_ns2_vc *nsvc, void *ctx)
a callback to iterate over all NSVC
Definition: gprs_ns2.h:106
const struct osmo_sockaddr * gprs_ns2_ip_vc_remote(const struct gprs_ns2_vc *nsvc)
Return the socket address of the remote peer of a NS-VC.
Definition: gprs_ns2_udp.c:416
void gprs_ns2_vty_force_vc_mode(bool force, enum gprs_ns2_vc_mode mode, const char *reason)
ns2_vty_force_vc_mode force a mode and prevents the vty from overwriting it.
Definition: gprs_ns2_vty.c:845
const struct osmo_sockaddr * gprs_ns2_ip_bind_sockaddr(struct gprs_ns2_vc_bind *bind)
Return the locally bound socket address of the bind.
Definition: gprs_ns2_udp.c:464
gprs_ns2_prim
Osmocom NS primitives according to 48.016 5.2 Service primitves.
Definition: gprs_ns2.h:33
@ PRIM_NS_STATUS
Definition: gprs_ns2.h:36
@ PRIM_NS_UNIT_DATA
Definition: gprs_ns2.h:34
@ PRIM_NS_CONGESTION
Definition: gprs_ns2.h:35
int gprs_ns2_frgre_bind(struct gprs_ns2_inst *nsi, const struct osmo_sockaddr *local, int dscp, struct gprs_ns2_vc_bind **result)
Create a new bind for NS over FR-GRE.
Definition: gprs_ns2_frgre.c:540
gprs_ns2_congestion_cause
Osmocom NS primitives according to 48.016 5.2.2.4 Service primitves.
Definition: gprs_ns2.h:40
@ NS_CONG_CAUSE_BACKWARD_END
Definition: gprs_ns2.h:42
@ NS_CONG_CAUSE_FORWARD_BEGIN
Definition: gprs_ns2.h:43
@ NS_CONG_CAUSE_FORWARD_END
Definition: gprs_ns2.h:44
@ NS_CONG_CAUSE_BACKWARD_BEGIN
Definition: gprs_ns2.h:41
gprs_ns2_affecting_cause
Osmocom NS primitives according to 48.016 5.2.2.6 Service primitves.
Definition: gprs_ns2.h:48
@ NS_AFF_CAUSE_SNS_CONFIGURED
Definition: gprs_ns2.h:54
@ NS_AFF_CAUSE_RECOVERY
Definition: gprs_ns2.h:52
@ NS_AFF_CAUSE_SNS_FAILURE
Definition: gprs_ns2.h:55
@ NS_AFF_CAUSE_VC_FAILURE
Definition: gprs_ns2.h:49
@ NS_AFF_CAUSE_VC_RECOVERY
Definition: gprs_ns2.h:50
@ NS_AFF_CAUSE_FAILURE
Definition: gprs_ns2.h:51
struct gprs_ns2_vc_bind * gprs_ns2_ip_bind_by_sockaddr(struct gprs_ns2_inst *nsi, const struct osmo_sockaddr *sockaddr)
Find NS bind for a given socket address.
Definition: gprs_ns2_udp.c:273
int gprs_ns2_ip_bind_set_dscp(struct gprs_ns2_vc_bind *bind, int dscp)
Set the DSCP (TOS) bit value of the given bind.
Definition: gprs_ns2_udp.c:479
gprs_ns2_change_ip_endpoint
Osmocom NS primitives according to 48.016 5.2.2.7 Service primitves.
Definition: gprs_ns2.h:59
@ NS_ENDPOINT_REQUEST_CHANGE
Definition: gprs_ns2.h:61
@ NS_ENDPOINT_NO_CHANGE
Definition: gprs_ns2.h:60
@ NS_ENDPOINT_CONFIRM_CHANGE
Definition: gprs_ns2.h:62
bool gprs_ns2_ip_vc_equal(const struct gprs_ns2_vc *nsvc, const struct osmo_sockaddr *local, const struct osmo_sockaddr *remote, uint16_t nsvci)
Compare the NS-VC with the given parameter.
Definition: gprs_ns2_udp.c:434
const struct osmo_sockaddr * gprs_ns2_ip_vc_local(const struct gprs_ns2_vc *nsvc)
Return the socket address of the local peer of a NS-VC.
Definition: gprs_ns2_udp.c:399
const struct osmo_sockaddr * gprs_ns2_nse_sns_remote(struct gprs_ns2_nse *nse)
Return the initial SNS remote socket address.
Definition: gprs_ns2_sns.c:201
int gprs_ns2_vty_init(struct gprs_ns2_inst *nsi, const struct osmo_sockaddr_str *default_bind)
gprs_ns2_vty_init initialize the vty
Definition: gprs_ns2_vty.c:710
void gprs_ns2_free_binds(struct gprs_ns2_inst *nsi)
Definition: gprs_ns2.c:1089
void gprs_ns2_free(struct gprs_ns2_inst *inst)
Destroy a NS Instance (including all its NSEs, binds, ...).
Definition: gprs_ns2.c:1024
const char * gprs_ns2_cause_str(int cause)
Obtain a human-readable string for NS cause value.
Definition: gprs_ns2.c:164
void gprs_ns2_start_alive_all_nsvcs(struct gprs_ns2_nse *nse)
Start the NS-ALIVE FSM in all NS-VCs of given NSE.
Definition: gprs_ns2.c:1049
const char * gprs_ns2_ll_str(struct gprs_ns2_vc *nsvc)
string-format a given NS-VC to a thread-local static buffer.
Definition: gprs_ns2.c:267
struct gprs_ns2_nse * gprs_ns2_nse_by_nsei(struct gprs_ns2_inst *nsi, uint16_t nsei)
Resolve a NS Entity based on its NSEI.
Definition: gprs_ns2.c:513
struct gprs_ns2_inst * gprs_ns2_instantiate(void *ctx, osmo_prim_cb cb, void *cb_data)
Create a new GPRS NS instance.
Definition: gprs_ns2.c:997
void gprs_ns2_bind_set_mode(struct gprs_ns2_vc_bind *bind, enum gprs_ns2_vc_mode mode)
Set the mode of given bind.
Definition: gprs_ns2.c:1065
struct gprs_ns2_nse * gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei)
Create a NS Entity within given NS instance.
Definition: gprs_ns2.c:548
void gprs_ns2_free_bind(struct gprs_ns2_vc_bind *bind)
Destroy a given bind.
Definition: gprs_ns2.c:1072
int gprs_ns2_nse_foreach_nsvc(struct gprs_ns2_nse *nse, gprs_ns2_foreach_nsvc_cb cb, void *cb_data)
Iterate over all nsvc of a NS Entity and call the callback.
Definition: gprs_ns2.c:867
int gprs_ns2_recv_prim(struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph)
Receive a primitive from the NS User (Gb).
Definition: gprs_ns2.c:289
struct gprs_ns2_vc * gprs_ns2_nsvc_by_sockaddr_nse(struct gprs_ns2_nse *nse, const struct osmo_sockaddr *sockaddr)
Find NS-VC for given socket address.
Definition: gprs_ns2.c:841
int gprs_ns2_ip_connect_sns(struct gprs_ns2_vc_bind *bind, const struct osmo_sockaddr *remote, uint16_t nsei)
Create, connect and activate a new IP-SNS NSE.
Definition: gprs_ns2.c:811
struct gprs_ns2_vc * gprs_ns2_ip_connect2(struct gprs_ns2_vc_bind *bind, const struct osmo_sockaddr *remote, uint16_t nsei, uint16_t nsvci)
Create, connect and activate a new IP-based NS-VC.
Definition: gprs_ns2.c:790
void gprs_ns2_free_nse(struct gprs_ns2_nse *nse)
Destroy given NS Entity.
Definition: gprs_ns2.c:582
uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse)
Return the NSEI.
Definition: gprs_ns2.c:575
char * gprs_ns2_ll_str_buf(char *buf, size_t buf_len, struct gprs_ns2_vc *nsvc)
string-format a given NS-VC into a user-supplied buffer.
Definition: gprs_ns2.c:211
int gprs_ns2_dynamic_create_nse(struct gprs_ns2_inst *nsi, bool create_nse)
Configure whether a NS Instance should dynamically create NSEs based on incoming traffic.
Definition: gprs_ns2.c:1040
void gprs_ns2_free_nses(struct gprs_ns2_inst *nsi)
Definition: gprs_ns2.c:601
struct gprs_ns2_vc * gprs_ns2_ip_connect_inactive(struct gprs_ns2_vc_bind *bind, const struct osmo_sockaddr *remote, struct gprs_ns2_nse *nse, uint16_t nsvci)
Create, and connect an inactive, new IP-based NS-VC.
Definition: gprs_ns2.c:744
struct gprs_ns2_vc * gprs_ns2_ip_connect(struct gprs_ns2_vc_bind *bind, const struct osmo_sockaddr *remote, struct gprs_ns2_nse *nse, uint16_t nsvci)
Create, connect and activate a new IP-based NS-VC.
Definition: gprs_ns2.c:769
struct gprs_ns2_vc * gprs_ns2_nsvc_by_nsvci(struct gprs_ns2_inst *nsi, uint16_t nsvci)
Resolve a NS-VC Entity based on its NS-VCI.
Definition: gprs_ns2.c:529
char * gprs_ns2_ll_str_c(const void *ctx, struct gprs_ns2_vc *nsvc)
string-format a given NS-VC to a dynamically allocated string.
Definition: gprs_ns2.c:277
void gprs_ns2_free_nsvc(struct gprs_ns2_vc *nsvc)
Destroy/release given NS-VC.
Definition: gprs_ns2.c:410
int(* osmo_prim_cb)(struct osmo_prim_hdr *oph, void *ctx)
An instance of the NS protocol stack.
Definition: gprs_ns2_internal.h:85
bool create_nse
create dynamic NSE on receiving packages
Definition: gprs_ns2_internal.h:99
void * cb_data
callback data
Definition: gprs_ns2_internal.h:90
osmo_prim_cb cb
callback to the user for incoming UNIT DATA IND
Definition: gprs_ns2_internal.h:87
Structure repesenting a NSE.
Definition: gprs_ns2_internal.h:108
struct gprs_ns2_inst * nsi
entry back to ns2_inst
Definition: gprs_ns2_internal.h:112
struct llist_head nsvc
llist head to hold all nsvc
Definition: gprs_ns2_internal.h:118
Structure repesenting a bind instance.
Definition: gprs_ns2_internal.h:176
struct gprs_ns2_inst * nsi
a pointer back to the nsi
Definition: gprs_ns2_internal.h:184
Definition: gprs_ns2_internal.h:201
Structure representing a single NS-VC.
Definition: gprs_ns2_internal.h:134
struct gprs_ns2_vc_bind * bind
pointer to NS VL bind.
Definition: gprs_ns2_internal.h:145
struct gprs_ns2_nse * nse
pointer to NS Instance
Definition: gprs_ns2_internal.h:142
enum gprs_ns2_vc_mode mode
Definition: gprs_ns2_internal.h:170
uint16_t nsvci
uniquely identifies NS-VC if VC contains nsvci
Definition: gprs_ns2_internal.h:151
Section 10.3.2c List of IP4 Elements.
Definition: gsm_08_16.h:24
Section 10.3.2d List of IP6 Elements.
Definition: gsm_08_16.h:32
Definition: gprs_ns2.h:65
int transfer
Definition: gprs_ns2.h:86
bool persistent
Definition: gprs_ns2.h:89
struct osmo_gprs_ns2_prim::@8::@9 unitdata
bool first
Definition: gprs_ns2.h:92
enum gprs_ns2_change_ip_endpoint change
Definition: gprs_ns2.h:73
uint16_t nsei
Definition: gprs_ns2.h:68
union osmo_gprs_ns2_prim::@8 u
enum gprs_ns2_congestion_cause cause
Definition: gprs_ns2.h:81
long long _resource_distribution_placeholder1
Definition: gprs_ns2.h:76
struct osmo_gprs_ns2_prim::@8::@10 congestion
struct osmo_prim_hdr oph
Definition: gprs_ns2.h:66
long long _resource_distribution_placeholder2
Definition: gprs_ns2.h:77
uint16_t bvci
Definition: gprs_ns2.h:69
struct osmo_gprs_ns2_prim::@8::@11 status
long long _resource_distribution_placeholder3
Definition: gprs_ns2.h:78