diff options
| -rw-r--r-- | bgpd/bgp_network.c | 8 | ||||
| -rw-r--r-- | lib/sockopt.c | 13 | ||||
| -rw-r--r-- | lib/sockopt.h | 1 | ||||
| -rw-r--r-- | ospf6d/ospf6_network.c | 9 | ||||
| -rw-r--r-- | ripngd/ripngd.c | 5 | 
5 files changed, 35 insertions, 1 deletions
| diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c index 570cc3b7..c8ff87a6 100644 --- a/bgpd/bgp_network.c +++ b/bgpd/bgp_network.c @@ -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 diff --git a/lib/sockopt.c b/lib/sockopt.c index 9ff15ca6..63858408 100644 --- a/lib/sockopt.c +++ b/lib/sockopt.c @@ -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. diff --git a/lib/sockopt.h b/lib/sockopt.h index 69309e00..aced6d48 100644 --- a/lib/sockopt.h +++ b/lib/sockopt.h @@ -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 */  /* diff --git a/ospf6d/ospf6_network.c b/ospf6d/ospf6_network.c index 96b82af3..3372238b 100644 --- a/ospf6d/ospf6_network.c +++ b/ospf6d/ospf6_network.c @@ -64,6 +64,14 @@ ospf6_set_pktinfo (void)  }  void +ospf6_set_transport_class (void) +{ +#ifdef IPTOS_PREC_INTERNETCONTROL +  setsockopt_ipv6_tclass (ospf6_sock, IPTOS_PREC_INTERNETCONTROL); +#endif +} + +void  ospf6_set_checksum (void)  {    int offset = 12; @@ -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 */ diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c index 6e32d83c..d416255c 100644 --- a/ripngd/ripngd.c +++ b/ripngd/ripngd.c @@ -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; | 
