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; }
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; }
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; }