Esempio n. 1
0
Blackadder::Blackadder(bool user_space) {
    int ret;

    if (user_space) {
#if HAVE_USE_NETLINK
        sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
#else	
        sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
#endif
    } else {
#if HAVE_USE_NETLINK
        sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_BADDER);
#else	
        sock_fd = -1;
        errno = EPFNOSUPPORT; /* XXX */
#endif
    }
    if (sock_fd < 0) {
        perror("socket");
    }
    /* source netlink address */
    memset(&s_nladdr, 0, sizeof (s_nladdr));
#if HAVE_USE_NETLINK
    s_nladdr.nl_family = AF_NETLINK;
    s_nladdr.nl_pad = 0;
    s_nladdr.nl_pid = getpid();
    ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof (s_nladdr));
#else
    s_nladdr.sun_len = sizeof (s_nladdr);
    s_nladdr.sun_family = PF_LOCAL;
    /* XXX: Probably shouldn't use getpid() here. */
    ba_id2path(s_nladdr.sun_path, getpid());
    if (unlink(s_nladdr.sun_path) != 0 && errno != ENOENT)
        perror("unlink");
    ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, SUN_LEN(&s_nladdr));
#endif
    if (ret < 0) {
        perror("bind");
        exit(0);
    }
    /* destination netlink address */
    memset(&d_nladdr, 0, sizeof (d_nladdr));
#if HAVE_USE_NETLINK
    d_nladdr.nl_family = AF_NETLINK;
    d_nladdr.nl_pad = 0;
    if (user_space) {
        d_nladdr.nl_pid = 9999; /* destined to user space blackadder */
    } else {
        d_nladdr.nl_pid = 0; /* destined to kernel */
    }
#else
    d_nladdr.sun_len = sizeof (d_nladdr);
    d_nladdr.sun_family = PF_LOCAL;
    ba_id2path(d_nladdr.sun_path, (user_space) ? 9999 : 0); /* XXX */
#endif
}
Esempio n. 2
0
NB_Blackadder::NB_Blackadder(bool user_space) {
    int ret;
    (void) signal(SIGINT, signal_handler);
    if (user_space) {
        cout << "NB_Blackadder Library: Initializing blackadder client for user space" << endl;
#if HAVE_USE_NETLINK
        sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
#else
        sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
#endif
    } else {
        cout << "NB_Blackadder Library: Initializing blackadder client for kernel space" << endl;
#if HAVE_USE_NETLINK
        sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_BADDER);
#else	
        sock_fd = -1;
        errno = EPFNOSUPPORT; /* XXX */
#endif
    }
    if (sock_fd < 0) {
        perror("NB_Blackadder Library: socket");
    } else {
        cout << "NB_Blackadder Library: Created and opened netlink socket" << endl;
    }
    int x;
    x = fcntl(sock_fd, F_GETFL, 0);
    fcntl(sock_fd, F_SETFL, x | O_NONBLOCK);
    /* source address */
    memset(&s_nladdr, 0, sizeof (s_nladdr));
#if HAVE_USE_NETLINK
    s_nladdr.nl_family = AF_NETLINK;
    s_nladdr.nl_pad = 0;
    s_nladdr.nl_pid = getpid();
    ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof (s_nladdr));
#else
    s_nladdr.sun_len = sizeof (s_nladdr);
    s_nladdr.sun_family = PF_LOCAL;
    /* XXX: Probably shouldn't use getpid() here. */
    ba_id2path(s_nladdr.sun_path, getpid());
    if (unlink(s_nladdr.sun_path) != 0 && errno != ENOENT)
        perror("unlink");
    ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, SUN_LEN(&s_nladdr));
#endif
    if (ret < 0) {
        perror("NB_Blackadder Library: bind");
    }
    /* destination address */
    memset(&d_nladdr, 0, sizeof (d_nladdr));
#if HAVE_USE_NETLINK
    d_nladdr.nl_family = AF_NETLINK;
    d_nladdr.nl_pad = 0;
    if (user_space) {
        d_nladdr.nl_pid = 9999; /* destined to user space blackadder */
    } else {
        d_nladdr.nl_pid = 0; /* destined to kernel */
    }
#else
    d_nladdr.sun_len = sizeof (d_nladdr);
    d_nladdr.sun_family = PF_LOCAL;
    ba_id2path(d_nladdr.sun_path, (user_space) ? 9999 : 0); /* XXX */
#endif
    /*initialize pipes*/
    if (pipe(pipe_fds) != 0) {
        perror("pipe");
        /* XXX: Should we raise an exception or something? */
    }
    FD_ZERO(&read_set);
    FD_SET(sock_fd, &read_set);
    FD_SET(pipe_fds[0], &read_set);
    /*register default callback method*/
    cf = &defaultCallback;
    pthread_mutex_init(&selector_mutex, NULL);
    pthread_mutex_init(&worker_mutex, NULL);
    pthread_cond_init(&queue_overflow_cond, NULL);
    pthread_cond_init(&worker_cond, NULL);
    pthread_create(&selector_thread, NULL, selector, NULL);
    pthread_create(&worker_thread, NULL, worker, NULL);
}
Esempio n. 3
0
blackadder::blackadder (bool user_space)
{
  int ret;
  protocol = 0;
  if (user_space) {
#if HAVE_USE_NETLINK
    sock_fd = socket (AF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
#elif HAVE_USE_UNIX
    sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
#else
    sock_fd = -1;
    errno = EPFNOSUPPORT; /* XXX */
#endif
  } else {
#if HAVE_USE_NETLINK
    sock_fd = socket (AF_NETLINK, SOCK_RAW, NETLINK_BADDER);
#else
    sock_fd = -1;
    errno = EPFNOSUPPORT; /* XXX */
#endif
  }
  if (sock_fd < 0) {
    perror ("socket");
  }
#ifdef __APPLE__
  int bufsize = 229376; /* XXX */
  setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof (bufsize));
  setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof (bufsize));
#endif
#ifdef __FreeBSD__
  kq = kqueue();
  if (kq < 0) {
    perror("kqueue");
  }
  struct kevent kev;
  EV_SET(&kev, sock_fd, EVFILT_READ, EV_ADD | EV_CLEAR, 0x0, 0, NULL);
  if (kevent(kq, &kev, 1, NULL, 0, NULL)) {
    perror("kevent");
  }
#endif
  /* source netlink address */
  memset (&s_nladdr, 0, sizeof(s_nladdr));
#if HAVE_USE_NETLINK
  s_nladdr.nl_family = AF_NETLINK;
  s_nladdr.nl_pad = 0;
  s_nladdr.nl_pid = getpid ();
  ret = bind (sock_fd, (struct sockaddr *) &s_nladdr, sizeof(s_nladdr));
#elif HAVE_USE_UNIX
  if (user_space) {
#ifndef __linux__
    s_nladdr.sun_len = sizeof (s_nladdr);
#endif
    s_nladdr.sun_family = PF_LOCAL;
    /* XXX: Probably shouldn't use getpid() here. */
    ba_id2path(s_nladdr.sun_path, getpid());
    if (unlink(s_nladdr.sun_path) != 0 && errno != ENOENT)
    perror("unlink");
#ifdef __linux__
    ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof (s_nladdr));
#else
    ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, SUN_LEN(&s_nladdr));
#endif
  } else {
    if (sock_fd > 0)
    ret = 0;
    else {
      ret = -1;
      errno = EBADF;
    }
  }
#endif
  if (ret < 0) {
    perror ("bind");
    exit (0);
  }
  /* destination netlink address */
  memset (&d_nladdr, 0, sizeof(d_nladdr));
#if HAVE_USE_NETLINK
  d_nladdr.nl_family = AF_NETLINK;
  d_nladdr.nl_pad = 0;
  if (user_space) {
    d_nladdr.nl_pid = 9999; /* destined to user space blackadder */
  } else {
    d_nladdr.nl_pid = 0; /* destined to kernel */
  }
#elif HAVE_USE_UNIX
  if (user_space) {
#ifndef __linux__
    d_nladdr.sun_len = sizeof (d_nladdr);
#endif
    d_nladdr.sun_family = PF_LOCAL;
    ba_id2path(d_nladdr.sun_path, (user_space) ? 9999 : 0); /* XXX */
  }
#endif
}
Esempio n. 4
0
NB_Blackadder::NB_Blackadder(bool user_space) {
    int ret;
    (void) signal(SIGINT, signal_handler);
    if (user_space) {
        //cout << "NB_Blackadder Library: Initializing blackadder client for user space" << endl;
#if HAVE_USE_NETLINK
        sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
#elif HAVE_USE_UNIX
        sock_fd = socket(PF_LOCAL, SOCK_DGRAM, 0);
#endif
    } else {
        //cout << "NB_Blackadder Library: Initializing blackadder client for kernel space" << endl;
#if HAVE_USE_NETLINK
        sock_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_BADDER);
#elif __FreeBSD__ /* XXX */
        sock_fd = socket(AF_BLACKADDER, SOCK_RAW, PROTO_BLACKADDER);
#else
        sock_fd = -1;
        errno = EPFNOSUPPORT; /* XXX */
#endif
    }
    if (sock_fd < 0) {
        perror("NB_Blackadder Library: socket");
    } else {
        //cout << "NB_Blackadder Library: Created and opened netlink socket" << endl;
    }
    int x;
    x = fcntl(sock_fd, F_GETFL, 0);
    fcntl(sock_fd, F_SETFL, x | O_NONBLOCK);
#ifdef __APPLE__
    int bufsize = 229376; /* XXX */
    setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize));
    setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize));
#endif
    /* source address */
    memset(&s_nladdr, 0, sizeof (s_nladdr));
#if HAVE_USE_NETLINK
    s_nladdr.nl_family = AF_NETLINK;
    s_nladdr.nl_pad = 0;
    s_nladdr.nl_pid = getpid();
    ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof (s_nladdr));
#elif HAVE_USE_UNIX
    if (user_space) {
# ifndef __linux__
        s_nladdr.sun_len = sizeof (s_nladdr);
# endif
        s_nladdr.sun_family = PF_LOCAL;
        /* XXX: Probably shouldn't use getpid() here. */
        ba_id2path(s_nladdr.sun_path, getpid());
        if (unlink(s_nladdr.sun_path) != 0 && errno != ENOENT)
            perror("unlink");
# ifdef __linux__
        ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, sizeof(s_nladdr));
# else
        ret = bind(sock_fd, (struct sockaddr *) &s_nladdr, SUN_LEN(&s_nladdr));
# endif
    } else {
        if (sock_fd > 0)
            ret = 0;
        else {
            ret = -1;
            errno = EBADF;
        }
    }
#endif
    if (ret < 0) {
        perror("NB_Blackadder Library: bind");
    }
    /* destination address */
    memset(&d_nladdr, 0, sizeof (d_nladdr));
#if HAVE_USE_NETLINK
    d_nladdr.nl_family = AF_NETLINK;
    d_nladdr.nl_pad = 0;
    if (user_space) {
    	// Sebastian Robitzsch: TODO Decide on unified Blackadder PID, 9999 is
    	// actually already taken!
        d_nladdr.nl_pid = 9999; /* destined to user space blackadder */
    } else {
        d_nladdr.nl_pid = 0; /* destined to kernel */
    }
#elif HAVE_USE_UNIX
    if (user_space) {
# ifndef __linux__
        d_nladdr.sun_len = sizeof (d_nladdr);
# endif
        d_nladdr.sun_family = PF_LOCAL;
        ba_id2path(d_nladdr.sun_path, (user_space) ? 9999 : 0); /* XXX */
    }
#endif
    /*initialize pipes*/
    if (pipe(pipe_fds) != 0) {
        perror("pipe");
        /* XXX: Should we raise an exception or something? */
    }
    FD_ZERO(&read_set);
    FD_SET(sock_fd, &read_set);
    FD_SET(pipe_fds[0], &read_set);
    /*register default callback method*/
    cf = &defaultCallback;
    pthread_mutex_init(&selector_mutex, NULL);
    pthread_mutex_init(&worker_mutex, NULL);
    pthread_cond_init(&queue_overflow_cond, NULL);
    pthread_cond_init(&worker_cond, NULL);
    pthread_create(&selector_thread, NULL, selector, NULL);
    pthread_create(&worker_thread, NULL, worker, NULL);
}