Example #1
0
/*
 *  alloc a mbuf which can be used to describe the packet
 *  if work is error , return NULL
 *  then free wqe, reurn mbuf
 */
void *
oct_rx_process_work(cvmx_wqe_t *wq)
{
	void *pkt_virt;
	mbuf_t *m;

	if (wq->word2.s.rcv_error || cvmx_wqe_get_bufs(wq) > 1){
		/* 
		  *  Work has error, so drop
		  *  and now do not support jumbo packet
		  */
		printf("recv error\n");
		oct_packet_free(wq, wqe_pool);
		STAT_RECV_ERR;
		return NULL;
	}

	pkt_virt = (void *) cvmx_phys_to_ptr(wq->packet_ptr.s.addr);
	if(NULL == pkt_virt)
	{
		STAT_RECV_ADDR_ERR;
		return NULL;
	}
	
#ifdef SEC_RXTX_DEBUG
    printf("Received %u byte packet.\n", cvmx_wqe_get_len(wq));
    printf("Processing packet\n");
    cvmx_helper_dump_packet(wq);
#endif

	m = (mbuf_t *)MBUF_ALLOC();

	memset((void *)m, 0, sizeof(mbuf_t));

	m->magic_flag = MBUF_MAGIC_NUM;
	PKTBUF_SET_HW(m);
	
	m->packet_ptr.u64 = wq->packet_ptr.u64;

	m->input_port = cvmx_wqe_get_port(wq);
	
	m->pkt_totallen = cvmx_wqe_get_len(wq);
	m->pkt_ptr = pkt_virt;

	cvmx_fpa_free(wq, wqe_pool, 0);
	
	STAT_RECV_PC_ADD;
	STAT_RECV_PB_ADD(m->pkt_totallen);

	STAT_RECV_OK;
	return (void *)m;

}
/*
 *  alloc a mbuf which can be used to describe the packet
 *  if work is error , return NULL
 *  then free wqe, reurn mbuf
 */
void *
oct_rx_process_work(cvmx_wqe_t *wq, uint8_t src)
{
    void *pkt_virt;
    mbuf_t *m;

    if (wq->word2.s.rcv_error || oct_wqe_get_bufs(wq) > 1){
        /*
              *  Work has error, so drop
              *  and now do not support jumbo packet
              */
        oct_packet_free(wq, wqe_pool);
        if(FROMLINUX == src)
        {
            STAT_RECV_FROMLINUX_ERR;
        }
        else
        {
            STAT_RECV_FROMHWPORT_ERR;
        }

        return NULL;
    }

    pkt_virt = (void *) cvmx_phys_to_ptr(wq->packet_ptr.s.addr);
    if(NULL == pkt_virt)
    {
        STAT_RECV_ADDR_ERR;
        return NULL;
    }

    LOGDBG(SEC_PACKET_DUMP, "Received %u byte packet.\n", oct_wqe_get_len(wq));
    LOGDBG(SEC_PACKET_DUMP, "Processing packet\n");
    if(srv_dp_sync->dp_debugprint & SEC_PACKET_DUMP)
    {
        cvmx_helper_dump_packet(wq);
    }

    m = (mbuf_t *)MBUF_ALLOC();

    memset((void *)m, 0, sizeof(mbuf_t));

    m->magic_flag = MBUF_MAGIC_NUM;
    PKTBUF_SET_HW(m);

    m->packet_ptr.u64 = wq->packet_ptr.u64;

    m->input_port = oct_wqe_get_port(wq);

    m->pkt_totallen = oct_wqe_get_len(wq);
    m->pkt_ptr = pkt_virt;

    m->tag = cvmx_wqe_get_tag(wq);

    m->timestamp = OCT_TIME_SECONDS_SINCE1970;

    oct_fpa_free(wq, wqe_pool, 0);

    if(FROMPORT == src)
    {
        STAT_RECV_PC_ADD;
        STAT_RECV_PB_ADD(m->pkt_totallen);
    }

    if(FROMLINUX == src)
    {
        STAT_RECV_FROMLINUX_OK;
    }
    else
    {
        STAT_RECV_FROMHWPORT_OK;
    }

    return (void *)m;
}