size_t ip_recv(session_t *session, uint8_t buffer[], size_t buffer_len) { ip_packet_t packet; static uint8_t icmp_multicast_addr[IP_ADDR_LEN] = { 0xff, 0x02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0 }; memcpy(icmp_multicast_addr + 13, session->src_ip + 13, 3); size_t received; // Skip all packets that don't match the session's protocol or ip_addr while( (received = eth_recv(session, packet.buffer)) > 0 ) { if(packet.next_header == session->protocol && (memcmp(packet.dst_ip, session->src_ip, IP_ADDR_LEN) == 0 || memcmp(packet.dst_ip, icmp_multicast_addr, IP_ADDR_LEN) == 0 ) ) break; } if(received == 0) return 0; const size_t data_len = MIN(received - IP_HEADER_LEN, buffer_len); memcpy(buffer, packet.data, data_len); memcpy(session->last_sender_ip, packet.src_ip, IP_ADDR_LEN); return data_len; }
static void recv_image( image *img ) { Huint s; s = sizeof(Hubyte)*img->width*img->height*img->depth; eth_recv( img->data, s ); }
void do_recv(void) { char buf[2048]; if(eth_recv(buf) > 0){ printf(buf + 42); } EINT0PEND = EINT0PEND; }
void do_net(void) { unsigned int len; if(!(EINT0PEND & (1 << 7))) goto end; if((len = eth_recv((void *)recv_buf)) > 14)//判断mac+ip/arp 一共14个字节 大于14表示有数据 eth_unpack();//板子解包 pc---->板子 板子解包 end: EINT0PEND = EINT0PEND; }
void log_data( FILE *file ) { Huint size; Huint data[ ETH_MTU_WORD ]; while( 1 ) { memset( data, 0, sizeof(Huint)*size ); show_operation( oper_win, "Waiting for Header..." ); box( oper_win, 0, 0 ); wrefresh( oper_win ); eth_recv( (Hubyte*)&size, sizeof(Huint) ); size = ntohl( size ); show_operation( oper_win, "Waiting for Data..." ); box( oper_win, 0, 0 ); wrefresh( oper_win ); eth_recv( (Hubyte*)data, size*sizeof(Huint) ); dump_packet( size, data, file ); } }
void netifc_poll(void) { uint8_t data[1514]; efi_status r; size_t hsz, bsz; uint32_t irq; void* txdone; if (eth_buffers_avail < num_eth_buffers) { // Only check for completion if we have operations in progress. // Otherwise, the result of GetStatus is unreliable. See ZX-759. if ((r = snp->GetStatus(snp, &irq, &txdone))) { return; } if (txdone) { // Check to make sure this is one of our buffers (see ZX-1516) efi_physical_addr buf_paddr = (efi_physical_addr)txdone; if ((buf_paddr >= eth_buffers_base) && (buf_paddr < (eth_buffers_base + (NUM_BUFFER_PAGES * PAGE_SIZE)))) { eth_put_buffer(txdone); } } } hsz = 0; bsz = sizeof(data); r = snp->Receive(snp, &hsz, &bsz, data, NULL, NULL, NULL); if (r != EFI_SUCCESS) { return; } #if DROP_PACKETS rxc++; if ((random() % DROP_PACKETS) == 0) { printf("rx drop %d\n", rxc); return; } #endif #if TRACE printf("RX %02x:%02x:%02x:%02x:%02x:%02x < %02x:%02x:%02x:%02x:%02x:%02x %02x%02x %d\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11], data[12], data[13], (int)(bsz - hsz)); #endif eth_recv(data, bsz); }
int eth_proc(struct net_device *dev, const int mode, struct net_packet *pkt) { int ret; static unsigned char buf[LEN_RxBuf]; int timeout = 1000; /* 1s */ if (mode == ARP_WAIT) timeout = 100; /* 100ms */ while (1) { memzero(pkt, sizeof(struct net_packet)); pkt->raw_data_addr = buf; ret = eth_recv(dev, pkt, &timeout); if (ret) return ret; pkt->eth = pkt->raw_data_addr; pkt->f2.any = pkt->raw_data_addr + ETH_FRAME_LEN; pkt->f2len = pkt->raw_data_len - ETH_FRAME_LEN; switch (ntohs(pkt->eth->protocol)) { case ETH_PROTOCOL_ARP: dev_vdbg("ARP\n"); ret = arp_proc(dev, pkt); if (mode == ARP_WAIT) return 0; break; case ETH_PROTOCOL_IP: dev_vdbg("IP\n"); if (mode == IP_WAIT) return 0; break; default: dev_vdbg("Unknown(%d)\n", ntohs(pkt->eth->protocol)); break; } } return 0; }