/* * Attach a network card to the system. * * This function is called by a hardware driver ("card") after it has * finished initializing itself, to link itself to the platform support * modules. */ void network_attach(void *dev, uint8_t *mac, NETRXCB rx) { if (network_card == 0) return; /* Save the card's info. */ net_cards[network_card].priv = dev; net_cards[network_card].rx = rx; network_mac = mac; /* Create the network events. */ poll_data.wake_poll_thread = thread_create_event(); poll_data.poll_complete = thread_create_event(); /* Activate the platform module. */ switch(network_type) { case NET_TYPE_PCAP: (void)net_pcap_reset(&net_cards[network_card], network_mac); break; case NET_TYPE_SLIRP: (void)net_slirp_reset(&net_cards[network_card], network_mac); break; } }
void sound_init() { initalmain(0,NULL); inital(); outbuffer = malloc(SOUNDBUFLEN * 2 * sizeof(int16_t)); sound_cd_event = thread_create_event(); sound_cd_thread_h = thread_create(sound_cd_thread, NULL); }
/* Handle the receiving of frames from the channel. */ static void poll_thread(void *arg) { uint8_t *mac = (uint8_t *)arg; const uint8_t *data = NULL; struct pcap_pkthdr h; uint32_t mac_cmp32[2]; uint16_t mac_cmp16[2]; event_t *evt; pclog("PCAP: polling thread started, arg %08lx\n", arg); /* Create a waitable event. */ evt = thread_create_event(); /* As long as the channel is open.. */ while (pcap != NULL) { /* Wait for the next packet to arrive. */ data = f_pcap_next(pcap, &h); if (data != NULL) { /* Received MAC. */ mac_cmp32[0] = *(uint32_t *)(data+6); mac_cmp16[0] = *(uint16_t *)(data+10); /* Local MAC. */ mac_cmp32[1] = *(uint32_t *)mac; mac_cmp16[1] = *(uint16_t *)(mac+4); if ((mac_cmp32[0] != mac_cmp32[1]) || (mac_cmp16[0] != mac_cmp16[1])) { if (poll_rx != NULL) poll_rx(poll_arg, (uint8_t *)data, h.caplen); } else { /* Mark as invalid packet. */ data = NULL; } } /* If we did not get anything, wait a while. */ if (data == NULL) thread_wait_event(evt, 10); } thread_destroy_event(evt); poll_tid = NULL; pclog("PCAP: polling stopped.\n"); }