Advertisement
Guest User

s_proc_do_tx

a guest
Dec 26th, 2022
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.54 KB | Source Code | 0 0
  1. static void s_proc_do_tx (void)
  2. {
  3. uint_fast64_t       l_cycles, i, l_expired_tsc, l_cur_tsc, l_lcore_id, l_rc, l_que_idx,
  4.             l_drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US,
  5.             l_diff_tsc, l_prev_tsc;
  6. struct rte_mbuf     *l_mbuf;
  7. TTR2$IF_RECORD      *l_if_rec;
  8. TTR2$TEST_HDR       l_testh = {0}, *l_testhp;
  9. struct rte_net_hdr_lens l_hdr_lens;
  10.  
  11.     l_lcore_id = rte_lcore_id();
  12.     $LOG(STS$K_INFO, "Start worker for <%s> on LCore #%d",  __PRETTY_FUNCTION__,  l_lcore_id);
  13.  
  14.     /* Ethernet II header ... */
  15.     rte_ether_addr_copy(&s_eth_ip_multicast, &l_testh.eth.dst_addr );   /* Ethernet multicast for IP  */
  16.     l_testh.eth.src_addr;                           /* Source HA will be filled on sending */
  17.     l_testh.eth.ether_type = rte_cpu_to_be_16( RTE_ETHER_TYPE_IPV4);    /* Protocol is IPv4 ... */
  18.  
  19.     /* IPv4 header ... */
  20.     l_testh.iph.version_ihl = RTE_IPV4_VHL_DEF;
  21.     l_testh.iph.type_of_service = 0;
  22.     l_testh.iph.total_length = sizeof(struct rte_ipv4_hdr) + sizeof(struct rte_udp_hdr) + sizeof(TTR2$TEST_PDU) + g_payload;
  23.     l_testh.iph.total_length = rte_cpu_to_be_16(l_testh.iph.total_length);
  24.     l_testh.iph.packet_id = 0;
  25.     l_testh.iph.fragment_offset = 0;
  26.     l_testh.iph.time_to_live = 63;
  27.     l_testh.iph.next_proto_id = IPPROTO_UDP;
  28.     l_testh.iph.hdr_checksum = 0;
  29.     l_testh.iph.src_addr = g_lip;
  30.     l_testh.iph.dst_addr = g_rip;
  31.  
  32.     /* UDP header*/
  33.     l_testh.udph.src_port = g_lpn;
  34.     l_testh.udph.dst_port = g_rpn;
  35.     l_testh.udph.dgram_len = rte_cpu_to_be_16(sizeof(TTR2$TEST_PDU) + g_payload);
  36.     l_testh.udph.dgram_cksum = 0;
  37.  
  38.     /* Test */
  39.     l_testh.data.magic64 = *s_starlet_sig64;
  40.     l_testh.data.len = rte_cpu_to_be_16 (g_payload);
  41.     l_testh.data.req = rte_cpu_to_be_16 (TTR2$K_OPCODE_REQ);
  42.  
  43.     $LOG(STS$K_INFO, "Paket is %d octets [header/payload: %d/%d octets]",
  44.         sizeof(struct rte_ipv4_hdr) + sizeof(struct rte_udp_hdr) + sizeof(TTR2$TEST_PDU) + g_payload,
  45.         sizeof(struct rte_ipv4_hdr) + sizeof(struct rte_udp_hdr) + sizeof(TTR2$TEST_PDU),
  46.         g_payload );
  47.  
  48.  
  49.     for ( l_cycles = l_expired_tsc = 0;  !g_exit_flag; )
  50.         {
  51.         l_cur_tsc = rte_get_tsc_cycles();               /* Get current "time" ... */
  52.  
  53.         if ( g_bw )                         /* Is there BW limit ? */
  54.             {
  55.             if ( unlikely(l_cur_tsc < l_expired_tsc) )      /* Do we reach expiration time ? */
  56.                 continue;
  57.  
  58.             l_expired_tsc = l_cur_tsc + g_xmit_delta;       /* A time o next sending */
  59.             }
  60.  
  61.  
  62.         /* Send a packet to all WAN interfaces */
  63.         l_cycles++;
  64.  
  65.         for ( i = 0; i < s_if_tbl_wan_nr; i++ )
  66.             {
  67.             l_if_rec = s_if_tbl_wan[i];             /* Get a pointer to Port's context */
  68.  
  69.             if ( !(l_if_rec->if_flags & TTR2_IF$M_UP) )     /* Skip port w/o active cable link */
  70.                 continue;
  71.  
  72.  
  73.             l_diff_tsc = l_cur_tsc - l_prev_tsc;            /* Do we need to flush TX buffers? */
  74.             if (unlikely( (l_diff_tsc > l_drain_tsc) && l_if_rec->tx_buffer->length) )
  75.                 {
  76.                 l_rc = rte_eth_tx_buffer_flush(l_if_rec->port_id, l_que_idx, l_if_rec->tx_buffer);
  77.                 l_prev_tsc = l_cur_tsc;
  78.                 }
  79.  
  80.  
  81.             if ( !(l_mbuf = rte_pktmbuf_alloc (g_pktmbuf_pool)) )   /* Get buffer from poll for new packet */
  82.                 {
  83.                 $LOG(STS$K_ERROR, "rte_pktmbuf_alloc() failed, errno=%d", rte_errno);
  84.                 break;
  85.                 }
  86.  
  87.             l_testhp = rte_pktmbuf_mtod(l_mbuf, TTR2$TEST_HDR *);
  88.             l_mbuf->pkt_len  = l_mbuf->data_len = sizeof(TTR2$TEST_HDR) + g_payload;
  89.  
  90.             *l_testhp = l_testh;                    /* Initialize static part of packet */
  91.  
  92.  
  93.                                         /* Fill variable part of headers and test data ... */
  94.             rte_ether_addr_copy(&l_if_rec->if_hwaddr, &l_testhp->eth.src_addr);
  95.             l_testhp->iph.packet_id = rte_cpu_to_be_16 (0xffff & l_cycles);
  96.  
  97.             l_testhp->data.seq = rte_cpu_to_be_64(l_cycles);
  98.             l_testhp->data.ts = rte_cpu_to_be_64(rte_get_tsc_cycles());
  99.  
  100.             memset(l_testhp->data.data, 'A' + (0x0F & l_cycles), g_payload);
  101.             l_testhp->data.crc = rte_hash_crc(l_testhp->data.data, g_payload, 0xEDB88320);
  102.             l_testhp->data.crc = rte_cpu_to_be_32(l_testhp->data.crc);
  103.  
  104.             l_mbuf->packet_type = RTE_PTYPE_L2_ETHER;
  105.             l_mbuf->ol_flags |= RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_UDP_CKSUM;
  106.             l_mbuf->l2_len = RTE_ETHER_HDR_LEN;
  107.             l_mbuf->l3_len = rte_ipv4_hdr_len (&l_testhp->iph);
  108.  
  109.  
  110.             /* Put new <mbuf> with the IP packet into the output buffer of the Ethernet port */
  111.             l_que_idx = l_cycles % g_nqueue;
  112.             l_rc = rte_eth_tx_buffer(l_if_rec->port_id, l_que_idx, l_if_rec->tx_buffer, l_mbuf);
  113.             if ( l_if_rec->tx_buffer->length == l_if_rec->tx_buffer->size )
  114.                 l_rc += rte_eth_tx_buffer_flush(l_if_rec->port_id, l_que_idx, l_if_rec->tx_buffer);
  115.  
  116.             atomic_fetch_add(&s_xmit_cnt, 1);
  117.             }
  118.         }
  119.  
  120.     $LOG(STS$K_INFO, "Terminate worker for <%s> on LCore #%d",  __PRETTY_FUNCTION__,  l_lcore_id);
  121. }
  122.  
  123.  
Tags: DPDK BMF SYSMAN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement