int netdev_tap::recv_dev(UINT8 **buf) { int len; if(m_fd == -1) return 0; // exit if we didn't receive anything, got an error, got a broadcast or multicast packet, // are in promiscuous mode or got a packet with our mac. do { len = read(m_fd, m_buf, sizeof(m_buf)); } while((len > 0) && memcmp(get_mac(), m_buf, 6) && !get_promisc() && !(m_buf[0] & 1)); *buf = m_buf; return (len == -1)?0:len; }
void netdev::recv(void *ptr, int param) { UINT8 *buf; int len; while((len = recv_dev(&buf))) { if(buf[0] & 1) { if(memcmp("\xff\xff\xff\xff\xff\xff", buf, 6) && !m_dev->mcast_chk(buf, len)) continue; } else if(memcmp(get_mac(), buf, 6) && !get_promisc()) continue; m_dev->recv_cb(buf, len); } }
void osd_netdev::recv(void *ptr, int param) { UINT8 *buf; int len; //const char atalkmac[] = { 0x09, 0x00, 0x07, 0xff, 0xff, 0xff }; while((!m_stop) && (len = recv_dev(&buf))) { #if 0 if(buf[0] & 1) { if(memcmp("\xff\xff\xff\xff\xff\xff", buf, 6) && memcmp(atalkmac, buf, 6) && !m_dev->mcast_chk(buf, len)) continue; } else { //const unsigned char *ourmac = (const unsigned char *)get_mac(); //printf("our mac: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X dst mac: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", ourmac[0], ourmac[1], ourmac[2], ourmac[3], ourmac[4], ourmac[5], buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); if(memcmp(get_mac(), buf, 6) && !get_promisc()) continue; } #endif m_dev->recv_cb(buf, len); } }