libosmogb  1.4.0.358-967e
Osmocom Gb library
Libgb

GPRS Networks Service (NS) messages on the Gb interface 3GPP TS 08.16 version 8.0.1 Release 1999 / ETSI TS 101 299 V8.0.1 (2002-05) More...

Files

file  gprs_ns.h
 
file  gprs_ns.c
 GPRS Networks Service (NS) messages on the Gb interface.
 
file  gprs_ns2.c
 GPRS Networks Service (NS) messages on the Gb interface.
 

Data Structures

struct  gprs_ns_hdr
 Common header of GPRS NS. More...
 
struct  gprs_ns_ie_ip4_elem
 Section 10.3.2c List of IP4 Elements. More...
 
struct  gprs_ns_ie_ip6_elem
 Section 10.3.2d List of IP6 Elements. More...
 

Macros

#define ns_set_state(ns_, st_)   ns_set_state_with_log(ns_, st_, false, __FILE__, __LINE__)
 
#define ns_set_remote_state(ns_, st_)   ns_set_state_with_log(ns_, st_, true, __FILE__, __LINE__)
 
#define ns_mark_blocked(ns_)   ns_set_state(ns_, (ns_)->state | NSE_S_BLOCKED)
 
#define ns_mark_unblocked(ns_)   ns_set_state(ns_, (ns_)->state & (~NSE_S_BLOCKED));
 
#define ns_mark_alive(ns_)   ns_set_state(ns_, (ns_)->state | NSE_S_ALIVE)
 
#define ns_mark_dead(ns_)   ns_set_state(ns_, (ns_)->state & (~NSE_S_ALIVE));
 
#define ERR_IF_NSVC_USES_SNS(nsvc, reason)
 
#define CHECK_TX_RC(rc, nsvc)
 
#define ns_set_state(ns_, st_)   ns_set_state_with_log(ns_, st_, false, __FILE__, __LINE__)
 
#define ns_set_remote_state(ns_, st_)   ns_set_state_with_log(ns_, st_, true, __FILE__, __LINE__)
 
#define ns_mark_blocked(ns_)   ns_set_state(ns_, (ns_)->state | NSE_S_BLOCKED)
 
#define ns_mark_unblocked(ns_)   ns_set_state(ns_, (ns_)->state & (~NSE_S_BLOCKED));
 
#define ns_mark_alive(ns_)   ns_set_state(ns_, (ns_)->state | NSE_S_ALIVE)
 
#define ns_mark_dead(ns_)   ns_set_state(ns_, (ns_)->state & (~NSE_S_ALIVE));
 
#define NS2_LL_MAX_STR   4+2*(INET6_ADDRSTRLEN+9)+8
 

Enumerations

enum  ns_pdu_type {
  NS_PDUT_UNITDATA = 0x00,
  NS_PDUT_RESET = 0x02,
  NS_PDUT_RESET_ACK = 0x03,
  NS_PDUT_BLOCK = 0x04,
  NS_PDUT_BLOCK_ACK = 0x05,
  NS_PDUT_UNBLOCK = 0x06,
  NS_PDUT_UNBLOCK_ACK = 0x07,
  NS_PDUT_STATUS = 0x08,
  NS_PDUT_ALIVE = 0x0a,
  NS_PDUT_ALIVE_ACK = 0x0b,
  SNS_PDUT_ACK = 0x0c,
  SNS_PDUT_ADD = 0x0d,
  SNS_PDUT_CHANGE_WEIGHT = 0x0e,
  SNS_PDUT_CONFIG = 0x0f,
  SNS_PDUT_CONFIG_ACK = 0x10,
  SNS_PDUT_DELETE = 0x11,
  SNS_PDUT_SIZE = 0x12,
  SNS_PDUT_SIZE_ACK = 0x13
}
 NS PDU Type (TS 08.16, Section 10.3.7, Table 14) More...
 
enum  ns_ctrl_ie {
  NS_IE_CAUSE = 0x00,
  NS_IE_VCI = 0x01,
  NS_IE_PDU = 0x02,
  NS_IE_BVCI = 0x03,
  NS_IE_NSEI = 0x04,
  NS_IE_IPv4_LIST = 0x05,
  NS_IE_IPv6_LIST = 0x06,
  NS_IE_MAX_NR_NSVC = 0x07,
  NS_IE_IPv4_EP_NR = 0x08,
  NS_IE_IPv6_EP_NR = 0x09,
  NS_IE_RESET_FLAG = 0x0a,
  NS_IE_IP_ADDR = 0x0b,
  NS_IE_TRANS_ID = 0xff
}
 NS Control IE (TS 08.16, Section 10.3, Table 12) More...
 
enum  ns_cause {
  NS_CAUSE_TRANSIT_FAIL = 0x00,
  NS_CAUSE_OM_INTERVENTION = 0x01,
  NS_CAUSE_EQUIP_FAIL = 0x02,
  NS_CAUSE_NSVC_BLOCKED = 0x03,
  NS_CAUSE_NSVC_UNKNOWN = 0x04,
  NS_CAUSE_BVCI_UNKNOWN = 0x05,
  NS_CAUSE_SEM_INCORR_PDU = 0x08,
  NS_CAUSE_PDU_INCOMP_PSTATE = 0x0a,
  NS_CAUSE_PROTO_ERR_UNSPEC = 0x0b,
  NS_CAUSE_INVAL_ESSENT_IE = 0x0c,
  NS_CAUSE_MISSING_ESSENT_IE = 0x0d,
  NS_CAUSE_INVAL_NR_IPv4_EP = 0x0e,
  NS_CAUSE_INVAL_NR_IPv6_EP = 0x0f,
  NS_CAUSE_INVAL_NR_NS_VC = 0x10,
  NS_CAUSE_INVAL_WEIGH = 0x11,
  NS_CAUSE_UNKN_IP_EP = 0x12,
  NS_CAUSE_UNKN_IP_ADDR = 0x13,
  NS_CAUSE_UNKN_IP_TEST_FAILED = 0x14
}
 NS Cause (TS 08.16, Section 10.3.2, Table 13) More...
 
enum  ns_ctr {
  NS_CTR_PKTS_IN,
  NS_CTR_PKTS_OUT,
  NS_CTR_BYTES_IN,
  NS_CTR_BYTES_OUT,
  NS_CTR_BLOCKED,
  NS_CTR_DEAD,
  NS_CTR_REPLACED,
  NS_CTR_NSEI_CHG,
  NS_CTR_INV_VCI,
  NS_CTR_INV_NSEI,
  NS_CTR_LOST_ALIVE,
  NS_CTR_LOST_RESET,
  NS_CTR_PKTS_IN,
  NS_CTR_PKTS_OUT,
  NS_CTR_BYTES_IN,
  NS_CTR_BYTES_OUT,
  NS_CTR_BLOCKED,
  NS_CTR_DEAD,
  NS_CTR_REPLACED,
  NS_CTR_NSEI_CHG,
  NS_CTR_INV_VCI,
  NS_CTR_INV_NSEI,
  NS_CTR_LOST_ALIVE,
  NS_CTR_LOST_RESET
}
 
enum  ns_stat {
  NS_STAT_ALIVE_DELAY,
  NS_STAT_ALIVE_DELAY
}
 

Functions

struct gprs_ns_hdr __attribute__ ((packed))
 
static bool nsvc_is_not_used (const struct gprs_nsvc *nsvc)
 
struct msgbgprs_ns_msgb_alloc (void)
 
static void ns_set_state_with_log (struct gprs_nsvc *nsvc, uint32_t state, bool is_remote, const char *file, unsigned line)
 
struct gprs_nsvcgprs_nsvc_by_nsvci (struct gprs_ns_inst *nsi, uint16_t nsvci)
 Lookup struct gprs_nsvc based on NSVCI. More...
 
struct gprs_nsvcgprs_nsvc_by_nsei (struct gprs_ns_inst *nsi, uint16_t nsei)
 Lookup struct gprs_nsvc based on NSEI. More...
 
static struct gprs_nsvcgprs_active_nsvc_by_nsei (struct gprs_ns_inst *nsi, uint16_t nsei, uint16_t bvci)
 Determine active NS-VC for given NSEI + BVCI. More...
 
struct gprs_nsvcgprs_nsvc_by_rem_addr (struct gprs_ns_inst *nsi, const struct sockaddr_in *sin)
 Lookup NS-VC based on specified remote peer socket addr. More...
 
static void gprs_ns_timer_cb (void *data)
 
struct gprs_nsvcgprs_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. More...
 
void gprs_nsvc_delete (struct gprs_nsvc *nsvc)
 Delete given NS-VC. More...
 
static void ns_osmo_signal_dispatch (struct gprs_nsvc *nsvc, unsigned int signal, uint8_t cause)
 
static void ns_osmo_signal_dispatch_mismatch (struct gprs_nsvc *nsvc, struct msgb *msg, uint8_t pdu_type, uint8_t ie_type)
 
static void ns_osmo_signal_dispatch_replaced (struct gprs_nsvc *nsvc, struct gprs_nsvc *old_nsvc)
 
const char * gprs_ns_cause_str (enum ns_cause cause)
 Obtain a human-readable string for NS cause value. More...
 
static int nsip_sendmsg (struct gprs_nsvc *nsvc, struct msgb *msg)
 
int grps_ns_frgre_sendmsg (struct gprs_nsvc *nsvc, struct msgb *msg)
 
static bool ns_is_sns (uint8_t pdu_type)
 
static int gprs_ns_tx (struct gprs_nsvc *nsvc, struct msgb *msg)
 
static int gprs_ns_tx_simple (struct gprs_nsvc *nsvc, uint8_t pdu_type)
 
int gprs_ns_tx_reset (struct gprs_nsvc *nsvc, uint8_t cause)
 Transmit a NS-RESET on a given NSVC. More...
 
int gprs_ns_tx_status (struct gprs_nsvc *nsvc, uint8_t cause, uint16_t bvci, struct msgb *orig_msg)
 Transmit a NS-STATUS on a given NSVC. More...
 
int gprs_ns_tx_block (struct gprs_nsvc *nsvc, uint8_t cause)
 Transmit a NS-BLOCK on a given NS-VC. More...
 
static int gprs_ns_tx_block_ack (struct gprs_nsvc *nsvc)
 Transmit a NS-BLOCK-ACK on a given NS-VC. More...
 
int gprs_ns_tx_unblock (struct gprs_nsvc *nsvc)
 Transmit a NS-UNBLOCK on a given NS-VC. More...
 
int gprs_ns_tx_alive (struct gprs_nsvc *nsvc)
 Transmit a NS-ALIVE on a given NS-VC. More...
 
int gprs_ns_tx_alive_ack (struct gprs_nsvc *nsvc)
 Transmit a NS-ALIVE-ACK on a given NS-VC. More...
 
static void nsvc_start_timer (struct gprs_nsvc *nsvc, enum nsvc_timer_mode mode)
 
static int nsvc_timer_elapsed_ms (struct gprs_nsvc *nsvc)
 
static int gprs_ns_tx_reset_ack (struct gprs_nsvc *nsvc)
 
int gprs_ns_tx_sns_ack (struct gprs_nsvc *nsvc, uint8_t trans_id, uint8_t *cause, const struct gprs_ns_ie_ip4_elem *ip4_elems, unsigned int num_ip4_elems)
 Encode + Transmit a SNS-ACK as per Section 9.3.1. More...
 
int gprs_ns_tx_sns_config (struct gprs_nsvc *nsvc, bool end_flag, const struct gprs_ns_ie_ip4_elem *ip4_elems, unsigned int num_ip4_elems)
 Encode + Transmit a SNS-CONFIG as per Section 9.3.4. More...
 
int gprs_ns_tx_sns_config_ack (struct gprs_nsvc *nsvc, uint8_t *cause)
 Encode + Transmit a SNS-CONFIG-ACK as per Section 9.3.5. More...
 
int gprs_ns_tx_sns_size (struct gprs_nsvc *nsvc, bool reset_flag, uint16_t max_nr_nsvc, uint16_t *ip4_ep_nr, uint16_t *ip6_ep_nr)
 Encode + transmit a SNS-SIZE as per Section 9.3.7. More...
 
int gprs_ns_tx_sns_size_ack (struct gprs_nsvc *nsvc, uint8_t *cause)
 Encode + Transmit a SNS-SIZE-ACK as per Section 9.3.8. More...
 
int gprs_ns_sendmsg (struct gprs_ns_inst *nsi, struct msgb *msg)
 High-level function for transmitting a NS-UNITDATA messsage. More...
 
static int gprs_ns_rx_unitdata (struct gprs_nsvc *nsvc, struct msgb *msg)
 
static int gprs_ns_rx_status (struct gprs_nsvc *nsvc, struct msgb *msg)
 
static int gprs_nsvc_replace_if_found (uint16_t nsvci, struct gprs_nsvc **nsvc, struct gprs_nsvc **old_nsvc)
 
static int gprs_ns_rx_reset (struct gprs_nsvc **nsvc, struct msgb *msg)
 
static int gprs_ns_rx_reset_ack (struct gprs_nsvc **nsvc, struct msgb *msg)
 
static int gprs_ns_rx_block (struct gprs_nsvc *nsvc, struct msgb *msg)
 
int gprs_ns_vc_create (struct gprs_ns_inst *nsi, struct msgb *msg, struct gprs_nsvc *fallback_nsvc, struct gprs_nsvc **new_nsvc)
 Create/get NS-VC independently from underlying transport layer. More...
 
int gprs_ns_process_msg (struct gprs_ns_inst *nsi, struct msgb *msg, struct gprs_nsvc **nsvc)
 Process NS message independently from underlying transport layer. More...
 
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. More...
 
char * gprs_ns_ll_str_buf (char *buf, size_t buf_len, const struct gprs_nsvc *nsvc)
 
const char * gprs_ns_ll_str (const struct gprs_nsvc *nsvc)
 
char * gprs_ns_ll_str_c (const void *ctx, const struct gprs_nsvc *nsvc)
 
void gprs_ns_ll_copy (struct gprs_nsvc *nsvc, struct gprs_nsvc *other)
 
void gprs_ns_ll_clear (struct gprs_nsvc *nsvc)
 
struct gprs_ns_instgprs_ns_instantiate (gprs_ns_cb_t *cb, void *ctx)
 Create a new GPRS NS instance. More...
 
void gprs_ns_close (struct gprs_ns_inst *nsi)
 
void gprs_ns_destroy (struct gprs_ns_inst *nsi)
 Destroy an entire NS instance. More...
 
static struct msgbread_nsip_msg (struct osmo_fd *bfd, int *error, struct sockaddr_in *saddr)
 
static int handle_nsip_read (struct osmo_fd *bfd)
 
static int handle_nsip_write (struct osmo_fd *bfd)
 
static int nsip_fd_cb (struct osmo_fd *bfd, unsigned int what)
 
int gprs_ns_nsip_listen (struct gprs_ns_inst *nsi)
 Create a listening socket for GPRS NS/UDP/IP. More...
 
int gprs_nsvc_reset (struct gprs_nsvc *nsvc, uint8_t cause)
 Initiate a RESET procedure. More...
 
struct gprs_nsvcgprs_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. More...
 
struct gprs_nsvcgprs_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. More...
 
void gprs_ns_set_log_ss (int ss)
 
char * gprs_nsvc_state_append (char *s, struct gprs_nsvc *nsvc)
 Append the nsvc state to a talloc string. More...
 
void gprs_nsvc_start_test (struct gprs_nsvc *nsvc)
 Start the ALIVE timer procedure in all NS-VCs part of this NS Instance. More...
 
void gprs_start_alive_all_nsvcs (struct gprs_ns_inst *nsi)
 
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. More...
 
const char * gprs_ns2_ll_str (struct gprs_ns2_vc *nsvc)
 string-format a given NS-VC to a thread-local static buffer. More...
 
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. More...
 
const char * gprs_ns2_nsvc_state_name (struct gprs_ns2_vc *nsvc)
 Return the current state name of a given NS-VC to a thread-local static buffer. More...
 
static struct gprs_ns2_vcns2_load_sharing_signal (struct gprs_ns2_nse *nse)
 
static struct gprs_ns2_vcns2_load_sharing_modulor (struct gprs_ns2_nse *nse, uint16_t bvci, uint32_t load_selector)
 
struct gprs_ns2_vcns2_load_sharing_first (struct gprs_ns2_nse *nse)
 
static struct gprs_ns2_vcns2_load_sharing (struct gprs_ns2_nse *nse, uint16_t bvci, uint32_t link_selector)
 
int gprs_ns2_recv_prim (struct gprs_ns2_inst *nsi, struct osmo_prim_hdr *oph)
 Receive a primitive from the NS User (Gb). More...
 
void ns2_prim_status_ind (struct gprs_ns2_nse *nse, struct gprs_ns2_vc *nsvc, uint16_t bvci, enum gprs_ns2_affecting_cause cause)
 Send a STATUS.ind primitive to the specified NS instance user. More...
 
struct gprs_ns2_vcns2_vc_alloc (struct gprs_ns2_vc_bind *bind, struct gprs_ns2_nse *nse, bool initiater, enum gprs_ns2_vc_mode vc_mode)
 Allocate a NS-VC within the given bind + NSE. More...
 
void gprs_ns2_free_nsvc (struct gprs_ns2_vc *nsvc)
 Destroy/release given NS-VC. More...
 
void gprs_ns2_free_nsvcs (struct gprs_ns2_nse *nse)
 Destroy/release all NS-VC of given NSE. More...
 
struct msgbgprs_ns2_msgb_alloc (void)
 Allocate a message buffer for use with the NS2 stack. More...
 
static int reject_status_msg (struct msgb *orig_msg, struct tlv_parsed *tp, struct msgb **reject, enum ns_cause cause)
 Create a status message to be sent over a new connection. More...
 
struct gprs_ns2_nsegprs_ns2_nse_by_nsei (struct gprs_ns2_inst *nsi, uint16_t nsei)
 Resolve a NS Entity based on its NSEI. More...
 
struct gprs_ns2_vcgprs_ns2_nsvc_by_nsvci (struct gprs_ns2_inst *nsi, uint16_t nsvci)
 Resolve a NS-VC Entity based on its NS-VCI. More...
 
struct gprs_ns2_nsegprs_ns2_create_nse (struct gprs_ns2_inst *nsi, uint16_t nsei, enum gprs_ns2_ll linklayer, enum gprs_ns2_dialect dialect)
 Create a NS Entity within given NS instance. More...
 
uint16_t gprs_ns2_nse_nsei (struct gprs_ns2_nse *nse)
 Return the NSEI. More...
 
void gprs_ns2_free_nse (struct gprs_ns2_nse *nse)
 Destroy given NS Entity. More...
 
void gprs_ns2_free_nses (struct gprs_ns2_inst *nsi)
 
static int ns2_tlv_parse (struct tlv_parsed *dec, const uint8_t *buf, int buf_len, uint8_t lv_tag, uint8_t lv_tag2)
 
enum gprs_ns2_cs ns2_create_vc (struct gprs_ns2_vc_bind *bind, struct msgb *msg, const char *logname, struct msgb **reject, struct gprs_ns2_vc **success)
 Create a new NS-VC based on a [received] message. More...
 
struct gprs_ns2_vcgprs_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. More...
 
struct gprs_ns2_vcgprs_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. More...
 
struct gprs_ns2_vcgprs_ns2_ip_connect2 (struct gprs_ns2_vc_bind *bind, const struct osmo_sockaddr *remote, uint16_t nsei, uint16_t nsvci, enum gprs_ns2_dialect dialect)
 Create, connect and activate a new IP-based NS-VC. More...
 
struct gprs_ns2_vcgprs_ns2_nsvc_by_sockaddr_nse (struct gprs_ns2_nse *nse, const struct osmo_sockaddr *sockaddr)
 Find NS-VC for given socket address. More...
 
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. More...
 
int ns2_recv_vc (struct gprs_ns2_vc *nsvc, struct msgb *msg)
 Bottom-side entry-point for received NS PDU from the driver/bind. More...
 
void ns2_nse_data_sum (struct gprs_ns2_nse *nse)
 
void ns2_nse_notify_unblocked (struct gprs_ns2_vc *nsvc, bool unblocked)
 Notify a nse about the change of a NS-VC. More...
 
struct gprs_ns2_instgprs_ns2_instantiate (void *ctx, osmo_prim_cb cb, void *cb_data)
 Create a new GPRS NS instance. More...
 
void gprs_ns2_free (struct gprs_ns2_inst *nsi)
 Destroy a NS Instance (including all its NSEs, binds, ...). More...
 
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. More...
 
void gprs_ns2_start_alive_all_nsvcs (struct gprs_ns2_nse *nse)
 Start the NS-ALIVE FSM in all NS-VCs of given NSE. More...
 
void gprs_ns2_free_bind (struct gprs_ns2_vc_bind *bind)
 Destroy a given bind. More...
 
void gprs_ns2_free_binds (struct gprs_ns2_inst *nsi)
 
struct gprs_ns2_vc_bindgprs_ns2_bind_by_name (struct gprs_ns2_inst *nsi, const char *name)
 Search for a bind with a unique name. More...
 
enum gprs_ns2_vc_mode gprs_ns2_dialect_to_vc_mode (enum gprs_ns2_dialect dialect)
 
static void add_bind_array (struct gprs_ns2_vc_bind **array, struct gprs_ns2_vc_bind *bind, int size)
 
int ns2_count_transfer_cap (struct gprs_ns2_nse *nse, uint16_t bvci)
 calculate the transfer capabilities for a nse More...
 

Variables

uint8_t gprs_ns_hdr::pdu_type
 NS PDU type. More...
 
uint8_t gprs_ns_hdr::data [0]
 variable-length payload More...
 
uint8_t pdu_type
 NS PDU type. More...
 
uint8_t data [0]
 variable-length payload More...
 
uint32_t gprs_ns_ie_ip4_elem::ip_addr
 
uint16_t gprs_ns_ie_ip4_elem::udp_port
 
uint8_t gprs_ns_ie_ip4_elem::sig_weight
 
uint8_t gprs_ns_ie_ip4_elem::data_weight
 
uint32_t ip_addr
 
uint16_t udp_port
 
uint8_t sig_weight
 
uint8_t data_weight
 
struct in6_addr gprs_ns_ie_ip6_elem::ip_addr
 
uint16_t gprs_ns_ie_ip6_elem::udp_port
 
uint8_t gprs_ns_ie_ip6_elem::sig_weight
 
uint8_t gprs_ns_ie_ip6_elem::data_weight
 
const struct value_string gprs_ns_pdu_strings []
 
enum ns_pdu_type __attribute__
 
static const struct tlv_definition ns_att_tlvdef
 
static const struct rate_ctr_desc nsvc_ctr_description []
 
static const struct rate_ctr_group_desc nsvc_ctrg_desc
 
static const struct osmo_stat_item_desc nsvc_stat_description []
 
static const struct osmo_stat_item_group_desc nsvc_statg_desc
 
const struct value_string gprs_ns_signal_ns_names []
 
const struct value_string gprs_ns_pdu_strings []
 
static const struct value_string ns_cause_str []
 
static enum ns_timeout timer_mode_tout [_NSVC_TIMER_NR]
 
static const struct value_string timer_mode_strs []
 
static bool gprs_sns_fsm_registered = false
 
static const struct tlv_definition ns_att_tlvdef1
 
static const struct tlv_definition ns_att_tlvdef2
 
const struct value_string gprs_ns2_cause_strs []
 
static const struct rate_ctr_desc nsvc_ctr_description []
 
static const struct rate_ctr_group_desc nsvc_ctrg_desc
 
static const struct osmo_stat_item_desc nsvc_stat_description []
 
static const struct osmo_stat_item_group_desc nsvc_statg_desc
 
const struct value_string gprs_ns2_aff_cause_prim_strs []
 
const struct value_string gprs_ns2_prim_strs []
 
const struct value_string gprs_ns2_lltype_strs []
 
enum gsmtap_um_voice_type __attribute__
 

Detailed Description

GPRS Networks Service (NS) messages on the Gb interface 3GPP TS 08.16 version 8.0.1 Release 1999 / ETSI TS 101 299 V8.0.1 (2002-05)

Some introduction into NS: NS is used typically on top of frame relay, but in the ip.access world it is encapsulated in UDP packets. It serves as an intermediate shim betwen BSSGP and the underlying medium. It doesn't do much, apart from providing congestion notification and status indication.

Terms:

    NS              Network Service
    NSVC            NS Virtual Connection
    NSEI            NS Entity Identifier
    NSVL            NS Virtual Link
    NSVLI           NS Virtual Link Identifier
    BVC             BSSGP Virtual Connection
    BVCI            BSSGP Virtual Connection Identifier
    NSVCG           NS Virtual Connection Goup
    Blocked         NS-VC cannot be used for user traffic
    Alive           Ability of a NS-VC to provide communication

There can be multiple BSSGP virtual connections over one (group of) NSVC's. BSSGP will therefore identify the BSSGP virtual connection by a BVCI passed down to NS. NS then has to figure out which NSVC's are responsible for this BVCI. Those mappings are administratively configured.

This implementation has the following limitations:

Some introduction into NS: NS is used typically on top of frame relay, but in the ip.access world it is encapsulated in UDP packets. It serves as an intermediate shim betwen BSSGP and the underlying medium. It doesn't do much, apart from providing congestion notification and status indication.

Terms:

    NS              Network Service
    NSVC            NS Virtual Connection
    NSEI            NS Entity Identifier
    NSVL            NS Virtual Link
    NSVLI           NS Virtual Link Identifier
    BVC             BSSGP Virtual Connection
    BVCI            BSSGP Virtual Connection Identifier
    NSVCG           NS Virtual Connection Goup
    Blocked         NS-VC cannot be used for user traffic
    Alive           Ability of a NS-VC to provide communication

There can be multiple BSSGP virtual connections over one (group of) NSVC's. BSSGP will therefore identify the BSSGP virtual connection by a BVCI passed down to NS. NS then has to figure out which NSVC's are responsible for this BVCI. Those mappings are administratively configured.

This implementation has the following limitations:

Macro Definition Documentation

◆ CHECK_TX_RC

#define CHECK_TX_RC (   rc,
  nsvc 
)
Value:
if (rc < 0) \
LOGP(DNS, LOGL_ERROR, "TX failed (%d) to peer %s\n", \
rc, gprs_ns_ll_str(nsvc));
#define DNS
Definition: gprs_ns2_vc_fsm.c:52
const char * gprs_ns_ll_str(const struct gprs_nsvc *nsvc)
Definition: gprs_ns.c:1548

Referenced by gprs_ns_rx_reset(), gprs_ns_rx_reset_ack(), and gprs_ns_vc_create().

◆ ERR_IF_NSVC_USES_SNS

#define ERR_IF_NSVC_USES_SNS (   nsvc,
  reason 
)
Value:
do { \
if ((nsvc)->nsi->bss_sns_fi) { \
LOGP(DNS, LOGL_ERROR, "NSEI=%u Asked to %s. Rejected on IP-SNS\n", \
nsvc->nsei, reason); \
osmo_log_backtrace(DNS, LOGL_ERROR); \
return -EIO; \
} \
} while (0)
struct gprs_ns_inst * nsi
pointer to NS Instance
Definition: gprs_ns.h:126
#define DNS
Definition: gprs_ns2_vc_fsm.c:52
struct osmo_fsm_inst * bss_sns_fi
Definition: gprs_ns.h:110

Referenced by gprs_ns_tx_block(), gprs_ns_tx_block_ack(), gprs_ns_tx_reset(), gprs_ns_tx_reset_ack(), gprs_ns_tx_unblock(), and gprs_nsvc_reset().

◆ NS2_LL_MAX_STR

#define NS2_LL_MAX_STR   4+2*(INET6_ADDRSTRLEN+9)+8

◆ ns_mark_alive [1/2]

#define ns_mark_alive (   ns_)    ns_set_state(ns_, (ns_)->state | NSE_S_ALIVE)

◆ ns_mark_alive [2/2]

#define ns_mark_alive (   ns_)    ns_set_state(ns_, (ns_)->state | NSE_S_ALIVE)

Referenced by gprs_ns_process_msg().

◆ ns_mark_blocked [1/2]

#define ns_mark_blocked (   ns_)    ns_set_state(ns_, (ns_)->state | NSE_S_BLOCKED)

◆ ns_mark_blocked [2/2]

#define ns_mark_blocked (   ns_)    ns_set_state(ns_, (ns_)->state | NSE_S_BLOCKED)

◆ ns_mark_dead [1/2]

#define ns_mark_dead (   ns_)    ns_set_state(ns_, (ns_)->state & (~NSE_S_ALIVE));

◆ ns_mark_dead [2/2]

#define ns_mark_dead (   ns_)    ns_set_state(ns_, (ns_)->state & (~NSE_S_ALIVE));

◆ ns_mark_unblocked [1/2]

#define ns_mark_unblocked (   ns_)    ns_set_state(ns_, (ns_)->state & (~NSE_S_BLOCKED));

◆ ns_mark_unblocked [2/2]

#define ns_mark_unblocked (   ns_)    ns_set_state(ns_, (ns_)->state & (~NSE_S_BLOCKED));

Referenced by gprs_ns_process_msg().

◆ ns_set_remote_state [1/2]

#define ns_set_remote_state (   ns_,
  st_ 
)    ns_set_state_with_log(ns_, st_, true, __FILE__, __LINE__)

◆ ns_set_remote_state [2/2]

#define ns_set_remote_state (   ns_,
  st_ 
)    ns_set_state_with_log(ns_, st_, true, __FILE__, __LINE__)

◆ ns_set_state [1/2]

#define ns_set_state (   ns_,
  st_ 
)    ns_set_state_with_log(ns_, st_, false, __FILE__, __LINE__)

◆ ns_set_state [2/2]

#define ns_set_state (   ns_,
  st_ 
)    ns_set_state_with_log(ns_, st_, false, __FILE__, __LINE__)

Enumeration Type Documentation

◆ ns_cause

enum ns_cause

NS Cause (TS 08.16, Section 10.3.2, Table 13)

Enumerator
NS_CAUSE_TRANSIT_FAIL 
NS_CAUSE_OM_INTERVENTION 
NS_CAUSE_EQUIP_FAIL 
NS_CAUSE_NSVC_BLOCKED 
NS_CAUSE_NSVC_UNKNOWN 
NS_CAUSE_BVCI_UNKNOWN 
NS_CAUSE_SEM_INCORR_PDU 
NS_CAUSE_PDU_INCOMP_PSTATE 
NS_CAUSE_PROTO_ERR_UNSPEC 
NS_CAUSE_INVAL_ESSENT_IE 
NS_CAUSE_MISSING_ESSENT_IE 
NS_CAUSE_INVAL_NR_IPv4_EP 
NS_CAUSE_INVAL_NR_IPv6_EP 
NS_CAUSE_INVAL_NR_NS_VC 
NS_CAUSE_INVAL_WEIGH 
NS_CAUSE_UNKN_IP_EP 
NS_CAUSE_UNKN_IP_ADDR 
NS_CAUSE_UNKN_IP_TEST_FAILED 

◆ ns_ctr

enum ns_ctr
Enumerator
NS_CTR_PKTS_IN 
NS_CTR_PKTS_OUT 
NS_CTR_BYTES_IN 
NS_CTR_BYTES_OUT 
NS_CTR_BLOCKED 
NS_CTR_DEAD 
NS_CTR_REPLACED 
NS_CTR_NSEI_CHG 
NS_CTR_INV_VCI 
NS_CTR_INV_NSEI 
NS_CTR_LOST_ALIVE 
NS_CTR_LOST_RESET 
NS_CTR_PKTS_IN 
NS_CTR_PKTS_OUT 
NS_CTR_BYTES_IN 
NS_CTR_BYTES_OUT 
NS_CTR_BLOCKED 
NS_CTR_DEAD 
NS_CTR_REPLACED 
NS_CTR_NSEI_CHG 
NS_CTR_INV_VCI 
NS_CTR_INV_NSEI 
NS_CTR_LOST_ALIVE 
NS_CTR_LOST_RESET 

◆ ns_ctrl_ie

enum ns_ctrl_ie

NS Control IE (TS 08.16, Section 10.3, Table 12)

Enumerator
NS_IE_CAUSE 
NS_IE_VCI 
NS_IE_PDU 
NS_IE_BVCI 
NS_IE_NSEI 
NS_IE_IPv4_LIST 
NS_IE_IPv6_LIST 
NS_IE_MAX_NR_NSVC 
NS_IE_IPv4_EP_NR 
NS_IE_IPv6_EP_NR 
NS_IE_RESET_FLAG 
NS_IE_IP_ADDR 
NS_IE_TRANS_ID 

◆ ns_pdu_type

NS PDU Type (TS 08.16, Section 10.3.7, Table 14)

Enumerator
NS_PDUT_UNITDATA 
NS_PDUT_RESET 
NS_PDUT_RESET_ACK 
NS_PDUT_BLOCK 
NS_PDUT_BLOCK_ACK 
NS_PDUT_UNBLOCK 
NS_PDUT_UNBLOCK_ACK 
NS_PDUT_STATUS 
NS_PDUT_ALIVE 
NS_PDUT_ALIVE_ACK 
SNS_PDUT_ACK 
SNS_PDUT_ADD 
SNS_PDUT_CHANGE_WEIGHT 
SNS_PDUT_CONFIG 
SNS_PDUT_CONFIG_ACK 
SNS_PDUT_DELETE 
SNS_PDUT_SIZE 
SNS_PDUT_SIZE_ACK 

◆ ns_stat

enum ns_stat
Enumerator
NS_STAT_ALIVE_DELAY 
NS_STAT_ALIVE_DELAY 

Function Documentation

◆ __attribute__()

struct gprs_ns_hdr __attribute__ ( (packed)  )

◆ add_bind_array()

static void add_bind_array ( struct gprs_ns2_vc_bind **  array,
struct gprs_ns2_vc_bind bind,
int  size 
)
static

Referenced by ns2_count_transfer_cap().

◆ gprs_active_nsvc_by_nsei()

static struct gprs_nsvc* gprs_active_nsvc_by_nsei ( struct gprs_ns_inst nsi,
uint16_t  nsei,
uint16_t  bvci 
)
static

Determine active NS-VC for given NSEI + BVCI.

Use this function to determine which of the NS-VCs inside the NS Instance shall be used to transmit data for given NSEI + BVCI

References gprs_nsvc::data_weight, gprs_ns_inst::gprs_nsvcs, gprs_nsvc::list, llist_for_each_entry, NSE_S_ALIVE, NSE_S_BLOCKED, gprs_nsvc::nsei, gprs_nsvc::sig_weight, and gprs_nsvc::state.

Referenced by gprs_ns_sendmsg().

◆ gprs_ns2_bind_by_name()

struct gprs_ns2_vc_bind* gprs_ns2_bind_by_name ( struct gprs_ns2_inst nsi,
const char *  name 
)

Search for a bind with a unique name.

Parameters
[in]nsiNS instance on which we operate
[in]nameThe unique bind name to search for
Returns
the bind or NULL if not found

References gprs_ns2_inst::binding, gprs_ns2_vc_bind::list, llist_for_each_entry, and gprs_ns2_vc_bind::name.

Referenced by config_write_vbind(), DEFUN(), gprs_ns2_fr_bind(), gprs_ns2_frgre_bind(), and gprs_ns2_ip_bind().

◆ gprs_ns2_create_nse()

struct gprs_ns2_nse* gprs_ns2_create_nse ( struct gprs_ns2_inst nsi,
uint16_t  nsei,
enum gprs_ns2_ll  linklayer,
enum gprs_ns2_dialect  dialect 
)

Create a NS Entity within given NS instance.

Parameters
[in]nsiNS instance in which to create NS Entity
[in]nseiNS Entity Identifier of to-be-created NSE
Returns
newly-allocated NS-E in successful case; NULL on error

References gprs_ns2_nse::bss_sns_fi, gprs_ns2_nse::dialect, DLNS, gprs_ns2_nse::first, gprs_ns2_nse_by_nsei(), INIT_LLIST_HEAD, gprs_ns2_nse::list, gprs_ns2_nse::ll, llist_add(), LOGL_ERROR, LOGP, NS2_DIALECT_SNS, ns2_sns_bss_fsm_alloc(), gprs_ns2_inst::nse, nsei, gprs_ns2_nse::nsei, gprs_ns2_nse::nsi, and gprs_ns2_nse::nsvc.

Referenced by DEFUN(), gprs_ns2_fr_connect2(), gprs_ns2_ip_connect2(), gprs_ns2_vty_create(), and ns2_create_vc().

◆ gprs_ns2_dialect_to_vc_mode()

◆ gprs_ns2_dynamic_create_nse()

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.

Parameters
nsithe instance to modify
create_nseif NSE can be created on receiving package. SGSN set this.
Returns
0 on success; negative on error

References gprs_ns2_inst::create_nse.

◆ gprs_ns2_free()

void gprs_ns2_free ( struct gprs_ns2_inst nsi)

Destroy a NS Instance (including all its NSEs, binds, ...).

Parameters
[in]nsiNS instance to destroy

References gprs_ns2_free_binds(), and gprs_ns2_free_nses().

◆ gprs_ns2_free_bind()

void gprs_ns2_free_bind ( struct gprs_ns2_vc_bind bind)

◆ gprs_ns2_free_binds()

void gprs_ns2_free_binds ( struct gprs_ns2_inst nsi)

◆ gprs_ns2_free_nse()

void gprs_ns2_free_nse ( struct gprs_ns2_nse nse)

◆ gprs_ns2_free_nses()

void gprs_ns2_free_nses ( struct gprs_ns2_inst nsi)

◆ gprs_ns2_free_nsvc()

◆ gprs_ns2_free_nsvcs()

void gprs_ns2_free_nsvcs ( struct gprs_ns2_nse nse)

Destroy/release all NS-VC of given NSE.

Parameters
[in]nseNSE

References gprs_ns2_free_nsvc(), gprs_ns2_vc::list, llist_for_each_entry_safe, and gprs_ns2_nse::nsvc.

Referenced by DEFUN_HIDDEN(), gprs_ns2_free_nse(), gprs_ns2_sns_del_endpoint(), and ns2_sns_st_all_action().

◆ gprs_ns2_instantiate()

struct gprs_ns2_inst* gprs_ns2_instantiate ( void *  ctx,
osmo_prim_cb  cb,
void *  cb_data 
)

Create a new GPRS NS instance.

Parameters
[in]ctxa talloc context to allocate NS instance from
[in]cbCall-back function for dispatching primitives to the user. The Call-back must free all msgb* given in the primitive.
[in]cb_datatransparent user data passed to Call-back
Returns
dynamically allocated gprs_ns_inst; NULL on error

References gprs_ns2_inst::binding, gprs_ns2_inst::cb, gprs_ns2_inst::cb_data, INIT_LLIST_HEAD, NS_TOUT_TNS_ALIVE, NS_TOUT_TNS_ALIVE_RETRIES, NS_TOUT_TNS_BLOCK, NS_TOUT_TNS_BLOCK_RETRIES, NS_TOUT_TNS_RESET, NS_TOUT_TNS_RESET_RETRIES, NS_TOUT_TNS_TEST, NS_TOUT_TSNS_CONFIG_RETRIES, NS_TOUT_TSNS_PROV, NS_TOUT_TSNS_SIZE_RETRIES, gprs_ns2_inst::nse, and gprs_ns2_inst::timeout.

◆ gprs_ns2_ip_connect()

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.

Parameters
[in]bindbind in which the new NS-VC is to be created
[in]remoteremote address to which to connect
[in]nseNS Entity in which the NS-VC is to be created
[in]nsvciis only required when bind->vc_mode == NS2_VC_MODE_BLOCKRESET
Returns
pointer to newly-allocated, connected and activated NS-VC; NULL on error

References gprs_ns2_ip_connect_inactive(), and gprs_ns2_vc_fsm_start().

Referenced by DEFUN(), gprs_ns2_ip_connect2(), and gprs_ns2_vty_create().

◆ gprs_ns2_ip_connect2()

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,
enum gprs_ns2_dialect  dialect 
)

Create, connect and activate a new IP-based NS-VC.

Parameters
[in]bindbind in which the new NS-VC is to be created
[in]remoteremote address to which to connect
[in]nseiNSEI of the NS Entity in which the NS-VC is to be created
[in]nsvciis only required when bind->vc_mode == NS2_VC_MODE_BLOCKRESET
Returns
pointer to newly-allocated, connected and activated NS-VC; NULL on error

References gprs_ns2_create_nse(), gprs_ns2_ip_connect(), GPRS_NS2_LL_UDP, gprs_ns2_nse_by_nsei(), and gprs_ns2_vc_bind::nsi.

◆ gprs_ns2_ip_connect_inactive()

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.

Parameters
[in]bindbind in which the new NS-VC is to be created
[in]remoteremote address to which to connect
[in]nseNS Entity in which the NS-VC is to be created
[in]nsvciis only required when bind->vc_mode == NS2_VC_MODE_BLOCKRESET
Returns
pointer to newly-allocated, connected and inactive NS-VC; NULL on error

References gprs_ns2_ip_bind_connect(), gprs_ns2_vc::mode, NS2_VC_MODE_BLOCKRESET, gprs_ns2_vc::nsvci, and gprs_ns2_vc::nsvci_is_valid.

Referenced by create_missing_nsvcs(), gprs_ns2_ip_connect(), ns2_nsvc_create_ip4(), and ns2_nsvc_create_ip6().

◆ gprs_ns2_ll_str()

const char* gprs_ns2_ll_str ( struct gprs_ns2_vc nsvc)

string-format a given NS-VC to a thread-local static buffer.

Parameters
[in]nsvcNS-VC to be string-formatted
Returns
pointer to the string on success; NULL on error

References gprs_ns2_ll_str_buf(), and NS2_LL_MAX_STR.

Referenced by do_sns_change_weight(), do_sns_delete(), dump_nsvc(), and dump_vty().

◆ gprs_ns2_ll_str_buf()

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.

Parameters
[in]bufuser-allocated output buffer
[in]buf_lensize of user-allocated output buffer in bytes
[in]nsvcNS-VC to be string-formatted
Returns
pointer to buf on success; NULL on error

References gprs_ns2_vc::bind, gprs_ns2_fr_bind_netif(), gprs_ns2_fr_nsvc_dlci(), gprs_ns2_ip_bind_sockaddr(), gprs_ns2_ip_vc_remote(), gprs_ns2_is_ip_bind(), GPRS_NS2_LL_FR, GPRS_NS2_LL_FR_GRE, GPRS_NS2_LL_UDP, osmo_sockaddr_str::ip, gprs_ns2_nse::ll, gprs_ns2_vc::nse, gprs_ns2_vc::nsvci, gprs_ns2_vc::nsvci_is_valid, osmo_sockaddr_str_from_sockaddr(), osmo_sockaddr_str::port, osmo_sockaddr::sas, and osmo_sockaddr::u.

Referenced by gprs_ns2_ll_str(), gprs_ns2_ll_str_c(), and ns2_prim_status_ind().

◆ gprs_ns2_ll_str_c()

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.

Parameters
[in]ctxtalloc context from which to allocate
[in]nsvcNS-VC to be string-formatted
Returns
pointer to the string on success; NULL on error

References gprs_ns2_ll_str_buf(), and NS2_LL_MAX_STR.

◆ gprs_ns2_msgb_alloc()

◆ gprs_ns2_nse_by_nsei()

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.

Parameters
[in]nsiNS Instance in which we do the look-up
[in]nseiNSEI to look up
Returns
NS Entity in successful case; NULL if none found

References gprs_ns2_nse::list, llist_for_each_entry, gprs_ns2_inst::nse, and gprs_ns2_nse::nsei.

Referenced by DEFUN(), DEFUN_HIDDEN(), gprs_ns2_create_nse(), gprs_ns2_fr_connect2(), gprs_ns2_ip_connect2(), gprs_ns2_recv_prim(), gprs_ns2_vty_create(), and ns2_create_vc().

◆ gprs_ns2_nse_foreach_nsvc()

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.

If the callback returns < 0 it aborts the loop and returns the callback return code.

Parameters
[in]nseNS Entity to iterate over all nsvcs
[in]cbthe callback to call
[in,out]cb_datathe private data of the callback
Returns
0 if the loop completes. If a callback returns < 0 it will returns this value.

References gprs_ns2_vc::list, llist_for_each_entry_safe, and gprs_ns2_nse::nsvc.

Referenced by DEFUN_HIDDEN().

◆ gprs_ns2_nse_nsei()

uint16_t gprs_ns2_nse_nsei ( struct gprs_ns2_nse nse)

Return the NSEI.

Parameters
[in]nseNS Entity
Returns
the nsei.

References gprs_ns2_nse::nsei.

◆ gprs_ns2_nsvc_by_nsvci()

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.

Parameters
[in]nsiNS Instance in which we do the look-up
[in]nsvciNS-VCI to look up
Returns
NS-VC Entity in successful case; NULL if none found

References gprs_ns2_vc::list, llist_for_each_entry, gprs_ns2_inst::nse, gprs_ns2_nse::nsvc, gprs_ns2_vc::nsvci, and gprs_ns2_vc::nsvci_is_valid.

Referenced by DEFUN().

◆ gprs_ns2_nsvc_by_sockaddr_nse()

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.

Parameters
[in]nseNS Entity in which to search
[in]sockaddrsocket address to search for
Returns
NS-VC matching sockaddr; NULL if none found

References gprs_ns2_ip_vc_remote(), llist_for_each_entry, gprs_ns2_nse::nsvc, OSMO_ASSERT, and osmo_sockaddr_cmp().

Referenced by nsvc_by_ip4_elem(), and nsvc_by_ip6_elem().

◆ gprs_ns2_nsvc_state_name()

const char* gprs_ns2_nsvc_state_name ( struct gprs_ns2_vc nsvc)

Return the current state name of a given NS-VC to a thread-local static buffer.

Parameters
[in]nsvcNS-VC to return the state of
Returns
pointer to the string on success; NULL on error

References gprs_ns2_vc::fi, and osmo_fsm_inst_state_name().

◆ gprs_ns2_recv_prim()

int gprs_ns2_recv_prim ( struct gprs_ns2_inst nsi,
struct osmo_prim_hdr oph 
)

◆ gprs_ns2_start_alive_all_nsvcs()

void gprs_ns2_start_alive_all_nsvcs ( struct gprs_ns2_nse nse)

Start the NS-ALIVE FSM in all NS-VCs of given NSE.

Parameters
[in]nseNS Entity in whihc to start NS-ALIVE FSMs

References gprs_ns2_vc_fsm_start(), gprs_ns2_vc::list, llist_for_each_entry, gprs_ns2_nse::nsvc, OSMO_ASSERT, and gprs_ns2_vc::sns_only.

Referenced by do_sns_add(), ns_sns_st_config_sgsn_ip4(), and ns_sns_st_config_sgsn_ip6().

◆ gprs_ns_cause_str()

const char* gprs_ns_cause_str ( enum ns_cause  cause)

◆ gprs_ns_close()

◆ gprs_ns_destroy()

void gprs_ns_destroy ( struct gprs_ns_inst nsi)

Destroy an entire NS instance.

Parameters
nsigprs_ns_inst that is to be destroyed

This function releases all resources associated with the NS-instance.

References gprs_ns_close().

◆ gprs_ns_instantiate()

◆ gprs_ns_ll_clear()

void gprs_ns_ll_clear ( struct gprs_nsvc nsvc)

◆ gprs_ns_ll_copy()

void gprs_ns_ll_copy ( struct gprs_nsvc nsvc,
struct gprs_nsvc other 
)

◆ gprs_ns_ll_str()

◆ gprs_ns_ll_str_buf()

char* gprs_ns_ll_str_buf ( char *  buf,
size_t  buf_len,
const struct gprs_nsvc nsvc 
)

◆ gprs_ns_ll_str_c()

char* gprs_ns_ll_str_c ( const void *  ctx,
const struct gprs_nsvc nsvc 
)

References gprs_ns_ll_str_buf().

◆ gprs_ns_msgb_alloc()

◆ gprs_ns_nsip_connect()

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.

Parameters
nsiNS-instance
[in]destDestination IP/Port
[in]nseiNSEI of the to-be-established NS-VC
[in]nsvciNSVCI of the to-be-established NS-VC
Returns
struct gprs_nsvc representing the new NS-VC

This function will establish a single NS/UDP/IP connection in uplink (BSS to SGSN) direction.

References gprs_nsvc_by_rem_addr(), gprs_nsvc_create2(), gprs_nsvc_reset(), gprs_nsvc::ip, NS_CAUSE_OM_INTERVENTION, nsei, gprs_nsvc::nsei, and gprs_nsvc::remote_end_is_sgsn.

◆ gprs_ns_nsip_connect_sns()

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.

Parameters
nsiNS-instance
[in]destDestination IP/Port
[in]nseiNSEI of the to-be-established NS-VC
[in]nsvciNSVCI of the to-be-established NS-VC
Returns
struct gprs_nsvc representing the new NS-VC

This function will establish a single NS/UDP/IP connection in uplink (BSS to SGSN) direction. It will start with the SNS-SIZE procedure, followed by BSS-originated SNS-CONFIG, then SGSN-originated SNS-CONFIG.

Once configuration completes, the user will be notified by the S_SNS_CONFIGURED signal, at which point he typically would want to initiate NS-RESET by means of gprs_nsvc_reset().

References gprs_ns_inst::bss_sns_fi, gprs_nsvc_by_rem_addr(), gprs_nsvc_create2(), gprs_sns_bss_fsm_alloc(), gprs_sns_bss_fsm_start(), gprs_nsvc::ip, ns_set_state, nsei, gprs_nsvc::nsei, osmo_fsm_inst_term, OSMO_FSM_TERM_REQUEST, and gprs_nsvc::remote_end_is_sgsn.

◆ gprs_ns_nsip_listen()

int gprs_ns_nsip_listen ( struct gprs_ns_inst nsi)

Create a listening socket for GPRS NS/UDP/IP.

Parameters
[in]nsiNS protocol instance to listen
Returns
>=0 (fd) in case of success, negative in case of error

A call to this function will create a UDP socket bound to the port number and IP address specified in the NS protocol instance. The file descriptor of the socket will be stored in nsi->nsip.fd.

References osmo_fd::cb, osmo_fd::data, DNS, gprs_ns_inst::dscp, osmo_fd::fd, gprs_ns_inst::fd, gprs_ns_inst::local_ip, gprs_ns_inst::local_port, LOGL_ERROR, LOGL_NOTICE, LOGP, gprs_ns_inst::nsip, nsip_fd_cb(), osmo_htonl, OSMO_SOCK_F_BIND, OSMO_SOCK_F_CONNECT, osmo_sock_init2_ofd(), osmo_sock_init_ofd(), gprs_ns_inst::remote_ip, and gprs_ns_inst::remote_port.

◆ gprs_ns_process_msg()

int gprs_ns_process_msg ( struct gprs_ns_inst nsi,
struct msgb msg,
struct gprs_nsvc **  nsvc 
)

Process NS message independently from underlying transport layer.

Parameters
nsiNS instance to which the data belongs
[in]msgmessage buffer containing newly-received data
[in,out]nsvcrefers to the virtual connection, may be modified when processing a NS_RESET
Returns
0 in case of success, < 0 in case of error

This contains the main NS automaton.

References gprs_ns_inst::bss_sns_fi, gprs_ns_hdr::data, DNS, get_value_string(), gprs_ns_rx_block(), gprs_ns_rx_reset(), gprs_ns_rx_reset_ack(), gprs_ns_rx_sns(), gprs_ns_rx_status(), gprs_ns_rx_unitdata(), gprs_ns_tx_alive_ack(), gprs_ns_tx_simple(), gprs_ns_tx_status(), gprs_ns_tx_unblock(), gprs_nsvc_reset(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_INFO, LOGL_NOTICE, LOGP, LOGPC, msgb_hexdump(), msgb_l2len(), msgb_nsei, NS_CAUSE_PDU_INCOMP_PSTATE, NS_CAUSE_PROTO_ERR_UNSPEC, NS_CTR_BYTES_IN, NS_CTR_PKTS_IN, NS_IE_NSEI, NS_IE_TRANS_ID, ns_is_sns(), ns_mark_alive, ns_mark_unblocked, ns_osmo_signal_dispatch(), NS_PDUT_ALIVE, NS_PDUT_ALIVE_ACK, NS_PDUT_BLOCK, NS_PDUT_BLOCK_ACK, NS_PDUT_RESET, NS_PDUT_RESET_ACK, NS_PDUT_STATUS, NS_PDUT_UNBLOCK, NS_PDUT_UNBLOCK_ACK, NS_PDUT_UNITDATA, ns_set_remote_state, ns_set_state, NS_STAT_ALIVE_DELAY, NSE_S_ALIVE, NSE_S_BLOCKED, NSE_S_RESET, nsvc_is_not_used(), nsvc_start_timer(), nsvc_timer_elapsed_ms(), NSVC_TIMER_TNS_ALIVE, NSVC_TIMER_TNS_TEST, osmo_stat_item_set(), gprs_ns_hdr::pdu_type, rate_ctr_add(), rate_ctr_inc(), S_NS_UNBLOCK, SNS_PDUT_ACK, SNS_PDUT_ADD, SNS_PDUT_CHANGE_WEIGHT, SNS_PDUT_CONFIG, SNS_PDUT_CONFIG_ACK, SNS_PDUT_DELETE, SNS_PDUT_SIZE, SNS_PDUT_SIZE_ACK, and tlv_parse().

Referenced by gprs_ns_rcvmsg(), and gprs_ns_rx_block().

◆ gprs_ns_rcvmsg()

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.

Parameters
nsiNS instance to which the data belongs
[in]msgmessage buffer containing newly-received data
[in]saddrsocketaddr from which data was received
[in]lllink-layer type in which data was received
Returns
0 in case of success, < 0 in case of error

This is the main entry point int othe NS imlementation where frames from the underlying transport (normally UDP) enter.

References gprs_ns_process_msg(), gprs_ns_vc_create(), gprs_nsvc_by_rem_addr(), gprs_nsvc::ip, gprs_nsvc::ll, LOG_CTX_GB_NSVC, log_set_context(), and gprs_ns_inst::unknown_nsvc.

Referenced by handle_nsfrgre_read(), handle_nsip_read(), and read_nsfrgre_msg().

◆ gprs_ns_rx_block()

◆ gprs_ns_rx_reset()

◆ gprs_ns_rx_reset_ack()

◆ gprs_ns_rx_status()

static int gprs_ns_rx_status ( struct gprs_nsvc nsvc,
struct msgb msg 
)
static

◆ gprs_ns_rx_unitdata()

◆ gprs_ns_sendmsg()

int gprs_ns_sendmsg ( struct gprs_ns_inst nsi,
struct msgb msg 
)

High-level function for transmitting a NS-UNITDATA messsage.

Parameters
[in]nsiNS-instance on which we shall transmit
[in]msgstruct msgb to be trasnmitted

This function obtains the NS-VC by the msgb_nsei(msg) and then checks if the NS-VC is ALIVE and not BLOCKED. After that, it adds a NS header for the NS-UNITDATA message type and sends it off.

Section 9.2.10: transmit side / NS-UNITDATA-REQUEST primitive

References bvci, gprs_ns_hdr::data, DNS, gprs_active_nsvc_by_nsei(), gprs_ns_tx(), gprs_nsvc_by_nsei(), if(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_ERROR, LOGP, msgb_bvci, msgb_free(), msgb_nsei, msgb_push(), NS_PDUT_UNITDATA, and gprs_ns_hdr::pdu_type.

Referenced by _gprs_ns_sendmsg().

◆ gprs_ns_set_log_ss()

void gprs_ns_set_log_ss ( int  ss)

References DNS.

◆ gprs_ns_timer_cb()

◆ gprs_ns_tx()

◆ gprs_ns_tx_alive()

int gprs_ns_tx_alive ( struct gprs_nsvc nsvc)

Transmit a NS-ALIVE on a given NS-VC.

Parameters
[in]nsvcNS-VC on which the NS-ALIVE is to be transmitted
Returns
0 in case of success

References DNS, gprs_ns_tx_simple(), LOG_CTX_GB_NSVC, log_set_context(), LOGL_DEBUG, LOGP, NS_PDUT_ALIVE, gprs_nsvc::nsei, and gprs_nsvc::nsvci.

Referenced by gprs_ns_timer_cb(), and gprs_nsvc_start_test().

◆ gprs_ns_tx_alive_ack()

int gprs_ns_tx_alive_ack ( struct gprs_nsvc nsvc)

Transmit a NS-ALIVE-ACK on a given NS-VC.

Parameters
[in]nsvcNS-VC on which the NS-ALIVE-ACK is to be transmitted
Returns
0 in case of success

References DNS, gprs_ns_tx_simple(), LOG_CTX_GB_NSVC, log_set_context(), LOGL_DEBUG, LOGP, NS_PDUT_ALIVE_ACK, gprs_nsvc::nsei, and gprs_nsvc::nsvci.

Referenced by gprs_ns_process_msg().

◆ gprs_ns_tx_block()

int gprs_ns_tx_block ( struct gprs_nsvc nsvc,
uint8_t  cause 
)

Transmit a NS-BLOCK on a given NS-VC.

Parameters
[in]nsvcNS-VC on which the NS-BLOCK is to be transmitted
[in]causeNumeric NS Cause value
Returns
0 in case of success

References rate_ctr_group::ctr, gprs_nsvc::ctrg, DNS, ERR_IF_NSVC_USES_SNS, gprs_ns_cause_str(), gprs_ns_msgb_alloc(), gprs_ns_tx(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_INFO, LOGP, msgb_put(), msgb_tvlv_put(), NS_CTR_BLOCKED, NS_IE_CAUSE, NS_IE_VCI, ns_mark_blocked, NS_PDUT_BLOCK, gprs_nsvc::nsei, gprs_nsvc::nsvci, osmo_htons, gprs_ns_hdr::pdu_type, and rate_ctr_inc().

Referenced by DEFUN().

◆ gprs_ns_tx_block_ack()

static int gprs_ns_tx_block_ack ( struct gprs_nsvc nsvc)
static

Transmit a NS-BLOCK-ACK on a given NS-VC.

Parameters
[in]nsvcNS-VC on which the NS-BLOCK is to be transmitted
Returns
0 in case of success

References DNS, ERR_IF_NSVC_USES_SNS, gprs_ns_msgb_alloc(), gprs_ns_tx(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_INFO, LOGP, msgb_put(), msgb_tvlv_put(), NS_IE_VCI, NS_PDUT_BLOCK_ACK, gprs_nsvc::nsei, gprs_nsvc::nsvci, osmo_htons, and gprs_ns_hdr::pdu_type.

Referenced by gprs_ns_rx_block().

◆ gprs_ns_tx_reset()

int gprs_ns_tx_reset ( struct gprs_nsvc nsvc,
uint8_t  cause 
)

Transmit a NS-RESET on a given NSVC.

Parameters
[in]nsvcNS-VC used for transmission [in] cause Numeric NS cause value

References DNS, ERR_IF_NSVC_USES_SNS, gprs_ns_cause_str(), gprs_ns_msgb_alloc(), gprs_ns_tx(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_INFO, LOGP, msgb_put(), msgb_tvlv_put(), NS_IE_CAUSE, NS_IE_NSEI, NS_IE_VCI, NS_PDUT_RESET, nsei, gprs_nsvc::nsei, gprs_nsvc::nsvci, osmo_htons, and gprs_ns_hdr::pdu_type.

Referenced by gprs_ns_timer_cb(), and gprs_nsvc_reset().

◆ gprs_ns_tx_reset_ack()

◆ gprs_ns_tx_simple()

static int gprs_ns_tx_simple ( struct gprs_nsvc nsvc,
uint8_t  pdu_type 
)
static

◆ gprs_ns_tx_sns_ack()

int gprs_ns_tx_sns_ack ( struct gprs_nsvc nsvc,
uint8_t  trans_id,
uint8_t *  cause,
const struct gprs_ns_ie_ip4_elem ip4_elems,
unsigned int  num_ip4_elems 
)

Encode + Transmit a SNS-ACK as per Section 9.3.1.

Parameters
[in]nsvcNS-VC through which to transmit the ACK
[in]trans_idTransaction ID which to acknowledge
[in]causePointer to cause value (NULL if no cause to be sent)
[in]ip4_elemsArray of IPv4 Elements
[in]num_ip4_elemsnumber of ip4_elems
Returns
0 on success; negative in case of error

References gprs_ns_inst::bss_sns_fi, DNS, gprs_ns_msgb_alloc(), gprs_ns_tx(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_ERROR, LOGP, msgb_free(), msgb_put(), msgb_tvlv_put(), msgb_v_put(), NS_IE_CAUSE, NS_IE_IPv4_LIST, NS_IE_NSEI, nsei, gprs_nsvc::nsei, gprs_nsvc::nsi, osmo_htons, gprs_ns_hdr::pdu_type, and SNS_PDUT_ACK.

Referenced by gprs_sns_st_configured().

◆ gprs_ns_tx_sns_config()

int gprs_ns_tx_sns_config ( struct gprs_nsvc nsvc,
bool  end_flag,
const struct gprs_ns_ie_ip4_elem ip4_elems,
unsigned int  num_ip4_elems 
)

Encode + Transmit a SNS-CONFIG as per Section 9.3.4.

Parameters
[in]nsvcNS-VC through which to transmit the SNS-CONFIG
[in]end_flagWhether or not this is the last SNS-CONFIG
[in]ip4_elemsArray of IPv4 Elements
[in]num_ip4_elemsnumber of ip4_elems
Returns
0 on success; negative in case of error

References gprs_ns_inst::bss_sns_fi, DNS, gprs_ns_msgb_alloc(), gprs_ns_tx(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_ERROR, LOGP, msgb_free(), msgb_put(), msgb_tvlv_put(), msgb_v_put(), NS_IE_IPv4_LIST, NS_IE_NSEI, nsei, gprs_nsvc::nsei, gprs_nsvc::nsi, osmo_htons, gprs_ns_hdr::pdu_type, and SNS_PDUT_CONFIG.

Referenced by gprs_sns_st_config_bss_onenter().

◆ gprs_ns_tx_sns_config_ack()

int gprs_ns_tx_sns_config_ack ( struct gprs_nsvc nsvc,
uint8_t *  cause 
)

Encode + Transmit a SNS-CONFIG-ACK as per Section 9.3.5.

Parameters
[in]nsvcNS-VC through which to transmit the SNS-CONFIG-ACK
[in]causePointer to cause value (NULL if no cause to be sent)
Returns
0 on success; negative in case of error

References gprs_ns_inst::bss_sns_fi, DNS, gprs_ns_msgb_alloc(), gprs_ns_tx(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_ERROR, LOGP, msgb_free(), msgb_put(), msgb_tvlv_put(), NS_IE_CAUSE, NS_IE_NSEI, nsei, gprs_nsvc::nsei, gprs_nsvc::nsi, osmo_htons, gprs_ns_hdr::pdu_type, and SNS_PDUT_CONFIG_ACK.

Referenced by gprs_sns_st_config_sgsn().

◆ gprs_ns_tx_sns_size()

int gprs_ns_tx_sns_size ( struct gprs_nsvc nsvc,
bool  reset_flag,
uint16_t  max_nr_nsvc,
uint16_t *  ip4_ep_nr,
uint16_t *  ip6_ep_nr 
)

Encode + transmit a SNS-SIZE as per Section 9.3.7.

Parameters
[in]nsvcNS-VC through which to transmit the SNS-SIZE
[in]reset_flagWhether or not to add a RESET flag
[in]max_nr_nsvcMaximum number of NS-VCs
[in]ip4_ep_nrNumber of IPv4 endpoints (NULL if none)
[in]ip6_ep_nrNumber of IPv6 endpoints (NULL if none)
Returns
0 on success; negative in case of error

References gprs_ns_inst::bss_sns_fi, DNS, gprs_ns_msgb_alloc(), gprs_ns_tx(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_ERROR, LOGP, msgb_free(), msgb_put(), msgb_tv16_put(), msgb_tv_put(), msgb_tvlv_put(), NS_IE_IPv4_EP_NR, NS_IE_IPv6_EP_NR, NS_IE_MAX_NR_NSVC, NS_IE_NSEI, NS_IE_RESET_FLAG, nsei, gprs_nsvc::nsei, gprs_nsvc::nsi, osmo_htons, gprs_ns_hdr::pdu_type, and SNS_PDUT_SIZE.

Referenced by gprs_sns_st_size_onenter().

◆ gprs_ns_tx_sns_size_ack()

int gprs_ns_tx_sns_size_ack ( struct gprs_nsvc nsvc,
uint8_t *  cause 
)

Encode + Transmit a SNS-SIZE-ACK as per Section 9.3.8.

Parameters
[in]nsvcNS-VC through which to transmit the SNS-SIZE-ACK
[in]causePointer to cause value (NULL if no cause to be sent)
Returns
0 on success; negative in case of error

References gprs_ns_inst::bss_sns_fi, DNS, gprs_ns_msgb_alloc(), gprs_ns_tx(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_ERROR, LOGP, msgb_free(), msgb_put(), msgb_tvlv_put(), NS_IE_CAUSE, NS_IE_NSEI, nsei, gprs_nsvc::nsei, gprs_nsvc::nsi, osmo_htons, gprs_ns_hdr::pdu_type, and SNS_PDUT_SIZE_ACK.

◆ gprs_ns_tx_status()

int gprs_ns_tx_status ( struct gprs_nsvc nsvc,
uint8_t  cause,
uint16_t  bvci,
struct msgb orig_msg 
)

◆ gprs_ns_tx_unblock()

int gprs_ns_tx_unblock ( struct gprs_nsvc nsvc)

Transmit a NS-UNBLOCK on a given NS-VC.

Parameters
[in]nsvcNS-VC on which the NS-UNBLOCK is to be transmitted
Returns
0 in case of success

References DNS, ERR_IF_NSVC_USES_SNS, gprs_ns_tx_simple(), LOG_CTX_GB_NSVC, log_set_context(), LOGL_INFO, LOGP, NS_PDUT_UNBLOCK, gprs_nsvc::nsei, and gprs_nsvc::nsvci.

Referenced by DEFUN(), and gprs_ns_process_msg().

◆ gprs_ns_vc_create()

int gprs_ns_vc_create ( struct gprs_ns_inst nsi,
struct msgb msg,
struct gprs_nsvc fallback_nsvc,
struct gprs_nsvc **  new_nsvc 
)

Create/get NS-VC independently from underlying transport layer.

Parameters
nsiNS instance to which the data belongs
[in]msgmessage buffer containing newly-received data
[in]fallback_nsvcis used to send error messages back to the peer and to initialise the ll info of a created NS-VC object
[out]new_nsvccontains a pointer to a NS-VC object if one has been created or found
Returns
< 0 in case of error, GPRS_NS_CS_SKIPPED if a message has been skipped, GPRS_NS_CS_REJECTED if a message has been rejected and answered accordingly, GPRS_NS_CS_CREATED if a new NS-VC object has been created and registered, and GPRS_NS_CS_FOUND if an existing NS-VC object has been found with the same NSEI.

This contains the initial NS automaton state (NS-VC not yet attached).

References CHECK_TX_RC, gprs_ns_hdr::data, DNS, get_value_string(), GPRS_NS_CS_CREATED, GPRS_NS_CS_FOUND, GPRS_NS_CS_REJECTED, GPRS_NS_CS_SKIPPED, gprs_ns_ll_copy(), gprs_ns_ll_str(), gprs_ns_tx_status(), gprs_nsvc_by_nsvci(), gprs_nsvc_create2(), if(), msgb::l2h, LOG_CTX_GB_NSVC, log_set_context(), LOGL_ERROR, LOGL_INFO, LOGL_NOTICE, LOGP, msgb_l2len(), NS_CAUSE_MISSING_ESSENT_IE, NS_CAUSE_PDU_INCOMP_PSTATE, NS_CTR_NSEI_CHG, NS_IE_CAUSE, NS_IE_NSEI, NS_IE_VCI, NS_PDUT_ALIVE_ACK, NS_PDUT_RESET, NS_PDUT_RESET_ACK, NS_PDUT_STATUS, ns_set_state, NSE_S_ALIVE, nsei, gprs_nsvc::nsei, gprs_nsvc::nsvci, gprs_nsvc::nsvci_is_valid, gprs_ns_hdr::pdu_type, rate_ctr_inc(), tlv_parse(), TLVP_PRESENT, and tlvp_val16be().

Referenced by gprs_ns_rcvmsg(), and gprs_ns_rx_block().

◆ gprs_nsvc_by_nsei()

struct gprs_nsvc* gprs_nsvc_by_nsei ( struct gprs_ns_inst nsi,
uint16_t  nsei 
)

Lookup struct gprs_nsvc based on NSEI.

Parameters
[in]nsiNS instance in which to search
[in]nseiNSEI to be searched
Returns
first gprs_nsvc of respective NSEI

References gprs_ns_inst::gprs_nsvcs, gprs_nsvc::list, llist_for_each_entry, and gprs_nsvc::nsei.

Referenced by DEFUN(), and gprs_ns_sendmsg().

◆ gprs_nsvc_by_nsvci()

struct gprs_nsvc* gprs_nsvc_by_nsvci ( struct gprs_ns_inst nsi,
uint16_t  nsvci 
)

Lookup struct gprs_nsvc based on NSVCI.

Parameters
[in]nsiNS instance in which to search
[in]nsvciNSVCI to be searched
Returns
gprs_nsvc of respective NSVCI

References gprs_ns_inst::gprs_nsvcs, gprs_nsvc::list, llist_for_each_entry, and gprs_nsvc::nsvci.

Referenced by DEFUN(), gprs_ns_vc_create(), gprs_nsvc_create2(), and gprs_nsvc_replace_if_found().

◆ gprs_nsvc_by_rem_addr()

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.

Parameters
[in]nsiNS Instance within which we shall look up the NS-VC
[in]sinRemote peer Socket Address (IP + UDP Port)
Returns
NS-VC matching the given peer; NULL in case of none

References data, gprs_ns_timer_cb(), gprs_ns_inst::gprs_nsvcs, gprs_nsvc::ip, gprs_nsvc::list, and llist_for_each_entry.

Referenced by gprs_ns_nsip_connect(), gprs_ns_nsip_connect_sns(), gprs_ns_rcvmsg(), and nsvc_by_ip4_elem().

◆ gprs_nsvc_create2()

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.

Parameters
[in]nsiNS Instance in which to create the NSVC
[in]nsvci]NS Virtual Connection Identifier for this NSVC
[in]sig_weightSignalling Weight of this NS-VC. Use "0" for no signalling
[in]data_weightData WEight of this NS-VC. Use "0" for no data
Returns
newly-created gprs_nsvc within nsi. NULL on error.

References gprs_ns_inst::bss_sns_fi, gprs_nsvc::ctrg, gprs_nsvc::data_weight, data_weight, DNS, gprs_ns_timer_cb(), gprs_nsvc_by_nsvci(), gprs_ns_inst::gprs_nsvcs, gprs_nsvc::list, llist_add(), LOGL_ERROR, LOGL_INFO, LOGP, ns_set_state, NSE_S_BLOCKED, gprs_nsvc::nsi, gprs_ns_inst::nsip, gprs_nsvc::nsvci, gprs_nsvc::nsvci_is_valid, osmo_stat_item_group_alloc(), osmo_timer_setup(), rate_ctr_group_alloc(), gprs_nsvc::sig_weight, sig_weight, gprs_nsvc::statg, gprs_nsvc::timer, and gprs_ns_inst::use_reset_block_unblock.

Referenced by DEFUN(), gprs_ns_instantiate(), gprs_ns_nsip_connect(), gprs_ns_nsip_connect_sns(), gprs_ns_rx_reset(), gprs_ns_vc_create(), and gprs_nsvc_create_ip4().

◆ gprs_nsvc_delete()

void gprs_nsvc_delete ( struct gprs_nsvc nsvc)

◆ gprs_nsvc_replace_if_found()

static int gprs_nsvc_replace_if_found ( uint16_t  nsvci,
struct gprs_nsvc **  nsvc,
struct gprs_nsvc **  old_nsvc 
)
static

◆ gprs_nsvc_reset()

int gprs_nsvc_reset ( struct gprs_nsvc nsvc,
uint8_t  cause 
)

Initiate a RESET procedure.

Parameters
[in]nsvcNS-VC in which to start the procedure
[in]causeNumeric NS cause value

This is a high-level function initiating a NS-RESET procedure. It will not only send a NS-RESET, but also set the state to BLOCKED and start the Tns-reset timer.

References DNS, ERR_IF_NSVC_USES_SNS, gprs_ns_tx_reset(), LOGL_ERROR, LOGL_INFO, LOGP, ns_set_state, NSE_S_BLOCKED, NSE_S_RESET, gprs_nsvc::nsei, nsvc_start_timer(), and NSVC_TIMER_TNS_RESET.

Referenced by DEFUN(), gprs_ns_nsip_connect(), and gprs_ns_process_msg().

◆ gprs_nsvc_start_test()

void gprs_nsvc_start_test ( struct gprs_nsvc nsvc)

Start the ALIVE timer procedure in all NS-VCs part of this NS Instance.

References gprs_ns_tx_alive(), nsvc_is_not_used(), nsvc_start_timer(), and NSVC_TIMER_TNS_TEST.

Referenced by do_sns_add(), gprs_ns_rx_reset(), gprs_ns_rx_reset_ack(), and gprs_start_alive_all_nsvcs().

◆ gprs_nsvc_state_append()

char* gprs_nsvc_state_append ( char *  s,
struct gprs_nsvc nsvc 
)

Append the nsvc state to a talloc string.

Parameters
sThe string to append to (allocated with talloc)
[in]nsvcThe NS-VC to print the state of
Returns
The new string with state information appended to it

This function will append a comma-separated state of the NS-VC to the string. The string needs to be allocated with talloc (e.g. talloc_strdup)

References NS_DESC_A, NS_DESC_B, gprs_nsvc::nsei, gprs_nsvc::nsvci, gprs_nsvc::remote_end_is_sgsn, gprs_nsvc::remote_state, and gprs_nsvc::state.

◆ gprs_start_alive_all_nsvcs()

void gprs_start_alive_all_nsvcs ( struct gprs_ns_inst nsi)

◆ grps_ns_frgre_sendmsg()

int grps_ns_frgre_sendmsg ( struct gprs_nsvc nsvc,
struct msgb msg 
)

Referenced by gprs_ns_cause_str().

◆ handle_nsip_read()

static int handle_nsip_read ( struct osmo_fd bfd)
static

◆ handle_nsip_write()

static int handle_nsip_write ( struct osmo_fd bfd)
static

Referenced by nsip_fd_cb().

◆ ns2_count_transfer_cap()

int ns2_count_transfer_cap ( struct gprs_ns2_nse nse,
uint16_t  bvci 
)

calculate the transfer capabilities for a nse

Parameters
nsethe nse to count the transfer capability
bvcia bvci - unused
Returns
the transfer capability in mbit. On error < 0.

References add_bind_array(), gprs_ns2_nse::alive, gprs_ns2_vc::bind, gprs_ns2_vc_is_unblocked(), gprs_ns2_vc_bind::list, llist_for_each_entry, gprs_ns2_nse::nsvc, OSMO_ASSERT, and gprs_ns2_vc_bind::transfer_capability.

Referenced by ns2_prim_status_ind().

◆ ns2_create_vc()

enum gprs_ns2_cs ns2_create_vc ( struct gprs_ns2_vc_bind bind,
struct msgb msg,
const char *  logname,
struct msgb **  reject,
struct gprs_ns2_vc **  success 
)

Create a new NS-VC based on a [received] message.

Depending on the bind it might create a NSE.

Parameters
[in]bindthe bind through which msg was received
[in]msgthe actual received message
[in]lognameA name to describe the VC. E.g. ip address pair
[out]rejectA message filled to be sent back. Only used in failure cases.
[out]successA pointer which will be set to the new VC on success
Returns
enum value indicating the status, e.g. GPRS_NS2_CS_CREATED

References gprs_ns2_vc_bind::accept_ipaccess, gprs_ns2_inst::create_nse, gprs_ns_hdr::data, DLNS, gprs_ns2_create_nse(), GPRS_NS2_CS_CREATED, GPRS_NS2_CS_ERROR, GPRS_NS2_CS_REJECTED, GPRS_NS2_CS_SKIPPED, gprs_ns2_dialect_to_vc_mode(), gprs_ns2_nse_by_nsei(), if(), msgb::l2h, msgb::len, gprs_ns2_vc_bind::ll, LOGL_ERROR, LOGL_INFO, LOGP, msgb_l2len(), NS2_DIALECT_IPACCESS, ns2_tlv_parse(), ns2_vc_alloc(), NS_CAUSE_MISSING_ESSENT_IE, NS_CAUSE_PDU_INCOMP_PSTATE, NS_CAUSE_PROTO_ERR_UNSPEC, NS_IE_CAUSE, NS_IE_NSEI, NS_IE_VCI, NS_PDUT_ALIVE_ACK, NS_PDUT_RESET, NS_PDUT_RESET_ACK, NS_PDUT_STATUS, nsei, gprs_ns2_vc_bind::nsi, gprs_ns_hdr::pdu_type, reject_status_msg(), TLVP_PRES_LEN, and tlvp_val16be().

Referenced by handle_nsfrgre_read(), and handle_nsip_read().

◆ ns2_load_sharing()

static struct gprs_ns2_vc* ns2_load_sharing ( struct gprs_ns2_nse nse,
uint16_t  bvci,
uint32_t  link_selector 
)
static

◆ ns2_load_sharing_first()

struct gprs_ns2_vc* ns2_load_sharing_first ( struct gprs_ns2_nse nse)

◆ ns2_load_sharing_modulor()

static struct gprs_ns2_vc* ns2_load_sharing_modulor ( struct gprs_ns2_nse nse,
uint16_t  bvci,
uint32_t  load_selector 
)
static

◆ ns2_load_sharing_signal()

static struct gprs_ns2_vc* ns2_load_sharing_signal ( struct gprs_ns2_nse nse)
static

◆ ns2_nse_data_sum()

◆ ns2_nse_notify_unblocked()

void ns2_nse_notify_unblocked ( struct gprs_ns2_vc nsvc,
bool  unblocked 
)

Notify a nse about the change of a NS-VC.

Parameters
[in]nsvcNS-VC which has detected the change (and shall not be notified).
[in]unblockedwhether the NSE should be marked as unblocked (true) or blocked (false)

References gprs_ns2_nse::alive, gprs_ns2_nse::first, gprs_ns2_vc_is_unblocked(), gprs_ns2_vc::list, llist_for_each_entry, ns2_nse_data_sum(), ns2_prim_status_ind(), NS_AFF_CAUSE_FAILURE, NS_AFF_CAUSE_RECOVERY, gprs_ns2_vc::nse, and gprs_ns2_nse::nsvc.

Referenced by gprs_ns2_free_nsvc(), gprs_ns2_st_alive_onenter(), gprs_ns2_st_reset_onenter(), and gprs_ns2_st_unblocked_on_enter().

◆ ns2_prim_status_ind()

void ns2_prim_status_ind ( struct gprs_ns2_nse nse,
struct gprs_ns2_vc nsvc,
uint16_t  bvci,
enum gprs_ns2_affecting_cause  cause 
)

◆ ns2_recv_vc()

int ns2_recv_vc ( struct gprs_ns2_vc nsvc,
struct msgb msg 
)

Bottom-side entry-point for received NS PDU from the driver/bind.

Parameters
[in]nsvcNS-VC for which the message was received
msgthe received message. Ownership is trasnferred, caller must not free it!
Returns
0 on success; negative on error

References gprs_ns_hdr::data, DLNS, gprs_ns2_sns_rx(), gprs_ns2_vc_rx(), msgb::l2h, msgb::len, LOG_CTX_GB_NSE, LOG_CTX_GB_NSVC, log_set_context(), LOGL_NOTICE, LOGP, msgb_hexdump(), msgb_l2len(), ns2_tlv_parse(), ns2_tx_status(), NS_CAUSE_PROTO_ERR_UNSPEC, NS_IE_NSEI, NS_IE_TRANS_ID, NS_PDUT_STATUS, NS_PDUT_UNITDATA, gprs_ns2_vc::nse, gprs_ns_hdr::pdu_type, SNS_PDUT_ACK, SNS_PDUT_ADD, SNS_PDUT_CHANGE_WEIGHT, SNS_PDUT_CONFIG, SNS_PDUT_CONFIG_ACK, SNS_PDUT_DELETE, SNS_PDUT_SIZE, and SNS_PDUT_SIZE_ACK.

Referenced by fr_dlci_rx_cb(), handle_nsfrgre_read(), and handle_nsip_read().

◆ ns2_tlv_parse()

static int ns2_tlv_parse ( struct tlv_parsed dec,
const uint8_t *  buf,
int  buf_len,
uint8_t  lv_tag,
uint8_t  lv_tag2 
)
inlinestatic

References tlv_parse().

Referenced by ns2_create_vc(), and ns2_recv_vc().

◆ ns2_vc_alloc()

struct gprs_ns2_vc* ns2_vc_alloc ( struct gprs_ns2_vc_bind bind,
struct gprs_ns2_nse nse,
bool  initiater,
enum gprs_ns2_vc_mode  vc_mode 
)

Allocate a NS-VC within the given bind + NSE.

Parameters
[in]bindThe 'bind' on which we operate
[in]nseThe NS Entity on which we operate
[in]initiater- if this is an incoming remote (!initiater) or a local outgoing connection (initater)
Returns
newly allocated NS-VC on success; NULL on error

References gprs_ns2_vc::bind, gprs_ns2_vc::blist, gprs_ns2_vc::ctrg, gprs_ns2_vc::data_weight, gprs_ns2_vc_fsm_alloc(), gprs_ns2_vc::list, llist_add(), gprs_ns2_vc::mode, gprs_ns2_vc::nse, gprs_ns2_vc_bind::nsi, gprs_ns2_nse::nsvc, gprs_ns2_vc_bind::nsvc, osmo_stat_item_group_alloc(), osmo_stat_item_group_free(), rate_ctr_group_alloc(), rate_ctr_group_free(), gprs_ns2_inst::rate_ctr_idx, gprs_ns2_vc::sig_weight, and gprs_ns2_vc::statg.

Referenced by gprs_ns2_fr_connect(), gprs_ns2_fr_connect2(), gprs_ns2_ip_bind_connect(), and ns2_create_vc().

◆ ns_is_sns()

◆ ns_osmo_signal_dispatch()

static void ns_osmo_signal_dispatch ( struct gprs_nsvc nsvc,
unsigned int  signal,
uint8_t  cause 
)
static

◆ ns_osmo_signal_dispatch_mismatch()

static void ns_osmo_signal_dispatch_mismatch ( struct gprs_nsvc nsvc,
struct msgb msg,
uint8_t  pdu_type,
uint8_t  ie_type 
)
static

◆ ns_osmo_signal_dispatch_replaced()

static void ns_osmo_signal_dispatch_replaced ( struct gprs_nsvc nsvc,
struct gprs_nsvc old_nsvc 
)
static

◆ ns_set_state_with_log()

static void ns_set_state_with_log ( struct gprs_nsvc nsvc,
uint32_t  state,
bool  is_remote,
const char *  file,
unsigned  line 
)
inlinestatic

◆ nsip_fd_cb()

static int nsip_fd_cb ( struct osmo_fd bfd,
unsigned int  what 
)
static

◆ nsip_sendmsg()

static int nsip_sendmsg ( struct gprs_nsvc nsvc,
struct msgb msg 
)
static

◆ nsvc_is_not_used()

static bool nsvc_is_not_used ( const struct gprs_nsvc nsvc)
static

◆ nsvc_start_timer()

◆ nsvc_timer_elapsed_ms()

static int nsvc_timer_elapsed_ms ( struct gprs_nsvc nsvc)
static

◆ read_nsip_msg()

static struct msgb* read_nsip_msg ( struct osmo_fd bfd,
int *  error,
struct sockaddr_in *  saddr 
)
static

◆ reject_status_msg()

static int reject_status_msg ( struct msgb orig_msg,
struct tlv_parsed tp,
struct msgb **  reject,
enum ns_cause  cause 
)
static

Create a status message to be sent over a new connection.

Parameters
[in]orig_msgthe original message
[in]tpTLVP parsed of the original message
[out]rejectcallee-allocated message buffer of the generated NS-STATUS
[in]causeCause for the rejection
Returns
0 on success

References DLNS, gprs_ns2_cause_str(), gprs_ns2_msgb_alloc(), msgb::l2h, LOGL_NOTICE, LOGP, msg, msgb_free(), msgb_l2len(), msgb_put(), msgb_tvlv_put(), NS_CAUSE_INVAL_ESSENT_IE, NS_CAUSE_MISSING_ESSENT_IE, NS_CAUSE_NSVC_BLOCKED, NS_CAUSE_NSVC_UNKNOWN, NS_CAUSE_PDU_INCOMP_PSTATE, NS_CAUSE_PROTO_ERR_UNSPEC, NS_CAUSE_SEM_INCORR_PDU, NS_IE_CAUSE, NS_IE_NSEI, NS_IE_PDU, NS_IE_VCI, NS_PDUT_STATUS, nsei, gprs_ns_hdr::pdu_type, TLVP_PRES_LEN, TLVP_VAL, and tlvp_val16be().

Referenced by ns2_create_vc().

Variable Documentation

◆ __attribute__

enum ns_pdu_type __attribute__

◆ data [1/2]

◆ data [2/2]

◆ data_weight [1/3]

◆ data_weight [2/3]

◆ data_weight [3/3]

uint8_t data_weight

Referenced by gprs_nsvc_create2().

◆ gprs_ns2_aff_cause_prim_strs

const struct value_string gprs_ns2_aff_cause_prim_strs[]
Initial value:
= {
{ NS_AFF_CAUSE_VC_FAILURE, "NSVC failure" },
{ NS_AFF_CAUSE_VC_RECOVERY, "NSVC recovery" },
{ NS_AFF_CAUSE_FAILURE, "NSE failure" },
{ NS_AFF_CAUSE_RECOVERY, "NSE recovery" },
{ NS_AFF_CAUSE_SNS_CONFIGURED, "NSE SNS configured" },
{ NS_AFF_CAUSE_SNS_FAILURE, "NSE SNS failure" },
{ 0, NULL }
}
Definition: gprs_ns2.h:79
Definition: gprs_ns2.h:85
Definition: gprs_ns2.h:84
Definition: gprs_ns2.h:81
Definition: gprs_ns2.h:80
Definition: gprs_ns2.h:82

Referenced by gprs_ns2_aff_cause_prim_str().

◆ gprs_ns2_cause_strs

const struct value_string gprs_ns2_cause_strs[]
Initial value:
= {
{ NS_CAUSE_TRANSIT_FAIL, "Transit network failure" },
{ NS_CAUSE_OM_INTERVENTION, "O&M intervention" },
{ NS_CAUSE_EQUIP_FAIL, "Equipment failure" },
{ NS_CAUSE_NSVC_BLOCKED, "NS-VC blocked" },
{ NS_CAUSE_NSVC_UNKNOWN, "NS-VC unknown" },
{ NS_CAUSE_BVCI_UNKNOWN, "BVCI unknown" },
{ NS_CAUSE_SEM_INCORR_PDU, "Semantically incorrect PDU" },
{ NS_CAUSE_PDU_INCOMP_PSTATE, "PDU not compatible with protocol state" },
{ NS_CAUSE_PROTO_ERR_UNSPEC, "Protocol error, unspecified" },
{ NS_CAUSE_INVAL_ESSENT_IE, "Invalid essential IE" },
{ NS_CAUSE_MISSING_ESSENT_IE, "Missing essential IE" },
{ NS_CAUSE_INVAL_NR_IPv4_EP, "Invalid Number of IPv4 Endpoints" },
{ NS_CAUSE_INVAL_NR_IPv6_EP, "Invalid Number of IPv6 Endpoints" },
{ NS_CAUSE_INVAL_NR_NS_VC, "Invalid Number of NS-VCs" },
{ NS_CAUSE_INVAL_WEIGH, "Invalid Weights" },
{ NS_CAUSE_UNKN_IP_EP, "Unknown IP Endpoint" },
{ NS_CAUSE_UNKN_IP_ADDR, "Unknown IP Address" },
{ NS_CAUSE_UNKN_IP_TEST_FAILED, "IP Test Failed" },
{ 0, NULL }
}
Definition: gsm_08_16.h:90
Definition: gsm_08_16.h:97
Definition: gsm_08_16.h:94
Definition: gsm_08_16.h:88
Definition: gsm_08_16.h:86
Definition: gsm_08_16.h:84
Definition: gsm_08_16.h:89
Definition: gsm_08_16.h:98
Definition: gsm_08_16.h:96
Definition: gsm_08_16.h:85
Definition: gsm_08_16.h:100
Definition: gsm_08_16.h:101
Definition: gsm_08_16.h:87
Definition: gsm_08_16.h:91
Definition: gsm_08_16.h:99
Definition: gsm_08_16.h:93
Definition: gsm_08_16.h:92
Definition: gsm_08_16.h:102

Referenced by gprs_ns2_cause_str().

◆ gprs_ns2_lltype_strs

const struct value_string gprs_ns2_lltype_strs[]
Initial value:
= {
{ GPRS_NS2_LL_UDP, "UDP" },
{ GPRS_NS2_LL_FR_GRE, "FR_GRE" },
{ GPRS_NS2_LL_FR, "FR" },
{ 0, NULL }
}
NS/UDP/IP.
Definition: gprs_ns2.h:46
NS/FR.
Definition: gprs_ns2.h:47
NS/FR/GRE/IP.
Definition: gprs_ns2.h:48

Referenced by gprs_ns2_lltype_str().

◆ gprs_ns2_prim_strs

const struct value_string gprs_ns2_prim_strs[]
Initial value:
= {
{ PRIM_NS_UNIT_DATA, "UNIT DATA" },
{ PRIM_NS_CONGESTION, "CONGESTION" },
{ PRIM_NS_STATUS, "STATUS" },
{ 0, NULL }
}
Definition: gprs_ns2.h:53
Definition: gprs_ns2.h:55
Definition: gprs_ns2.h:54

Referenced by gprs_ns2_prim_str().

◆ gprs_ns_pdu_strings [1/2]

const struct value_string gprs_ns_pdu_strings[]

◆ gprs_ns_pdu_strings [2/2]

const struct value_string gprs_ns_pdu_strings[]
Initial value:
= {
{ NS_PDUT_UNITDATA, "NS-UNITDATA" },
{ NS_PDUT_RESET, "NS-RESET" },
{ NS_PDUT_RESET_ACK, "NS-RESET-ACK" },
{ NS_PDUT_BLOCK, "NS-BLOCK" },
{ NS_PDUT_BLOCK_ACK, "NS-BLOCK-ACK" },
{ NS_PDUT_UNBLOCK, "NS-UNBLOCK" },
{ NS_PDUT_UNBLOCK_ACK, "NS-UNBLOCK-ACK" },
{ NS_PDUT_STATUS, "NS-STATUS" },
{ NS_PDUT_ALIVE, "NS-ALIVE" },
{ NS_PDUT_ALIVE_ACK, "NS-ALIVE-ACK" },
{ SNS_PDUT_ACK, "SNS-ACK" },
{ SNS_PDUT_ADD, "SNS-ADD" },
{ SNS_PDUT_CHANGE_WEIGHT, "SNS-CHANGEWEIGHT" },
{ SNS_PDUT_CONFIG, "SNS-CONFIG" },
{ SNS_PDUT_CONFIG_ACK, "SNS-CONFIG-ACK" },
{ SNS_PDUT_DELETE, "SNS-DELETE" },
{ SNS_PDUT_SIZE, "SNS-SIZE" },
{ SNS_PDUT_SIZE_ACK, "SNS-SIZE-ACK" },
{ 0, NULL }
}
Definition: gsm_08_16.h:56
Definition: gsm_08_16.h:52
Definition: gsm_08_16.h:59
Definition: gsm_08_16.h:49
Definition: gsm_08_16.h:51
Definition: gsm_08_16.h:46
Definition: gsm_08_16.h:45
Definition: gsm_08_16.h:50
Definition: gsm_08_16.h:44
Definition: gsm_08_16.h:58
Definition: gsm_08_16.h:55
Definition: gsm_08_16.h:61
Definition: gsm_08_16.h:47
Definition: gsm_08_16.h:60
Definition: gsm_08_16.h:43
Definition: gsm_08_16.h:54
Definition: gsm_08_16.h:57
Definition: gsm_08_16.h:48

Referenced by gprs_ns2_sns_rx(), gprs_ns2_vc_rx(), and gprs_ns_rx_sns().

◆ gprs_ns_signal_ns_names

const struct value_string gprs_ns_signal_ns_names[]
Initial value:
= {
{ S_NS_RESET, "NS-RESET" },
{ S_NS_BLOCK, "NS-BLOCK" },
{ S_NS_UNBLOCK, "NS-UNBLOCK" },
{ S_NS_ALIVE_EXP, "NS-ALIVE expired" },
{ S_NS_REPLACED, "NSVC replaced" },
{ S_NS_MISMATCH, "Unexpected IE" },
{ S_SNS_CONFIGURED, "SNS Configured" },
{ 0, NULL }
}
Definition: gprs_ns.h:238
Definition: gprs_ns.h:236
Definition: gprs_ns.h:234
Definition: gprs_ns.h:233
Definition: gprs_ns.h:239
Definition: gprs_ns.h:235
Definition: gprs_ns.h:237

◆ gprs_sns_fsm_registered

bool gprs_sns_fsm_registered = false
static

Referenced by gprs_ns_instantiate().

◆ ip_addr [1/3]

◆ ip_addr [2/3]

struct in6_addr ip_addr

◆ ip_addr [3/3]

◆ ns_att_tlvdef

const struct tlv_definition ns_att_tlvdef
static
Initial value:
= {
.def = {
},
}
Definition: gsm_08_16.h:76
Definition: gsm_08_16.h:74
Definition: gsm_08_16.h:70
TLV_TYPE_TV
Definition: gsm_08_16.h:66
Definition: gsm_08_16.h:78
Definition: gsm_08_16.h:73
Definition: gsm_08_16.h:72
Definition: gsm_08_16.h:69
TLV_TYPE_FIXED
Definition: gsm_08_16.h:77
Definition: gsm_08_16.h:75
Definition: gsm_08_16.h:68
TLV_TYPE_TvLV
Definition: gsm_08_16.h:67

◆ ns_att_tlvdef1

const struct tlv_definition ns_att_tlvdef1
static
Initial value:
= {
.def = {
},
}
Definition: gsm_08_16.h:76
Definition: gsm_08_16.h:74
Definition: gsm_08_16.h:70
TLV_TYPE_TV
Definition: gsm_08_16.h:66
Definition: gsm_08_16.h:78
Definition: gsm_08_16.h:73
Definition: gsm_08_16.h:72
Definition: gsm_08_16.h:69
TLV_TYPE_FIXED
Definition: gsm_08_16.h:77
Definition: gsm_08_16.h:75
Definition: gsm_08_16.h:68
TLV_TYPE_TvLV
Definition: gsm_08_16.h:67

◆ ns_att_tlvdef2

const struct tlv_definition ns_att_tlvdef2
static
Initial value:
= {
.def = {
},
}
Definition: gsm_08_16.h:76
Definition: gsm_08_16.h:74
Definition: gsm_08_16.h:70
TLV_TYPE_TV
Definition: gsm_08_16.h:66
Definition: gsm_08_16.h:78
Definition: gsm_08_16.h:73
Definition: gsm_08_16.h:72
Definition: gsm_08_16.h:69
TLV_TYPE_FIXED
Definition: gsm_08_16.h:77
Definition: gsm_08_16.h:75
Definition: gsm_08_16.h:68
TLV_TYPE_TvLV
Definition: gsm_08_16.h:67

◆ ns_cause_str

const struct value_string ns_cause_str[]
static
Initial value:
= {
{ NS_CAUSE_TRANSIT_FAIL, "Transit network failure" },
{ NS_CAUSE_OM_INTERVENTION, "O&M intervention" },
{ NS_CAUSE_EQUIP_FAIL, "Equipment failure" },
{ NS_CAUSE_NSVC_BLOCKED, "NS-VC blocked" },
{ NS_CAUSE_NSVC_UNKNOWN, "NS-VC unknown" },
{ NS_CAUSE_BVCI_UNKNOWN, "BVCI unknown" },
{ NS_CAUSE_SEM_INCORR_PDU, "Semantically incorrect PDU" },
{ NS_CAUSE_PDU_INCOMP_PSTATE, "PDU not compatible with protocol state" },
{ NS_CAUSE_PROTO_ERR_UNSPEC, "Protocol error, unspecified" },
{ NS_CAUSE_INVAL_ESSENT_IE, "Invalid essential IE" },
{ NS_CAUSE_MISSING_ESSENT_IE, "Missing essential IE" },
{ NS_CAUSE_INVAL_NR_IPv4_EP, "Invalid Number of IPv4 Endpoints" },
{ NS_CAUSE_INVAL_NR_IPv6_EP, "Invalid Number of IPv6 Endpoints" },
{ NS_CAUSE_INVAL_NR_NS_VC, "Invalid Number of NS-VCs" },
{ NS_CAUSE_INVAL_WEIGH, "Invalid Weights" },
{ NS_CAUSE_UNKN_IP_EP, "Unknown IP Endpoint" },
{ NS_CAUSE_UNKN_IP_ADDR, "Unknown IP Address" },
{ NS_CAUSE_UNKN_IP_TEST_FAILED, "IP Test Failed" },
{ 0, NULL }
}
Definition: gsm_08_16.h:90
Definition: gsm_08_16.h:97
Definition: gsm_08_16.h:94
Definition: gsm_08_16.h:88
Definition: gsm_08_16.h:86
Definition: gsm_08_16.h:84
Definition: gsm_08_16.h:89
Definition: gsm_08_16.h:98
Definition: gsm_08_16.h:96
Definition: gsm_08_16.h:85
Definition: gsm_08_16.h:100
Definition: gsm_08_16.h:101
Definition: gsm_08_16.h:87
Definition: gsm_08_16.h:91
Definition: gsm_08_16.h:99
Definition: gsm_08_16.h:93
Definition: gsm_08_16.h:92
Definition: gsm_08_16.h:102

◆ nsvc_ctr_description [1/2]

const struct rate_ctr_desc nsvc_ctr_description[]
static
Initial value:
= {
{ "packets:in", "Packets at NS Level ( In)" },
{ "packets:out","Packets at NS Level (Out)" },
{ "bytes:in", "Bytes at NS Level ( In)" },
{ "bytes:out", "Bytes at NS Level (Out)" },
{ "blocked", "NS-VC Block count " },
{ "dead", "NS-VC gone dead count " },
{ "replaced", "NS-VC replaced other count" },
{ "nsei-chg", "NS-VC changed NSEI count " },
{ "inv-nsvci", "NS-VCI was invalid count " },
{ "inv-nsei", "NSEI was invalid count " },
{ "lost:alive", "ALIVE ACK missing count " },
{ "lost:reset", "RESET ACK missing count " },
}

◆ nsvc_ctr_description [2/2]

const struct rate_ctr_desc nsvc_ctr_description[]
static
Initial value:
= {
{ "packets:in", "Packets at NS Level ( In)" },
{ "packets:out","Packets at NS Level (Out)" },
{ "bytes:in", "Bytes at NS Level ( In)" },
{ "bytes:out", "Bytes at NS Level (Out)" },
{ "blocked", "NS-VC Block count " },
{ "dead", "NS-VC gone dead count " },
{ "replaced", "NS-VC replaced other count" },
{ "nsei-chg", "NS-VC changed NSEI count " },
{ "inv-nsvci", "NS-VCI was invalid count " },
{ "inv-nsei", "NSEI was invalid count " },
{ "lost:alive", "ALIVE ACK missing count " },
{ "lost:reset", "RESET ACK missing count " },
}

◆ nsvc_ctrg_desc [1/2]

const struct rate_ctr_group_desc nsvc_ctrg_desc
static
Initial value:
= {
.group_name_prefix = "ns:nsvc",
.group_description = "NSVC Peer Statistics",
.ctr_desc = nsvc_ctr_description,
.class_id = OSMO_STATS_CLASS_PEER,
}
static const struct rate_ctr_desc nsvc_ctr_description[]
Definition: gprs_ns.c:143
OSMO_STATS_CLASS_PEER
#define ARRAY_SIZE(x)

◆ nsvc_ctrg_desc [2/2]

const struct rate_ctr_group_desc nsvc_ctrg_desc
static
Initial value:
= {
.group_name_prefix = "ns:nsvc",
.group_description = "NSVC Peer Statistics",
.ctr_desc = nsvc_ctr_description,
.class_id = OSMO_STATS_CLASS_PEER,
}
static const struct rate_ctr_desc nsvc_ctr_description[]
Definition: gprs_ns2.c:162
OSMO_STATS_CLASS_PEER
#define ARRAY_SIZE(x)

◆ nsvc_stat_description [1/2]

const struct osmo_stat_item_desc nsvc_stat_description[]
static
Initial value:
= {
{ "alive.delay", "ALIVE response time ", "ms", 16, 0 },
}

◆ nsvc_stat_description [2/2]

const struct osmo_stat_item_desc nsvc_stat_description[]
static
Initial value:
= {
{ "alive.delay", "ALIVE response time ", "ms", 16, 0 },
}

◆ nsvc_statg_desc [1/2]

const struct osmo_stat_item_group_desc nsvc_statg_desc
static
Initial value:
= {
.group_name_prefix = "ns.nsvc",
.group_description = "NSVC Peer Statistics",
.item_desc = nsvc_stat_description,
.class_id = OSMO_STATS_CLASS_PEER,
}
OSMO_STATS_CLASS_PEER
static const struct osmo_stat_item_desc nsvc_stat_description[]
Definition: gprs_ns.c:170
#define ARRAY_SIZE(x)

◆ nsvc_statg_desc [2/2]

const struct osmo_stat_item_group_desc nsvc_statg_desc
static
Initial value:
= {
.group_name_prefix = "ns.nsvc",
.group_description = "NSVC Peer Statistics",
.item_desc = nsvc_stat_description,
.class_id = OSMO_STATS_CLASS_PEER,
}
OSMO_STATS_CLASS_PEER
static const struct osmo_stat_item_desc nsvc_stat_description[]
Definition: gprs_ns2.c:186
#define ARRAY_SIZE(x)

◆ pdu_type [1/2]

◆ pdu_type [2/2]

◆ sig_weight [1/3]

◆ sig_weight [2/3]

◆ sig_weight [3/3]

uint8_t sig_weight

Referenced by gprs_nsvc_create2().

◆ timer_mode_strs

const struct value_string timer_mode_strs[]
static
Initial value:
= {
{ NSVC_TIMER_TNS_RESET, "tns-reset" },
{ NSVC_TIMER_TNS_ALIVE, "tns-alive" },
{ NSVC_TIMER_TNS_TEST, "tns-test" },
{ 0, NULL }
}
Definition: gprs_ns.h:115
Definition: gprs_ns.h:117
Definition: gprs_ns.h:116

◆ timer_mode_tout

enum ns_timeout timer_mode_tout[_NSVC_TIMER_NR]
static
Initial value:
= {
}
Definition: gprs_ns.h:115
Definition: gprs_ns.h:117
Definition: gprs_ns.h:116
Definition: gprs_ns.h:38
Definition: gprs_ns.h:36
Definition: gprs_ns.h:39

Referenced by gprs_ns_timer_cb(), and nsvc_start_timer().

◆ udp_port [1/3]

◆ udp_port [2/3]

◆ udp_port [3/3]

uint16_t udp_port