Exemplo n.º 1
0
Arquivo: ip.c Projeto: RoXeon/TCPIPv6
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;
}
Exemplo n.º 2
0
static void recv_image( image *img )
{
    Huint   s;
    
    s = sizeof(Hubyte)*img->width*img->height*img->depth;
    eth_recv( img->data, s );
}
Exemplo n.º 3
0
void do_recv(void)
{
	char buf[2048];
	
	if(eth_recv(buf) > 0){
		printf(buf + 42);
	}
	
	EINT0PEND = EINT0PEND;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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 );
    }
}
Exemplo n.º 6
0
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);
}
Exemplo n.º 7
0
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;
}