]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: Allow bgp to control the DSCP session TOS value
authorPavel Shirshov <pavelsh@microsoft.com>
Thu, 5 May 2022 18:16:27 +0000 (14:16 -0400)
committerDonald Sharp <sharpd@pinkbelly.org>
Fri, 13 May 2022 18:14:35 +0000 (14:14 -0400)
Allow BGP to control the TOS DSCP value in the tcp header
via a new command at the bgp global level `bgp session-dscp <0-63>`

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Signed-off-by: Pavel Shirhov <pavelsh@microsoft.com>
bgpd/bgp_network.c
bgpd/bgp_vty.c
bgpd/bgpd.c
bgpd/bgpd.h
doc/user/bgp.rst

index e702ee4fdddc62e17c3821312affc76eb90feaee..77e2a0f53fc01010c747c821a4c3d06ac4a52ba0 100644 (file)
@@ -741,11 +741,9 @@ int bgp_connect(struct peer *peer)
 #ifdef IPTOS_PREC_INTERNETCONTROL
        frr_with_privs(&bgpd_privs) {
                if (sockunion_family(&peer->su) == AF_INET)
-                       setsockopt_ipv4_tos(peer->fd,
-                                           IPTOS_PREC_INTERNETCONTROL);
+                       setsockopt_ipv4_tos(peer->fd, bm->tcp_dscp);
                else if (sockunion_family(&peer->su) == AF_INET6)
-                       setsockopt_ipv6_tclass(peer->fd,
-                                              IPTOS_PREC_INTERNETCONTROL);
+                       setsockopt_ipv6_tclass(peer->fd, bm->tcp_dscp);
        }
 #endif
 
@@ -822,10 +820,9 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen,
 
 #ifdef IPTOS_PREC_INTERNETCONTROL
                if (sa->sa_family == AF_INET)
-                       setsockopt_ipv4_tos(sock, IPTOS_PREC_INTERNETCONTROL);
+                       setsockopt_ipv4_tos(sock, bm->tcp_dscp);
                else if (sa->sa_family == AF_INET6)
-                       setsockopt_ipv6_tclass(sock,
-                                              IPTOS_PREC_INTERNETCONTROL);
+                       setsockopt_ipv6_tclass(sock, bm->tcp_dscp);
 #endif
 
                sockopt_v6only(sa->sa_family, sock);
index 4a3688be27a1caa53100f341955279e9eb28c2e3..9e22c6cdbd86192ea350ae89c562c066c60d706a 100644 (file)
@@ -1568,6 +1568,32 @@ DEFUN (no_router_bgp,
        return CMD_SUCCESS;
 }
 
+/* bgp session-dscp */
+
+DEFPY (bgp_session_dscp,
+       bgp_session_dscp_cmd,
+       "bgp session-dscp (0-63)$dscp",
+       BGP_STR
+       "Override default (C6) bgp TCP session DSCP value\n"
+       "Manually configured dscp parameter\n")
+{
+       bm->tcp_dscp = dscp << 2;
+
+       return CMD_SUCCESS;
+}
+
+DEFPY (no_bgp_session_dscp,
+       no_bgp_session_dscp_cmd,
+       "no bgp session-dscp [(0-63)]",
+       NO_STR
+       BGP_STR
+       "Override default (C6) bgp TCP session DSCP value\n"
+       "Manually configured dscp parameter\n")
+{
+       bm->tcp_dscp = IPTOS_PREC_INTERNETCONTROL;
+
+       return CMD_SUCCESS;
+}
 
 /* BGP router-id.  */
 
@@ -17126,6 +17152,10 @@ int bgp_config_write(struct vty *vty)
        if (CHECK_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA))
                vty_out(vty, "bgp send-extra-data zebra\n");
 
+       /* BGP session DSCP value */
+       if (bm->tcp_dscp != IPTOS_PREC_INTERNETCONTROL)
+               vty_out(vty, "bgp session-dscp %u\n", bm->tcp_dscp >> 2);
+
        /* BGP configuration. */
        for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp)) {
 
@@ -17829,6 +17859,10 @@ void bgp_vty_init(void)
        /* "no router bgp" commands. */
        install_element(CONFIG_NODE, &no_router_bgp_cmd);
 
+       /* "bgp session-dscp command */
+       install_element(CONFIG_NODE, &bgp_session_dscp_cmd);
+       install_element(CONFIG_NODE, &no_bgp_session_dscp_cmd);
+
        /* "bgp router-id" commands. */
        install_element(BGP_NODE, &bgp_router_id_cmd);
        install_element(BGP_NODE, &no_bgp_router_id_cmd);
index 779540772acee43660a313a68baf528abe547862..7d284f28b38b22c248db2076759a0c7e0fdc8c88 100644 (file)
@@ -3259,7 +3259,6 @@ static struct bgp *bgp_create(as_t *as, const char *name,
 
        bgp->evpn_info = XCALLOC(MTYPE_BGP_EVPN_INFO,
                                 sizeof(struct bgp_evpn_info));
-
        bgp_evpn_init(bgp);
        bgp_evpn_vrf_es_init(bgp);
        bgp_pbr_init(bgp);
@@ -7854,6 +7853,7 @@ void bgp_master_init(struct thread_master *master, const int buffer_size,
        bm->terminating = false;
        bm->socket_buffer = buffer_size;
        bm->wait_for_fib = false;
+       bm->tcp_dscp = IPTOS_PREC_INTERNETCONTROL;
 
        bgp_mac_init();
        /* init the rd id space.
index af07cb4c10a9d329d2b60c6243484886f7d80d98..6b58c101a78457235a7ab10e4ab1cd3c5db996d9 100644 (file)
@@ -171,6 +171,10 @@ struct bgp_master {
 #define BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA (1 << 1)
 
        bool terminating;       /* global flag that sigint terminate seen */
+
+       /* DSCP value for TCP sessions */
+       uint8_t tcp_dscp;
+
        QOBJ_FIELDS;
 };
 DECLARE_QOBJ_TYPE(bgp_master);
index 3069745723ea52cb37973f741e70eea606d9fa96..d4abf2c34d6addf38072a4b570440def961c43de 100644 (file)
@@ -4014,6 +4014,11 @@ behavior in BGP is not to send this data. If the routes were sent to zebra and
 the option is changed, bgpd doesn't reinstall the routes to comply with the new
 setting.
 
+.. clicmd:: bgp session-dscp (0-63)
+
+This command allows bgp to control, at a global level, the TCP dscp values
+in the TCP header.
+
 .. _bgp-suppress-fib:
 
 Suppressing routes not installed in FIB