Merge pull request #11152 from donaldsharp/dscp

bgpd: Allow bgp to control the DSCP session TOS value
This commit is contained in:
Donatas Abraitis 2022-05-16 22:53:41 +03:00 committed by GitHub
commit b2ca7559b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 48 additions and 8 deletions

View 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);

View 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);

View 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.

View 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);

View 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