Beispiel #1
0
static int
new_pstream(char *suffix, const char *name, struct pstream **pstreamp,
            int dscp, char *unlink_path, bool kernel_print_port)
{
    char bound_name[SS_NTOP_BUFSIZE + 16];
    char addrbuf[SS_NTOP_BUFSIZE];
    struct sockaddr_storage ss;
    int error;
    uint16_t port;
    int fd;
    char *conn_name = CONST_CAST(char *, name);

    fd = inet_open_passive(SOCK_STREAM, suffix, -1, &ss, dscp,
                           kernel_print_port);
    if (fd < 0) {
        return -fd;
    }

    port = ss_get_port(&ss);
    if (!conn_name) {
        snprintf(bound_name, sizeof bound_name, "ptcp:%"PRIu16":%s",
                 port, ss_format_address(&ss, addrbuf, sizeof addrbuf));
        conn_name = bound_name;
    }

    error = new_fd_pstream(conn_name, fd, ptcp_accept, unlink_path, pstreamp);
    if (!error) {
        pstream_set_bound_port(*pstreamp, htons(port));
    }
    return error;
}
Beispiel #2
0
static int
new_pstream(char *suffix, const char *name, struct pstream **pstreamp,
            int dscp, char *unlink_path, bool kernel_print_port)
{
    struct sockaddr_storage ss;
    int error;
    int fd;

    fd = inet_open_passive(SOCK_STREAM, suffix, -1, &ss, dscp,
                           kernel_print_port);
    if (fd < 0) {
        return -fd;
    }

    struct ds bound_name = DS_EMPTY_INITIALIZER;
    if (!name) {
        ds_put_format(&bound_name, "ptcp:%"PRIu16":", ss_get_port(&ss));
        ss_format_address(&ss, &bound_name);
    } else {
        ds_put_cstr(&bound_name, name);
    }

    error = new_fd_pstream(ds_steal_cstr(&bound_name), fd,
                           ptcp_accept, unlink_path, pstreamp);
    if (!error) {
        pstream_set_bound_port(*pstreamp, htons(ss_get_port(&ss)));
    }
    return error;
}
Beispiel #3
0
static int
ptcp_open(const char *name, char *suffix, struct pstream **pstreamp,
          uint8_t dscp)
{
  char bound_name[128];
  int fd;
  struct sockaddr_in sin;

  fd = inet_open_passive(SOCK_STREAM, suffix, -1, &sin, dscp);
  if (fd < 0) {
      return -fd;
  }

  sprintf(bound_name, "ptcp%"PRIu16":"IP_FMT,
            ntohs(sin.sin_port), IP_ARGS(&sin.sin_addr.s_addr));
  return new_fd_pstream(bound_name, fd, ptcp_accept, NULL, pstreamp);
}
};

/* Passive TCP. */

static int ptcp_accept(int fd, const struct sockaddr *sa, size_t sa_len,
                       struct stream **streamp);

static int
ptcp_open(const char *name OVS_UNUSED, char *suffix, struct pstream **pstreamp,
          uint8_t dscp)
{
    struct sockaddr_in sin;
    char bound_name[128];
    int fd;

    fd = inet_open_passive(SOCK_STREAM, suffix, -1, &sin, dscp);
    if (fd < 0) {
        return -fd;
    }

    sprintf(bound_name, "ptcp:%"PRIu16":"IP_FMT,
            ntohs(sin.sin_port), IP_ARGS(&sin.sin_addr.s_addr));
    return new_fd_pstream(bound_name, fd, ptcp_accept, NULL, pstreamp);
}

static int
ptcp_accept(int fd, const struct sockaddr *sa, size_t sa_len,
            struct stream **streamp)
{
    const struct sockaddr_in *sin = (const struct sockaddr_in *) sa;
    char name[128];
int
main(int argc, char *argv[])
{
    struct unixctl_server *server;
    enum { MAX_RECV = 1500 };
    const char *target;
    struct ofpbuf buf;
    bool exiting = false;
    int error;
    int sock;
    int n;

    proctitle_init(argc, argv);
    set_program_name(argv[0]);
    parse_options(argc, argv);

    if (argc - optind != 1) {
        ovs_fatal(0, "exactly one non-option argument required "
                  "(use --help for help)");
    }
    target = argv[optind];

    sock = inet_open_passive(SOCK_DGRAM, target, 0, NULL, 0);
    if (sock < 0) {
        ovs_fatal(0, "%s: failed to open (%s)", argv[1], strerror(-sock));
    }

    daemon_save_fd(STDOUT_FILENO);
    daemonize_start();

    error = unixctl_server_create(NULL, &server);
    if (error) {
        ovs_fatal(error, "failed to create unixctl server");
    }
    unixctl_command_register("exit", "", 0, 0, test_netflow_exit, &exiting);

    daemonize_complete();

    ofpbuf_init(&buf, MAX_RECV);
    n = 0;
    for (;;) {
        int retval;

        unixctl_server_run(server);

        ofpbuf_clear(&buf);
        do {
            retval = read(sock, buf.data, buf.allocated);
        } while (retval < 0 && errno == EINTR);
        if (retval > 0) {
            ofpbuf_put_uninit(&buf, retval);
            if (n++ > 0) {
                putchar('\n');
            }
            print_netflow(&buf);
            fflush(stdout);
        }

        if (exiting) {
            break;
        }

        poll_fd_wait(sock, POLLIN);
        unixctl_server_wait(server);
        poll_block();
    }

    return 0;
}