X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fip_reassembly%2Fmain.c;h=f2e4510b15eff18935ec4f487e7cbca3387f66c4;hb=4c00cfdc0ea225f2518a35db928ad1ab02b2a724;hp=849215314533b7307370b6503cc35c323f29b49a;hpb=fdf20fa7bee9df9037116318a87080e1eb7e757e;p=dpdk.git diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c index 8492153145..f2e4510b15 100644 --- a/examples/ip_reassembly/main.c +++ b/examples/ip_reassembly/main.c @@ -49,10 +49,7 @@ #include #include #include -#include -#include #include -#include #include #include #include @@ -66,7 +63,6 @@ #include #include #include -#include #include #include #include @@ -86,11 +82,11 @@ #define MAX_JUMBO_PKT_LEN 9600 -#define BUF_SIZE 2048 -#define MBUF_SIZE \ - (BUF_SIZE + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM) +#define BUF_SIZE RTE_MBUF_DEFAULT_DATAROOM +#define MBUF_DATA_SIZE RTE_MBUF_DEFAULT_BUF_SIZE #define NB_MBUF 8192 +#define MEMPOOL_CACHE_SIZE 256 /* allow max jumbo frame 9.5 KB */ #define JUMBO_FRAME_MAX_SIZE 0x2600 @@ -169,7 +165,7 @@ struct rx_queue { struct rte_mempool *pool; struct rte_lpm *lpm; struct rte_lpm6 *lpm6; - uint8_t portid; + uint16_t portid; }; struct tx_lcore_stat { @@ -202,7 +198,7 @@ static struct rte_eth_conf port_conf = { .hw_ip_checksum = 1, /**< IP checksum offload enabled */ .hw_vlan_filter = 0, /**< VLAN filtering disabled */ .jumbo_frame = 1, /**< Jumbo Frame Support disabled */ - .hw_strip_crc = 0, /**< CRC stripped by hardware */ + .hw_strip_crc = 1, /**< CRC stripped by hardware */ }, .rx_adv_conf = { .rss_conf = { @@ -280,7 +276,7 @@ static struct rte_lpm6 *socket_lpm6[RTE_MAX_NUMA_NODES]; * send burst of packets on an output interface. */ static inline uint32_t -send_burst(struct lcore_queue_conf *qconf, uint32_t thresh, uint8_t port) +send_burst(struct lcore_queue_conf *qconf, uint32_t thresh, uint16_t port) { uint32_t fill, len, k, n; struct mbuf_table *txmb; @@ -305,12 +301,12 @@ send_burst(struct lcore_queue_conf *qconf, uint32_t thresh, uint8_t port) txmb->tail = 0; } - return (fill); + return fill; } /* Enqueue a single packet, and send burst if queue is filled */ static inline int -send_single_packet(struct rte_mbuf *m, uint8_t port) +send_single_packet(struct rte_mbuf *m, uint16_t port) { uint32_t fill, lcore_id, len; struct lcore_queue_conf *qconf; @@ -336,11 +332,11 @@ send_single_packet(struct rte_mbuf *m, uint8_t port) if(++txmb->head == len) txmb->head = 0; - return (0); + return 0; } static inline void -reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue, +reassemble(struct rte_mbuf *m, uint16_t portid, uint32_t queue, struct lcore_queue_conf *qconf, uint64_t tms) { struct ether_hdr *eth_hdr; @@ -348,7 +344,8 @@ reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue, struct rte_ip_frag_death_row *dr; struct rx_queue *rxq; void *d_addr_bytes; - uint8_t next_hop, dst_port; + uint32_t next_hop; + uint16_t dst_port; rxq = &qconf->rx_queue_list[queue]; @@ -357,7 +354,7 @@ reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue, dst_port = portid; /* if packet is IPv4 */ - if (m->ol_flags & (PKT_RX_IPV4_HDR)) { + if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) { struct ipv4_hdr *ip_hdr; uint32_t ip_dst; @@ -397,9 +394,8 @@ reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue, } eth_hdr->ether_type = rte_be_to_cpu_16(ETHER_TYPE_IPv4); - } - /* if packet is IPv6 */ - else if (m->ol_flags & (PKT_RX_IPV6_HDR | PKT_RX_IPV6_HDR_EXT)) { + } else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) { + /* if packet is IPv6 */ struct ipv6_extension_fragment *frag_hdr; struct ipv6_hdr *ip_hdr; @@ -429,7 +425,8 @@ reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue, } /* Find destination port */ - if (rte_lpm6_lookup(rxq->lpm6, ip_hdr->dst_addr, &next_hop) == 0 && + if (rte_lpm6_lookup(rxq->lpm6, ip_hdr->dst_addr, + &next_hop) == 0 && (enabled_port_mask & 1 << next_hop) != 0) { dst_port = next_hop; } @@ -456,7 +453,7 @@ main_loop(__attribute__((unused)) void *dummy) unsigned lcore_id; uint64_t diff_tsc, cur_tsc, prev_tsc; int i, j, nb_rx; - uint8_t portid; + uint16_t portid; struct lcore_queue_conf *qconf; const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US; @@ -475,7 +472,7 @@ main_loop(__attribute__((unused)) void *dummy) for (i = 0; i < qconf->n_rx_queue; i++) { portid = qconf->rx_queue_list[i].portid; - RTE_LOG(INFO, IP_RSMBL, " -- lcoreid=%u portid=%hhu\n", lcore_id, + RTE_LOG(INFO, IP_RSMBL, " -- lcoreid=%u portid=%u\n", lcore_id, portid); } @@ -563,13 +560,13 @@ parse_flow_num(const char *str, uint32_t min, uint32_t max, uint32_t *val) errno = 0; v = strtoul(str, &end, 10); if (errno != 0 || *end != '\0') - return (-EINVAL); + return -EINVAL; if (v < min || v > max) - return (-EINVAL); + return -EINVAL; *val = (uint32_t)v; - return (0); + return 0; } static int @@ -585,20 +582,20 @@ parse_flow_ttl(const char *str, uint32_t min, uint32_t max, uint32_t *val) errno = 0; v = strtoul(str, &end, 10); if (errno != 0) - return (-EINVAL); + return -EINVAL; if (*end != '\0') { if (strncmp(frmt_sec, end, sizeof(frmt_sec)) == 0) v *= MS_PER_S; else if (strncmp(frmt_msec, end, sizeof (frmt_msec)) != 0) - return (-EINVAL); + return -EINVAL; } if (v < min || v > max) - return (-EINVAL); + return -EINVAL; *val = (uint32_t)v; - return (0); + return 0; } static int @@ -691,7 +688,7 @@ parse_args(int argc, char **argv) optarg, lgopts[option_index].name); print_usage(prgname); - return (ret); + return ret; } } @@ -704,7 +701,7 @@ parse_args(int argc, char **argv) optarg, lgopts[option_index].name); print_usage(prgname); - return (ret); + return ret; } } @@ -720,7 +717,7 @@ parse_args(int argc, char **argv) argv[optind-1] = prgname; ret = optind-1; - optind = 0; /* reset getopt lib */ + optind = 1; /* reset getopt lib */ return ret; } @@ -734,11 +731,12 @@ print_ethaddr(const char *name, const struct ether_addr *eth_addr) /* Check the link status of all ports in up to 9s, and print them finally */ static void -check_all_ports_link_status(uint8_t port_num, uint32_t port_mask) +check_all_ports_link_status(uint16_t port_num, uint32_t port_mask) { #define CHECK_INTERVAL 100 /* 100ms */ #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */ - uint8_t portid, count, all_ports_up, print_flag = 0; + uint16_t portid; + uint8_t count, all_ports_up, print_flag = 0; struct rte_eth_link link; printf("\nChecking link status"); @@ -753,18 +751,17 @@ check_all_ports_link_status(uint8_t port_num, uint32_t port_mask) /* print link status if flag set */ if (print_flag == 1) { if (link.link_status) - printf("Port %d Link Up - speed %u " - "Mbps - %s\n", (uint8_t)portid, - (unsigned)link.link_speed, + printf( + "Port%d Link Up. Speed %u Mbps - %s\n", + portid, link.link_speed, (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? ("full-duplex") : ("half-duplex\n")); else - printf("Port %d Link Down\n", - (uint8_t)portid); + printf("Port %d Link Down\n", portid); continue; } /* clear all_ports_up flag if any link down */ - if (link.link_status == 0) { + if (link.link_status == ETH_LINK_DOWN) { all_ports_up = 0; break; } @@ -905,17 +902,17 @@ setup_queue_tbl(struct rx_queue *rxq, uint32_t lcore, uint32_t queue) nb_mbuf = RTE_MAX(max_flow_num, 2UL * MAX_PKT_BURST) * MAX_FRAG_NUM; nb_mbuf *= (port_conf.rxmode.max_rx_pkt_len + BUF_SIZE - 1) / BUF_SIZE; nb_mbuf *= 2; /* ipv4 and ipv6 */ - nb_mbuf += RTE_TEST_RX_DESC_DEFAULT + RTE_TEST_TX_DESC_DEFAULT; + nb_mbuf += nb_rxd + nb_txd; nb_mbuf = RTE_MAX(nb_mbuf, (uint32_t)NB_MBUF); snprintf(buf, sizeof(buf), "mbuf_pool_%u_%u", lcore, queue); - if ((rxq->pool = rte_mempool_create(buf, nb_mbuf, MBUF_SIZE, 0, - sizeof(struct rte_pktmbuf_pool_private), - rte_pktmbuf_pool_init, NULL, rte_pktmbuf_init, NULL, - socket, MEMPOOL_F_SP_PUT | MEMPOOL_F_SC_GET)) == NULL) { - RTE_LOG(ERR, IP_RSMBL, "mempool_create(%s) failed", buf); + rxq->pool = rte_pktmbuf_pool_create(buf, nb_mbuf, MEMPOOL_CACHE_SIZE, 0, + MBUF_DATA_SIZE, socket); + if (rxq->pool == NULL) { + RTE_LOG(ERR, IP_RSMBL, + "rte_pktmbuf_pool_create(%s) failed", buf); return -1; } @@ -928,6 +925,7 @@ init_mem(void) char buf[PATH_MAX]; struct rte_lpm *lpm; struct rte_lpm6 *lpm6; + struct rte_lpm_config lpm_config; int socket; unsigned lcore_id; @@ -947,7 +945,11 @@ init_mem(void) RTE_LOG(INFO, IP_RSMBL, "Creating LPM table on socket %i\n", socket); snprintf(buf, sizeof(buf), "IP_RSMBL_LPM_%i", socket); - lpm = rte_lpm_create(buf, socket, LPM_MAX_RULES, 0); + lpm_config.max_rules = LPM_MAX_RULES; + lpm_config.number_tbl8s = 256; + lpm_config.flags = 0; + + lpm = rte_lpm_create(buf, socket, &lpm_config); if (lpm == NULL) { RTE_LOG(ERR, IP_RSMBL, "Cannot create LPM table\n"); return -1; @@ -959,7 +961,7 @@ init_mem(void) RTE_LOG(INFO, IP_RSMBL, "Creating LPM6 table on socket %i\n", socket); snprintf(buf, sizeof(buf), "IP_RSMBL_LPM_%i", socket); - lpm6 = rte_lpm6_create("IP_RSMBL_LPM6", socket, &lpm6_config); + lpm6 = rte_lpm6_create(buf, socket, &lpm6_config); if (lpm6 == NULL) { RTE_LOG(ERR, IP_RSMBL, "Cannot create LPM table\n"); return -1; @@ -984,7 +986,7 @@ queue_dump_stat(void) qconf = &lcore_queue_conf[lcore]; for (i = 0; i < qconf->n_rx_queue; i++) { - fprintf(stdout, " -- lcoreid=%u portid=%hhu " + fprintf(stdout, " -- lcoreid=%u portid=%u " "frag tbl stat:\n", lcore, qconf->rx_queue_list[i].portid); rte_ip_frag_table_statistics_dump(stdout, @@ -1021,7 +1023,7 @@ main(int argc, char **argv) uint16_t queueid; unsigned lcore_id = 0, rx_lcore_id = 0; uint32_t n_tx_queue, nb_lcores; - uint8_t portid; + uint16_t portid; /* init EAL */ ret = rte_eal_init(argc, argv); @@ -1036,9 +1038,7 @@ main(int argc, char **argv) rte_exit(EXIT_FAILURE, "Invalid IP reassembly parameters\n"); nb_ports = rte_eth_dev_count(); - if (nb_ports > RTE_MAX_ETHPORTS) - nb_ports = RTE_MAX_ETHPORTS; - else if (nb_ports == 0) + if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No ports found!\n"); nb_lcores = rte_lcore_count(); @@ -1061,6 +1061,11 @@ main(int argc, char **argv) qconf = &lcore_queue_conf[rx_lcore_id]; + /* limit the frame size to the maximum supported by NIC */ + rte_eth_dev_info_get(portid, &dev_info); + port_conf.rxmode.max_rx_pkt_len = RTE_MIN( + dev_info.max_rx_pktlen, port_conf.rxmode.max_rx_pkt_len); + /* get the lcore_id for this port */ while (rte_lcore_is_enabled(rx_lcore_id) == 0 || qconf->n_rx_queue == (unsigned)rx_queue_per_lcore) { @@ -1081,6 +1086,14 @@ main(int argc, char **argv) rxq->portid = portid; rxq->lpm = socket_lpm[socket]; rxq->lpm6 = socket_lpm6[socket]; + + ret = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd, + &nb_txd); + if (ret < 0) + rte_exit(EXIT_FAILURE, + "Cannot adjust number of descriptors: err=%d, port=%d\n", + ret, portid); + if (setup_queue_tbl(rxq, rx_lcore_id, queueid) < 0) rte_exit(EXIT_FAILURE, "Failed to set up queue table\n"); qconf->n_rx_queue++; @@ -1127,7 +1140,6 @@ main(int argc, char **argv) printf("txq=%u,%d,%d ", lcore_id, queueid, socket); fflush(stdout); - rte_eth_dev_info_get(portid, &dev_info); txconf = &dev_info.default_txconf; txconf->txq_flags = 0; @@ -1164,7 +1176,7 @@ main(int argc, char **argv) if (init_routing_table() < 0) rte_exit(EXIT_FAILURE, "Cannot init routing table\n"); - check_all_ports_link_status((uint8_t)nb_ports, enabled_port_mask); + check_all_ports_link_status(nb_ports, enabled_port_mask); signal(SIGUSR1, signal_handler); signal(SIGTERM, signal_handler);