From 35e56453d2cb11847fe6b65752e1641987419773 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 18 May 2010 03:31:16 +0800 Subject: msc: Add msc ip-tos NR option for the BSC Allow to set the TOS field via the VTY interface. The SO_PRIORITY was not used as it has no effect on the packets being sent (in contrast to the documentation). --- openbsc/include/openbsc/bsc_msc.h | 3 ++- openbsc/include/openbsc/gsm_data.h | 1 + openbsc/src/bsc_msc.c | 10 +++++++++- openbsc/src/bsc_msc_ip.c | 4 +++- openbsc/src/nat/bsc_nat.c | 2 +- openbsc/src/vty_interface.c | 12 ++++++++++++ 6 files changed, 28 insertions(+), 4 deletions(-) (limited to 'openbsc') diff --git a/openbsc/include/openbsc/bsc_msc.h b/openbsc/include/openbsc/bsc_msc.h index 9b75def9a..faf6faaa3 100644 --- a/openbsc/include/openbsc/bsc_msc.h +++ b/openbsc/include/openbsc/bsc_msc.h @@ -32,6 +32,7 @@ struct bsc_msc_connection { int is_authenticated; const char *ip; int port; + int prio; void (*connection_loss) (struct bsc_msc_connection *); void (*connected) (struct bsc_msc_connection *); @@ -39,7 +40,7 @@ struct bsc_msc_connection { struct timer_list timeout_timer; }; -struct bsc_msc_connection *bsc_msc_create(const char *ip, int port); +struct bsc_msc_connection *bsc_msc_create(const char *ip, int port, int prio); int bsc_msc_connect(struct bsc_msc_connection *); void bsc_msc_schedule_connect(struct bsc_msc_connection *); diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 65b5a3c3e..4e73fd4f2 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -675,6 +675,7 @@ struct gsm_network { char *bsc_token; char *msc_ip; int msc_port; + int msc_prio; struct bsc_msc_connection *msc_con; int ping_timeout; int pong_timeout; diff --git a/openbsc/src/bsc_msc.c b/openbsc/src/bsc_msc.c index 3ecd13170..362450fa5 100644 --- a/openbsc/src/bsc_msc.c +++ b/openbsc/src/bsc_msc.c @@ -163,6 +163,13 @@ int bsc_msc_connect(struct bsc_msc_connection *con) /* make it non blocking */ setnonblocking(fd); + /* set the socket priority */ + ret = setsockopt(fd->fd, IPPROTO_IP, IP_TOS, + &con->prio, sizeof(con->prio)); + if (ret != 0) + LOGP(DMSC, LOGL_ERROR, "Failed to set prio to %d. %s\n", + con->prio, strerror(errno)); + memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(con->port); @@ -201,7 +208,7 @@ int bsc_msc_connect(struct bsc_msc_connection *con) } -struct bsc_msc_connection *bsc_msc_create(const char *ip, int port) +struct bsc_msc_connection *bsc_msc_create(const char *ip, int port, int prio) { struct bsc_msc_connection *con; @@ -213,6 +220,7 @@ struct bsc_msc_connection *bsc_msc_create(const char *ip, int port) con->ip = ip; con->port = port; + con->prio = prio; write_queue_init(&con->write_queue, 100); con->write_queue.except_cb = bsc_msc_except; return con; diff --git a/openbsc/src/bsc_msc_ip.c b/openbsc/src/bsc_msc_ip.c index 0166a76c6..4d1c1a18d 100644 --- a/openbsc/src/bsc_msc_ip.c +++ b/openbsc/src/bsc_msc_ip.c @@ -1233,7 +1233,9 @@ int main(int argc, char **argv) if (msc_address) msc = msc_address; - bsc_gsmnet->msc_con = bsc_msc_create(msc, bsc_gsmnet->msc_port); + bsc_gsmnet->msc_con = bsc_msc_create(msc, + bsc_gsmnet->msc_port, + bsc_gsmnet->msc_prio); if (!bsc_gsmnet->msc_con) { fprintf(stderr, "Creating a bsc_msc_connection failed.\n"); exit(1); diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c index 60af912b3..a10510e8d 100644 --- a/openbsc/src/nat/bsc_nat.c +++ b/openbsc/src/nat/bsc_nat.c @@ -1109,7 +1109,7 @@ int main(int argc, char** argv) return -4; /* connect to the MSC */ - nat->msc_con = bsc_msc_create(nat->msc_ip, nat->msc_port); + nat->msc_con = bsc_msc_create(nat->msc_ip, nat->msc_port, 0); if (!nat->msc_con) { fprintf(stderr, "Creating a bsc_msc_connection failed.\n"); exit(1); diff --git a/openbsc/src/vty_interface.c b/openbsc/src/vty_interface.c index aada5fa97..d16cc61f3 100644 --- a/openbsc/src/vty_interface.c +++ b/openbsc/src/vty_interface.c @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -482,6 +483,7 @@ static int config_write_net(struct vty *vty) vty_out(vty, " bsc_token %s%s", gsmnet->bsc_token, VTY_NEWLINE); vty_out(vty, " msc ip %s%s", gsmnet->msc_ip, VTY_NEWLINE); vty_out(vty, " msc port %d%s", gsmnet->msc_port, VTY_NEWLINE); + vty_out(vty, " msc ip-tos %d%s", gsmnet->msc_prio, VTY_NEWLINE); vty_out(vty, " timeout ping %d%s", gsmnet->ping_timeout, VTY_NEWLINE); vty_out(vty, " timeout pong %d%s", gsmnet->pong_timeout, VTY_NEWLINE); @@ -1347,6 +1349,15 @@ DEFUN(cfg_net_msc_port, return CMD_SUCCESS; } +DEFUN(cfg_net_msc_prio, + cfg_net_msc_prio_cmd, + "msc ip-tos <0-255>", + "Set the IP_TOS socket attribite") +{ + gsmnet->msc_prio = atoi(argv[0]); + return CMD_SUCCESS; +} + DEFUN(cfg_net_ping_time, cfg_net_ping_time_cmd, "timeout ping NR", @@ -2114,6 +2125,7 @@ int bsc_vty_init(struct gsm_network *net) install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd); install_element(GSMNET_NODE, &cfg_net_msc_ip_cmd); install_element(GSMNET_NODE, &cfg_net_msc_port_cmd); + install_element(GSMNET_NODE, &cfg_net_msc_prio_cmd); install_element(GSMNET_NODE, &cfg_net_ping_time_cmd); install_element(GSMNET_NODE, &cfg_net_pong_time_cmd); -- cgit v1.2.3