diff options
-rw-r--r-- | examples/sccp_test_vty.c | 8 | ||||
-rw-r--r-- | include/osmocom/sigtran/sccp_helpers.h | 4 | ||||
-rw-r--r-- | src/sccp_helpers.c | 18 |
3 files changed, 24 insertions, 6 deletions
diff --git a/examples/sccp_test_vty.c b/examples/sccp_test_vty.c index 3f644e2..f6f86f7 100644 --- a/examples/sccp_test_vty.c +++ b/examples/sccp_test_vty.c @@ -94,14 +94,16 @@ DEFUN(scu_unitdata_req, scu_unitdata_req_cmd, } DEFUN(scu_disc_req, scu_disc_req_cmd, - "disconnect-req <0-16777216>", + "disconnect-req <0-16777216> [DATA]", "N-DISCONNT.req\n" - "Connection ID\n") + "Connection ID\n" + "Optional Data\n") { struct osmo_sccp_user *scu = vty->index; int conn_id = atoi(argv[0]); - osmo_sccp_tx_disconn(scu, conn_id, NULL, 42); + osmo_sccp_tx_disconn_data(scu, conn_id, NULL, 42, (const uint8_t *)argv[1], (argc > 1) ? strlen(argv[1]) + 1 : 0); + return CMD_SUCCESS; } diff --git a/include/osmocom/sigtran/sccp_helpers.h b/include/osmocom/sigtran/sccp_helpers.h index a575169..44fd9bf 100644 --- a/include/osmocom/sigtran/sccp_helpers.h +++ b/include/osmocom/sigtran/sccp_helpers.h @@ -44,6 +44,10 @@ int osmo_sccp_tx_disconn(struct osmo_sccp_user *scu, uint32_t conn_id, const struct osmo_sccp_addr *resp_addr, uint32_t cause); +int osmo_sccp_tx_disconn_data(struct osmo_sccp_user *scu, uint32_t conn_id, + const struct osmo_sccp_addr *resp_addr, + uint32_t cause, const uint8_t *data, size_t len); + int osmo_sccp_tx_conn_resp_msg(struct osmo_sccp_user *scu, uint32_t conn_id, const struct osmo_sccp_addr *resp_addr, struct msgb *msg); diff --git a/src/sccp_helpers.c b/src/sccp_helpers.c index ae7c526..38561be 100644 --- a/src/sccp_helpers.c +++ b/src/sccp_helpers.c @@ -193,9 +193,9 @@ int osmo_sccp_tx_data_msg(struct osmo_sccp_user *scu, uint32_t conn_id, } /* N-DISCONNECT.req */ -int osmo_sccp_tx_disconn(struct osmo_sccp_user *scu, uint32_t conn_id, - const struct osmo_sccp_addr *resp_addr, - uint32_t cause) +int osmo_sccp_tx_disconn_data(struct osmo_sccp_user *scu, uint32_t conn_id, + const struct osmo_sccp_addr *resp_addr, + uint32_t cause, const uint8_t *data, size_t len) { struct msgb *msg; struct osmo_scu_prim *prim; @@ -219,9 +219,21 @@ int osmo_sccp_tx_disconn(struct osmo_sccp_user *scu, uint32_t conn_id, param->conn_id = conn_id; param->cause = cause; + if (data && len) { + msg->l2h = msgb_put(msg, len); + memcpy(msg->l2h, data, len); + } + return osmo_sccp_user_sap_down(scu, &prim->oph); } +int osmo_sccp_tx_disconn(struct osmo_sccp_user *scu, uint32_t conn_id, + const struct osmo_sccp_addr *resp_addr, + uint32_t cause) +{ + return osmo_sccp_tx_disconn_data(scu, conn_id, resp_addr, cause, NULL, 0); +} + /* N-CONNECT.resp */ int osmo_sccp_tx_conn_resp_msg(struct osmo_sccp_user *scu, uint32_t conn_id, const struct osmo_sccp_addr *resp_addr, |