]> git.proxmox.com Git - mirror_frr.git/commitdiff
IPv6 transport class suppport
authorStephen Hemminger <shemminger@vyatta.com>
Wed, 28 Sep 2011 10:23:35 +0000 (14:23 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 17 Oct 2011 14:59:19 +0000 (18:59 +0400)
IPv6 supports the same concept of differentiated service for routing
protocols as IPv4, but like too many things, the standards committee
decided that having two names for the same thing wasn't good enough and
introduced a third more generic term transport class.

The socket option to set transport class works the same as IPv4, but the
arguments are different.

* lib/sockopt.[ch]
  * setsockopt_ipv6_tclass(): new function
* bgpd/bgp_network.c
  * bgp_connect(): set socket option
  * bgp_listener(): set socket option
* ospf6d/ospf6_network.c
  * ospf6_set_transport_class(): new function
  * ospf6_serv_sock(): set socket option
* ripngd/ripngd.c
  * ripng_make_socket(): set socket option

bgpd/bgp_network.c
lib/sockopt.c
lib/sockopt.h
ospf6d/ospf6_network.c
ripngd/ripngd.c

index 570cc3b7335ac692025a5ef285e6cf45acce26f6..c8ff87a68c5513e91fffc74f00d985d99bd53103 100644 (file)
@@ -330,6 +330,10 @@ bgp_connect (struct peer *peer)
 #ifdef IPTOS_PREC_INTERNETCONTROL
   if (sockunion_family (&peer->su) == AF_INET)
     setsockopt_ipv4_tos (peer->fd, IPTOS_PREC_INTERNETCONTROL);
+# ifdef HAVE_IPV6
+  else if (sockunion_family (&peer->su) == AF_INET6)
+    setsockopt_ipv6_tclass (peer->fd, IPTOS_PREC_INTERNETCONTROL);
+# endif
 #endif
 
   if (peer->password)
@@ -389,6 +393,10 @@ 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);
+#  ifdef HAVE_IPV6
+  else if (sa->sa_family == AF_INET6)
+    setsockopt_ipv6_tclass (sock, IPTOS_PREC_INTERNETCONTROL);
+#  endif
 #endif
 
 #ifdef IPV6_V6ONLY
index 9ff15ca6dce4eddefd17d260564b491026a57cb2..638584087735fb2e4d9ec14be99218aa616ad41a 100644 (file)
@@ -179,8 +179,19 @@ getsockopt_ipv6_ifindex (struct msghdr *msgh)
   
   return pktinfo->ipi6_ifindex;
 }
-#endif /* HAVE_IPV6 */
 
+int
+setsockopt_ipv6_tclass(int sock, int tclass)
+{
+  int ret;
+
+  ret = setsockopt (sock, IPPROTO_IPV6, IPV6_TCLASS, &tclass, sizeof (tclass));
+  if (ret < 0)
+    zlog_warn ("Can't set IPV6_TCLASS option for fd %d to %#x: %s",
+              sock, tclass, safe_strerror(errno));
+  return ret;
+}
+#endif /* HAVE_IPV6 */
 
 /*
  * Process multicast socket options for IPv4 in an OS-dependent manner.
index 69309e001b9b5f66355c74b708356163e462dc73..aced6d489f916b3ec87cb47c16cfd95e74a49708 100644 (file)
@@ -35,6 +35,7 @@ extern int setsockopt_ipv6_multicast_hops (int, int);
 extern int setsockopt_ipv6_unicast_hops (int, int);
 extern int setsockopt_ipv6_hoplimit (int, int);
 extern int setsockopt_ipv6_multicast_loop (int, int);
+extern int setsockopt_ipv6_tclass (int, int);
 #endif /* HAVE_IPV6 */
 
 /*
index 96b82af32a4838a98af48f7270b7de6e3e0b48cc..3372238b9e954e700596e1336a1219d2a9c999b6 100644 (file)
@@ -63,6 +63,14 @@ ospf6_set_pktinfo (void)
   setsockopt_ipv6_pktinfo (ospf6_sock, 1);
 }
 
+void
+ospf6_set_transport_class (void)
+{
+#ifdef IPTOS_PREC_INTERNETCONTROL
+  setsockopt_ipv6_tclass (ospf6_sock, IPTOS_PREC_INTERNETCONTROL);
+#endif
+}
+
 void
 ospf6_set_checksum (void)
 {
@@ -102,6 +110,7 @@ ospf6_serv_sock (void)
 #endif /*1*/
   ospf6_reset_mcastloop ();
   ospf6_set_pktinfo ();
+  ospf6_set_transport_class ();
   ospf6_set_checksum ();
 
   /* setup global in6_addr, allspf6 and alldr6 for later use */
index 6e32d83c5d0a7df138a89977d67383effb21dff8..d416255c2fea0cb35e2e1dbf687c8fedb67f4936 100644 (file)
@@ -117,6 +117,11 @@ ripng_make_socket (void)
   ret = setsockopt_ipv6_pktinfo (sock, 1);
   if (ret < 0)
     return ret;
+#ifdef IPTOS_PREC_INTERNETCONTROL
+  ret = setsockopt_ipv6_tclass (sock, IPTOS_PREC_INTERNETCONTROL);
+  if (ret < 0)
+    return ret;
+#endif
   ret = setsockopt_ipv6_multicast_hops (sock, 255);
   if (ret < 0)
     return ret;