aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-05-15 00:14:58 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-05-15 00:14:58 +0800
commit317934a2ba0b674044095c7054dc8f01ee4398b3 (patch)
treeca20364ac82d5da3b2789c18199e0136fc0fcc91
parent565b355c8216bc4847b68ddcbd03aa4e813fca59 (diff)
[nat] Add a token to the nat config and handle ID GET
This allows to chain a nat with a nat by answering to the id get code and sending the token.
-rw-r--r--openbsc/include/openbsc/bsc_nat.h1
-rw-r--r--openbsc/src/nat/bsc_nat.c19
-rw-r--r--openbsc/src/nat/bsc_nat_vty.c13
3 files changed, 30 insertions, 3 deletions
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 455e46e71..090eca8ef 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -219,6 +219,7 @@ struct bsc_nat {
int msc_port;
int first_contact;
struct bsc_msc_connection *msc_con;
+ char *token;
/* timeouts */
int auth_timeout;
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index 29aa514e1..ea6c82f91 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -260,6 +260,16 @@ static void initialize_msc_if_needed()
msc_send_reset(nat->msc_con);
}
+static void send_id_get_response()
+{
+ struct msgb *msg = bsc_msc_id_get_resp(nat->token);
+ if (!msg)
+ return;
+
+ ipaccess_prepend_header(msg, IPAC_PROTO_IPACCESS);
+ queue_for_msc(nat->msc_con, msg);
+}
+
/*
* Currently we are lacking refcounting so we need to copy each message.
*/
@@ -455,9 +465,12 @@ static int ipaccess_msc_read_cb(struct bsc_fd *bfd)
ipaccess_rcvmsg_base(msg, bfd);
/* initialize the networking. This includes sending a GSM08.08 message */
- if (hh->proto == IPAC_PROTO_IPACCESS && msg->l2h[0] == IPAC_MSGT_ID_ACK)
- initialize_msc_if_needed();
- else if (hh->proto == IPAC_PROTO_SCCP)
+ if (hh->proto == IPAC_PROTO_IPACCESS) {
+ if (msg->l2h[0] == IPAC_MSGT_ID_ACK)
+ initialize_msc_if_needed();
+ else if (msg->l2h[0] == IPAC_MSGT_ID_GET)
+ send_id_get_response();
+ } else if (hh->proto == IPAC_PROTO_SCCP)
forward_sccp_to_bts(msg);
msgb_free(msg);
diff --git a/openbsc/src/nat/bsc_nat_vty.c b/openbsc/src/nat/bsc_nat_vty.c
index 7209ae946..c41929e7b 100644
--- a/openbsc/src/nat/bsc_nat_vty.c
+++ b/openbsc/src/nat/bsc_nat_vty.c
@@ -61,6 +61,8 @@ static int config_write_nat(struct vty *vty)
vty_out(vty, " timeout auth %d%s", _nat->auth_timeout, VTY_NEWLINE);
vty_out(vty, " timeout ping %d%s", _nat->ping_timeout, VTY_NEWLINE);
vty_out(vty, " timeout pong %d%s", _nat->pong_timeout, VTY_NEWLINE);
+ if (_nat->token)
+ vty_out(vty, " token %s%s", _nat->token, VTY_NEWLINE);
return CMD_SUCCESS;
}
@@ -296,6 +298,16 @@ DEFUN(cfg_nat_pong_time,
return CMD_SUCCESS;
}
+DEFUN(cfg_nat_token, cfg_nat_token_cmd,
+ "token TOKEN",
+ "Set a token for the NAT")
+{
+ if (_nat->token)
+ talloc_free(_nat->token);
+ _nat->token = talloc_strdup(_nat, argv[0]);
+ return CMD_SUCCESS;
+}
+
/* per BSC configuration */
DEFUN(cfg_bsc, cfg_bsc_cmd, "bsc BSC_NR", "Select a BSC to configure")
{
@@ -457,6 +469,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
install_element(NAT_NODE, &cfg_nat_auth_time_cmd);
install_element(NAT_NODE, &cfg_nat_ping_time_cmd);
install_element(NAT_NODE, &cfg_nat_pong_time_cmd);
+ install_element(NAT_NODE, &cfg_nat_token_cmd);
/* BSC subgroups */
install_element(NAT_NODE, &cfg_bsc_cmd);