From: Max msuraev@sysmocom.de
Print string representation of Cause IE and PDU type instead of numerical value. --- src/gb/gprs_bssgp.c | 28 ++++++++++++++-------------- src/gb/gprs_bssgp_bss.c | 6 +++--- 2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/src/gb/gprs_bssgp.c b/src/gb/gprs_bssgp.c index e3e69c9..d9d8ccd 100644 --- a/src/gb/gprs_bssgp.c +++ b/src/gb/gprs_bssgp.c @@ -896,8 +896,8 @@ static int bssgp_rx_ptp(struct msgb *msg, struct tlv_parsed *tp, case BSSGP_PDUT_CREATE_BSS_PFC_NACK: case BSSGP_PDUT_MODIFY_BSS_PFC: case BSSGP_PDUT_DELETE_BSS_PFC_ACK: - DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type 0x%02x not [yet] " - "implemented\n", bctx->bvci, pdu_type); + DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type %s not [yet] " + "implemented\n", bctx->bvci, bssgp_pdu_str(pdu_type)); rc = bssgp_tx_status(BSSGP_CAUSE_PDU_INCOMP_FEAT, NULL, msg); break; /* those only exist in the SGSN -> BSS direction */ @@ -907,14 +907,14 @@ static int bssgp_rx_ptp(struct msgb *msg, struct tlv_parsed *tp, case BSSGP_PDUT_RA_CAPA_UPDATE_ACK: case BSSGP_PDUT_FLOW_CONTROL_BVC_ACK: case BSSGP_PDUT_FLOW_CONTROL_MS_ACK: - DEBUGP(DBSSGP, "BSSGP BVCI=%u PDU type 0x%02x only exists " - "in DL\n", bctx->bvci, pdu_type); + DEBUGP(DBSSGP, "BSSGP BVCI=%u PDU type %s only exists in DL\n", + bctx->bvci, bssgp_pdu_str(pdu_type)); bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg); rc = -EINVAL; break; default: - DEBUGP(DBSSGP, "BSSGP BVCI=%u PDU type 0x%02x unknown\n", - bctx->bvci, pdu_type); + DEBUGP(DBSSGP, "BSSGP BVCI=%u PDU type %s unknown\n", + bctx->bvci, bssgp_pdu_str(pdu_type)); rc = bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg); break; } @@ -999,14 +999,14 @@ static int bssgp_rx_sign(struct msgb *msg, struct tlv_parsed *tp, case BSSGP_PDUT_BVC_BLOCK_ACK: case BSSGP_PDUT_BVC_UNBLOCK_ACK: case BSSGP_PDUT_SGSN_INVOKE_TRACE: - DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type 0x%02x only exists " - "in DL\n", bvci, pdu_type); + DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type %s only exists in DL\n", + bvci, bssgp_pdu_str(pdu_type)); bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg); rc = -EINVAL; break; default: - DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type 0x%02x unknown\n", - bvci, pdu_type); + DEBUGP(DBSSGP, "BSSGP BVCI=%u Rx PDU type %s unknown\n", + bvci, bssgp_pdu_str(pdu_type)); rc = bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg); break; } @@ -1066,8 +1066,8 @@ int bssgp_rcvmsg(struct msgb *msg) if (!bctx && bvci != BVCI_SIGNALLING && pdu_type != BSSGP_PDUT_BVC_RESET) { LOGP(DBSSGP, LOGL_NOTICE, "NSEI=%u/BVCI=%u Rejecting PDU " - "type %u for unknown BVCI\n", msgb_nsei(msg), bvci, - pdu_type); + "type %s for unknown BVCI\n", msgb_nsei(msg), bvci, + bssgp_pdu_str(pdu_type)); return bssgp_tx_status(BSSGP_CAUSE_UNKNOWN_BVCI, &bvci, msg); }
@@ -1079,9 +1079,9 @@ int bssgp_rcvmsg(struct msgb *msg) rc = bssgp_rx_ptp(msg, &tp, bctx); else LOGP(DBSSGP, LOGL_NOTICE, - "NSEI=%u/BVCI=%u Cannot handle PDU type %u for " + "NSEI=%u/BVCI=%u Cannot handle PDU type %s for " "unknown BVCI, NS BVCI %u\n", - msgb_nsei(msg), bvci, pdu_type, ns_bvci); + msgb_nsei(msg), bvci, bssgp_pdu_str(pdu_type), ns_bvci);
return rc; } diff --git a/src/gb/gprs_bssgp_bss.c b/src/gb/gprs_bssgp_bss.c index 3a9012e..61ed0c4 100644 --- a/src/gb/gprs_bssgp_bss.c +++ b/src/gb/gprs_bssgp_bss.c @@ -135,7 +135,7 @@ static struct msgb *common_tx_radio_status(struct bssgp_bvc_ctx *bctx) static int common_tx_radio_status2(struct msgb *msg, uint8_t cause) { msgb_tvlv_put(msg, BSSGP_IE_CAUSE, 1, &cause); - LOGPC(DBSSGP, LOGL_NOTICE, "CAUSE=%u\n", cause); + LOGPC(DBSSGP, LOGL_NOTICE, "CAUSE=%s\n", bssgp_cause_str(cause));
return gprs_ns_sendmsg(bssgp_nsi, msg); } @@ -247,7 +247,7 @@ int bssgp_tx_bvc_block(struct bssgp_bvc_ctx *bctx, uint8_t cause) uint16_t _bvci = htons(bctx->bvci);
LOGP(DBSSGP, LOGL_NOTICE, "BSSGP (BVCI=%u) Tx BVC-BLOCK " - "CAUSE=%u\n", bctx->bvci, cause); + "CAUSE=%s\n", bctx->bvci, bssgp_cause_str(cause));
msgb_nsei(msg) = bctx->nsei; msgb_bvci(msg) = 0; /* Signalling */ @@ -287,7 +287,7 @@ int bssgp_tx_bvc_reset(struct bssgp_bvc_ctx *bctx, uint16_t bvci, uint8_t cause) uint16_t _bvci = htons(bvci);
LOGP(DBSSGP, LOGL_NOTICE, "BSSGP (BVCI=%u) Tx BVC-RESET " - "CAUSE=%u\n", bvci, cause); + "CAUSE=%s\n", bvci, bssgp_cause_str(cause));
msgb_nsei(msg) = bctx->nsei; msgb_bvci(msg) = 0; /* Signalling */
From: Max msuraev@sysmocom.de
It's useful for debugging and is similar to existing nsvc reset vty command. --- src/gb/gprs_bssgp_vty.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/src/gb/gprs_bssgp_vty.c b/src/gb/gprs_bssgp_vty.c index 080867b..2725d1f 100644 --- a/src/gb/gprs_bssgp_vty.c +++ b/src/gb/gprs_bssgp_vty.c @@ -33,6 +33,7 @@ #include <osmocom/core/rate_ctr.h> #include <osmocom/gprs/gprs_ns.h> #include <osmocom/gprs/gprs_bssgp.h> +#include <osmocom/gprs/gprs_bssgp_bss.h>
#include <osmocom/vty/vty.h> #include <osmocom/vty/command.h> @@ -113,6 +114,31 @@ static void dump_bssgp(struct vty *vty, int stats) } }
+DEFUN(bvc_reset, bvc_reset_cmd, + "bvc reset nsei <0-65535> bvci <0-65535>", + "Initiate BVC RESET procedure for a given NSEI and BVCI\n") +{ + uint16_t nsei = atoi(argv[0]), bvci = atoi(argv[1]); + struct bssgp_bvc_ctx *bvc; + + if (!strcmp(argv[0], "reset")) + return CMD_WARNING; + + if (argc != 2) + return CMD_WARNING; + + bvc = btsctx_by_bvci_nsei(bvci, nsei); + if (!bvc) { + vty_out(vty, "No BVC for NSEI %d BVCI %d%s", nsei, bvci, + VTY_NEWLINE); + return CMD_WARNING; + } + int r = bssgp_tx_bvc_reset(bvc, bvci, BSSGP_CAUSE_OML_INTERV); + vty_out(vty, "Sent BVC RESET for NSEI %d BVCI %d: %d%s", nsei, bvci, r, + VTY_NEWLINE); + return CMD_SUCCESS; +} + #define BSSGP_STR "Show information about the BSSGP protocol\n"
DEFUN(show_bssgp, show_bssgp_cmd, "show bssgp", @@ -185,6 +211,7 @@ int bssgp_vty_init(void) install_element_ve(&show_bssgp_stats_cmd); install_element_ve(&show_bvc_cmd); install_element_ve(&logging_fltr_bvc_cmd); + install_element_ve(&bvc_reset_cmd);
install_element(CFG_LOG_NODE, &logging_fltr_bvc_cmd);
Hi Max,
On Thu, Mar 17, 2016 at 03:42:27PM +0100, msuraev@sysmocom.de wrote:
+DEFUN(bvc_reset, bvc_reset_cmd,
- "bvc reset nsei <0-65535> bvci <0-65535>",
[...]
- if (!strcmp(argv[0], "reset"))
return CMD_WARNING;
no need to do this. the generic vty parser code will make sure that you don't end up here if the command doesn't match the synfax above.
- if (argc != 2)
return CMD_WARNING;
same here. If the number of arguments is not the number of mandatory arguments, you will never get called.
So while defensive programming is generally a good idea, in the VTY case it doesn't add any benefit and just makes the functions longer. We never do this kind of checking in other functions, as we rely on libosmovty to handle this.
The only places where you need to check for argc is when you have optional arguments, and !strcmp() is only needed if you have something like "bvc (start|stop)" in order to determien if start or stop was stated.
Also, it might make sense to prefix the entire command with bssgp so that it becomes "bssgp bvc reset ...."
On Thu, Mar 17, 2016 at 04:54:58PM +0100, Harald Welte wrote:
Hi Max,
On Thu, Mar 17, 2016 at 03:42:27PM +0100, msuraev@sysmocom.de wrote:
+DEFUN(bvc_reset, bvc_reset_cmd,
- "bvc reset nsei <0-65535> bvci <0-65535>",
[...]
- if (!strcmp(argv[0], "reset"))
return CMD_WARNING;
no need to do this. the generic vty parser code will make sure that you don't end up here if the command doesn't match the synfax above.
- if (argc != 2)
return CMD_WARNING;
same here. If the number of arguments is not the number of mandatory arguments, you will never get called.
I used to do the same kind of checking for my first VTY commands, until I figured out that all of the formatting is already checked ;) Quite handy.
~Neels