summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-07-08 22:29:18 -0700
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-07-08 22:29:18 -0700
commit7ddd7a8c51f05287919e9c4e39756f9a52dac99c (patch)
tree470a9fe7f1ad83fb3fe275af7fac7f8f78cdbc35
parent28de8497e34585088d74d739d8f6d9ca27eb311d (diff)
downloadquagga-7ddd7a8c51f05287919e9c4e39756f9a52dac99c.tar.bz2
quagga-7ddd7a8c51f05287919e9c4e39756f9a52dac99c.tar.xz
Set IPv4 TOS value for BGP
Bugfix 2847 Set TOS to internet control for BGP traffic
-rw-r--r--bgpd/bgp_network.c15
-rw-r--r--lib/sockopt.c13
-rw-r--r--lib/sockopt.h1
3 files changed, 29 insertions, 0 deletions
diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c
index 4289ce20..e981e718 100644
--- a/bgpd/bgp_network.c
+++ b/bgpd/bgp_network.c
@@ -267,6 +267,11 @@ bgp_connect (struct peer *peer)
sockopt_reuseaddr (peer->fd);
sockopt_reuseport (peer->fd);
+#ifdef IPTOS_PREC_INTERNETCONTROL
+ if (sockunion_family (&peer->su) == AF_INET)
+ setsockopt_ipv4_tos (peer->fd, IPTOS_PREC_INTERNETCONTROL);
+#endif
+
#ifdef HAVE_TCP_MD5SIG
if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSWORD))
if (sockunion_family (&peer->su) == AF_INET)
@@ -362,6 +367,11 @@ bgp_socket (struct bgp *bgp, unsigned short port, char *address)
sockopt_reuseaddr (sock);
sockopt_reuseport (sock);
+#ifdef IPTOS_PREC_INTERNETCONTROL
+ if (ainfo->ai_family == AF_INET)
+ setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL);
+#endif
+
#if defined(HAVE_TCP_MD5SIG) && defined(IPV6_V6ONLY)
/* We can not apply MD5SIG to an IPv6 socket. If this is an AF_INET6
socket, we'll have to create another socket for IPv4*/
@@ -419,6 +429,7 @@ bgp_socket (struct bgp *bgp, unsigned short port, char *address)
sockopt_reuseaddr (sock);
sockopt_reuseport (sock);
+ setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL);
memset (&sin, 0, sizeof (struct sockaddr_in));
@@ -486,6 +497,10 @@ bgp_socket (struct bgp *bgp, unsigned short port, char *address)
sockopt_reuseaddr (sock);
sockopt_reuseport (sock);
+#ifdef IPTOS_PREC_INTERNETCONTROL
+ setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL);
+#endif
+
memset (&sin, 0, sizeof (struct sockaddr_in));
sin.sin_family = AF_INET;
diff --git a/lib/sockopt.c b/lib/sockopt.c
index 985c3a38..e0027e88 100644
--- a/lib/sockopt.c
+++ b/lib/sockopt.c
@@ -342,6 +342,19 @@ setsockopt_ipv4_ifindex (int sock, int val)
}
int
+setsockopt_ipv4_tos(int sock, int tos)
+{
+ int ret;
+
+ ret = setsockopt (sock, IPPROTO_IP, IP_TOS, &tos, sizeof (tos));
+ if (ret < 0)
+ zlog_warn ("Can't set IP_TOS option for fd %d to %#x: %s",
+ sock, tos, safe_strerror(errno));
+ return ret;
+}
+
+
+int
setsockopt_ifindex (int af, int sock, int val)
{
int ret = -1;
diff --git a/lib/sockopt.h b/lib/sockopt.h
index 158f17ac..df0de61c 100644
--- a/lib/sockopt.h
+++ b/lib/sockopt.h
@@ -87,6 +87,7 @@ extern int setsockopt_multicast_ipv4(int sock, int optname,
unsigned int ifindex
/* optional: if non-zero, may be used
instead of if_addr */);
+extern int setsockopt_ipv4_tos(int sock, int tos);
/* Ask for, and get, ifindex, by whatever method is supported. */
extern int setsockopt_ifindex (int, int, int);