aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-06-15 18:52:38 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-06-15 20:24:20 +0800
commitca999a989d972ba79902251cbb74956732e91bf9 (patch)
treef3821fbcd0e1a07cc7dc1c8711cd6e3db43c3e91
parentb71c23bb0aba550f7f6907476ef5ca43cd578433 (diff)
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).
-rw-r--r--openbsc/include/openbsc/bsc_msc.h3
-rw-r--r--openbsc/include/openbsc/gsm_data.h1
-rw-r--r--openbsc/src/bsc_msc.c10
-rw-r--r--openbsc/src/nat/bsc_nat.c2
4 files changed, 13 insertions, 3 deletions
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 4292bb11b..f3f4ed37a 100644
--- a/openbsc/include/openbsc/gsm_data.h
+++ b/openbsc/include/openbsc/gsm_data.h
@@ -677,6 +677,7 @@ struct gsm_network {
struct {
enum rrlp_mode mode;
} rrlp;
+ int msc_prio;
};
#define SMS_HDR_SIZE 128
diff --git a/openbsc/src/bsc_msc.c b/openbsc/src/bsc_msc.c
index 5ee267a2f..42b4c20f8 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);
@@ -200,7 +207,7 @@ int bsc_msc_connect(struct bsc_msc_connection *con)
return ret;
}
-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;
@@ -212,6 +219,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/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index c80c088a6..3b3bf6964 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -1110,7 +1110,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);