Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 1 | /*! \file gprs_ns2.h */ |
| 2 | |
| 3 | |
| 4 | #pragma once |
| 5 | |
| 6 | #include <stdint.h> |
| 7 | #include <netinet/in.h> |
| 8 | |
| 9 | #include <osmocom/core/prim.h> |
Alexander Couzens | b3b837c | 2020-10-27 15:12:25 +0100 | [diff] [blame] | 10 | #include <osmocom/gprs/protocol/gsm_08_16.h> |
Alexander Couzens | 841817e | 2020-11-19 00:41:29 +0100 | [diff] [blame] | 11 | #include <osmocom/gprs/frame_relay.h> |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 12 | |
| 13 | struct osmo_sockaddr; |
Alexander Couzens | 1fac6f7 | 2020-10-01 19:08:38 +0200 | [diff] [blame] | 14 | struct osmo_sockaddr_str; |
Alexander Couzens | 841817e | 2020-11-19 00:41:29 +0100 | [diff] [blame] | 15 | struct osmo_fr_network; |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 16 | |
| 17 | struct gprs_ns2_inst; |
| 18 | struct gprs_ns2_nse; |
| 19 | struct gprs_ns2_vc; |
| 20 | struct gprs_ns2_vc_bind; |
| 21 | struct gprs_ns2_vc_driver; |
| 22 | struct gprs_ns_ie_ip4_elem; |
| 23 | struct gprs_ns_ie_ip6_elem; |
| 24 | |
| 25 | enum gprs_ns2_vc_mode { |
Harald Welte | fa2d66c | 2020-10-17 13:09:34 +0200 | [diff] [blame] | 26 | /*! The VC will use RESET/BLOCK/UNBLOCK to start the connection and do ALIVE/ACK. |
| 27 | * This is what is needed for Frame Relay transport, and if you use a R97/R99 Gb |
| 28 | * interface over an IP transport (never standardized by 3GPP) */ |
Alexander Couzens | 138b96f | 2021-01-25 16:23:29 +0100 | [diff] [blame] | 29 | GPRS_NS2_VC_MODE_BLOCKRESET, |
Harald Welte | fa2d66c | 2020-10-17 13:09:34 +0200 | [diff] [blame] | 30 | /*! The VC will only use ALIVE/ACK (no RESET/BLOCK/UNBLOCK), which is for Gb-IP |
| 31 | * interface compliant to 3GPP Rel=4 or later. */ |
Alexander Couzens | 138b96f | 2021-01-25 16:23:29 +0100 | [diff] [blame] | 32 | GPRS_NS2_VC_MODE_ALIVE, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 33 | }; |
| 34 | |
Alexander Couzens | d923cff | 2020-12-01 01:03:52 +0100 | [diff] [blame] | 35 | enum gprs_ns2_dialect { |
Alexander Couzens | 138b96f | 2021-01-25 16:23:29 +0100 | [diff] [blame] | 36 | GPRS_NS2_DIALECT_UNDEF, |
| 37 | GPRS_NS2_DIALECT_STATIC_ALIVE, |
| 38 | GPRS_NS2_DIALECT_STATIC_RESETBLOCK, |
| 39 | GPRS_NS2_DIALECT_IPACCESS, |
| 40 | GPRS_NS2_DIALECT_SNS, |
Alexander Couzens | d923cff | 2020-12-01 01:03:52 +0100 | [diff] [blame] | 41 | }; |
| 42 | |
Alexander Couzens | 24a14ac | 2020-11-19 02:34:49 +0100 | [diff] [blame] | 43 | /*! Osmocom NS link layer types */ |
| 44 | enum gprs_ns2_ll { |
Alexander Couzens | 412bc34 | 2020-11-19 05:24:37 +0100 | [diff] [blame] | 45 | GPRS_NS2_LL_UNDEF, /*!< undefined, used by vty */ |
Alexander Couzens | 24a14ac | 2020-11-19 02:34:49 +0100 | [diff] [blame] | 46 | GPRS_NS2_LL_UDP, /*!< NS/UDP/IP */ |
Alexander Couzens | 24a14ac | 2020-11-19 02:34:49 +0100 | [diff] [blame] | 47 | GPRS_NS2_LL_FR, /*!< NS/FR */ |
| 48 | GPRS_NS2_LL_FR_GRE, /*!< NS/FR/GRE/IP */ |
| 49 | }; |
| 50 | |
Harald Welte | a3f7323 | 2021-01-31 15:57:22 +0100 | [diff] [blame] | 51 | /*! Osmocom NS primitives according to 48.016 5.2 Service primitives */ |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 52 | enum gprs_ns2_prim { |
Alexander Couzens | 138b96f | 2021-01-25 16:23:29 +0100 | [diff] [blame] | 53 | GPRS_NS2_PRIM_UNIT_DATA, |
| 54 | GPRS_NS2_PRIM_CONGESTION, |
| 55 | GPRS_NS2_PRIM_STATUS, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 56 | }; |
| 57 | |
Alexander Couzens | 0ab028c | 2020-11-04 02:41:44 +0100 | [diff] [blame] | 58 | extern const struct value_string gprs_ns2_prim_strs[]; |
Harald Welte | a24e7ee | 2020-11-29 17:38:48 +0100 | [diff] [blame] | 59 | extern const struct value_string gprs_ns2_lltype_strs[]; |
Alexander Couzens | 2498f1d | 2020-10-27 01:09:01 +0100 | [diff] [blame] | 60 | |
| 61 | /*! Obtain a human-readable string for NS primitives */ |
| 62 | static inline const char *gprs_ns2_prim_str(enum gprs_ns2_prim val) |
Alexander Couzens | 0ab028c | 2020-11-04 02:41:44 +0100 | [diff] [blame] | 63 | { return get_value_string(gprs_ns2_prim_strs, val); } |
Alexander Couzens | 2498f1d | 2020-10-27 01:09:01 +0100 | [diff] [blame] | 64 | |
Harald Welte | a24e7ee | 2020-11-29 17:38:48 +0100 | [diff] [blame] | 65 | /*! Obtain a human-readable string for NS link-layer type */ |
| 66 | static inline const char *gprs_ns2_lltype_str(enum gprs_ns2_ll val) |
| 67 | { return get_value_string(gprs_ns2_lltype_strs, val); } |
| 68 | |
Harald Welte | a3f7323 | 2021-01-31 15:57:22 +0100 | [diff] [blame] | 69 | /*! Osmocom NS primitives according to 48.016 5.2.2.4 Service primitives */ |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 70 | enum gprs_ns2_congestion_cause { |
Alexander Couzens | 138b96f | 2021-01-25 16:23:29 +0100 | [diff] [blame] | 71 | GPRS_NS2_CONG_CAUSE_BACKWARD_BEGIN, |
| 72 | GPRS_NS2_CONG_CAUSE_BACKWARD_END, |
| 73 | GPRS_NS2_CONG_CAUSE_FORWARD_BEGIN, |
| 74 | GPRS_NS2_CONG_CAUSE_FORWARD_END, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 75 | }; |
| 76 | |
Harald Welte | a3f7323 | 2021-01-31 15:57:22 +0100 | [diff] [blame] | 77 | /*! Osmocom NS primitives according to 48.016 5.2.2.6 Service primitives */ |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 78 | enum gprs_ns2_affecting_cause { |
Alexander Couzens | 138b96f | 2021-01-25 16:23:29 +0100 | [diff] [blame] | 79 | GPRS_NS2_AFF_CAUSE_VC_FAILURE, |
| 80 | GPRS_NS2_AFF_CAUSE_VC_RECOVERY, |
| 81 | GPRS_NS2_AFF_CAUSE_FAILURE, |
| 82 | GPRS_NS2_AFF_CAUSE_RECOVERY, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 83 | /* osmocom own causes */ |
Alexander Couzens | 138b96f | 2021-01-25 16:23:29 +0100 | [diff] [blame] | 84 | GPRS_NS2_AFF_CAUSE_SNS_CONFIGURED, |
| 85 | GPRS_NS2_AFF_CAUSE_SNS_FAILURE, |
| 86 | GPRS_NS2_AFF_CAUSE_SNS_NO_ENDPOINTS, |
Alexander Couzens | 4f1128f | 2021-01-20 17:42:48 +0100 | [diff] [blame] | 87 | GPRS_NS2_AFF_CAUSE_MTU_CHANGE, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 88 | }; |
| 89 | |
Alexander Couzens | 2498f1d | 2020-10-27 01:09:01 +0100 | [diff] [blame] | 90 | extern const struct value_string gprs_ns2_aff_cause_prim_strs[]; |
| 91 | |
Harald Welte | a3f7323 | 2021-01-31 15:57:22 +0100 | [diff] [blame] | 92 | /*! Obtain a human-readable string for NS affecting cause in primitives */ |
Alexander Couzens | 2498f1d | 2020-10-27 01:09:01 +0100 | [diff] [blame] | 93 | static inline const char *gprs_ns2_aff_cause_prim_str(enum gprs_ns2_affecting_cause val) |
| 94 | { return get_value_string(gprs_ns2_aff_cause_prim_strs, val); } |
| 95 | |
Harald Welte | a3f7323 | 2021-01-31 15:57:22 +0100 | [diff] [blame] | 96 | /*! Osmocom NS primitives according to 48.016 5.2.2.7 Service primitives */ |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 97 | enum gprs_ns2_change_ip_endpoint { |
Alexander Couzens | 138b96f | 2021-01-25 16:23:29 +0100 | [diff] [blame] | 98 | GRPS_NS2_ENDPOINT_NO_CHANGE, |
| 99 | GPRS_NS2_ENDPOINT_REQUEST_CHANGE, |
| 100 | GPRS_NS2_ENDPOINT_CONFIRM_CHANGE, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 101 | }; |
| 102 | |
Alexander Couzens | b3b837c | 2020-10-27 15:12:25 +0100 | [diff] [blame] | 103 | extern const struct value_string gprs_ns2_cause_strs[]; |
| 104 | |
| 105 | /*! Obtain a human-readable string for NS primitives */ |
| 106 | static inline const char *gprs_ns2_cause_str(enum ns_cause val) |
| 107 | { return get_value_string(gprs_ns2_cause_strs, val); } |
| 108 | |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 109 | struct osmo_gprs_ns2_prim { |
| 110 | struct osmo_prim_hdr oph; |
| 111 | |
| 112 | uint16_t nsei; |
| 113 | uint16_t bvci; |
| 114 | |
| 115 | union { |
| 116 | struct { |
| 117 | enum gprs_ns2_change_ip_endpoint change; |
Alexander Couzens | fc3dd1f | 2020-11-19 00:41:47 +0100 | [diff] [blame] | 118 | uint32_t link_selector; |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 119 | /* TODO: implement resource distribution |
| 120 | * add place holder for the link selector */ |
| 121 | long long _resource_distribution_placeholder1; |
| 122 | long long _resource_distribution_placeholder2; |
| 123 | long long _resource_distribution_placeholder3; |
| 124 | } unitdata; |
| 125 | struct { |
| 126 | enum gprs_ns2_congestion_cause cause; |
| 127 | } congestion; |
| 128 | struct { |
| 129 | enum gprs_ns2_affecting_cause cause; |
Daniel Willmann | 15c09a8 | 2020-11-03 23:05:43 +0100 | [diff] [blame] | 130 | char *nsvc; |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 131 | /* 48.016 5.2.2.6 transfer capability */ |
| 132 | int transfer; |
Alexander Couzens | da0a285 | 2020-10-01 23:24:07 +0200 | [diff] [blame] | 133 | /* osmocom specific */ |
| 134 | /* Persistent NSE/NSVC are configured by vty */ |
| 135 | bool persistent; |
| 136 | /* Only true on the first time it's available. |
| 137 | * Allow the BSSGP layer to reset persistent NSE */ |
| 138 | bool first; |
Alexander Couzens | 4f1128f | 2021-01-20 17:42:48 +0100 | [diff] [blame] | 139 | /* MTU of a NS SDU. It's the lowest MTU of all (alive & dead) NSVCs */ |
| 140 | uint16_t mtu; |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 141 | } status; |
| 142 | } u; |
| 143 | }; |
| 144 | |
| 145 | /* instance */ |
| 146 | struct gprs_ns2_inst *gprs_ns2_instantiate(void *ctx, osmo_prim_cb cb, void *cb_data); |
| 147 | void gprs_ns2_free(struct gprs_ns2_inst *inst); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 148 | |
| 149 | /* Entrypoint for primitives from the NS USER */ |
| 150 | int gprs_ns2_recv_prim(struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph); |
| 151 | |
Alexander Couzens | 6cb5d5f | 2020-10-11 23:23:31 +0200 | [diff] [blame] | 152 | /*! a callback to iterate over all NSVC */ |
| 153 | typedef int (*gprs_ns2_foreach_nsvc_cb)(struct gprs_ns2_vc *nsvc, void *ctx); |
| 154 | |
| 155 | int gprs_ns2_nse_foreach_nsvc(struct gprs_ns2_nse *nse, |
| 156 | gprs_ns2_foreach_nsvc_cb cb, void *cb_data); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 157 | struct gprs_ns2_nse *gprs_ns2_nse_by_nsei(struct gprs_ns2_inst *nsi, uint16_t nsei); |
Alexander Couzens | aac9016 | 2020-11-19 02:44:04 +0100 | [diff] [blame] | 158 | struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei, |
Alexander Couzens | d923cff | 2020-12-01 01:03:52 +0100 | [diff] [blame] | 159 | enum gprs_ns2_ll linklayer, |
| 160 | enum gprs_ns2_dialect dialect); |
Harald Welte | 5b034fb | 2021-03-04 14:16:49 +0100 | [diff] [blame] | 161 | struct gprs_ns2_nse *gprs_ns2_create_nse2(struct gprs_ns2_inst *nsi, uint16_t nsei, |
| 162 | enum gprs_ns2_ll linklayer, |
| 163 | enum gprs_ns2_dialect dialect, bool local_sgsn_role); |
Alexander Couzens | 05e7f7d | 2020-10-11 19:51:46 +0200 | [diff] [blame] | 164 | uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 165 | void gprs_ns2_free_nse(struct gprs_ns2_nse *nse); |
Alexander Couzens | 4b6c8af | 2020-10-11 20:15:25 +0200 | [diff] [blame] | 166 | void gprs_ns2_free_nses(struct gprs_ns2_inst *nsi); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 167 | |
| 168 | /* create vc */ |
| 169 | void gprs_ns2_free_nsvc(struct gprs_ns2_vc *nsvc); |
Alexander Couzens | 4755879 | 2020-12-06 03:16:11 +0100 | [diff] [blame] | 170 | void gprs_ns2_free_nsvcs(struct gprs_ns2_nse *nse); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 171 | struct gprs_ns2_vc *gprs_ns2_nsvc_by_nsvci(struct gprs_ns2_inst *nsi, uint16_t nsvci); |
| 172 | |
Alexander Couzens | aaa55a6 | 2020-12-03 06:02:03 +0100 | [diff] [blame] | 173 | /* generic VL driver */ |
| 174 | struct gprs_ns2_vc_bind *gprs_ns2_bind_by_name(struct gprs_ns2_inst *nsi, |
| 175 | const char *name); |
| 176 | |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 177 | /* IP VL driver */ |
| 178 | int gprs_ns2_ip_bind(struct gprs_ns2_inst *nsi, |
Alexander Couzens | aaa55a6 | 2020-12-03 06:02:03 +0100 | [diff] [blame] | 179 | const char *name, |
Vadim Yanitskiy | a07f25e | 2020-10-09 21:47:01 +0700 | [diff] [blame] | 180 | const struct osmo_sockaddr *local, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 181 | int dscp, |
| 182 | struct gprs_ns2_vc_bind **result); |
Alexander Couzens | 4f60845 | 2020-10-11 18:41:24 +0200 | [diff] [blame] | 183 | struct gprs_ns2_vc_bind *gprs_ns2_ip_bind_by_sockaddr(struct gprs_ns2_inst *nsi, |
| 184 | const struct osmo_sockaddr *sockaddr); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 185 | |
Alexander Couzens | 841817e | 2020-11-19 00:41:29 +0100 | [diff] [blame] | 186 | /* FR VL driver */ |
| 187 | struct gprs_ns2_vc_bind *gprs_ns2_fr_bind_by_netif( |
| 188 | struct gprs_ns2_inst *nsi, |
| 189 | const char *netif); |
| 190 | const char *gprs_ns2_fr_bind_netif(struct gprs_ns2_vc_bind *bind); |
Alexander Couzens | c782cec | 2020-12-10 04:10:25 +0100 | [diff] [blame] | 191 | enum osmo_fr_role gprs_ns2_fr_bind_role(struct gprs_ns2_vc_bind *bind); |
Alexander Couzens | 841817e | 2020-11-19 00:41:29 +0100 | [diff] [blame] | 192 | int gprs_ns2_fr_bind(struct gprs_ns2_inst *nsi, |
Alexander Couzens | aaa55a6 | 2020-12-03 06:02:03 +0100 | [diff] [blame] | 193 | const char *name, |
Alexander Couzens | 841817e | 2020-11-19 00:41:29 +0100 | [diff] [blame] | 194 | const char *netif, |
| 195 | struct osmo_fr_network *fr_network, |
| 196 | enum osmo_fr_role fr_role, |
| 197 | struct gprs_ns2_vc_bind **result); |
| 198 | int gprs_ns2_is_fr_bind(struct gprs_ns2_vc_bind *bind); |
| 199 | struct gprs_ns2_vc *gprs_ns2_fr_nsvc_by_dlci(struct gprs_ns2_vc_bind *bind, uint16_t dlci); |
| 200 | struct gprs_ns2_vc *gprs_ns2_fr_connect(struct gprs_ns2_vc_bind *bind, |
Alexander Couzens | ebcbd72 | 2020-12-03 06:11:39 +0100 | [diff] [blame] | 201 | struct gprs_ns2_nse *nse, |
| 202 | uint16_t nsvci, |
| 203 | uint16_t dlci); |
| 204 | struct gprs_ns2_vc *gprs_ns2_fr_connect2(struct gprs_ns2_vc_bind *bind, |
Alexander Couzens | 841817e | 2020-11-19 00:41:29 +0100 | [diff] [blame] | 205 | uint16_t nsei, |
| 206 | uint16_t nsvci, |
| 207 | uint16_t dlci); |
| 208 | |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 209 | /* create a VC connection */ |
| 210 | struct gprs_ns2_vc *gprs_ns2_ip_connect(struct gprs_ns2_vc_bind *bind, |
Vadim Yanitskiy | a07f25e | 2020-10-09 21:47:01 +0700 | [diff] [blame] | 211 | const struct osmo_sockaddr *remote, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 212 | struct gprs_ns2_nse *nse, |
| 213 | uint16_t nsvci); |
| 214 | |
| 215 | struct gprs_ns2_vc *gprs_ns2_ip_connect2(struct gprs_ns2_vc_bind *bind, |
Vadim Yanitskiy | a07f25e | 2020-10-09 21:47:01 +0700 | [diff] [blame] | 216 | const struct osmo_sockaddr *remote, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 217 | uint16_t nsei, |
Alexander Couzens | d923cff | 2020-12-01 01:03:52 +0100 | [diff] [blame] | 218 | uint16_t nsvci, |
| 219 | enum gprs_ns2_dialect dialect); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 220 | struct gprs_ns2_vc *gprs_ns2_ip_connect_inactive(struct gprs_ns2_vc_bind *bind, |
Vadim Yanitskiy | a07f25e | 2020-10-09 21:47:01 +0700 | [diff] [blame] | 221 | const struct osmo_sockaddr *remote, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 222 | struct gprs_ns2_nse *nse, |
| 223 | uint16_t nsvci); |
Alexander Couzens | c470476 | 2021-02-08 23:13:12 +0100 | [diff] [blame] | 224 | void gprs_ns2_ip_bind_set_sns_weight(struct gprs_ns2_vc_bind *bind, |
| 225 | uint8_t signalling, uint8_t data); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 226 | |
| 227 | void gprs_ns2_free_bind(struct gprs_ns2_vc_bind *bind); |
Alexander Couzens | 896fcd5 | 2020-10-11 19:52:36 +0200 | [diff] [blame] | 228 | void gprs_ns2_free_binds(struct gprs_ns2_inst *nsi); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 229 | |
| 230 | /* create a VC SNS connection */ |
Alexander Couzens | e769f52 | 2020-12-07 07:37:07 +0100 | [diff] [blame] | 231 | int gprs_ns2_sns_count(struct gprs_ns2_nse *nse); |
| 232 | int gprs_ns2_sns_add_endpoint(struct gprs_ns2_nse *nse, |
| 233 | const struct osmo_sockaddr *saddr); |
| 234 | int gprs_ns2_sns_del_endpoint(struct gprs_ns2_nse *nse, |
| 235 | const struct osmo_sockaddr *saddr); |
Alexander Couzens | 6b9d232 | 2021-02-12 03:17:59 +0100 | [diff] [blame] | 236 | int gprs_ns2_sns_add_bind(struct gprs_ns2_nse *nse, struct gprs_ns2_vc_bind *bind); |
| 237 | int gprs_ns2_sns_del_bind(struct gprs_ns2_nse *nse, struct gprs_ns2_vc_bind *bind); |
Alexander Couzens | 125298f | 2020-10-11 21:22:42 +0200 | [diff] [blame] | 238 | const struct osmo_sockaddr *gprs_ns2_nse_sns_remote(struct gprs_ns2_nse *nse); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 239 | |
Alexander Couzens | d33512b | 2020-10-11 21:42:11 +0200 | [diff] [blame] | 240 | const struct osmo_sockaddr *gprs_ns2_ip_vc_remote(const struct gprs_ns2_vc *nsvc); |
Alexander Couzens | 979f5f5 | 2020-10-11 21:01:48 +0200 | [diff] [blame] | 241 | const struct osmo_sockaddr *gprs_ns2_ip_vc_local(const struct gprs_ns2_vc *nsvc); |
Alexander Couzens | d420ea9 | 2020-10-12 01:11:05 +0200 | [diff] [blame] | 242 | bool gprs_ns2_ip_vc_equal(const struct gprs_ns2_vc *nsvc, |
| 243 | const struct osmo_sockaddr *local, |
| 244 | const struct osmo_sockaddr *remote, |
| 245 | uint16_t nsvci); |
Alexander Couzens | 9a4cf27 | 2020-10-11 20:48:04 +0200 | [diff] [blame] | 246 | const struct osmo_sockaddr *gprs_ns2_ip_bind_sockaddr(struct gprs_ns2_vc_bind *bind); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 247 | int gprs_ns2_is_ip_bind(struct gprs_ns2_vc_bind *bind); |
| 248 | int gprs_ns2_ip_bind_set_dscp(struct gprs_ns2_vc_bind *bind, int dscp); |
Harald Welte | d99e4ee | 2021-04-28 19:57:12 +0200 | [diff] [blame] | 249 | int gprs_ns2_ip_bind_set_priority(struct gprs_ns2_vc_bind *bind, uint8_t priority); |
Alexander Couzens | 38b19e8 | 2020-09-23 23:56:37 +0200 | [diff] [blame] | 250 | struct gprs_ns2_vc *gprs_ns2_nsvc_by_sockaddr_bind( |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 251 | struct gprs_ns2_vc_bind *bind, |
Vadim Yanitskiy | a07f25e | 2020-10-09 21:47:01 +0700 | [diff] [blame] | 252 | const struct osmo_sockaddr *saddr); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 253 | |
| 254 | int gprs_ns2_frgre_bind(struct gprs_ns2_inst *nsi, |
Alexander Couzens | aaa55a6 | 2020-12-03 06:02:03 +0100 | [diff] [blame] | 255 | const char *name, |
Vadim Yanitskiy | a07f25e | 2020-10-09 21:47:01 +0700 | [diff] [blame] | 256 | const struct osmo_sockaddr *local, |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 257 | int dscp, |
| 258 | struct gprs_ns2_vc_bind **result); |
| 259 | int gprs_ns2_is_frgre_bind(struct gprs_ns2_vc_bind *bind); |
Alexander Couzens | 22c26e0 | 2020-12-10 04:10:07 +0100 | [diff] [blame] | 260 | uint16_t gprs_ns2_fr_nsvc_dlci(const struct gprs_ns2_vc *nsvc); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 261 | |
Alexander Couzens | 38b19e8 | 2020-09-23 23:56:37 +0200 | [diff] [blame] | 262 | struct gprs_ns2_vc *gprs_ns2_nsvc_by_sockaddr_nse( |
| 263 | struct gprs_ns2_nse *nse, |
Vadim Yanitskiy | a07f25e | 2020-10-09 21:47:01 +0700 | [diff] [blame] | 264 | const struct osmo_sockaddr *sockaddr); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 265 | void gprs_ns2_start_alive_all_nsvcs(struct gprs_ns2_nse *nse); |
Daniel Willmann | f128654 | 2020-11-03 23:03:33 +0100 | [diff] [blame] | 266 | |
| 267 | /* VC information */ |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 268 | const char *gprs_ns2_ll_str(struct gprs_ns2_vc *nsvc); |
| 269 | char *gprs_ns2_ll_str_buf(char *buf, size_t buf_len, struct gprs_ns2_vc *nsvc); |
| 270 | char *gprs_ns2_ll_str_c(const void *ctx, struct gprs_ns2_vc *nsvc); |
Daniel Willmann | f128654 | 2020-11-03 23:03:33 +0100 | [diff] [blame] | 271 | const char *gprs_ns2_nsvc_state_name(struct gprs_ns2_vc *nsvc); |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 272 | |
| 273 | /* vty */ |
Alexander Couzens | da1bf8e | 2021-01-25 16:27:33 +0100 | [diff] [blame] | 274 | int gprs_ns2_vty_init(struct gprs_ns2_inst *nsi); |
Alexander Couzens | 412bc34 | 2020-11-19 05:24:37 +0100 | [diff] [blame] | 275 | |
Alexander Couzens | 6a16149 | 2020-07-12 13:45:50 +0200 | [diff] [blame] | 276 | /*! @} */ |