| 9888 | } |
| 9889 | |
| 9890 | static inline struct rte_mbuf * |
| 9891 | ext_mbuf_create(struct rte_mempool *mbuf_pool, int pkt_len, |
| 9892 | int nb_segs, const void *input_text) |
| 9893 | { |
| 9894 | struct rte_mbuf *m = NULL, *mbuf = NULL; |
| 9895 | size_t data_off = 0; |
| 9896 | uint8_t *dst; |
| 9897 | int i, size; |
| 9898 | int t_len; |
| 9899 | |
| 9900 | if (pkt_len < 1) { |
| 9901 | printf("Packet size must be 1 or more (is %d)\n", pkt_len); |
| 9902 | return NULL; |
| 9903 | } |
| 9904 | |
| 9905 | if (nb_segs < 1) { |
| 9906 | printf("Number of segments must be 1 or more (is %d)\n", |
| 9907 | nb_segs); |
| 9908 | return NULL; |
| 9909 | } |
| 9910 | |
| 9911 | t_len = pkt_len >= nb_segs ? pkt_len / nb_segs : 1; |
| 9912 | size = pkt_len; |
| 9913 | |
| 9914 | /* Create chained mbuf_src with external buffer */ |
| 9915 | for (i = 0; size > 0; i++) { |
| 9916 | struct rte_mbuf_ext_shared_info *ret_shinfo = NULL; |
| 9917 | uint16_t data_len = RTE_MIN(size, t_len); |
| 9918 | char mz_name[RTE_MEMZONE_NAMESIZE]; |
| 9919 | const struct rte_memzone *memzone; |
| 9920 | void *ext_buf_addr = NULL; |
| 9921 | rte_iova_t buf_iova; |
| 9922 | bool freed = false; |
| 9923 | uint16_t buf_len; |
| 9924 | |
| 9925 | buf_len = RTE_ALIGN_CEIL(data_len + 1024 + |
| 9926 | sizeof(struct rte_mbuf_ext_shared_info), 8); |
| 9927 | |
| 9928 | snprintf(mz_name, RTE_MEMZONE_NAMESIZE, "ext_buf_%d", i); |
| 9929 | memzone = rte_memzone_lookup(mz_name); |
| 9930 | if (memzone != NULL && memzone->len != buf_len) { |
| 9931 | rte_memzone_free(memzone); |
| 9932 | memzone = NULL; |
| 9933 | } |
| 9934 | if (memzone == NULL) { |
| 9935 | memzone = rte_memzone_reserve_aligned(mz_name, buf_len, SOCKET_ID_ANY, |
| 9936 | RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE); |
| 9937 | if (memzone == NULL) { |
| 9938 | printf("Can't allocate memory zone %s\n", mz_name); |
| 9939 | return NULL; |
| 9940 | } |
| 9941 | } |
| 9942 | |
| 9943 | ext_buf_addr = memzone->addr; |
| 9944 | memcpy(ext_buf_addr, RTE_PTR_ADD(input_text, data_off), data_len); |
| 9945 | |
| 9946 | /* Create buffer to hold rte_mbuf header */ |
| 9947 | m = rte_pktmbuf_alloc(mbuf_pool); |
no test coverage detected