aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/gprs/gprs_ns.h2
-rw-r--r--src/gb/gprs_ns.c18
-rw-r--r--src/gb/gprs_ns_vty.c11
3 files changed, 22 insertions, 9 deletions
diff --git a/include/osmocom/gprs/gprs_ns.h b/include/osmocom/gprs/gprs_ns.h
index 2d2f86ed..4fb9f584 100644
--- a/include/osmocom/gprs/gprs_ns.h
+++ b/include/osmocom/gprs/gprs_ns.h
@@ -140,6 +140,8 @@ struct gprs_nsvc {
/*! which link-layer are we based on? */
enum gprs_ns_ll ll;
+ /*! make sure to always keep bts_addr as first struct member to not break the assumption
+ that those structs are similar */
union {
struct {
struct sockaddr_in bts_addr;
diff --git a/src/gb/gprs_ns.c b/src/gb/gprs_ns.c
index 2d062cf2..18d43ccc 100644
--- a/src/gb/gprs_ns.c
+++ b/src/gb/gprs_ns.c
@@ -1173,9 +1173,21 @@ int gprs_ns_rcvmsg(struct gprs_ns_inst *nsi, struct msgb *msg,
const char *gprs_ns_ll_str(struct gprs_nsvc *nsvc)
{
static char buf[80];
- snprintf(buf, sizeof(buf), "%s:%u",
- inet_ntoa(nsvc->ip.bts_addr.sin_addr),
- osmo_ntohs(nsvc->ip.bts_addr.sin_port));
+
+ switch(nsvc->ll) {
+ case GPRS_NS_LL_UDP:
+ snprintf(buf, sizeof(buf), "%s:%u",
+ inet_ntoa(nsvc->ip.bts_addr.sin_addr), osmo_ntohs(nsvc->ip.bts_addr.sin_port));
+ break;
+ case GPRS_NS_LL_FR_GRE:
+ snprintf(buf, sizeof(buf), "%s:%u",
+ inet_ntoa(nsvc->frgre.bts_addr.sin_addr), osmo_ntohs(nsvc->frgre.bts_addr.sin_port));
+ break;
+ default:
+ buf[0] = '\0';
+ break;
+ }
+
buf[sizeof(buf) - 1] = '\0';
return buf;
diff --git a/src/gb/gprs_ns_vty.c b/src/gb/gprs_ns_vty.c
index 317a6a10..4ed4fefb 100644
--- a/src/gb/gprs_ns_vty.c
+++ b/src/gb/gprs_ns_vty.c
@@ -165,12 +165,11 @@ static void dump_nse(struct vty *vty, struct gprs_nsvc *nsvc, int stats)
nsvc->remote_end_is_sgsn ? "SGSN" : "BSS",
NS_DESC_A(nsvc->remote_state),
NS_DESC_B(nsvc->remote_state));
- if (nsvc->ll == GPRS_NS_LL_UDP || nsvc->ll == GPRS_NS_LL_FR_GRE)
- vty_out(vty, ", %s %15s:%u",
- nsvc->ll == GPRS_NS_LL_UDP ? "UDP " : "FR-GRE",
- inet_ntoa(nsvc->ip.bts_addr.sin_addr),
- osmo_ntohs(nsvc->ip.bts_addr.sin_port));
- vty_out(vty, "%s", VTY_NEWLINE);
+
+ vty_out(vty, ", %s %s%s",
+ nsvc->ll == GPRS_NS_LL_UDP ? "UDP " : "FR-GRE",
+ gprs_ns_ll_str(nsvc), VTY_NEWLINE);
+
if (stats) {
vty_out_rate_ctr_group(vty, " ", nsvc->ctrg);
vty_out_stat_item_group(vty, " ", nsvc->statg);