Use stored packet pool segment length (pool_t.seg_len) instead of a define.
This enables creating packet pools with different segment sizes.

Signed-off-by: Matias Elo <[email protected]>
---
 platform/linux-generic/odp_packet.c   | 58 +++++++++++++++++------------------
 platform/linux-generic/pktio/netmap.c |  2 +-
 2 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/platform/linux-generic/odp_packet.c 
b/platform/linux-generic/odp_packet.c
index e715970..a8d61d2 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -21,9 +21,6 @@
 #include <stdio.h>
 #include <inttypes.h>
 
-/* Initial packet segment data length */
-#define BASE_LEN  CONFIG_PACKET_MAX_SEG_LEN
-
 #include <odp/visibility_begin.h>
 
 /* Fill in packet header field offsets for inline functions */
@@ -244,6 +241,7 @@ void packet_parse_reset(odp_packet_hdr_t *pkt_hdr)
 static inline void packet_init(odp_packet_hdr_t *pkt_hdr, uint32_t len,
                               int parse)
 {
+       pool_t *pool = pool_entry_from_hdl(pkt_hdr->buf_hdr.pool_hdl);
        uint32_t seg_len;
        int num = pkt_hdr->buf_hdr.segcount;
 
@@ -251,7 +249,7 @@ static inline void packet_init(odp_packet_hdr_t *pkt_hdr, 
uint32_t len,
                seg_len = len;
                pkt_hdr->buf_hdr.seg[0].len = len;
        } else {
-               seg_len = len - ((num - 1) * CONFIG_PACKET_MAX_SEG_LEN);
+               seg_len = len - ((num - 1) * pool->seg_len);
 
                /* Last segment data length */
                pkt_hdr->buf_hdr.seg[num - 1].len = seg_len;
@@ -277,8 +275,7 @@ static inline void packet_init(odp_packet_hdr_t *pkt_hdr, 
uint32_t len,
        */
        pkt_hdr->frame_len = len;
        pkt_hdr->headroom  = CONFIG_PACKET_HEADROOM;
-       pkt_hdr->tailroom  = CONFIG_PACKET_MAX_SEG_LEN - seg_len +
-                            CONFIG_PACKET_TAILROOM;
+       pkt_hdr->tailroom  = pool->seg_len - seg_len + CONFIG_PACKET_TAILROOM;
 
        pkt_hdr->input = ODP_PKTIO_INVALID;
 }
@@ -286,13 +283,14 @@ static inline void packet_init(odp_packet_hdr_t *pkt_hdr, 
uint32_t len,
 static inline void init_segments(odp_packet_hdr_t *pkt_hdr[], int num)
 {
        odp_packet_hdr_t *hdr;
+       pool_t *pool = pool_entry_from_hdl(pkt_hdr[0]->buf_hdr.pool_hdl);
        int i;
 
        /* First segment is the packet descriptor */
        hdr = pkt_hdr[0];
 
        hdr->buf_hdr.seg[0].data = hdr->buf_hdr.base_data;
-       hdr->buf_hdr.seg[0].len  = BASE_LEN;
+       hdr->buf_hdr.seg[0].len  = pool->seg_len;
 
        /* Link segments */
        if (CONFIG_PACKET_MAX_SEGS != 1) {
@@ -305,28 +303,26 @@ static inline void init_segments(odp_packet_hdr_t 
*pkt_hdr[], int num)
                                buf_hdr = &pkt_hdr[i]->buf_hdr;
                                hdr->buf_hdr.seg[i].hdr  = buf_hdr;
                                hdr->buf_hdr.seg[i].data = buf_hdr->base_data;
-                               hdr->buf_hdr.seg[i].len  = BASE_LEN;
+                               hdr->buf_hdr.seg[i].len  = pool->seg_len;
                        }
                }
        }
 }
 
 /* Calculate the number of segments */
-static inline int num_segments(uint32_t len)
+static inline int num_segments(uint32_t len, uint32_t seg_len)
 {
-       uint32_t max_seg_len;
        int num;
 
        if (CONFIG_PACKET_MAX_SEGS == 1)
                return 1;
 
        num = 1;
-       max_seg_len = CONFIG_PACKET_MAX_SEG_LEN;
 
-       if (odp_unlikely(len > max_seg_len)) {
-               num = len / max_seg_len;
+       if (odp_unlikely(len > seg_len)) {
+               num = len / seg_len;
 
-               if (odp_likely((num * max_seg_len) != len))
+               if (odp_likely((num * seg_len) != len))
                        num += 1;
        }
 
@@ -530,7 +526,7 @@ int packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len,
        pool_t *pool = pool_entry_from_hdl(pool_hdl);
        int num, num_seg;
 
-       num_seg = num_segments(len);
+       num_seg = num_segments(len, pool->seg_len);
        num     = packet_alloc(pool, len, max_num, num_seg, pkt, 1);
 
        return num;
@@ -550,7 +546,7 @@ odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t 
len)
        if (odp_unlikely(len > pool->max_len))
                return ODP_PACKET_INVALID;
 
-       num_seg = num_segments(len);
+       num_seg = num_segments(len, pool->seg_len);
        num     = packet_alloc(pool, len, 1, num_seg, &pkt, 0);
 
        if (odp_unlikely(num == 0))
@@ -573,7 +569,7 @@ int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t 
len,
        if (odp_unlikely(len > pool->max_len))
                return -1;
 
-       num_seg = num_segments(len);
+       num_seg = num_segments(len, pool->seg_len);
        num     = packet_alloc(pool, len, max_num, num_seg, pkt, 0);
 
        return num;
@@ -721,10 +717,11 @@ static inline uint32_t pack_seg_head(odp_packet_hdr_t 
*pkt_hdr, int seg)
 
 static inline uint32_t pack_seg_tail(odp_packet_hdr_t *pkt_hdr, int seg)
 {
+       pool_t *pool = pool_entry_from_hdl(pkt_hdr->buf_hdr.pool_hdl);
        odp_buffer_hdr_t *hdr = pkt_hdr->buf_hdr.seg[seg].hdr;
        uint32_t len = pkt_hdr->buf_hdr.seg[seg].len;
        uint8_t *src = pkt_hdr->buf_hdr.seg[seg].data;
-       uint8_t *dst = hdr->base_data + BASE_LEN - len;
+       uint8_t *dst = hdr->base_data + pool->seg_len - len;
 
        if (dst != src) {
                memmove(dst, src, len);
@@ -791,6 +788,7 @@ static inline uint32_t fill_seg_tail(odp_packet_hdr_t 
*pkt_hdr, int dst_seg,
 
 static inline int move_data_to_head(odp_packet_hdr_t *pkt_hdr, int segs)
 {
+       pool_t *pool = pool_entry_from_hdl(pkt_hdr->buf_hdr.pool_hdl);
        int dst_seg, src_seg;
        uint32_t len, free_len;
        uint32_t moved = 0;
@@ -799,10 +797,10 @@ static inline int move_data_to_head(odp_packet_hdr_t 
*pkt_hdr, int segs)
                len    = pack_seg_head(pkt_hdr, dst_seg);
                moved += len;
 
-               if (len == BASE_LEN)
+               if (len == pool->seg_len)
                        continue;
 
-               free_len = BASE_LEN - len;
+               free_len = pool->seg_len - len;
 
                for (src_seg = dst_seg + 1; CONFIG_PACKET_MAX_SEGS > 1 &&
                     src_seg < segs; src_seg++) {
@@ -829,6 +827,7 @@ static inline int move_data_to_head(odp_packet_hdr_t 
*pkt_hdr, int segs)
 
 static inline int move_data_to_tail(odp_packet_hdr_t *pkt_hdr, int segs)
 {
+       pool_t *pool = pool_entry_from_hdl(pkt_hdr->buf_hdr.pool_hdl);
        int dst_seg, src_seg;
        uint32_t len, free_len;
        uint32_t moved = 0;
@@ -837,10 +836,10 @@ static inline int move_data_to_tail(odp_packet_hdr_t 
*pkt_hdr, int segs)
                len    = pack_seg_tail(pkt_hdr, dst_seg);
                moved += len;
 
-               if (len == BASE_LEN)
+               if (len == pool->seg_len)
                        continue;
 
-               free_len = BASE_LEN - len;
+               free_len = pool->seg_len - len;
 
                for (src_seg = dst_seg - 1; src_seg >= 0; src_seg--) {
                        len = fill_seg_tail(pkt_hdr, dst_seg, src_seg,
@@ -866,6 +865,7 @@ static inline int move_data_to_tail(odp_packet_hdr_t 
*pkt_hdr, int segs)
 
 static inline void reset_seg(odp_packet_hdr_t *pkt_hdr, int first, int num)
 {
+       pool_t *pool = pool_entry_from_hdl(pkt_hdr->buf_hdr.pool_hdl);
        odp_buffer_hdr_t *hdr;
        void *base;
        int i;
@@ -873,7 +873,7 @@ static inline void reset_seg(odp_packet_hdr_t *pkt_hdr, int 
first, int num)
        for (i = first; i < first + num; i++) {
                hdr  = pkt_hdr->buf_hdr.seg[i].hdr;
                base = hdr->base_data;
-               pkt_hdr->buf_hdr.seg[i].len  = BASE_LEN;
+               pkt_hdr->buf_hdr.seg[i].len  = pool->seg_len;
                pkt_hdr->buf_hdr.seg[i].data = base;
        }
 }
@@ -894,7 +894,7 @@ int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len,
                if (odp_unlikely((frame_len + len) > pool->max_len))
                        return -1;
 
-               num  = num_segments(len - headroom);
+               num  = num_segments(len - headroom, pool->seg_len);
                segs = pkt_hdr->buf_hdr.segcount;
 
                if (odp_unlikely((segs + num) > CONFIG_PACKET_MAX_SEGS)) {
@@ -904,7 +904,7 @@ int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len,
                        int free_segs = 0;
                        uint32_t offset;
 
-                       num = num_segments(frame_len + len);
+                       num = num_segments(frame_len + len, pool->seg_len);
 
                        if (num > segs) {
                                /* Allocate additional segments */
@@ -942,7 +942,7 @@ int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len,
                        }
 
                        frame_len += len;
-                       offset = (segs * BASE_LEN) - frame_len;
+                       offset = (segs * pool->seg_len) - frame_len;
 
                        pkt_hdr->buf_hdr.seg[0].data += offset;
                        pkt_hdr->buf_hdr.seg[0].len  -= offset;
@@ -1060,7 +1060,7 @@ int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t 
len,
                if (odp_unlikely((frame_len + len) > pool->max_len))
                        return -1;
 
-               num  = num_segments(len - tailroom);
+               num  = num_segments(len - tailroom, pool->seg_len);
                segs = pkt_hdr->buf_hdr.segcount;
 
                if (odp_unlikely((segs + num) > CONFIG_PACKET_MAX_SEGS)) {
@@ -1070,7 +1070,7 @@ int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t 
len,
                        int free_segs = 0;
                        uint32_t offset;
 
-                       num = num_segments(frame_len + len);
+                       num = num_segments(frame_len + len, pool->seg_len);
 
                        if (num > segs) {
                                /* Allocate additional segments */
@@ -1100,7 +1100,7 @@ int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t 
len,
                        }
 
                        frame_len += len;
-                       offset     = (segs * BASE_LEN) - frame_len;
+                       offset     = (segs * pool->seg_len) - frame_len;
 
                        pkt_hdr->buf_hdr.seg[segs - 1].len -= offset;
 
diff --git a/platform/linux-generic/pktio/netmap.c 
b/platform/linux-generic/pktio/netmap.c
index ae3db34..1bffa6d 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -348,7 +348,7 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, 
pktio_entry_t *pktio_entry,
        pkt_nm->pool = pool;
 
        /* max frame len taking into account the l2-offset */
-       pkt_nm->max_frame_len = CONFIG_PACKET_MAX_SEG_LEN;
+       pkt_nm->max_frame_len = pool_entry_from_hdl(pool)->max_len;
 
        /* allow interface to be opened with or without the 'netmap:' prefix */
        prefix = "netmap:";
-- 
2.7.4

Reply via email to