laforge has uploaded this change for review. ( 
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(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-e1d refs/changes/57/27857/1

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 https://gerrit.osmocom.org/c/osmo-e1d/+/27857
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-e1d
Gerrit-Branch: master
Gerrit-Change-Id: Ic5a6c5a0ec67beb40be4ca95326aca5072a28958
Gerrit-Change-Number: 27857
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <[email protected]>
Gerrit-MessageType: newchange

Reply via email to