diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-03-17 10:21:17 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-03-18 21:54:37 +0100 |
commit | 36153dc61aa15f9c3084c2824c51356fc4babadb (patch) | |
tree | c6cf226629812e56459bf8c42e5f38498fa05478 /tests/gb | |
parent | 49ed9beed1a1f6df197defb295cf436b5eeb8933 (diff) |
bssgp: Handle BSSGP STATUS messages
Currently incoming BSSGP STATUS messages are just logged and no other
action is taken. This makes it impossible for higher layers to react
to failures which are indicated by corresponding STATUS messages
unless a timeout is triggered as a result of that failure later on.
This commit adds a bssgp_rx_status() function and calls it on
incoming STATUS messages. That function logs a message, increments the
new BSSGP_CTR_STATUS counter if the bctx context exists and invokes
an NM_STATUS status indication. The latter will allow the application
to handle failures immediately. Since all STATUS messages should be
handled, the function is already called in bssgp_rcvmsg and the
message is no longer handled in (and will not reach) bssgp_rx_sign
and bssgp_rx_ptp.
Ticket: OW#1414
Sponsored-by: On-Waves ehf
Diffstat (limited to 'tests/gb')
-rw-r--r-- | tests/gb/gprs_bssgp_test.c | 35 | ||||
-rw-r--r-- | tests/gb/gprs_bssgp_test.ok | 4 |
2 files changed, 39 insertions, 0 deletions
diff --git a/tests/gb/gprs_bssgp_test.c b/tests/gb/gprs_bssgp_test.c index a2473268..3d1384b7 100644 --- a/tests/gb/gprs_bssgp_test.c +++ b/tests/gb/gprs_bssgp_test.c @@ -125,6 +125,40 @@ static void test_bssgp_suspend_resume(void) printf("----- %s END\n", __func__); } +static void send_bssgp_status(enum gprs_bssgp_cause cause, uint16_t *bvci) +{ + struct msgb *msg = bssgp_msgb_alloc(); + uint8_t cause_ = cause; + + msgb_v_put(msg, BSSGP_PDUT_STATUS); + msgb_tvlv_put(msg, BSSGP_IE_CAUSE, 1, &cause_); + if (bvci) { + uint16_t bvci_ = htons(*bvci); + msgb_tvlv_put(msg, BSSGP_IE_BVCI, 2, (uint8_t *) &bvci_); + } + + msgb_bssgp_send_and_free(msg); +} + +static void test_bssgp_status(void) +{ + uint16_t bvci; + + printf("----- %s START\n", __func__); + + send_bssgp_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL); + OSMO_ASSERT(last_oph.primitive == PRIM_NM_STATUS); + + /* Enforce prim != PRIM_NM_STATUS */ + last_oph.primitive = PRIM_NM_LLC_DISCARDED; + + bvci = 1234; + send_bssgp_status(BSSGP_CAUSE_UNKNOWN_BVCI, &bvci); + OSMO_ASSERT(last_oph.primitive == PRIM_NM_STATUS); + + printf("----- %s END\n", __func__); +} + static struct log_info info = {}; int main(int argc, char **argv) @@ -146,6 +180,7 @@ int main(int argc, char **argv) printf("===== BSSGP test START\n"); test_bssgp_suspend_resume(); + test_bssgp_status(); printf("===== BSSGP test END\n\n"); exit(EXIT_SUCCESS); diff --git a/tests/gb/gprs_bssgp_test.ok b/tests/gb/gprs_bssgp_test.ok index c9ec83d7..0392e6a5 100644 --- a/tests/gb/gprs_bssgp_test.ok +++ b/tests/gb/gprs_bssgp_test.ok @@ -3,5 +3,9 @@ BSSGP primitive, SAP 16777219, prim = 3, op = 0, msg = 0b 1f 84 f0 12 34 56 1b 86 0f f1 80 20 37 00 BSSGP primitive, SAP 16777219, prim = 4, op = 0, msg = 0e 1f 84 f0 12 34 56 1b 86 0f f1 80 20 37 00 1d 81 01 ----- test_bssgp_suspend_resume END +----- test_bssgp_status START +BSSGP primitive, SAP 16777221, prim = 11, op = 2, msg = 41 07 81 27 +BSSGP primitive, SAP 16777221, prim = 11, op = 2, msg = 41 07 81 05 04 82 04 d2 +----- test_bssgp_status END ===== BSSGP test END |