Esempio n. 1
0
int open_tcp_socket(char* server, int port)
{
  /* create TCP/IP socket */
  /* Socket erstellen */
  int sock_fd2 = socket(AF_INET, SOCK_STREAM, 0);

  if (sock_fd2 == -1) exit_program_err(-1, "failed to TCP socket");

  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr=inet_addr(server);
  servaddr.sin_port=htons(port);

  connect(sock_fd2, (struct sockaddr *)&servaddr, sizeof(servaddr));

  return sock_fd2;
}
Esempio n. 2
0
int main(int argc, char** argv)
{
	/* Local variables */
	struct sockaddr_nl proc_addr, kern_addr;	// addrs for recv, send, bind
	struct cn_msg *cmsg;
	char buf[5000000];
	int ret;
	unsigned short l, l2;
	int count = 0;

	/* Make sure usage is correct */
	check_usage(argc, argv);

	/* Open and check log file */
	out = open_file(argv[1], "w");

	/* Setup the socket */
	sock_fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);
	if (sock_fd == -1)
		exit_program_err(-1, "socket");

	/* Initialize the address structs */
	memset(&proc_addr, 0, sizeof(struct sockaddr_nl));
	proc_addr.nl_family = AF_NETLINK;
	proc_addr.nl_pid = getpid();			// this process' PID
	proc_addr.nl_groups = CN_IDX_IWLAGN;
	memset(&kern_addr, 0, sizeof(struct sockaddr_nl));
	kern_addr.nl_family = AF_NETLINK;
	kern_addr.nl_pid = 0;					// kernel
	kern_addr.nl_groups = CN_IDX_IWLAGN;

	/* Now bind the socket */
	if (bind(sock_fd, (struct sockaddr *)&proc_addr, sizeof(struct sockaddr_nl)) == -1)
		exit_program_err(-1, "bind");

	/* And subscribe to netlink group */
	{
		int on = proc_addr.nl_groups;
		ret = setsockopt(sock_fd, 270, NETLINK_ADD_MEMBERSHIP, &on, sizeof(on));
		if (ret)
			exit_program_err(-1, "setsockopt");
	}

	/* Set up the "caught_signal" function as this program's sig handler */
	signal(SIGINT, caught_signal);

	/* Poll socket forever waiting for a message */
	while (1)
	{
		/* Receive from socket with infinite timeout */
		ret = recv(sock_fd, buf, sizeof(buf), 0);
		if (ret == -1)
			exit_program_err(-1, "recv");
		/* Pull out the message portion and print some stats */
		cmsg = NLMSG_DATA(buf);
		if (count % SLOW_MSG_CNT == 0)
                {
			// printf("received %d bytes: id: %d val: %d seq: %d clen: %d\n", cmsg->len, cmsg->id.idx, cmsg->id.val, cmsg->seq, cmsg->len);
                }
		/* Log the data to file */
		l = (unsigned short) cmsg->len;
		l2 = htons(l);
		fwrite(&l2, 1, sizeof(unsigned short), out);
		ret = fwrite(cmsg->data, 1, l, out);
                fflush(out);
                /*
		if (count % SLOW_MSG_CNT == 0)
                {
			printf("wrote %d bytes [msgcnt=%u]\n", ret, count);
                }
                */
		++count;
		if (ret != l)
			exit_program_err(1, "fwrite");
	}

	exit_program(0);
	return 0;
}
Esempio n. 3
0
int main(int argc, char** argv)
{
  int target = TARGET_UDP_SOCKET;
  int input = INPUT_FILE;
  int output_mode = OUTPUT_MODE_CLICK;

  filter_code = 0xFF;
  filter_rate = 0xFFFF;
  filter_Nrx = 0xFF;

  char *csi_node = "0.0.0.0";
  char *tx_node = "0.0.0.1";

  int debug_level = 0;

  if ( (argc < 5) || ((argc > 1) && (strcmp(argv[1], "help") == 0)) ) {
    print_help();
    exit(0);
  }

  target = io_type(argv[1][2],TARGET);
  input = io_type(argv[1][0],INPUT);
  output_mode = format_type(argv[4][0]);

  printf("Config: %s (%s -> %s) %s %s %s\n", argv[1], input_types[input], output_types[target],
                                             argv[2], argv[3], format_types[output_mode]);

  if ( argc > 5 ) {
    csi_node = argv[5];
    tx_node = argv[6];
  }

  if ( argc > 7 ) {
    debug_level = atoi(argv[7]);
  }

  struct cn_msg *cmsg;
  unsigned char cmsg_input_buf[BUF_SIZE];

  char sendline[3000];
  unsigned char buf[BUF_SIZE];

  int ret;
  int count = 0;

  char hostname[1024];
  gethostname(hostname, 1024);

  uint32_t csi_node_addr = (uint32_t)inet_addr(csi_node);
  uint32_t tx_node_addr = (uint32_t)inet_addr(tx_node);

  unsigned short l, l2;

  /* Make sure usage is correct */
  check_usage(argc, argv);

  /* Set up the "caught_signal" function as this program's sig handler */
  signal(SIGINT, caught_signal);

  /* Prepare Input */
  switch ( input ) {
    case INPUT_SOCKET:
      netlink_sock_fd = open_iwl_netlink_socket();
      break;
    case INPUT_FILE:
      netlink_sock_fd = open_file(argv[3], "r");
      break;
  }

  /* Prepare Output */
  switch ( target ) {
    case TARGET_TCP_SOCKET:
      out_fd = open_tcp_socket(argv[2], 32000);
      break;
    case TARGET_UDP_SOCKET:
      out_fd = open_udp_socket(argv[2], 32000);
      break;
    case TARGET_FILE:
      out_fd = open_file(argv[2], "w");
      break;
    case TARGET_STDOUT:
      out_fd = 1;
      break;
  }

  /* Poll socket forever waiting for a message */
  u_char *buf_p;
  int len_p, len_sendline;

  while (1) {
    /* Receive from socket with infinite timeout */
    //ret = recv(sock_fd, buf, sizeof(buf), 0);

    /* Read the next entry size */

    if (DEBUG_LEVEL_DEV) {
      printf("\n----- Next Data -----\n\n");
    }

    switch (input) {
      case INPUT_FILE:
        /* Read the next entry size */
        ret = read(netlink_sock_fd, &l2, 1 * sizeof(unsigned short));

        if ( ret != 0 ) {
          l = ntohs(l2);
          /* Sanity-check the entry size */

          if (l == 0) {
            fprintf(stderr, "Error: got entry size=0\n");
            exit_program(-1);
          } else if (l > BUF_SIZE) {
            fprintf(stderr, "Error: got entry size %u > BUF_SIZE=%u\n", l, BUF_SIZE);
            exit_program(-2);
          }

          /* Read in the entry */
          read(netlink_sock_fd, buf, l * sizeof(*buf));

          cmsg = (struct cn_msg*)&cmsg_input_buf[0];
          cmsg->id.idx = 0;
          cmsg->id.val = 0;
          cmsg->seq = 0;
          cmsg->ack = 0;
          cmsg->len = l;
          cmsg->flags = 0;
          memcpy(cmsg->data,buf,l);

        }
        if ( ret == 0 ) ret = -1;
        break;
      case INPUT_SOCKET:
        ret = iwl_netlink_recv(netlink_sock_fd, &buf_p, &len_p, &cmsg);
        break;
    }

    if (ret == -1) exit_program_err(-1, "recv");

    if (cmsg == NULL) {
      printf("cmsg == NULL\n");
      continue;
    }
    struct iwl5000_bfee_notif *bfee = NULL;
    bfee = (struct iwl5000_bfee_notif *)&(cmsg->data[1]);

    /* Filter */
    if ( (filter_code != 0xFF) && (cmsg->data[0] != filter_code) ) continue;
    if ( (filter_rate != 0xFFFF) && (bfee->fake_rate_n_flags != filter_rate) ) continue;
    if ( (filter_Nrx != 0xFF) && (bfee->Nrx != filter_Nrx) ) continue;

     if (DEBUG_LEVEL_DEV) printf("Entry size=%d, code=0x%X\n", cmsg->len, cmsg->data[0]);

    /* Evaluation */
    double eff_snrs[MAX_NUM_RATES][4];

    if ( cmsg->data[0] == IWL_CONN_BFEE_NOTIF /*0xBB*/) { /* Beamforming packet */

      calc_eff_snrs(bfee, eff_snrs);

      struct timeval timeVal;
      gettimeofday (&timeVal, NULL);

      if (DEBUG_LEVEL_INFO) printf("Rcvd pkt at <%ld.%06ld>\n", (long int)(timeVal.tv_sec), (long int)(timeVal.tv_usec));

      if (DEBUG_LEVEL_DEV) {
        /* Beamforming packet */
        printf("\nBeamforming: rate=0x%x\n", bfee->fake_rate_n_flags);
        /* Pull out the message portion and print some stats */
        if (count % SLOW_MSG_CNT == 0)
          printf("Received %d bytes: id: %d val: %d seq: %d clen: %d\n", cmsg->len, cmsg->id.idx, cmsg->id.val, cmsg->seq, cmsg->len);

        printf("\n--- Effektive SNR ---\n\n");
        int i;
        for ( i = 0; i < MAX_NUM_RATES; i++) {
          printf("%d: %f %f %f %f\n", i, db(eff_snrs[i][0]), db(eff_snrs[i][1]), db(eff_snrs[i][2]), db(eff_snrs[i][3]));
        }
        printf("\n---------------------\n\n");
      }
    }

    /* Log the data remote */
    /* Puffer mit Text füllen */
    switch (output_mode) {
      case OUTPUT_MODE_FORMAT:
        sprintf(sendline, "%s, Received %d bytes: id: %d val: %d seq: %d clen: %d\n", hostname, cmsg->len, cmsg->id.idx,
                                                                                      cmsg->id.val, cmsg->seq, cmsg->len);
        len_sendline = strlen(sendline);
        break;
      case OUTPUT_MODE_BFEE:
        if ( bfee != NULL) {
          calc_eff_snrs_tostr(bfee, eff_snrs, sendline, hostname);
        } else {
          sprintf(sendline, "bfee == NULL\n");
        }

        if (DEBUG_LEVEL_DEV) printf("To tx:\n%s\n", sendline);
        break;
      case OUTPUT_MODE_CLICK:
        len_sendline = click_output(sendline, bfee, cmsg, eff_snrs, csi_node_addr, tx_node_addr);
        break;
      default:
        /* Log the data to file */
        l = (unsigned short) cmsg->len;
        l2 = htons(l);
        memcpy(sendline, &l2, 1 * sizeof(unsigned short));
        len_sendline = 1 * sizeof(unsigned short);

        memcpy(&(sendline[len_sendline]), cmsg->data, 1 * l);
        len_sendline += 1 * l;

        if ((count % 100 == 0) && (DEBUG_LEVEL_DEV)) printf("wrote %d bytes [msgcnt=%u]\n", len_sendline, count);
    }

    switch ( target ) {
      case TARGET_FILE:
      case TARGET_TCP_SOCKET:
        ret = write(out_fd, sendline, len_sendline);
        break;
      case TARGET_UDP_SOCKET:
        sendto(out_fd, sendline, len_sendline, 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
        break;
      case TARGET_STDOUT:
        dprintf(out_fd,"%s",sendline);
        break;
    }

    ++count;
  }

  exit_program(0);
  return 0;
}