Projects
osmocom:master
libosmo-sigtran
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 134
View file
commit_07796d3a0c9971b8225a9ff4fe48e89e95313f83.txt
Added
View file
commit_44a5f20fd0d5db44e33f21c8b84b4a47372ff127.txt
Deleted
View file
libosmo-sigtran_2.2.1.79.44a5.dsc -> libosmo-sigtran_2.2.1.90.0779.dsc
Changed
@@ -2,7 +2,7 @@ Source: libosmo-sigtran Binary: libosmo-sigtran12, libosmo-sigtran-dbg, libosmo-sigtran-doc, libosmo-sigtran-dev, osmo-stp, osmo-stp-dbg, osmo-stp-doc Architecture: any all -Version: 2.2.1.79.44a5 +Version: 2.2.1.90.0779 Maintainer: Osmocom team <openbsc@lists.osmocom.org> Homepage: https://projects.osmocom.org/projects/libosmo-sccp Standards-Version: 3.9.7 @@ -18,8 +18,8 @@ osmo-stp-dbg deb debug optional arch=any osmo-stp-doc deb doc optional arch=all Checksums-Sha1: - 018b6090bbcd7ad8416c9590fde5c75ca524dcea 273536 libosmo-sigtran_2.2.1.79.44a5.tar.xz + fb8a2ab38d89a9fea0416de28138d3ee4da74321 274668 libosmo-sigtran_2.2.1.90.0779.tar.xz Checksums-Sha256: - bec9742d214d4dab3a5de25601760d86c3d0f7379f9e884b7e2d5c345121adfb 273536 libosmo-sigtran_2.2.1.79.44a5.tar.xz + 92e6153208f0b2db2b7395ad23eb6d3e66e5761fd4897b909111f046d0dd7858 274668 libosmo-sigtran_2.2.1.90.0779.tar.xz Files: - e2736e457736ffcd5835a9e41456057e 273536 libosmo-sigtran_2.2.1.79.44a5.tar.xz + df7c9a5434cbd5740228a9165c81681e 274668 libosmo-sigtran_2.2.1.90.0779.tar.xz
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/.tarball-version -> libosmo-sigtran_2.2.1.90.0779.tar.xz/.tarball-version
Changed
@@ -1 +1 @@ -2.2.1.79-44a5 +2.2.1.90-0779
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/debian/changelog -> libosmo-sigtran_2.2.1.90.0779.tar.xz/debian/changelog
Changed
@@ -1,8 +1,8 @@ -libosmo-sigtran (2.2.1.79.44a5) unstable; urgency=medium +libosmo-sigtran (2.2.1.90.0779) unstable; urgency=medium * Automatically generated changelog entry for building the Osmocom master feed - -- Osmocom OBS scripts <info@osmocom.org> Wed, 01 Apr 2026 08:48:09 +0000 + -- Osmocom OBS scripts <info@osmocom.org> Wed, 01 Apr 2026 09:52:56 +0000 libosmo-sigtran (2.2.1) unstable; urgency=medium
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/include/osmocom/sigtran/sigtran_sap.h -> libosmo-sigtran_2.2.1.90.0779.tar.xz/include/osmocom/sigtran/sigtran_sap.h
Changed
@@ -27,7 +27,7 @@ OSMO_XLM_PRIM_M_AS_ACTIVE, OSMO_XLM_PRIM_M_AS_INACTIVE, OSMO_XLM_PRIM_M_AS_DOWN, - /* optional as per spec, not implemented yet */ + /* optional as per spec: */ OSMO_XLM_PRIM_M_RK_REG, OSMO_XLM_PRIM_M_RK_DEREG, };
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/Makefile.am -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/Makefile.am
Changed
@@ -30,6 +30,7 @@ tcap_trans_tracking.h \ xua_asp_fsm.h \ xua_as_fsm.h \ + xua_lm_sap.h \ xua_internal.h \ xua_msg.h \ xua_types.h \ @@ -92,6 +93,7 @@ xua_asp_fsm.c \ xua_as_fsm.c \ xua_default_lm_fsm.c \ + xua_lm_sap.c \ xua_msg.c \ xua_rkm.c \ xua_shared.c \
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/m3ua.c -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/m3ua.c
Changed
@@ -49,6 +49,7 @@ #include "ss7_asp.h" #include "ss7_internal.h" #include "xua_msg.h" +#include "xua_lm_sap.h" #define M3UA_MSGB_SIZE 1500 @@ -693,16 +694,13 @@ static int m3ua_rx_mgmt_err(struct osmo_ss7_asp *asp, struct xua_msg *xua) { uint32_t err_code = xua_msg_get_u32(xua, M3UA_IEI_ERR_CODE); - struct osmo_xlm_prim *prim; LOGPASP(asp, DLM3UA, LOGL_ERROR, "Received MGMT_ERR '%s': %s\n", get_value_string(m3ua_err_names, err_code), xua_msg_dump(xua, &xua_dialect_m3ua)); - /* report this to layer manager */ - prim = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_ERROR, PRIM_OP_INDICATION); - prim->u.error.code = err_code; - xua_asp_send_xlm_prim(asp, prim); + /* deliver that event to the ASP FSM */ + osmo_fsm_inst_dispatch(asp->fi, XUA_ASP_E_MGMT_ERROR, xua); /* NEVER return != 0 here, as we cannot respont to an ERR * message with another ERR! */ @@ -724,9 +722,8 @@ ntfy.info_string ? ntfy.info_string : ""); /* report this to layer manager */ - prim = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_NOTIFY, PRIM_OP_INDICATION); - prim->u.notify = ntfy; - xua_asp_send_xlm_prim(asp,prim); + prim = xua_xlm_prim_alloc_m_notify_ind(&ntfy); + xua_asp_send_xlm_prim(asp, prim); if (ntfy.info_string) talloc_free(ntfy.info_string); @@ -1169,7 +1166,7 @@ int rc; /* SNM only permitted in ACTIVE state */ - if (asp->fi->state != XUA_ASP_S_ACTIVE) { + if (!osmo_ss7_asp_active(asp)) { if (asp->fi->state == XUA_ASP_S_INACTIVE && asp->cfg.quirks & OSMO_SS7_ASP_QUIRK_SNM_INACTIVE) { LOGPASP(asp, DLM3UA, LOGL_NOTICE, "quirk snm_inactive active: "
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/ss7_asp.c -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/ss7_asp.c
Changed
@@ -59,6 +59,7 @@ #include "ss7_xua_srv.h" #include "xua_asp_fsm.h" #include "xua_as_fsm.h" +#include "xua_lm_sap.h" static int _setsockopt_peer_primary_addr(int fd, const struct osmo_sockaddr *saddr) { @@ -1540,6 +1541,9 @@ asp->cfg.adm_state.blocked ? "" : "no ", blocked ? "" : "no "); asp->cfg.adm_state.blocked = blocked; + + if (asp->cfg.adm_state.blocked) + osmo_fsm_inst_dispatch(asp->fi, XUA_ASP_E_ADM_BLOCKED, NULL); } /* Apply sane configs for unconfigured options and restart the ASP. */ @@ -1652,30 +1656,3 @@ } return true; } - -/* process a primitive from the xUA Layer Manager (LM) */ -int osmo_xlm_sap_down(struct osmo_ss7_asp *asp, struct osmo_prim_hdr *oph) -{ - struct osmo_xlm_prim *prim = (struct osmo_xlm_prim *) oph; - - LOGPASP(asp, DLSS7, LOGL_DEBUG, "Received XUA Layer Manager Primitive: %s)\n", - osmo_xlm_prim_name(&prim->oph)); - - switch (OSMO_PRIM_HDR(&prim->oph)) { - case OSMO_PRIM(OSMO_XLM_PRIM_M_RK_REG, PRIM_OP_REQUEST): - /* Layer Manager asks us to send a Routing Key Reg Request */ - xua_rkm_send_reg_req(asp, &prim->u.rk_reg.key, prim->u.rk_reg.traf_mode); - break; - case OSMO_PRIM(OSMO_XLM_PRIM_M_RK_DEREG, PRIM_OP_REQUEST): - /* Layer Manager asks us to send a Routing Key De-Reg Request */ - xua_rkm_send_dereg_req(asp, prim->u.rk_dereg.route_ctx); - break; - default: - LOGPASP(asp, DLSS7, LOGL_ERROR, "Unknown XUA Layer Manager Primitive: %s\n", - osmo_xlm_prim_name(&prim->oph)); - break; - } - - msgb_free(prim->oph.msg); - return 0; -}
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/ss7_xua_srv.c -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/ss7_xua_srv.c
Changed
@@ -55,6 +55,7 @@ #include "ss7_internal.h" #include "xua_asp_fsm.h" #include "xua_as_fsm.h" +#include "xua_lm_sap.h" #include "ss7_xua_srv.h" /***********************************************************************
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/sua.c -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/sua.c
Changed
@@ -1113,7 +1113,7 @@ static int sua_rx_snm(struct osmo_ss7_asp *asp, struct xua_msg *xua) { /* SNM only permitted in ACTIVE state */ - if (asp->fi->state != XUA_ASP_S_ACTIVE) { + if (!osmo_ss7_asp_active(asp)) { if (asp->fi->state == XUA_ASP_S_INACTIVE && asp->cfg.quirks & OSMO_SS7_ASP_QUIRK_SNM_INACTIVE) { LOGPASP(asp, DLSUA, LOGL_NOTICE, "quirk snm_inactive active: " "Accepting SSNM in state %s\n", osmo_fsm_inst_state_name(asp->fi));
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/xua_as_fsm.c -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/xua_as_fsm.c
Changed
@@ -296,7 +296,7 @@ if (asp_cmp == asp) continue; - if (asp->fi && asp->fi->state == XUA_ASP_S_ACTIVE) + if (osmo_ss7_asp_active(asp)) return true; }
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/xua_asp_fsm.c -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/xua_asp_fsm.c
Changed
@@ -36,6 +36,7 @@ #include "sccp_internal.h" #include "xua_asp_fsm.h" #include "xua_as_fsm.h" +#include "xua_lm_sap.h" #include "xua_internal.h" #ifdef WITH_TCAP_LOADSHARING @@ -73,7 +74,10 @@ { XUA_ASP_E_ASPSM_BEAT, "ASPSM_BEAT" }, { XUA_ASP_E_ASPSM_BEAT_ACK, "ASPSM_BEAT_ACK" }, + { XUA_ASP_E_MGMT_ERROR, "XUA_ASP_E_MGMT_ERROR" }, + { XUA_ASP_E_AS_ASSIGNED, "AS_ASSIGNED" }, + { XUA_ASP_E_ADM_BLOCKED, "ADM_BLOCKED" }, { IPA_ASP_E_ID_RESP, "IPA_CCM_ID_RESP" }, { IPA_ASP_E_ID_GET, "IPA_CCM_ID_GET" }, @@ -102,46 +106,6 @@ } t_beat; }; -struct osmo_xlm_prim *xua_xlm_prim_alloc(enum osmo_xlm_prim_type prim_type, - enum osmo_prim_operation op) -{ - struct osmo_xlm_prim *prim; - struct msgb *msg = msgb_alloc_headroom(2048+128, 128, "xua_asp-xlm msgb"); - if (!msg) - return NULL; - - prim = (struct osmo_xlm_prim *) msgb_put(msg, sizeof(*prim)); - osmo_prim_init(&prim->oph, XUA_SAP_LM, prim_type, op, msg); - - return prim; -} - -/* Send a XUA LM Primitive to the XUA Layer Manager (LM) */ -void xua_asp_send_xlm_prim(struct osmo_ss7_asp *asp, struct osmo_xlm_prim *prim) -{ - const struct osmo_xua_layer_manager *lm = asp->lm; - - if (lm && lm->prim_cb) - lm->prim_cb(&prim->oph, asp); - else { - LOGPFSML(asp->fi, LOGL_DEBUG, "No Layer Manager, dropping %s\n", - osmo_xlm_prim_name(&prim->oph)); - } - - msgb_free(prim->oph.msg); -} - -/* wrapper around send_xlm_prim for primitives without data */ -void xua_asp_send_xlm_prim_simple(struct osmo_ss7_asp *asp, - enum osmo_xlm_prim_type prim_type, - enum osmo_prim_operation op) -{ - struct osmo_xlm_prim *prim = xua_xlm_prim_alloc(prim_type, op); - if (!prim) - return; - xua_asp_send_xlm_prim(asp, prim); -} - static void send_xlm_prim_simple(struct osmo_fsm_inst *fi, enum osmo_xlm_prim_type prim_type, enum osmo_prim_operation op) @@ -212,6 +176,24 @@ return cnt; } +static int xua_asp_tx_unsolicited_aspia_ack(struct osmo_ss7_asp *asp) +{ + struct msgb *msg; + struct xua_msg *xua = xua_msg_alloc(); + + OSMO_ASSERT(xua); + + xua->hdr = XUA_HDR(SUA_MSGC_ASPTM, SUA_ASPTM_INACTIVE_ACK); + xua_msg_add_asp_rctx(xua, asp); + + msg = xua_to_msg(SUA_VERSION, xua); + xua_msg_free(xua); + if (!msg) + return -1; + + return osmo_ss7_asp_send(asp, msg); +} + /* ask the xUA implementation to transmit a specific message */ static int peer_send(struct osmo_fsm_inst *fi, int out_event, struct xua_msg *in) { @@ -394,6 +376,12 @@ } /* check if expected message was received + stop t_ack */ +static void stop_t_ack(struct osmo_fsm_inst *fi) +{ + struct xua_asp_fsm_priv *xafp = fi->priv; + LOGPFSML(fi, LOGL_DEBUG, "T(ack) stopped\n"); + osmo_timer_del(&xafp->t_ack.timer); +} static void check_stop_t_ack(struct osmo_fsm_inst *fi, uint32_t event) { struct xua_asp_fsm_priv *xafp = fi->priv; @@ -403,10 +391,8 @@ return; exp_ack = evt_ack_mapxafp->t_ack.out_event; - if (exp_ack && event == exp_ack) { - LOGPFSML(fi, LOGL_DEBUG, "T(ack) stopped\n"); - osmo_timer_del(&xafp->t_ack.timer); - } + if (exp_ack && event == exp_ack) + stop_t_ack(fi); } static void xua_t_beat_stop(struct osmo_fsm_inst *fi) @@ -893,7 +879,9 @@ static void xua_asp_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct xua_asp_fsm_priv *xafp = fi->priv; + struct osmo_ss7_asp *asp = xafp->asp; struct xua_msg *xua; + struct osmo_xlm_prim *oxp; switch (event) { case XUA_ASP_E_SCTP_COMM_DOWN_IND: @@ -911,9 +899,38 @@ LOGPFSML(fi, LOGL_DEBUG, "Rx HEARTBEAT ACK\n"); xafp->t_beat.unacked_beats = 0; break; + case XUA_ASP_E_MGMT_ERROR: + xua = data; + OSMO_ASSERT(xua); + /* Mark ongoing request as rejected, no need to retransmit: */ + stop_t_ack(fi); + /* report this to layer manager */ + oxp = xua_xlm_prim_alloc_m_error_ind(xua_msg_get_u32(xua, M3UA_IEI_ERR_CODE)); + xua_asp_send_xlm_prim(asp, oxp); + break; case XUA_ASP_E_AS_ASSIGNED: /* Ignore, only used in IPA asps so far. */ break; + case XUA_ASP_E_ADM_BLOCKED: + if (fi->state != XUA_ASP_S_ACTIVE) { + /* nothing to be done, ASPAC will be rejected when received. */ + return; + } + if (asp->cfg.role == OSMO_SS7_ASP_ROLE_SG) { + /* RFC4666 4.3.4.4: Transmit unsolicited ASPIA ACK no tnotify peer. + * "If the ASP receives an ASP Inactive Ack without having sent an + * ASP Inactive message, the ASP should now consider itself to be + * in the ASP-INACTIVE state. If the ASP was previously in the + * ASP-ACTIVE state, the ASP should then initiate procedures to + * return itself to its previous state." + */ + xua_asp_tx_unsolicited_aspia_ack(asp); + /* transition state and inform layer manager */ + osmo_fsm_inst_state_chg(fi, XUA_ASP_S_INACTIVE, 0, 0); + send_xlm_prim_simple(fi, OSMO_XLM_PRIM_M_ASP_INACTIVE, PRIM_OP_INDICATION); + } + /* TODO: implement ASP and IPSP roles. */ + break; default: break; } @@ -999,7 +1016,9 @@ S(XUA_ASP_E_SCTP_RESTART_IND) | S(XUA_ASP_E_ASPSM_BEAT) | S(XUA_ASP_E_ASPSM_BEAT_ACK) | - S(XUA_ASP_E_AS_ASSIGNED), + S(XUA_ASP_E_MGMT_ERROR) | + S(XUA_ASP_E_AS_ASSIGNED) | + S(XUA_ASP_E_ADM_BLOCKED), .allstate_action = xua_asp_allstate, .cleanup = xua_asp_fsm_cleanup, };
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/xua_asp_fsm.h -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/xua_asp_fsm.h
Changed
@@ -28,9 +28,15 @@ XUA_ASP_E_ASPSM_BEAT, XUA_ASP_E_ASPSM_BEAT_ACK, + /* Rx M3UA MGMT Error message from peer */ + XUA_ASP_E_MGMT_ERROR, + /* The ASP was added to an AS. data: (struct osmo_ss7_as *) */ XUA_ASP_E_AS_ASSIGNED, + /* The ASP became administratively blocked */ + XUA_ASP_E_ADM_BLOCKED, + /* IPA specific */ IPA_ASP_E_ID_RESP, IPA_ASP_E_ID_ACK,
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/xua_default_lm_fsm.c -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/xua_default_lm_fsm.c
Changed
@@ -37,6 +37,7 @@ #include "xua_internal.h" #include "xua_asp_fsm.h" +#include "xua_lm_sap.h" #include "ss7_as.h" #include "ss7_asp.h" #include "ss7_xua_srv.h" @@ -61,8 +62,10 @@ LM_E_ASP_UP_CONF, LM_E_ASP_UP_IND, LM_E_ASP_ACT_IND, + LM_E_ASP_INACT_CONF, LM_E_ASP_INACT_IND, LM_E_NOTIFY_IND, + LM_E_ERROR_IND, LM_E_AS_INACTIVE_IND, LM_E_AS_ACTIVE_IND, LM_E_AS_STATUS_IND, @@ -75,8 +78,10 @@ { LM_E_ASP_UP_CONF, "ASP-UP.conf" }, { LM_E_ASP_UP_IND, "ASP-UP.ind" }, { LM_E_ASP_ACT_IND, "ASP-ACT.ind" }, + { LM_E_ASP_INACT_CONF, "ASP-INACT.conf" }, { LM_E_ASP_INACT_IND, "ASP-INACT.ind" }, { LM_E_NOTIFY_IND, "NOTIFY.ind" }, + { LM_E_ERROR_IND, "ERROR.ind" }, { LM_E_AS_INACTIVE_IND, "AS-INACTIVE.ind" }, { LM_E_AS_ACTIVE_IND, "AS-ACTIVE.ind" }, { LM_E_AS_STATUS_IND, "AS-STATUS.ind" }, @@ -178,12 +183,9 @@ { struct ss7_as_asp_assoc *assoc; llist_for_each_entry(assoc, &asp->assoc_as_list, asp_entry) { - struct osmo_ss7_as *as = assoc->as; struct osmo_xlm_prim *prim; - prim = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_RK_REG, PRIM_OP_REQUEST); - OSMO_ASSERT(prim); - prim->u.rk_reg.key = as->cfg.routing_key; - prim->u.rk_reg.traf_mode = as->cfg.mode; + prim = xua_xlm_prim_alloc_m_rk_reg_req(&assoc->as->cfg.routing_key, + assoc->as->cfg.mode); osmo_xlm_sap_down(asp, &prim->oph); } } @@ -198,7 +200,7 @@ lmp->asp->cfg.role == OSMO_SS7_ASP_ROLE_IPSP) { /* Try to transition to ASP-UP, wait to receive message for a few seconds */ lm_fsm_state_chg(fi, S_WAIT_ASP_UP); - osmo_fsm_inst_dispatch(lmp->asp->fi, XUA_ASP_E_M_ASP_UP_REQ, NULL); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_ASP_UP, PRIM_OP_REQUEST); } /* role SG: Unimplemented, do nothing, stay in this state forever. */ break; @@ -207,6 +209,8 @@ static void lm_wait_asp_up(struct osmo_fsm_inst *fi, uint32_t event, void *data) { + const struct osmo_xlm_prim *oxp = data; + switch (event) { case LM_E_ASP_UP_CONF: ENSURE_ASP_OR_IPSP(fi, event); @@ -221,6 +225,16 @@ */ lm_fsm_state_chg(fi, S_WAIT_NOTIFY); break; + case LM_E_ERROR_IND: + ENSURE_ASP_OR_IPSP(fi, event); + OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_ERROR); + OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION); + /* Our ASPUP was most probably rejected by peer with an M3UA ERR. + * Log the issue and let the SS7_ASP_LM_T_WAIT_ASP_UP timer timeout in a while and + * then attempt again */ + LOGPFSML(fi, LOGL_NOTICE, "Received M-ERROR.ind with error code %u (%s)\n", + oxp->u.error.code, get_value_string(m3ua_err_names, oxp->u.error.code)); + break; } } @@ -251,7 +265,7 @@ break; lm_fsm_state_chg(fi, S_ACTIVE); - osmo_fsm_inst_dispatch(lmp->asp->fi, XUA_ASP_E_M_ASP_ACTIVE_REQ, NULL); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_ASP_ACTIVE, PRIM_OP_REQUEST); break; case LM_E_ASP_ACT_IND: ENSURE_SG_OR_IPSP(fi, event); @@ -264,7 +278,7 @@ * hopefully will bring the AS to active, too) */ lm_fsm_state_chg(fi, S_ACTIVE); if (lmp->asp->cfg.role != OSMO_SS7_ASP_ROLE_SG) - osmo_fsm_inst_dispatch(lmp->asp->fi, XUA_ASP_E_M_ASP_ACTIVE_REQ, NULL); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_ASP_ACTIVE, PRIM_OP_REQUEST); break; } }; @@ -272,20 +286,19 @@ static void lm_rkm_reg(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct xua_layer_manager_default_priv *lmp = fi->priv; - struct osmo_xlm_prim *oxp; + struct osmo_xlm_prim *oxp = data; int rc; switch (event) { case LM_E_RKM_REG_CONF: - oxp = data; if (oxp->u.rk_reg.status != M3UA_RKM_REG_SUCCESS) { LOGPFSML(fi, LOGL_NOTICE, "Received RKM_REG_RSP with negative result\n"); - ss7_asp_disconnect_stream(lmp->asp); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_SCTP_RELEASE, PRIM_OP_REQUEST); } else { unsigned long timeout_sec; rc = handle_reg_conf(fi, oxp->u.rk_reg.key.l_rk_id, oxp->u.rk_reg.key.context); if (rc < 0) - ss7_asp_disconnect_stream(lmp->asp); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_SCTP_RELEASE, PRIM_OP_REQUEST); /* RKM registration was successful, we can transition to WAIT_NOTIFY * state and assume that an NOTIFY/AS-INACTIVE arrives within * T_WAIT_NOTIFY_RKM seconds */ @@ -293,30 +306,63 @@ osmo_fsm_inst_state_chg(fi, S_WAIT_NOTIFY, timeout_sec, SS7_ASP_LM_T_WAIT_NOTIY_RKM); } break; + case LM_E_ERROR_IND: + ENSURE_ASP_OR_IPSP(fi, event); + OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_ERROR); + OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION); + /* Our RKM_REQ REQ was most probably rejected by peer with an M3UA ERR. + * Go back to Wait Notify to either wait for some notificaiton to re-attempt, + * or end up timing out and reconnecting. */ + LOGPFSML(fi, LOGL_NOTICE, "Received M-ERROR.ind with error code %u (%s)\n", + oxp->u.error.code, get_value_string(m3ua_err_names, oxp->u.error.code)); + lm_fsm_state_chg(fi, S_WAIT_NOTIFY); + break; } } static void lm_active(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct xua_layer_manager_default_priv *lmp = fi->priv; - struct osmo_xlm_prim *oxp; + struct osmo_xlm_prim *oxp = data; switch (event) { case LM_E_ASP_ACT_IND: /* This may come in IPSP if we received ASPAC from peer before it answered our ASPAC: */ ENSURE_IPSP(fi, event); break; + case LM_E_ASP_INACT_CONF: + ENSURE_ASP_OR_IPSP(fi, event); + /* RFC 4666 RFC4666 4.3.4.4: Rx unsolicited ASPIA ACK, usually triggered because + * peer's ASP became administratively blocked. + * Try to re-activate, if peer's ASP is indeed blocked we'll probably receive an + * ERR msg and continue from there in the case LM_E_ERROR_IND below. */ + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_ASP_ACTIVE, PRIM_OP_REQUEST); + break; case LM_E_AS_INACTIVE_IND: /* request the ASP to go into active state */ - osmo_fsm_inst_dispatch(lmp->asp->fi, XUA_ASP_E_M_ASP_ACTIVE_REQ, NULL); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_ASP_ACTIVE, PRIM_OP_REQUEST); break; case LM_E_NOTIFY_IND: - oxp = data; + ENSURE_ASP_OR_IPSP(fi, event); OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_NOTIFY); OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION); if (oxp->u.notify.status_type == M3UA_NOTIFY_T_STATCHG && - oxp->u.notify.status_info != M3UA_NOTIFY_I_AS_ACT) - lm_fsm_state_chg(fi, S_IDLE); + oxp->u.notify.status_info != M3UA_NOTIFY_I_AS_ACT) { + /* There not much we can do here, Go back to S_WAIT_NOTIFY to either wait for + * some notification to re-attempt, or end up timing out and reconnecting.*/ + lm_fsm_state_chg(fi, S_WAIT_NOTIFY); + } + break; + case LM_E_ERROR_IND: + ENSURE_ASP_OR_IPSP(fi, event); + OSMO_ASSERT(oxp->oph.primitive == OSMO_XLM_PRIM_M_ERROR); + OSMO_ASSERT(oxp->oph.operation == PRIM_OP_INDICATION); + /* Our ASPAC was most probably rejected by peer with an M3UA ERR. + * Go back to Wait Notify to either wait for some notificaiton to re-attempt, + * or end up timing out and reconnecting. */ + LOGPFSML(fi, LOGL_NOTICE, "Received M-ERROR.ind with error code %u (%s)\n", + oxp->u.error.code, get_value_string(m3ua_err_names, oxp->u.error.code)); + lm_fsm_state_chg(fi, S_WAIT_NOTIFY); break; } } @@ -339,7 +385,7 @@ /* we have been waiting for the ASP to come up, but it * failed to do so */ LOGPFSML(fi, LOGL_NOTICE, "Peer didn't send any ASP_UP in time! Restarting ASP\n"); - ss7_asp_disconnect_stream(lmp->asp); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_SCTP_RELEASE, PRIM_OP_REQUEST); break; case SS7_ASP_LM_T_WAIT_NOTIFY: if (lmp->asp->cfg.quirks & OSMO_SS7_ASP_QUIRK_NO_NOTIFY) { @@ -358,11 +404,11 @@ case SS7_ASP_LM_T_WAIT_NOTIY_RKM: /* No AS has reported via NOTIFY even after dynamic RKM * configuration */ - ss7_asp_disconnect_stream(lmp->asp); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_SCTP_RELEASE, PRIM_OP_REQUEST); break; case SS7_ASP_LM_T_WAIT_RK_REG_RESP: /* timeout of registration of routing key */ - ss7_asp_disconnect_stream(lmp->asp); + xlm_sap_down_simple(lmp->asp, OSMO_XLM_PRIM_M_SCTP_RELEASE, PRIM_OP_REQUEST); break; } return 0; @@ -378,7 +424,8 @@ }, S_WAIT_ASP_UP = { .in_event_mask = S(LM_E_ASP_UP_CONF) | - S(LM_E_ASP_UP_IND), + S(LM_E_ASP_UP_IND) | + S(LM_E_ERROR_IND), .out_state_mask = S(S_IDLE) | S(S_WAIT_NOTIFY), .name = "WAIT_ASP_UP", @@ -396,7 +443,8 @@ .action = lm_wait_notify, }, S_RKM_REG = { - .in_event_mask = S(LM_E_RKM_REG_CONF), + .in_event_mask = S(LM_E_RKM_REG_CONF) | + S(LM_E_ERROR_IND), .out_state_mask = S(S_IDLE) | S(S_WAIT_NOTIFY), .name = "RKM_REG", @@ -404,9 +452,12 @@ }, S_ACTIVE = { .in_event_mask = S(LM_E_ASP_ACT_IND) | + S(LM_E_ASP_INACT_CONF) | S(LM_E_AS_INACTIVE_IND) | - S(LM_E_NOTIFY_IND), - .out_state_mask = S(S_IDLE), + S(LM_E_NOTIFY_IND) | + S(LM_E_ERROR_IND), + .out_state_mask = S(S_IDLE) | + S(S_WAIT_NOTIFY), .name = "ACTIVE", .action = lm_active, }, @@ -419,9 +470,11 @@ { XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_UP, PRIM_OP_CONFIRM, LM_E_ASP_UP_CONF }, { XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_UP, PRIM_OP_INDICATION, LM_E_ASP_UP_IND }, { XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_ACTIVE, PRIM_OP_INDICATION, LM_E_ASP_ACT_IND }, + { XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_INACTIVE, PRIM_OP_CONFIRM, LM_E_ASP_INACT_CONF }, { XUA_SAP_LM, OSMO_XLM_PRIM_M_ASP_INACTIVE, PRIM_OP_INDICATION, LM_E_ASP_INACT_IND }, { XUA_SAP_LM, OSMO_XLM_PRIM_M_AS_STATUS, PRIM_OP_INDICATION, LM_E_AS_STATUS_IND }, { XUA_SAP_LM, OSMO_XLM_PRIM_M_NOTIFY, PRIM_OP_INDICATION, LM_E_NOTIFY_IND }, + { XUA_SAP_LM, OSMO_XLM_PRIM_M_ERROR, PRIM_OP_INDICATION, LM_E_ERROR_IND }, { XUA_SAP_LM, OSMO_XLM_PRIM_M_AS_INACTIVE, PRIM_OP_INDICATION, LM_E_AS_INACTIVE_IND }, { XUA_SAP_LM, OSMO_XLM_PRIM_M_AS_ACTIVE, PRIM_OP_INDICATION, LM_E_AS_ACTIVE_IND }, { XUA_SAP_LM, OSMO_XLM_PRIM_M_RK_REG, PRIM_OP_CONFIRM, LM_E_RKM_REG_CONF },
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/xua_internal.h -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/xua_internal.h
Changed
@@ -103,14 +103,6 @@ const struct xua_msg *xua); int m3ua_rx_rkm(struct osmo_ss7_asp *asp, struct xua_msg *xua); -struct osmo_xlm_prim *xua_xlm_prim_alloc(enum osmo_xlm_prim_type prim_type, - enum osmo_prim_operation op); - -void xua_asp_send_xlm_prim(struct osmo_ss7_asp *asp, struct osmo_xlm_prim *prim); -void xua_asp_send_xlm_prim_simple(struct osmo_ss7_asp *asp, - enum osmo_xlm_prim_type prim_type, - enum osmo_prim_operation op); - void xua_snm_pc_available(struct osmo_ss7_as *as, const uint32_t *aff_pc, unsigned int num_aff_pc, const char *info_str, bool available);
View file
libosmo-sigtran_2.2.1.90.0779.tar.xz/src/xua_lm_sap.c
Added
@@ -0,0 +1,184 @@ +/* M3UA/SUA <-> XUA Layer Manager SAP, RFC466 1.6.3 & RFC3868 1.6.3 */ +/* (C) 2017-2021 by Harald Welte <laforge@gnumonks.org> + * All Rights Reserved + * + * SPDX-License-Identifier: GPL-2.0+ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* The idea of this default Layer Manager is as follows: + * - we wait until a SCTP connection is established + * - we issue the ASP-UP request and wait for the ASP being in UP state + * - we wait if we receive a M-NOTIFY indication about any AS in this ASP + * - if that's not received, we use RKM to register a routing context + * for our locally configured ASP and expect a positive registration + * result as well as a NOTIFY indication about AS-ACTIVE afterwards. + */ + +#include <errno.h> + +#include <osmocom/core/logging.h> +#include <osmocom/core/msgb.h> +#include <osmocom/core/prim.h> +#include <osmocom/sigtran/osmo_ss7.h> +#include <osmocom/sigtran/sigtran_sap.h> + +#include "xua_asp_fsm.h" +#include "xua_internal.h" +#include "ss7_asp.h" + + +struct osmo_xlm_prim *xua_xlm_prim_alloc(enum osmo_xlm_prim_type prim_type, + enum osmo_prim_operation op) +{ + struct osmo_xlm_prim *prim; + struct msgb *msg = msgb_alloc_headroom(2048+128, 128, "xua_asp-xlm msgb"); + if (!msg) + return NULL; + + prim = (struct osmo_xlm_prim *) msgb_put(msg, sizeof(*prim)); + osmo_prim_init(&prim->oph, XUA_SAP_LM, prim_type, op, msg); + + return prim; +} + +/* M-RK_REG request */ +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_rk_reg_req(const struct osmo_ss7_routing_key *rkey, + enum osmo_ss7_as_traffic_mode mode) +{ + struct osmo_xlm_prim *prim; + prim = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_RK_REG, PRIM_OP_REQUEST); + OSMO_ASSERT(prim); + prim->u.rk_reg.key = *rkey; + prim->u.rk_reg.traf_mode = mode; + return prim; +} + +/* M-RK_REG confirm */ +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_rk_reg_cfm(const struct osmo_ss7_routing_key *rkey, uint32_t status) +{ + struct osmo_xlm_prim *prim; + prim = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_RK_REG, PRIM_OP_CONFIRM); + OSMO_ASSERT(prim); + prim->u.rk_reg.key = *rkey; + prim->u.rk_reg.status = status; + return prim; +} + +/* M-RK_DEREG confirm */ +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_rk_dereg_cfm(uint32_t route_ctx, uint32_t status) +{ + struct osmo_xlm_prim *prim; + prim = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_RK_DEREG, PRIM_OP_CONFIRM); + OSMO_ASSERT(prim); + prim->u.rk_dereg.route_ctx = route_ctx; + prim->u.rk_dereg.status = status; + return prim; +} + +/* M-ERROR indication */ +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_error_ind(uint32_t err_code) +{ + struct osmo_xlm_prim *prim; + prim = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_ERROR, PRIM_OP_INDICATION); + OSMO_ASSERT(prim); + prim->u.error.code = err_code; + return prim; +} + +/* M-NOTIFY indication */ +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_notify_ind(const struct osmo_xlm_prim_notify *ntfy) +{ + struct osmo_xlm_prim *prim; + prim = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_NOTIFY, PRIM_OP_INDICATION); + OSMO_ASSERT(prim); + prim->u.notify = *ntfy; + return prim; +} + +/* Send a XUA LM Primitive from M3UA/SUA to the XUA Layer Manager (LM) */ +void xua_asp_send_xlm_prim(struct osmo_ss7_asp *asp, struct osmo_xlm_prim *prim) +{ + const struct osmo_xua_layer_manager *lm = asp->lm; + + if (lm && lm->prim_cb) + lm->prim_cb(&prim->oph, asp); + else { + LOGPFSML(asp->fi, LOGL_DEBUG, "No Layer Manager, dropping %s\n", + osmo_xlm_prim_name(&prim->oph)); + } + + msgb_free(prim->oph.msg); +} + +/* wrapper around send_xlm_prim for primitives without data */ +void xua_asp_send_xlm_prim_simple(struct osmo_ss7_asp *asp, + enum osmo_xlm_prim_type prim_type, + enum osmo_prim_operation op) +{ + struct osmo_xlm_prim *prim = xua_xlm_prim_alloc(prim_type, op); + if (!prim) + return; + xua_asp_send_xlm_prim(asp, prim); +} + +/* process a primitive from the xUA Layer Manager (LM) to M3UA/SUA */ +int osmo_xlm_sap_down(struct osmo_ss7_asp *asp, struct osmo_prim_hdr *oph) +{ + struct osmo_xlm_prim *prim = (struct osmo_xlm_prim *) oph; + + LOGPASP(asp, DLSS7, LOGL_DEBUG, "Received XUA Layer Manager Primitive: %s)\n", + osmo_xlm_prim_name(&prim->oph)); + + switch (OSMO_PRIM_HDR(&prim->oph)) { + case OSMO_PRIM(OSMO_XLM_PRIM_M_SCTP_RELEASE, PRIM_OP_REQUEST): + /* Layer Manager asks us to release an SCTP association with the peer */ + ss7_asp_disconnect_stream(asp); + break; + case OSMO_PRIM(OSMO_XLM_PRIM_M_ASP_UP, PRIM_OP_REQUEST): + /* Layer Manager asks us to send an ASPUP REQ */ + osmo_fsm_inst_dispatch(asp->fi, XUA_ASP_E_M_ASP_UP_REQ, NULL); + break; + case OSMO_PRIM(OSMO_XLM_PRIM_M_ASP_ACTIVE, PRIM_OP_REQUEST): + /* Layer Manager asks us to send an ASPAC REQ */ + osmo_fsm_inst_dispatch(asp->fi, XUA_ASP_E_M_ASP_ACTIVE_REQ, NULL); + break; + case OSMO_PRIM(OSMO_XLM_PRIM_M_RK_REG, PRIM_OP_REQUEST): + /* Layer Manager asks us to send a Routing Key Reg Request */ + xua_rkm_send_reg_req(asp, &prim->u.rk_reg.key, prim->u.rk_reg.traf_mode); + break; + case OSMO_PRIM(OSMO_XLM_PRIM_M_RK_DEREG, PRIM_OP_REQUEST): + /* Layer Manager asks us to send a Routing Key De-Reg Request */ + xua_rkm_send_dereg_req(asp, prim->u.rk_dereg.route_ctx); + break; + default: + LOGPASP(asp, DLSS7, LOGL_ERROR, "Unknown XUA Layer Manager Primitive: %s\n", + osmo_xlm_prim_name(&prim->oph)); + break; + } + + msgb_free(prim->oph.msg); + return 0; +} + +/* wrapper around osmo_xlm_sap_down for primitives without data */ +int xlm_sap_down_simple(struct osmo_ss7_asp *asp, + enum osmo_xlm_prim_type prim_type, + enum osmo_prim_operation op) +{ + struct osmo_xlm_prim *prim = xua_xlm_prim_alloc(prim_type, op); + OSMO_ASSERT(prim); + return osmo_xlm_sap_down(asp, &prim->oph); +}
View file
libosmo-sigtran_2.2.1.90.0779.tar.xz/src/xua_lm_sap.h
Added
@@ -0,0 +1,28 @@ +/* M3UA/SUA <-> XUA Layer Manager SAP, RFC466 1.6.3 & RFC3868 1.6.3 */ +#pragma once + +#include <unistd.h> +#include <stdint.h> + +#include <osmocom/core/tdef.h> +#include <osmocom/sigtran/osmo_ss7.h> +#include <osmocom/sigtran/sigtran_sap.h> + +struct osmo_xlm_prim *xua_xlm_prim_alloc(enum osmo_xlm_prim_type prim_type, + enum osmo_prim_operation op); +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_rk_reg_req(const struct osmo_ss7_routing_key *rkey, + enum osmo_ss7_as_traffic_mode mode); +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_rk_reg_cfm(const struct osmo_ss7_routing_key *rkey, + uint32_t status); +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_rk_dereg_cfm(uint32_t route_ctx, uint32_t status); +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_error_ind(uint32_t err_code); +struct osmo_xlm_prim *xua_xlm_prim_alloc_m_notify_ind(const struct osmo_xlm_prim_notify *ntfy); + +void xua_asp_send_xlm_prim(struct osmo_ss7_asp *asp, struct osmo_xlm_prim *prim); +void xua_asp_send_xlm_prim_simple(struct osmo_ss7_asp *asp, + enum osmo_xlm_prim_type prim_type, + enum osmo_prim_operation op); + +int xlm_sap_down_simple(struct osmo_ss7_asp *asp, + enum osmo_xlm_prim_type prim_type, + enum osmo_prim_operation op);
View file
libosmo-sigtran_2.2.1.79.44a5.tar.xz/src/xua_rkm.c -> libosmo-sigtran_2.2.1.90.0779.tar.xz/src/xua_rkm.c
Changed
@@ -36,6 +36,7 @@ #include "xua_internal.h" #include "xua_as_fsm.h" #include "xua_asp_fsm.h" +#include "xua_lm_sap.h" const struct value_string m3ua_rkm_reg_status_vals = { { M3UA_RKM_REG_SUCCESS, "SUCCESS" }, @@ -119,13 +120,18 @@ { struct msgb *msg = m3ua_msgb_alloc(__func__); int tmod = osmo_ss7_tmode_to_xua(traf_mode); + uint16_t outter_len; /* One individual Registration Request according to Chapter 3.6.1 */ msgb_put_u16(msg, M3UA_IEI_ROUT_KEY); /* outer IEI */ - msgb_put_u16(msg, 32 + 4); /* outer length */ + outter_len = 24 + 4; + if (rkey->context > 0) + outter_len += 8; + msgb_put_u16(msg, outter_len); /* outer length */ /* nested IEIs */ msgb_t16l16vp_put_u32(msg, M3UA_IEI_LOC_RKEY_ID, rkey->l_rk_id); - msgb_t16l16vp_put_u32(msg, M3UA_IEI_ROUTE_CTX, rkey->context); + if (rkey->context > 0) + msgb_t16l16vp_put_u32(msg, M3UA_IEI_ROUTE_CTX, rkey->context); msgb_t16l16vp_put_u32(msg, M3UA_IEI_TRAF_MODE_TYP, tmod); msgb_t16l16vp_put_u32(msg, M3UA_IEI_DEST_PC, rkey->pc); @@ -414,7 +420,7 @@ } /* Reject if ASP is still active */ - if (asp->fi->state == XUA_ASP_S_ACTIVE) { + if (osmo_ss7_asp_active(asp)) { msgb_append_dereg_res(resp, M3UA_RKM_DEREG_ERR_ASP_ACTIVE, 0); return -1; } @@ -465,6 +471,7 @@ static int handle_rkey_reg_resp(struct osmo_ss7_asp *asp, struct xua_msg *inner) { struct osmo_xlm_prim *oxp; + struct osmo_ss7_routing_key rkey; if (!xua_msg_find_tag(inner, M3UA_IEI_LOC_RKEY_ID) || !xua_msg_find_tag(inner, M3UA_IEI_REG_STATUS) || @@ -474,13 +481,11 @@ return -1; } - oxp = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_RK_REG, PRIM_OP_CONFIRM); - if (!oxp) - return -1; - - oxp->u.rk_reg.key.l_rk_id = xua_msg_get_u32(inner, M3UA_IEI_LOC_RKEY_ID); - oxp->u.rk_reg.key.context = xua_msg_get_u32(inner, M3UA_IEI_ROUTE_CTX); - oxp->u.rk_reg.status = xua_msg_get_u32(inner, M3UA_IEI_REG_STATUS); + rkey = (struct osmo_ss7_routing_key){ + .l_rk_id = xua_msg_get_u32(inner, M3UA_IEI_LOC_RKEY_ID), + .context = xua_msg_get_u32(inner, M3UA_IEI_ROUTE_CTX), + }; + oxp = xua_xlm_prim_alloc_m_rk_reg_cfm(&rkey, xua_msg_get_u32(inner, M3UA_IEI_REG_STATUS)); LOGPASP(asp, DLSS7, LOGL_INFO, "Received RKM REG RES rctx=%u status=%s\n", oxp->u.rk_reg.key.context, @@ -528,12 +533,8 @@ return -1; } - oxp = xua_xlm_prim_alloc(OSMO_XLM_PRIM_M_RK_DEREG, PRIM_OP_CONFIRM); - if (!oxp) - return -1; - - oxp->u.rk_dereg.route_ctx = xua_msg_get_u32(inner, M3UA_IEI_ROUTE_CTX); - oxp->u.rk_dereg.status = xua_msg_get_u32(inner, M3UA_IEI_DEREG_STATUS); + oxp = xua_xlm_prim_alloc_m_rk_dereg_cfm(xua_msg_get_u32(inner, M3UA_IEI_ROUTE_CTX), + xua_msg_get_u32(inner, M3UA_IEI_DEREG_STATUS)); LOGPASP(asp, DLSS7, LOGL_INFO, "Received RKM DEREG RES rctx=%u status=%s\n", oxp->u.rk_reg.key.context,
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.