Ejemplo n.º 1
0
int
shim_sock_init(void)
{
  int shim_sock;

  if ( svd_privs.change (ZPRIVS_RAISE) )
    zlog_err ("shim_sock_init: could not raise privs, %s",
               safe_strerror (errno) );
    
  shim_sock = socket (AF_INET6, SOCK_RAW, IPPROTO_OSPFIGP);
  if (shim_sock < 0)
    {
      int save_errno = errno;
      if ( svd_privs.change (ZPRIVS_LOWER) )
        zlog_err ("shim_sock_init: could not lower privs, %s",
                   safe_strerror (errno) );
      zlog_err ("shim_sock_init: socket: %s", safe_strerror (save_errno));
      exit(1);
    }
    
  if (svd_privs.change (ZPRIVS_LOWER))
    {
      zlog_err ("shim_sock_init: could not lower privs, %s",
               safe_strerror (errno) );
    }

  sockopt_reuseaddr (shim_sock);

  u_int off = 0;
  if (setsockopt (shim_sock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
                  &off, sizeof (u_int)) < 0)
    zlog_warn ("Network: reset IPV6_MULTICAST_LOOP failed: %s",
               safe_strerror (errno));

  if (setsockopt_ipv6_pktinfo (shim_sock, 1) < 0)
     zlog_warn ("Can't set pktinfo option for fd %d", shim_sock);

  int offset = 12;
#ifndef DISABLE_IPV6_CHECKSUM
  if (setsockopt (shim_sock, IPPROTO_IPV6, IPV6_CHECKSUM,
                  &offset, sizeof (offset)) < 0)
    zlog_warn ("Network: set IPV6_CHECKSUM failed: %s", safe_strerror (errno));
#else
  zlog_warn ("Network: Don't set IPV6_CHECKSUM");
#endif /* DISABLE_IPV6_CHECKSUM */

  inet_pton (AF_INET6, ALLSPFROUTERS6, &allspfrouters6);
  inet_pton (AF_INET6, ALLDROUTERS6, &alldrouters6);

  return shim_sock;
}
Ejemplo n.º 2
0
int
setsockopt_ifindex (int af, int sock, int val)
{
	int ret = -1;

	switch (af)
	{
		case AF_INET:
		ret = setsockopt_ipv4_ifindex (sock, val);
		break;
#ifdef HAVE_IPV6
		case AF_INET6:
		ret = setsockopt_ipv6_pktinfo (sock, val);
		break;
#endif
		default:
		zlog_warn ("setsockopt_ifindex: unknown address family %d", af);
	}
	return ret;
}
Ejemplo n.º 3
0
void
ospf6_set_pktinfo (void)
{
  setsockopt_ipv6_pktinfo (ospf6_sock, 1);
}