diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-09-24 11:43:17 +0800 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-09-24 23:10:01 +0800 |
commit | 93fed3bc510563e7d88cadafa7eada2ae4182213 (patch) | |
tree | 74219144de97b894c8890e3de80c4adec9c0d769 | |
parent | 3c1cce245e6ed1746c0eacc6208b884871186d3d (diff) |
ggsn: Add per-APN VTY configuration option on G-PDU sequence numbers
This per-APN vty option determines if we are transmitting GTP sequence
numbers in downlink G-PDU messages. This behavior is optional as per
GTP spec. The default behavior is "true", like before this change.
Related: OS#2519
Change-Id: Ibf0de261f83951309b01b4feae998b6656c77664
-rw-r--r-- | ggsn/ggsn.c | 3 | ||||
-rw-r--r-- | ggsn/ggsn.h | 2 | ||||
-rw-r--r-- | ggsn/ggsn_vty.c | 26 |
3 files changed, 31 insertions, 0 deletions
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index d521e57..780a0c2 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -517,6 +517,9 @@ int create_context_ind(struct pdp_t *pdp) process_pco(apn, pdp); + /* Transmit G-PDU sequence numbers (only) if configured in APN */ + pdp->tx_gpdu_seq = apn->cfg.tx_gpdu_seq; + LOGPPDP(LOGL_INFO, pdp, "Successful PDP Context Creation: APN=%s(%s), TEIC=%u, IP=%s\n", name_buf, apn->cfg.name, pdp->teic_own, in46a_ntoa(&member->addr)); gtp_create_context_resp(gsn, pdp, GTPCAUSE_ACC_REQ); diff --git a/ggsn/ggsn.h b/ggsn/ggsn.h index 42f8e1c..c0774c4 100644 --- a/ggsn/ggsn.h +++ b/ggsn/ggsn.h @@ -63,6 +63,8 @@ struct apn_ctx { enum apn_gtpu_mode gtpu_mode; /* administratively shut-down (true) or not (false) */ bool shutdown; + /* transmit G-PDU sequeence numbers (true) or not (false) */ + bool tx_gpdu_seq; } cfg; /* corresponding tun device */ diff --git a/ggsn/ggsn_vty.c b/ggsn/ggsn_vty.c index c92d83e..9f343ec 100644 --- a/ggsn/ggsn_vty.c +++ b/ggsn/ggsn_vty.c @@ -103,6 +103,7 @@ struct apn_ctx *ggsn_find_or_create_apn(struct ggsn_ctx *ggsn, const char *name) apn->ggsn = ggsn; apn->cfg.name = talloc_strdup(apn, name); apn->cfg.shutdown = true; + apn->cfg.tx_gpdu_seq = true; INIT_LLIST_HEAD(&apn->cfg.name_list); llist_add_tail(&apn->list, &ggsn->apn_list); @@ -558,6 +559,24 @@ DEFUN(cfg_apn_no_dns, cfg_apn_no_dns_cmd, return CMD_SUCCESS; } +DEFUN(cfg_apn_gpdu_seq, cfg_apn_gpdu_seq_cmd, + "g-pdu tx-sequence-numbers", + "G-PDU Configuration\n" "Enable transmission of G-PDU sequence numbers\n") +{ + struct apn_ctx *apn = (struct apn_ctx *) vty->index; + apn->cfg.tx_gpdu_seq = true; + return CMD_SUCCESS; +} + +DEFUN(cfg_apn_no_gpdu_seq, cfg_apn_no_gpdu_seq_cmd, + "no g-pdu tx-sequence-numbers", + NO_STR "G-PDU Configuration\n" "Disable transmission of G-PDU sequence numbers\n") +{ + struct apn_ctx *apn = (struct apn_ctx *) vty->index; + apn->cfg.tx_gpdu_seq = false; + return CMD_SUCCESS; +} + DEFUN(cfg_apn_shutdown, cfg_apn_shutdown_cmd, "shutdown", "Put the APN in administrative shut-down\n") @@ -621,6 +640,9 @@ static void config_write_apn(struct vty *vty, struct apn_ctx *apn) VTY_NEWLINE); } + if (!apn->cfg.tx_gpdu_seq) + vty_out(vty, " no g-pdu tx-sequence-numbers%s", VTY_NEWLINE); + /* IPv4 prefixes + DNS */ if (apn->v4.cfg.static_prefix.addr.len) vty_dump_prefix(vty, " ip prefix static", &apn->v4.cfg.static_prefix); @@ -703,6 +725,8 @@ static void show_one_pdp(struct vty *vty, struct pdp_t *pdp) in46a_from_eua(&pdp->eua, &eua46); vty_out(vty, " End-User Address: %s%s", in46a_ntoa(&eua46), VTY_NEWLINE); + vty_out(vty, " Transmit GTP Sequence Number for G-PDU: %s%s", + pdp->tx_gpdu_seq ? "Yes" : "No", VTY_NEWLINE); } DEFUN(show_pdpctx_imsi, show_pdpctx_imsi_cmd, @@ -870,6 +894,8 @@ int ggsn_vty_init(void) install_element(APN_NODE, &cfg_apn_no_ip_ifconfig_cmd); install_element(APN_NODE, &cfg_apn_ipv6_ifconfig_cmd); install_element(APN_NODE, &cfg_apn_no_ipv6_ifconfig_cmd); + install_element(APN_NODE, &cfg_apn_gpdu_seq_cmd); + install_element(APN_NODE, &cfg_apn_no_gpdu_seq_cmd); return 0; } |