laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-e1d/+/27857 )
Change subject: octoi: Support setting IP DSCP and socket priority via VTY ......................................................................
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(-)
Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved
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); }