laforge submitted this change.
octoi: Support setting IP DSCP and socket priority via VTY
Let's allow setting IP DSCP and socket priority via the VTY.
Note that you must still manually add a kernel egress QoS map from
socket priority to IEEE P802.1p PCP (Priority Code Point) like this:
ip link set dev eth0.7 type vlan egress-qos-map 0:0 1:1 5:5 6:6 7:7
This will create 1:1 mappings for socket priorities 0, 1, 5, 6 and 7 to
the respective IEEE PCP. A higher PCP typically means higher priority,
where voice is traditionally using "5".
Change-Id: Ic5a6c5a0ec67beb40be4ca95326aca5072a28958
---
M include/osmocom/octoi/octoi.h
M src/octoi/octoi_clnt_vty.c
M src/octoi/octoi_sock.c
M src/octoi/octoi_sock.h
M src/octoi/octoi_srv_vty.c
5 files changed, 155 insertions(+), 0 deletions(-)
diff --git a/include/osmocom/octoi/octoi.h b/include/osmocom/octoi/octoi.h
index 48ec122..e7ebcaa 100644
--- a/include/osmocom/octoi/octoi.h
+++ b/include/osmocom/octoi/octoi.h
@@ -42,6 +42,8 @@
struct {
struct llist_head accounts; /* list of octoi_account */
struct osmo_sockaddr_str local; /* local socket bind address/port */
+ uint8_t dscp; /* IP DSCP value */
+ uint8_t priority; /* Socket Priority value */
} cfg;
};
@@ -54,6 +56,9 @@
struct osmo_sockaddr_str local; /* local socket bind address/port */
struct octoi_account *account;
+
+ uint8_t dscp; /* IP DSCP value */
+ uint8_t priority; /* Socket Priority value */
} cfg;
};
diff --git a/src/octoi/octoi_clnt_vty.c b/src/octoi/octoi_clnt_vty.c
index 1f8f7d1..756cc9a 100644
--- a/src/octoi/octoi_clnt_vty.c
+++ b/src/octoi/octoi_clnt_vty.c
@@ -148,6 +148,68 @@
}
clnt->sock->rx_cb = octoi_clnt_fsm_rx_cb;
+ if (clnt->cfg.dscp) {
+ rc = octoi_sock_set_dscp(clnt->sock, clnt->cfg.dscp);
+ if (rc < 0) {
+ vty_out(vty, "%% failed to set DSCP on socket: %s%s", strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
+ if (clnt->cfg.priority) {
+ rc = octoi_sock_set_priority(clnt->sock, clnt->cfg.priority);
+ if (rc < 0) {
+ vty_out(vty, "%% failed to set priority on socket: %s%s", strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_clnt_dscp, cfg_clnt_dscp_cmd,
+ "ip-dscp <0-63>",
+ "Set IP DSCP value for outbound packets\n"
+ "IP DSCP Value to use\n")
+{
+ struct octoi_client *clnt = vty->index;
+ int rc;
+
+ clnt->cfg.dscp = atoi(argv[0]);
+
+ if (!clnt->sock)
+ return CMD_SUCCESS;
+
+ /* apply to already-existing server */
+ rc = octoi_sock_set_dscp(clnt->sock, clnt->cfg.dscp);
+ if (rc < 0) {
+ vty_out(vty, "%% failed to set DSCP on socket: %s%s", strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_clnt_prio, cfg_clnt_prio_cmd,
+ "socket-priority <0-255>",
+ "Set socket priority value for outbound packets\n"
+ "Socket Priority\n")
+{
+ struct octoi_client *clnt = vty->index;
+ int rc;
+
+ clnt->cfg.priority = atoi(argv[0]);
+
+ if (!clnt->sock)
+ return CMD_SUCCESS;
+
+ /* apply to already-existing server */
+ rc = octoi_sock_set_priority(clnt->sock, clnt->cfg.priority);
+ if (rc < 0) {
+ vty_out(vty, "%% failed to set priority on socket: %s%s", strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
return CMD_SUCCESS;
}
@@ -197,6 +259,11 @@
vty_out(vty, " local-bind %s %u%s", clnt->cfg.local.ip, clnt->cfg.local.port,
VTY_NEWLINE);
}
+ if (clnt->cfg.dscp)
+ vty_out(vty, " ip-dscp %u%s", clnt->cfg.dscp, VTY_NEWLINE);
+ if (clnt->cfg.priority)
+ vty_out(vty, " socket-priority %u%s", clnt->cfg.priority, VTY_NEWLINE);
+
octoi_vty_write_one_account(vty, clnt->cfg.account);
}
@@ -215,5 +282,7 @@
install_node(&clnt_node, config_write_octoi_clnt);
install_element(CONFIG_NODE, &cfg_client_cmd);
install_element(OCTOI_CLNT_NODE, &cfg_clnt_local_cmd);
+ install_element(OCTOI_CLNT_NODE, &cfg_clnt_dscp_cmd);
+ install_element(OCTOI_CLNT_NODE, &cfg_clnt_prio_cmd);
install_element(OCTOI_CLNT_NODE, &cfg_clnt_account_cmd);
}
diff --git a/src/octoi/octoi_sock.c b/src/octoi/octoi_sock.c
index 943270a..4805d7e 100644
--- a/src/octoi/octoi_sock.c
+++ b/src/octoi/octoi_sock.c
@@ -450,6 +450,16 @@
return sock;
}
+int octoi_sock_set_dscp(struct octoi_sock *sock, uint8_t dscp)
+{
+ return osmo_sock_set_dscp(sock->ofd.fd, dscp);
+}
+
+int octoi_sock_set_priority(struct octoi_sock *sock, uint8_t priority)
+{
+ return osmo_sock_set_priority(sock->ofd.fd, priority);
+}
+
void octoi_sock_destroy(struct octoi_sock *sock)
{
struct octoi_peer *p1, *p2;
diff --git a/src/octoi/octoi_sock.h b/src/octoi/octoi_sock.h
index cf7b74b..b251864 100644
--- a/src/octoi/octoi_sock.h
+++ b/src/octoi/octoi_sock.h
@@ -66,6 +66,9 @@
struct octoi_peer *octoi_sock_client_get_peer(struct octoi_sock *sock);
+int octoi_sock_set_dscp(struct octoi_sock *sock, uint8_t dscp);
+int octoi_sock_set_priority(struct octoi_sock *sock, uint8_t priority);
+
void octoi_peer_destroy(struct octoi_peer *peer);
int octoi_tx(struct octoi_peer *peer, uint8_t msg_type, uint8_t flags,
diff --git a/src/octoi/octoi_srv_vty.c b/src/octoi/octoi_srv_vty.c
index c9f63cb..f616af5 100644
--- a/src/octoi/octoi_srv_vty.c
+++ b/src/octoi/octoi_srv_vty.c
@@ -182,6 +182,68 @@
}
srv->sock->rx_cb = octoi_srv_fsm_rx_cb;
+ if (srv->cfg.dscp) {
+ rc = octoi_sock_set_dscp(srv->sock, srv->cfg.dscp);
+ if (rc < 0) {
+ vty_out(vty, "%% failed to set DSCP on socket: %s%s", strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
+ if (srv->cfg.priority) {
+ rc = octoi_sock_set_priority(srv->sock, srv->cfg.priority);
+ if (rc < 0) {
+ vty_out(vty, "%% failed to set priority on socket: %s%s", strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_srv_dscp, cfg_srv_dscp_cmd,
+ "ip-dscp <0-63>",
+ "Set IP DSCP value for outbound packets\n"
+ "IP DSCP Value to use\n")
+{
+ struct octoi_server *srv = vty->index;
+ int rc;
+
+ srv->cfg.dscp = atoi(argv[0]);
+
+ if (!srv->sock)
+ return CMD_SUCCESS;
+
+ /* apply to already-existing server */
+ rc = octoi_sock_set_dscp(srv->sock, srv->cfg.dscp);
+ if (rc < 0) {
+ vty_out(vty, "%% failed to set DSCP on socket: %s%s", strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_srv_prio, cfg_srv_prio_cmd,
+ "socket-priority <0-255>",
+ "Set socket priority value for outbound packets\n"
+ "Socket Priority\n")
+{
+ struct octoi_server *srv = vty->index;
+ int rc;
+
+ srv->cfg.priority = atoi(argv[0]);
+
+ if (!srv->sock)
+ return CMD_SUCCESS;
+
+ /* apply to already-existing server */
+ rc = octoi_sock_set_priority(srv->sock, srv->cfg.priority);
+ if (rc < 0) {
+ vty_out(vty, "%% failed to set priority on socket: %s%s", strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
return CMD_SUCCESS;
}
@@ -347,6 +409,10 @@
vty_out(vty, " local-bind %s %u%s", srv->cfg.local.ip, srv->cfg.local.port,
VTY_NEWLINE);
}
+ if (srv->cfg.dscp)
+ vty_out(vty, " ip-dscp %u%s", srv->cfg.dscp, VTY_NEWLINE);
+ if (srv->cfg.priority)
+ vty_out(vty, " socket-priority %u%s", srv->cfg.priority, VTY_NEWLINE);
llist_for_each_entry(acc, &srv->cfg.accounts, list)
octoi_vty_write_one_account(vty, acc);
@@ -385,6 +451,8 @@
install_element(CONFIG_NODE, &cfg_server_cmd);
//install_element(CONFIG_NODE, &cfg_no_server_cmd);
install_element(OCTOI_SRV_NODE, &cfg_srv_local_cmd);
+ install_element(OCTOI_SRV_NODE, &cfg_srv_dscp_cmd);
+ install_element(OCTOI_SRV_NODE, &cfg_srv_prio_cmd);
install_element(OCTOI_SRV_NODE, &cfg_srv_account_cmd);
//install_element(CONFIG_SRV_NODE, &cfg_srv_no_account_cmd);
}
To view, visit change 27857. To unsubscribe, or for help writing mail filters, visit settings.