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
This commit is contained in:
Harald Welte 2022-04-21 09:09:03 +02:00
parent 42d2b80fd5
commit e8e62c4b31
5 changed files with 155 additions and 0 deletions

View File

@ -42,6 +42,8 @@ struct octoi_server {
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 octoi_client {
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;
};

View File

@ -148,6 +148,68 @@ DEFUN(cfg_clnt_local, cfg_clnt_local_cmd,
}
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 @@ static int config_write_octoi_clnt(struct vty *vty)
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 @@ void octoi_client_vty_init(void)
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);
}

View File

@ -450,6 +450,16 @@ struct octoi_sock *octoi_sock_create_client(void *ctx, void *priv, const struct
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;

View File

@ -66,6 +66,9 @@ void octoi_sock_destroy(struct octoi_sock *sock);
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,

View File

@ -182,6 +182,68 @@ DEFUN(cfg_srv_local, cfg_srv_local_cmd,
}
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 @@ static int config_write_octoi_srv(struct vty *vty)
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 @@ void octoi_server_vty_init(void)
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);
}