X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fip_fragmentation%2Fmain.c;h=78205d2e12dc16db3f53001ce3c4791d38e02cec;hb=c7ebd65c137215d714b445b7b4c584007cc89ffb;hp=a5101fa911e66e2e83b10d7069bf3cd177dd08d7;hpb=0c9da7555da8c8373dfd69f798f832723ae6de71;p=dpdk.git diff --git a/examples/ip_fragmentation/main.c b/examples/ip_fragmentation/main.c index a5101fa911..78205d2e12 100644 --- a/examples/ip_fragmentation/main.c +++ b/examples/ip_fragmentation/main.c @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -146,16 +145,16 @@ struct lcore_queue_conf lcore_queue_conf[RTE_MAX_LCORE]; static struct rte_eth_conf port_conf = { .rxmode = { - .max_rx_pkt_len = JUMBO_FRAME_MAX_SIZE, + .mtu = JUMBO_FRAME_MAX_SIZE - RTE_ETHER_HDR_LEN - + RTE_ETHER_CRC_LEN, .split_hdr_size = 0, - .offloads = (DEV_RX_OFFLOAD_CHECKSUM | - DEV_RX_OFFLOAD_SCATTER | - DEV_RX_OFFLOAD_JUMBO_FRAME), + .offloads = (RTE_ETH_RX_OFFLOAD_CHECKSUM | + RTE_ETH_RX_OFFLOAD_SCATTER), }, .txmode = { - .mq_mode = ETH_MQ_TX_NONE, - .offloads = (DEV_TX_OFFLOAD_IPV4_CKSUM | - DEV_TX_OFFLOAD_MULTI_SEGS), + .mq_mode = RTE_ETH_MQ_TX_NONE, + .offloads = (RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | + RTE_ETH_TX_OFFLOAD_MULTI_SEGS), }, }; @@ -168,6 +167,7 @@ struct l3fwd_ipv4_route { uint8_t if_out; }; +/* Default l3fwd_ipv4_route_array table. 8< */ struct l3fwd_ipv4_route l3fwd_ipv4_route_array[] = { {RTE_IPV4(100,10,0,0), 16, 0}, {RTE_IPV4(100,20,0,0), 16, 1}, @@ -178,6 +178,7 @@ struct l3fwd_ipv4_route l3fwd_ipv4_route_array[] = { {RTE_IPV4(100,70,0,0), 16, 6}, {RTE_IPV4(100,80,0,0), 16, 7}, }; +/* >8 End of default l3fwd_ipv4_route_array table */ /* * IPv6 forwarding table @@ -189,6 +190,7 @@ struct l3fwd_ipv6_route { uint8_t if_out; }; +/* Default l3fwd_ipv6_route_array table. 8< */ static struct l3fwd_ipv6_route l3fwd_ipv6_route_array[] = { {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 0}, {{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 1}, @@ -199,6 +201,7 @@ static struct l3fwd_ipv6_route l3fwd_ipv6_route_array[] = { {{7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 6}, {{8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 7}, }; +/* >8 End of default l3fwd_ipv6_route_array table. */ #define LPM_MAX_RULES 1024 #define LPM6_MAX_RULES 1024 @@ -242,16 +245,21 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf, { struct rx_queue *rxq; uint32_t i, len, next_hop; - uint8_t ipv6; - uint16_t port_out; + uint16_t port_out, ether_type; int32_t len2; + uint64_t ol_flags; + const struct rte_ether_hdr *eth; - ipv6 = 0; + ol_flags = 0; rxq = &qconf->rx_queue_list[queueid]; /* by default, send everything back to the source port */ port_out = port_in; + /* save ether type of the incoming packet */ + eth = rte_pktmbuf_mtod(m, const struct rte_ether_hdr *); + ether_type = eth->ether_type; + /* Remove the Ethernet header and trailer from the input packet */ rte_pktmbuf_adj(m, (uint16_t)sizeof(struct rte_ether_hdr)); @@ -289,6 +297,9 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf, /* Free input packet */ rte_pktmbuf_free(m); + /* request HW to regenerate IPv4 cksum */ + ol_flags |= (RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_IP_CKSUM); + /* If we fail to fragment the packet */ if (unlikely (len2 < 0)) return; @@ -297,8 +308,6 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf, /* if this is an IPv6 packet */ struct rte_ipv6_hdr *ip_hdr; - ipv6 = 1; - /* Read the lookup key (i.e. ip_dst) from the input packet */ ip_hdr = rte_pktmbuf_mtod(m, struct rte_ipv6_hdr *); @@ -348,21 +357,18 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf, rte_panic("No headroom in mbuf.\n"); } + m->ol_flags |= ol_flags; m->l2_len = sizeof(struct rte_ether_hdr); /* 02:00:00:00:00:xx */ - d_addr_bytes = ð_hdr->d_addr.addr_bytes[0]; - *((uint64_t *)d_addr_bytes) = 0x000000000002 + ((uint64_t)port_out << 40); + d_addr_bytes = ð_hdr->dst_addr.addr_bytes[0]; + *((uint64_t *)d_addr_bytes) = 0x000000000002 + + ((uint64_t)port_out << 40); /* src addr */ rte_ether_addr_copy(&ports_eth_addr[port_out], - ð_hdr->s_addr); - if (ipv6) - eth_hdr->ether_type = - rte_be_to_cpu_16(RTE_ETHER_TYPE_IPV6); - else - eth_hdr->ether_type = - rte_be_to_cpu_16(RTE_ETHER_TYPE_IPV4); + ð_hdr->src_addr); + eth_hdr->ether_type = ether_type; } len += len2; @@ -379,7 +385,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf, /* main processing loop */ static int -main_loop(__attribute__((unused)) void *dummy) +main_loop(__rte_unused void *dummy) { struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; unsigned lcore_id; @@ -589,6 +595,8 @@ check_all_ports_link_status(uint32_t port_mask) uint16_t portid; uint8_t count, all_ports_up, print_flag = 0; struct rte_eth_link link; + int ret; + char link_status_text[RTE_ETH_LINK_MAX_STR_LEN]; printf("\nChecking link status"); fflush(stdout); @@ -598,21 +606,24 @@ check_all_ports_link_status(uint32_t port_mask) if ((port_mask & (1 << portid)) == 0) continue; memset(&link, 0, sizeof(link)); - rte_eth_link_get_nowait(portid, &link); + ret = rte_eth_link_get_nowait(portid, &link); + if (ret < 0) { + all_ports_up = 0; + if (print_flag == 1) + printf("Port %u link get failed: %s\n", + portid, rte_strerror(-ret)); + continue; + } /* print link status if flag set */ if (print_flag == 1) { - if (link.link_status) - 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", portid); + rte_eth_link_to_str(link_status_text, + sizeof(link_status_text), &link); + printf("Port %d %s\n", portid, + link_status_text); continue; } /* clear all_ports_up flag if any link down */ - if (link.link_status == ETH_LINK_DOWN) { + if (link.link_status == RTE_ETH_LINK_DOWN) { all_ports_up = 0; break; } @@ -635,7 +646,7 @@ check_all_ports_link_status(uint32_t port_mask) } } -/* Check L3 packet type detection capablity of the NIC port */ +/* Check L3 packet type detection capability of the NIC port */ static int check_ptype(int portid) { @@ -900,10 +911,15 @@ 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); - local_port_conf.rxmode.max_rx_pkt_len = RTE_MIN( - dev_info.max_rx_pktlen, - local_port_conf.rxmode.max_rx_pkt_len); + ret = rte_eth_dev_info_get(portid, &dev_info); + if (ret != 0) + rte_exit(EXIT_FAILURE, + "Error during getting device (port %u) info: %s\n", + portid, strerror(-ret)); + + local_port_conf.rxmode.mtu = RTE_MIN( + dev_info.max_mtu, + local_port_conf.rxmode.mtu); /* get the lcore_id for this port */ while (rte_lcore_is_enabled(rx_lcore_id) == 0 || @@ -936,9 +952,6 @@ main(int argc, char **argv) n_tx_queue = nb_lcores; if (n_tx_queue > MAX_TX_QUEUE_PER_PORT) n_tx_queue = MAX_TX_QUEUE_PER_PORT; - if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) - local_port_conf.txmode.offloads |= - DEV_TX_OFFLOAD_MBUF_FAST_FREE; ret = rte_eth_dev_configure(portid, 1, (uint16_t)n_tx_queue, &local_port_conf); if (ret < 0) { @@ -949,8 +962,7 @@ main(int argc, char **argv) } /* set the mtu to the maximum received packet size */ - ret = rte_eth_dev_set_mtu(portid, - local_port_conf.rxmode.max_rx_pkt_len - MTU_OVERHEAD); + ret = rte_eth_dev_set_mtu(portid, local_port_conf.rxmode.mtu); if (ret < 0) { printf("\n"); rte_exit(EXIT_FAILURE, "Set MTU failed: " @@ -979,16 +991,32 @@ main(int argc, char **argv) ret, portid); } - rte_eth_macaddr_get(portid, &ports_eth_addr[portid]); + ret = rte_eth_macaddr_get(portid, &ports_eth_addr[portid]); + if (ret < 0) { + printf("\n"); + rte_exit(EXIT_FAILURE, + "rte_eth_macaddr_get: err=%d, port=%d\n", + ret, portid); + } + print_ethaddr(" Address:", &ports_eth_addr[portid]); printf("\n"); /* init one TX queue per couple (lcore,port) */ + ret = rte_eth_dev_info_get(portid, &dev_info); + if (ret != 0) + rte_exit(EXIT_FAILURE, + "Error during getting device (port %u) info: %s\n", + portid, strerror(-ret)); + queueid = 0; for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { if (rte_lcore_is_enabled(lcore_id) == 0) continue; + if (queueid >= dev_info.nb_tx_queues) + break; + socket = (int) rte_lcore_to_socket_id(lcore_id); printf("txq=%u,%d ", lcore_id, queueid); fflush(stdout); @@ -1024,7 +1052,11 @@ main(int argc, char **argv) rte_exit(EXIT_FAILURE, "rte_eth_dev_start: err=%d, port=%d\n", ret, portid); - rte_eth_promiscuous_enable(portid); + ret = rte_eth_promiscuous_enable(portid); + if (ret != 0) + rte_exit(EXIT_FAILURE, + "rte_eth_promiscuous_enable: err=%s, port=%d\n", + rte_strerror(-ret), portid); if (check_ptype(portid) == 0) { rte_eth_add_rx_callback(portid, 0, cb_parse_ptype, NULL); @@ -1039,11 +1071,14 @@ main(int argc, char **argv) check_all_ports_link_status(enabled_port_mask); /* launch per-lcore init on every lcore */ - rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER); - RTE_LCORE_FOREACH_SLAVE(lcore_id) { + rte_eal_mp_remote_launch(main_loop, NULL, CALL_MAIN); + RTE_LCORE_FOREACH_WORKER(lcore_id) { if (rte_eal_wait_lcore(lcore_id) < 0) return -1; } + /* clean up the EAL */ + rte_eal_cleanup(); + return 0; }