int main(int argc, char* argv[]) { int sockfd; unsigned char src[ETH_ADDR_LEN]; // htons(proto) jako 3 argument ?? if ( (sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL /*ETH_TYPE_IP6 */))) < 0 ) { printf("Error: could not open a socket.\n"); return -1; } int ifindex = 0; if ( get_hardware_info(&ifindex, src, sockfd) < 0 ) { printf("Error getting host's data\n"); return -1; } uint16_t src_ipaddr[IPV6_ADDR_LEN] = { 0xfe80, 0x0, 0xa00, 0x27ff, 0xfe5c, 0x2c16, 0x0, 0x0 }; void* buffer = (void*)malloc(ETH_FRAME_LEN); int frame_len = 0; printf("waiting for frames...\n"); while ( 1 ) { frame_len = recvfrom(sockfd, buffer, ETH_FRAME_LEN, 0, NULL, NULL); if (frame_len == -1) { printf("no frame... "); //errorhandling .... } else { printf("%d\n", frame_len); union ethframe frame; parse_eth_frame(&frame, buffer); if ( ntohs(frame.field.header.proto) == ETH_TYPE_IP6 ) { struct ip6_hdr iphdr; parsed_ipv6(&frame, &iphdr); struct icmp6_hdr icmphdr; parsed_icmp(&frame, &icmphdr); icmp_actions(&frame, &iphdr, &icmphdr, src_ipaddr); } } } /* get frame's data */ close(sockfd); printf("Everything worked!\n"); return 0; }
static int efw_probe(struct fw_unit *unit, const struct ieee1394_device_id *entry) { struct snd_card *card; struct snd_efw *efw; int card_index, err; mutex_lock(&devices_mutex); /* check registered cards */ for (card_index = 0; card_index < SNDRV_CARDS; ++card_index) { if (!test_bit(card_index, devices_used) && enable[card_index]) break; } if (card_index >= SNDRV_CARDS) { err = -ENOENT; goto end; } err = snd_card_new(&unit->device, index[card_index], id[card_index], THIS_MODULE, sizeof(struct snd_efw), &card); if (err < 0) goto end; efw = card->private_data; efw->card_index = card_index; set_bit(card_index, devices_used); card->private_free = efw_card_free; efw->card = card; efw->unit = unit; mutex_init(&efw->mutex); spin_lock_init(&efw->lock); init_waitqueue_head(&efw->hwdep_wait); /* prepare response buffer */ snd_efw_resp_buf_size = clamp(snd_efw_resp_buf_size, SND_EFW_RESPONSE_MAXIMUM_BYTES, 4096U); efw->resp_buf = kzalloc(snd_efw_resp_buf_size, GFP_KERNEL); if (efw->resp_buf == NULL) { err = -ENOMEM; goto error; } efw->pull_ptr = efw->push_ptr = efw->resp_buf; snd_efw_transaction_add_instance(efw); err = get_hardware_info(efw); if (err < 0) goto error; if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9) efw->is_af9 = true; snd_efw_proc_init(efw); if (efw->midi_out_ports || efw->midi_in_ports) { err = snd_efw_create_midi_devices(efw); if (err < 0) goto error; } err = snd_efw_create_pcm_devices(efw); if (err < 0) goto error; err = snd_efw_create_hwdep_device(efw); if (err < 0) goto error; err = snd_efw_stream_init_duplex(efw); if (err < 0) goto error; err = snd_card_register(card); if (err < 0) { snd_efw_stream_destroy_duplex(efw); goto error; } dev_set_drvdata(&unit->device, efw); end: mutex_unlock(&devices_mutex); return err; error: snd_efw_transaction_remove_instance(efw); mutex_unlock(&devices_mutex); snd_card_free(card); return err; }