aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2012-01-16 11:51:18 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2012-01-16 11:51:18 +0100
commit60bc8e7dabb7af9ebab738d7135b73883aed9113 (patch)
tree7c21594e10fb0cee67087722a2794ce4e147cd60
parent53559b39e574d9c4d183d1b3eb6f55e694d8e3b8 (diff)
mtp: Allow to send SCCP/ISUP to a specific endpoint
For a linkset define where SCCP/ISUP should be send. This config should probably move up to the application part when real work on the routing is done. Right now the sccp_opc/sccp_dpc need to stay inside the mtp_layer3.c to be able to send a TFA for the reachable OPC and it is easier to keep both (dpc/opc) in the same file.
-rw-r--r--include/mtp_data.h14
-rw-r--r--src/mtp_layer3.c9
-rw-r--r--src/vty_interface.c88
3 files changed, 107 insertions, 4 deletions
diff --git a/include/mtp_data.h b/include/mtp_data.h
index bb6805b..69db8f7 100644
--- a/include/mtp_data.h
+++ b/include/mtp_data.h
@@ -52,8 +52,18 @@ struct mtp_link_set {
char *name;
- /* routing info.. */
- int dpc, opc, sccp_opc, isup_opc;
+ /**
+ * Routing is very limited. We can only forward to one
+ * other STP/Endpoint. For ISUP and SCCP we can statically
+ * send it to another destination. We need to follow Q.704
+ * more properly here.
+ * DPC/OPC are the ones for the linkset,
+ * sccp_dpc/isup_dpc are where we will send SCCP/ISUP messages
+ * sccp_opc/isup_opc are what we announce in the TFP
+ */
+ int dpc, opc;
+ int sccp_dpc, isup_dpc;
+ int sccp_opc, isup_opc;
int ni;
int spare;
diff --git a/src/mtp_layer3.c b/src/mtp_layer3.c
index d62440d..92e8f41 100644
--- a/src/mtp_layer3.c
+++ b/src/mtp_layer3.c
@@ -525,14 +525,18 @@ int mtp_link_set_submit_sccp_data(struct mtp_link_set *set, int sls, const uint8
}
rate_ctr_inc(&set->ctrg->ctr[MTP_LSET_SCCP_OUT_MSG]);
- return mtp_int_submit(set, set->sccp_opc, set->dpc, sls, MTP_SI_MNT_SCCP, data, length);
+ return mtp_int_submit(set, set->sccp_opc,
+ set->sccp_dpc == -1 ? set->dpc : set->sccp_dpc,
+ sls, MTP_SI_MNT_SCCP, data, length);
}
int mtp_link_set_submit_isup_data(struct mtp_link_set *set, int sls,
const uint8_t *data, unsigned int length)
{
rate_ctr_inc(&set->ctrg->ctr[MTP_LSET_ISUP_OUT_MSG]);
- return mtp_int_submit(set, set->isup_opc, set->dpc, sls, MTP_SI_MNT_ISUP, data, length);
+ return mtp_int_submit(set, set->isup_opc,
+ set->isup_dpc == -1 ? set->dpc : set->isup_dpc,
+ sls, MTP_SI_MNT_ISUP, data, length);
}
int mtp_link_set_send(struct mtp_link_set *set, struct msgb *msg)
@@ -648,6 +652,7 @@ struct mtp_link_set *mtp_link_set_alloc(struct bsc_data *bsc)
set->nr = bsc->num_linksets++;
set->sccp_opc = set->isup_opc = -1;
+ set->sccp_dpc = set->isup_dpc = -1;
set->pcap_fd = bsc->pcap_fd;
set->bsc = bsc;
diff --git a/src/vty_interface.c b/src/vty_interface.c
index 9fe780e..01e504c 100644
--- a/src/vty_interface.c
+++ b/src/vty_interface.c
@@ -206,6 +206,14 @@ static void write_linkset(struct vty *vty, struct mtp_link_set *set)
set->timeout_t18, VTY_NEWLINE);
vty_out(vty, " mtp3 timeout t20 %d%s",
set->timeout_t20, VTY_NEWLINE);
+ if (set->sccp_dpc != -1)
+ vty_out(vty, " mtp3 sccp dpc %d%s", set->sccp_dpc, VTY_NEWLINE);
+ if (set->sccp_opc != -1)
+ vty_out(vty, " mtp3 sccp opc %d%s", set->sccp_opc, VTY_NEWLINE);
+ if (set->isup_dpc != -1)
+ vty_out(vty, " mtp3 isup dpc %d%s", set->isup_dpc, VTY_NEWLINE);
+ if (set->isup_opc != -1)
+ vty_out(vty, " mtp3 isup opc %d%s", set->isup_opc, VTY_NEWLINE);
for (i = 0; i < ARRAY_SIZE(set->supported_ssn); ++i) {
if (!set->supported_ssn[i])
@@ -452,6 +460,78 @@ DEFUN(cfg_linkset_t20, cfg_linkset_t20_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_linkset_mtp3_isup_opc, cfg_linkset_mtp3_isup_opc_cmd,
+ "mtp3 isup opc <0-8191>",
+ "MTP Level3\n" "ISUP Commands\n" "OPC\n" "OPC Number\n")
+{
+ struct mtp_link_set *set = vty->index;
+ set->isup_opc = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_linkset_no_mtp3_isup_opc, cfg_linkset_no_mtp3_isup_opc_cmd,
+ "no mtp3 isup opc",
+ NO_STR "MTP Level3\n" "ISUP Commands\n" "OPC\n")
+{
+ struct mtp_link_set *set = vty->index;
+ set->isup_opc = -1;
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_linkset_mtp3_isup_dpc, cfg_linkset_mtp3_isup_dpc_cmd,
+ "mtp3 isup dpc <0-8191>",
+ "MTP Level3\n" "ISUP Commands\n" "DPC\n" "DPC Number\n")
+{
+ struct mtp_link_set *set = vty->index;
+ set->isup_dpc = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_linkset_no_mtp3_isup_dpc, cfg_linkset_no_mtp3_isup_dpc_cmd,
+ "no mtp3 isup dpc",
+ NO_STR "MTP Level3\n" "ISUP Commands\n" "DPC\n")
+{
+ struct mtp_link_set *set = vty->index;
+ set->isup_dpc = -1;
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_linkset_mtp3_sccp_opc, cfg_linkset_mtp3_sccp_opc_cmd,
+ "mtp3 sccp opc <0-8191>",
+ "MTP Level3\n" "SCCP Commands\n" "OPC\n" "OPC Number\n")
+{
+ struct mtp_link_set *set = vty->index;
+ set->sccp_opc = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_linkset_no_mtp3_sccp_opc, cfg_linkset_no_mtp3_sccp_opc_cmd,
+ "no mtp3 sccp opc",
+ NO_STR "MTP Level3\n" "SCCP Commands\n" "OPC\n")
+{
+ struct mtp_link_set *set = vty->index;
+ set->sccp_opc = -1;
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_linkset_mtp3_sccp_dpc, cfg_linkset_mtp3_sccp_dpc_cmd,
+ "mtp3 sccp dpc <0-8191>",
+ "MTP Level3\n" "SCCP Commands\n" "DPC\n" "DPC Number\n")
+{
+ struct mtp_link_set *set = vty->index;
+ set->sccp_dpc = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_linkset_no_mtp3_sccp_dpc, cfg_linkset_no_mtp3_sccp_dpc_cmd,
+ "no mtp3 sccp dpc",
+ NO_STR "MTP Level3\n" "SCCP Commands\n" "DPC\n")
+{
+ struct mtp_link_set *set = vty->index;
+ set->sccp_dpc = -1;
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_linkset_link, cfg_linkset_link_cmd,
"link <0-100>",
"Link\n" "Link number\n")
@@ -943,6 +1023,14 @@ void cell_vty_init(void)
install_element(LINKSETS_NODE, &cfg_linkset_sltm_once_cmd);
install_element(LINKSETS_NODE, &cfg_linkset_t18_cmd);
install_element(LINKSETS_NODE, &cfg_linkset_t20_cmd);
+ install_element(LINKSETS_NODE, &cfg_linkset_mtp3_isup_opc_cmd);
+ install_element(LINKSETS_NODE, &cfg_linkset_no_mtp3_isup_opc_cmd);
+ install_element(LINKSETS_NODE, &cfg_linkset_mtp3_sccp_opc_cmd);
+ install_element(LINKSETS_NODE, &cfg_linkset_no_mtp3_sccp_opc_cmd);
+ install_element(LINKSETS_NODE, &cfg_linkset_mtp3_isup_dpc_cmd);
+ install_element(LINKSETS_NODE, &cfg_linkset_no_mtp3_isup_dpc_cmd);
+ install_element(LINKSETS_NODE, &cfg_linkset_mtp3_sccp_dpc_cmd);
+ install_element(LINKSETS_NODE, &cfg_linkset_no_mtp3_sccp_dpc_cmd);
install_element(LINKSETS_NODE, &cfg_linkset_link_cmd);
install_node(&link_node, dummy_write);