aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2013-03-25 16:16:47 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2013-03-25 16:20:53 +0100
commit2b9d7b1376ac0a4ccbd4c5cb94ed4b516664a05b (patch)
tree09f3873e74bc719b4e20267d72f1363135fde908
parent692daaf2d26d1296db4b7e780f4805bb1b36bf31 (diff)
gprs: Introduce a way to set the DSCP for the NS socket
Add a VTY command to set the DSCP.
-rw-r--r--openbsc/include/openbsc/gprs_ns.h1
-rw-r--r--openbsc/src/libgb/gprs_ns.c10
-rw-r--r--openbsc/src/libgb/gprs_ns_vty.c14
3 files changed, 24 insertions, 1 deletions
diff --git a/openbsc/include/openbsc/gprs_ns.h b/openbsc/include/openbsc/gprs_ns.h
index 8f28d4623..e8a143ebc 100644
--- a/openbsc/include/openbsc/gprs_ns.h
+++ b/openbsc/include/openbsc/gprs_ns.h
@@ -136,6 +136,7 @@ struct gprs_ns_inst {
struct osmo_fd fd;
uint32_t local_ip;
uint16_t local_port;
+ int dscp;
} nsip;
/* NS-over-FR-over-GRE-over-IP specific bits */
struct {
diff --git a/openbsc/src/libgb/gprs_ns.c b/openbsc/src/libgb/gprs_ns.c
index dab57e663..67a52f6c6 100644
--- a/openbsc/src/libgb/gprs_ns.c
+++ b/openbsc/src/libgb/gprs_ns.c
@@ -853,7 +853,6 @@ void gprs_ns_destroy(struct gprs_ns_inst *nsi)
talloc_free(nsi);
}
-
/* NS-over-IP code, according to 3GPP TS 48.016 Chapter 6.2
* We don't support Size Procedure, Configuration Procedure, ChangeWeight Procedure */
@@ -952,6 +951,15 @@ int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi)
nsi->nsip.fd.data = nsi;
+ ret = setsockopt(nsi->nsip.fd.fd, IPPROTO_IP, IP_TOS,
+ &nsi->nsip.dscp, sizeof(nsi->nsip.dscp));
+ if (ret < 0)
+ LOGP(DNS, LOGL_ERROR,
+ "Failed to set the DSCP to %d with ret(%d) errno(%d)\n",
+ nsi->nsip.dscp, ret, errno);
+
+
+
return ret;
}
diff --git a/openbsc/src/libgb/gprs_ns_vty.c b/openbsc/src/libgb/gprs_ns_vty.c
index 14d7691dd..a9b35d80b 100644
--- a/openbsc/src/libgb/gprs_ns_vty.c
+++ b/openbsc/src/libgb/gprs_ns_vty.c
@@ -121,6 +121,9 @@ static int config_write_ns(struct vty *vty)
if (vty_nsi->nsip.local_port)
vty_out(vty, " encapsulation udp local-port %u%s",
vty_nsi->nsip.local_port, VTY_NEWLINE);
+ if (vty_nsi->nsip.dscp)
+ vty_out(vty, " encapsulation udp dscp %d%s",
+ vty_nsi->nsip.dscp, VTY_NEWLINE);
vty_out(vty, " encapsulation framerelay-gre enabled %u%s",
vty_nsi->frgre.enabled ? 1 : 0, VTY_NEWLINE);
@@ -444,6 +447,16 @@ DEFUN(cfg_nsip_local_port, cfg_nsip_local_port_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_nsip_dscp, cfg_nsip_dscp_cmd,
+ "encapsulation udp dscp <0-255>",
+ ENCAPS_STR "NS over UDP Encapsulation\n"
+ "Set DSCP/TOS on the UDP socket\n" "DSCP Value\n")
+{
+ int dscp = atoi(argv[0]);
+ vty_nsi->nsip.dscp = dscp;
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_frgre_local_ip, cfg_frgre_local_ip_cmd,
"encapsulation framerelay-gre local-ip A.B.C.D",
ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
@@ -561,6 +574,7 @@ int gprs_ns_vty_init(struct gprs_ns_inst *nsi)
install_element(NS_NODE, &cfg_ns_timer_cmd);
install_element(NS_NODE, &cfg_nsip_local_ip_cmd);
install_element(NS_NODE, &cfg_nsip_local_port_cmd);
+ install_element(NS_NODE, &cfg_nsip_dscp_cmd);
install_element(NS_NODE, &cfg_frgre_enable_cmd);
install_element(NS_NODE, &cfg_frgre_local_ip_cmd);