int main(int argc, char *argv[]) { int ret; char* file_name = NULL; char* dev = NULL; char errbuf[PCAP_ERRBUF_SIZE]; struct bpf_program comp_filter_exp; /* The compiled filter expression */ char filter_exp[] = "ether dst 91:E0:F0:00:0e:80"; /* The filter expression */ struct pcap_pkthdr header; /* header pcap gives us */ const u_char* packet; /* actual packet */ signal(SIGINT, sigint_handler); int c; while((c = getopt(argc, argv, "hi:f:")) > 0) { switch (c) { case 'h': help(); break; case 'i': dev = strdup(optarg); break; case 'f': file_name = strdup(optarg); break; default: fprintf(stderr, "Unrecognized option!\n"); } } if ((NULL == dev) || (NULL == file_name)) help(); if (create_socket()) { fprintf(stderr, "Socket creation failed.\n"); return (errno); } report_domain_status(); fprintf(stdout,"Waiting for talker...\n"); await_talker(); #ifdef DEBUG fprintf(stdout,"Send ready-msg...\n"); #endif send_ready(); #ifdef LIBSND SF_INFO* sf_info = (SF_INFO*)malloc(sizeof(SF_INFO)); memset(sf_info, 0, sizeof(SF_INFO)); sf_info->samplerate = SAMPLES_PER_SECOND; sf_info->channels = CHANNELS; sf_info->format = SF_FORMAT_WAV | SF_FORMAT_PCM_24; if (0 == sf_format_check(sf_info)) { fprintf(stderr, "Wrong format."); return -1; } if (NULL == (snd_file = sf_open(file_name, SFM_WRITE, sf_info))) { fprintf(stderr, "Could not create file."); return -1; } fprintf(stdout,"Created file called %s\n", file_name); #endif #ifdef PCAP /** session, get session handler */ /* take promiscuous vs. non-promiscuous sniffing? (0 or 1) */ handle = pcap_open_live(dev, BUFSIZ, 1, -1, errbuf); if (NULL == handle) { fprintf(stderr, "Could not open device %s: %s\n", dev, errbuf); return -1; } #ifdef DEBUG fprintf(stdout,"Got session handler.\n"); #endif /* compile and apply filter */ if (-1 == pcap_compile(handle, &comp_filter_exp, filter_exp, 0, PCAP_NETMASK_UNKNOWN)) { fprintf(stderr, "Could not parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); return -1; } if (-1 == pcap_setfilter(handle, &comp_filter_exp)) { fprintf(stderr, "Could not install filter %s: %s\n", filter_exp, pcap_geterr(handle)); return -1; } #ifdef DEBUG fprintf(stdout,"Compiled and applied filter.\n"); #endif /** loop forever and call callback-function for every received packet */ pcap_loop(handle, -1, pcap_callback, NULL); #endif return 0; }
int main(int argc, char *argv[ ]) { device_t igb_dev; struct ifreq device; int error; struct sockaddr_ll ifsock_addr; struct packet_mreq mreq; int ifindex; int socket_descriptor; char *iface; seventeen22_header *h1722; long long int frame_sequence = 0; unsigned char frame[MAX_FRAME_SIZE]; int size, length; struct sched_param sched; struct mrp_listener_ctx *ctx = malloc(sizeof(struct mrp_listener_ctx)); struct mrp_domain_attr *class_a = malloc(sizeof(struct mrp_domain_attr)); struct mrp_domain_attr *class_b = malloc(sizeof(struct mrp_domain_attr)); ctx_sig = ctx; int rc; if (argc < 2) { fprintf(stderr, "Usage : %s <interface_name> <payload>\n",argv[0]); return EINVAL; } signal(SIGINT, sigint_handler); #if USE_MRPD rc = mrp_listener_client_init(ctx); if (rc) { printf("failed to initialize global variables\n"); return EXIT_FAILURE; } if (create_socket(ctx)) { fprintf(stderr, "Socket creation failed.\n"); return errno; } rc = mrp_monitor(ctx); if (rc) { printf("failed creating MRP monitor thread\n"); return EXIT_FAILURE; } rc=mrp_get_domain(ctx, class_a, class_b); if (rc) { printf("failed calling mrp_get_domain()\n"); return EXIT_FAILURE; } printf("detected domain Class A PRIO=%d VID=%04x...\n",class_a->priority,class_a->vid); rc = report_domain_status(class_a,ctx); if (rc) { printf("report_domain_status failed\n"); return EXIT_FAILURE; } rc = join_vlan(class_a, ctx); if (rc) { printf("join_vlan failed\n"); return EXIT_FAILURE; } fprintf(stdout,"Waiting for talker...\n"); await_talker(ctx); rc = send_ready(ctx); if (rc) { printf("send_ready failed\n"); return EXIT_FAILURE; } #endif /* USE_MRPD */ iface = strdup(argv[1]); error = pci_connect(&igb_dev); if (error) { fprintf(stderr, "connect failed (%s) - are you running as root?\n", strerror(errno)); return errno; } error = igb_init(&igb_dev); if (error) { fprintf(stderr, "init failed (%s) - is the driver really loaded?\n", strerror(errno)); return errno; } socket_descriptor = socket(AF_PACKET, SOCK_RAW, htons(ETHER_TYPE_AVTP)); if (socket_descriptor < 0) { fprintf(stderr, "failed to open socket: %s \n", strerror(errno)); return EINVAL; } memset(&device, 0, sizeof(device)); memcpy(device.ifr_name, iface, IFNAMSIZ); error = ioctl(socket_descriptor, SIOCGIFINDEX, &device); if (error < 0) { fprintf(stderr, "Failed to get index of iface %s: %s\n", iface, strerror(errno)); return EINVAL; } ifindex = device.ifr_ifindex; memset(&ifsock_addr, 0, sizeof(ifsock_addr)); ifsock_addr.sll_family = AF_PACKET; ifsock_addr.sll_ifindex = ifindex; ifsock_addr.sll_protocol = htons(ETHER_TYPE_AVTP); error = bind(socket_descriptor, (struct sockaddr *) & ifsock_addr, sizeof(ifsock_addr)); if (error < 0) { fprintf(stderr, "Failed to bind: %s\n", strerror(errno)); return EINVAL; } memset(&mreq, 0, sizeof(mreq)); mreq.mr_ifindex = ifindex; mreq.mr_type = PACKET_MR_MULTICAST; mreq.mr_alen = 6; memcpy(mreq.mr_address, glob_dest_addr, mreq.mr_alen); error = setsockopt(socket_descriptor, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); if (error < 0) { fprintf(stderr, "Failed to add multi-cast addresses to port: %u\n", ifindex); return EINVAL; } size = sizeof(ifsock_addr); frame_sequence = 0; memset(frame, 0, sizeof(frame)); memset(&sched, 0, sizeof sched); sched.sched_priority = 1; error = sched_setscheduler(0, SCHED_RR, &sched); if (error < 0) fprintf(stderr, "Failed to select RR scheduler: %s (%d)\n", strerror(errno), errno); while (1) { error = recvfrom(socket_descriptor, frame, MAX_FRAME_SIZE, 0, (struct sockaddr *) &ifsock_addr, (socklen_t *)&size); if (error > 0) { fprintf(stderr,"frame sequence = %lld\n", frame_sequence++); h1722 = (seventeen22_header *)((uint8_t*)frame + sizeof(eth_header)); length = ntohs(h1722->length) - sizeof(six1883_header); write(1, (uint8_t *)((uint8_t*)frame + sizeof(eth_header) + sizeof(seventeen22_header) + sizeof(six1883_header)), length); } else { fprintf(stderr,"recvfrom() error for frame sequence = %lld\n", frame_sequence++); } } usleep(100); close(socket_descriptor); free(ctx); free(class_a); free(class_b); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { int ret; char* dev = NULL; char errbuf[PCAP_ERRBUF_SIZE]; struct bpf_program comp_filter_exp; /** The compiled filter expression */ char filter_exp[] = "ether dst 91:E0:F0:00:0e:80"; /** The filter expression */ struct pcap_pkthdr header; /** header pcap gives us */ const u_char* packet; /** actual packet */ signal(SIGINT, shutdown_all); int c; while((c = getopt(argc, argv, "hi:")) > 0) { switch (c) { case 'h': help(); break; case 'i': dev = strdup(optarg); break; default: fprintf(stderr, "Unrecognized option!\n"); } } if (NULL == dev) { help(); } if (create_socket()) { fprintf(stderr, "Socket creation failed.\n"); return (errno); } send_process('D'); /** report domain status */ init_jack(); fprintf(stdout,"Waiting for talker...\n"); await_talker(); send_process('R'); /** send_ready */ #ifdef LIBSND char* filename = "listener.wav"; SF_INFO* sf_info = (SF_INFO*)malloc(sizeof(SF_INFO)); memset(sf_info, 0, sizeof(SF_INFO)); sf_info->samplerate = SAMPLES_PER_SECOND; sf_info->channels = CHANNELS; sf_info->format = SF_FORMAT_WAV | SF_FORMAT_PCM_24; if (0 == sf_format_check(sf_info)) { fprintf(stderr, "Wrong format.\n"); shutdown_all(0); return -1; } if (NULL == (snd_file = sf_open(filename, SFM_WRITE, sf_info))) { fprintf(stderr, "Could not create file %s.\n", filename); shutdown_all(0); return -1; } #endif /** session, get session handler */ handle = pcap_open_live(dev, BUFSIZ, 1, -1, errbuf); if (NULL == handle) { fprintf(stderr, "Could not open device %s: %s.\n", dev, errbuf); shutdown_all(0); return -1; } /** compile and apply filter */ if (-1 == pcap_compile(handle, &comp_filter_exp, filter_exp, 0, PCAP_NETMASK_UNKNOWN)) { fprintf(stderr, "Could not parse filter %s: %s.\n", filter_exp, pcap_geterr(handle)); shutdown_all(0); return -1; } if (-1 == pcap_setfilter(handle, &comp_filter_exp)) { fprintf(stderr, "Could not install filter %s: %s.\n", filter_exp, pcap_geterr(handle)); shutdown_all(0); return -1; } /** loop forever and call callback-function for every received packet */ pcap_loop(handle, -1, pcap_callback, NULL); usleep(-1); return 0; }