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:
parent
42d2b80fd5
commit
e8e62c4b31
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue