Ejemplo n.º 1
0
int ospf_sock_init (int packet_flag)
{
    int ospf_sock;
    int ret, hincl = 1;
    int ospf_hello = OSPF_IP_HELLO_PACKET;
    int ospf_other = OSPF_IP_OTHER_PACKET;

    ospf_sock = socket (AF_INET, SOCK_RAW, IPPROTO_OSPFIGP);
    if (ospf_sock < 0)
    {
        int save_errno = errno;
        zlog_err ("ospf_read_sock_init: socket: %s", safe_strerror (save_errno));
        exit(1);
    }
    
#ifdef IP_HDRINCL
    /* we will include IP header with packet */
    ret = setsockopt (ospf_sock, IPPROTO_IP, IP_HDRINCL, &hincl, sizeof (hincl));
    if (ret < 0)
    {
        int save_errno = errno;
        zlog_warn ("Can't set IP_HDRINCL option for fd %d: %s",
        ospf_sock, safe_strerror(save_errno));
    }
#elif defined (IPTOS_PREC_INTERNETCONTROL)
#warning "IP_HDRINCL not available on this system"
#warning "using IPTOS_PREC_INTERNETCONTROL"
    ret = setsockopt_ipv4_tos(ospf_sock, IPTOS_PREC_INTERNETCONTROL);
    if (ret < 0)
    {
        int save_errno = errno;
        zlog_warn ("can't set sockopt IP_TOS %d to socket %d: %s",
                    tos, ospf_sock, safe_strerror(save_errno));
        close (ospf_sock);	/* Prevent sd leak. */
        return ret;
    }
#else /* !IPTOS_PREC_INTERNETCONTROL */
#warning "IP_HDRINCL not available, nor is IPTOS_PREC_INTERNETCONTROL"
    zlog_warn ("IP_HDRINCL option not available");
#endif /* IP_HDRINCL */

    ret = setsockopt_ifindex (AF_INET, ospf_sock, 1);
    if (ret < 0)
    {
        zlog_warn ("Can't set pktinfo option for fd %d", ospf_sock);
    }

    ret = setsockopt_so_recvbuf (ospf_sock, OSPF_PACKET_RECV_BUFFLEN);
    if (ret < 0)
    {
        zlog_warn ("Can't set SO_RCVBUF %d to socket %d", 
                   OSPF_PACKET_RECV_BUFFLEN, ospf_sock);
    }
    if(packet_flag == OSPF_IP_HELLO_PACKET)
    {   
        set_nonblocking(ospf_sock);
        setsockopt (ospf_sock, SOL_SOCKET, SO_SET_OSPF_FILTER, &ospf_hello, sizeof (ospf_hello));
    }
    if(packet_flag == OSPF_IP_OTHER_PACKET)
    {
        set_nonblocking(ospf_sock);
        setsockopt (ospf_sock, SOL_SOCKET, SO_SET_OSPF_FILTER, &ospf_other, sizeof (ospf_hello));
    }

    return ospf_sock;
}
Ejemplo n.º 2
0
int
ospf_sock_init (void)
{
  int ospf_sock;
  /*
   * XXX warning: unused variable `tos'
   * tos should be ifdefed similarly to usage
   */
  int ret, tos, hincl = 1;

  if ( ospfd_privs.change (ZPRIVS_RAISE) )
    zlog_err ("ospf_sock_init: could not raise privs, %s",
               safe_strerror (errno) );
    
  ospf_sock = socket (AF_INET, SOCK_RAW, IPPROTO_OSPFIGP);
  if (ospf_sock < 0)
    {
      int save_errno = errno;
      if ( ospfd_privs.change (ZPRIVS_LOWER) )
        zlog_err ("ospf_sock_init: could not lower privs, %s",
                   safe_strerror (errno) );
      zlog_err ("ospf_read_sock_init: socket: %s", safe_strerror (save_errno));
      exit(1);
    }
    
#ifdef IP_HDRINCL
  /* we will include IP header with packet */
  ret = setsockopt (ospf_sock, IPPROTO_IP, IP_HDRINCL, &hincl, sizeof (hincl));
  if (ret < 0)
    {
      int save_errno = errno;
      if ( ospfd_privs.change (ZPRIVS_LOWER) )
        zlog_err ("ospf_sock_init: could not lower privs, %s",
                   safe_strerror (errno) );
      zlog_warn ("Can't set IP_HDRINCL option for fd %d: %s",
      		 ospf_sock, safe_strerror(save_errno));
    }
#elif defined (IPTOS_PREC_INTERNETCONTROL)
#warning "IP_HDRINCL not available on this system"
#warning "using IPTOS_PREC_INTERNETCONTROL"
  /* Set precedence field. */
  tos = IPTOS_PREC_INTERNETCONTROL;
  ret = setsockopt (ospf_sock, IPPROTO_IP, IP_TOS,
		    (char *) &tos, sizeof (int));
  if (ret < 0)
    {
      int save_errno = errno;
      if ( ospfd_privs.change (ZPRIVS_LOWER) )
        zlog_err ("ospf_sock_init: could not lower privs, %s",
                   safe_strerror (errno) );
      zlog_warn ("can't set sockopt IP_TOS %d to socket %d: %s",
      		 tos, ospf_sock, safe_strerror(save_errno));
      close (ospf_sock);	/* Prevent sd leak. */
      return ret;
    }
#else /* !IPTOS_PREC_INTERNETCONTROL */
#warning "IP_HDRINCL not available, nor is IPTOS_PREC_INTERNETCONTROL"
  zlog_warn ("IP_HDRINCL option not available");
#endif /* IP_HDRINCL */

  ret = setsockopt_ifindex (AF_INET, ospf_sock, 1);

  if (ret < 0)
     zlog_warn ("Can't set pktinfo option for fd %d", ospf_sock);

  if (ospfd_privs.change (ZPRIVS_LOWER))
    {
      zlog_err ("ospf_sock_init: could not lower privs, %s",
               safe_strerror (errno) );
    }
 
  return ospf_sock;
}