git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mbuf: switch vlan_tci and reserved2 fields
[dpdk.git]
/
lib
/
librte_ip_frag
/
rte_ipv4_fragmentation.c
diff --git
a/lib/librte_ip_frag/rte_ipv4_fragmentation.c
b/lib/librte_ip_frag/rte_ipv4_fragmentation.c
index
46ed583
..
a4ed923
100644
(file)
--- a/
lib/librte_ip_frag/rte_ipv4_fragmentation.c
+++ b/
lib/librte_ip_frag/rte_ipv4_fragmentation.c
@@
-32,24
+32,14
@@
*/
#include <stddef.h>
*/
#include <stddef.h>
-#include <stdint.h>
#include <errno.h>
#include <errno.h>
-#include <rte_byteorder.h>
#include <rte_memcpy.h>
#include <rte_mempool.h>
#include <rte_debug.h>
#include <rte_memcpy.h>
#include <rte_mempool.h>
#include <rte_debug.h>
-#include <rte_mbuf.h>
-#include <rte_ip.h>
-#include "rte_ip_frag.h"
#include "ip_frag_common.h"
#include "ip_frag_common.h"
-/*
- * MAX number of fragments per packet allowed.
- */
-#define IPV4_MAX_FRAGS_PER_PACKET 0x80
-
/* Fragment Offset */
#define IPV4_HDR_DF_SHIFT 14
#define IPV4_HDR_MF_SHIFT 13
/* Fragment Offset */
#define IPV4_HDR_DF_SHIFT 14
#define IPV4_HDR_MF_SHIFT 13
@@
-101,7
+91,7
@@
static inline void __free_fragments(struct rte_mbuf *mb[], uint32_t num)
* Otherwise - (-1) * <errno>.
*/
int32_t
* Otherwise - (-1) * <errno>.
*/
int32_t
-rte_ipv4_fragment
ation
(struct rte_mbuf *pkt_in,
+rte_ipv4_fragment
_packet
(struct rte_mbuf *pkt_in,
struct rte_mbuf **pkts_out,
uint16_t nb_pkts_out,
uint16_t mtu_size,
struct rte_mbuf **pkts_out,
uint16_t nb_pkts_out,
uint16_t mtu_size,
@@
-117,13
+107,9
@@
rte_ipv4_fragmentation(struct rte_mbuf *pkt_in,
frag_size = (uint16_t)(mtu_size - sizeof(struct ipv4_hdr));
/* Fragment size should be a multiply of 8. */
frag_size = (uint16_t)(mtu_size - sizeof(struct ipv4_hdr));
/* Fragment size should be a multiply of 8. */
- RTE_IP_FRAG_ASSERT((frag_size & IPV4_HDR_FO_MASK) == 0);
-
- /* Fragment size should be a multiply of 8. */
- RTE_IP_FRAG_ASSERT(IPV4_MAX_FRAGS_PER_PACKET * frag_size >=
- (uint16_t)(pkt_in->pkt.pkt_len - sizeof(struct ipv4_hdr)));
+ IP_FRAG_ASSERT((frag_size & IPV4_HDR_FO_MASK) == 0);
- in_hdr =
(struct ipv4_hdr *) pkt_in->pkt.data
;
+ in_hdr =
rte_pktmbuf_mtod(pkt_in, struct ipv4_hdr *)
;
flag_offset = rte_cpu_to_be_16(in_hdr->fragment_offset);
/* If Don't Fragment flag is set */
flag_offset = rte_cpu_to_be_16(in_hdr->fragment_offset);
/* If Don't Fragment flag is set */
@@
-132,7
+118,7
@@
rte_ipv4_fragmentation(struct rte_mbuf *pkt_in,
/* Check that pkts_out is big enough to hold all fragments */
if (unlikely(frag_size * nb_pkts_out <
/* Check that pkts_out is big enough to hold all fragments */
if (unlikely(frag_size * nb_pkts_out <
- (uint16_t)(pkt_in->pkt
.pkt
_len - sizeof (struct ipv4_hdr))))
+ (uint16_t)(pkt_in->pkt_len - sizeof (struct ipv4_hdr))))
return -EINVAL;
in_seg = pkt_in;
return -EINVAL;
in_seg = pkt_in;
@@
-154,8
+140,8
@@
rte_ipv4_fragmentation(struct rte_mbuf *pkt_in,
}
/* Reserve space for the IP header that will be built later */
}
/* Reserve space for the IP header that will be built later */
- out_pkt->
pkt.
data_len = sizeof(struct ipv4_hdr);
- out_pkt->pkt
.pkt
_len = sizeof(struct ipv4_hdr);
+ out_pkt->data_len = sizeof(struct ipv4_hdr);
+ out_pkt->pkt_len = sizeof(struct ipv4_hdr);
out_seg_prev = out_pkt;
more_out_segs = 1;
out_seg_prev = out_pkt;
more_out_segs = 1;
@@
-170,29
+156,29
@@
rte_ipv4_fragmentation(struct rte_mbuf *pkt_in,
__free_fragments(pkts_out, out_pkt_pos);
return -ENOMEM;
}
__free_fragments(pkts_out, out_pkt_pos);
return -ENOMEM;
}
- out_seg_prev->
pkt.
next = out_seg;
+ out_seg_prev->next = out_seg;
out_seg_prev = out_seg;
/* Prepare indirect buffer */
rte_pktmbuf_attach(out_seg, in_seg);
out_seg_prev = out_seg;
/* Prepare indirect buffer */
rte_pktmbuf_attach(out_seg, in_seg);
- len = mtu_size - out_pkt->pkt
.pkt
_len;
- if (len > (in_seg->
pkt.
data_len - in_seg_data_pos)) {
- len = in_seg->
pkt.
data_len - in_seg_data_pos;
+ len = mtu_size - out_pkt->pkt_len;
+ if (len > (in_seg->data_len - in_seg_data_pos)) {
+ len = in_seg->data_len - in_seg_data_pos;
}
}
- out_seg->
pkt.data = (char*) in_seg->pkt.data + (uint16_t)
in_seg_data_pos;
- out_seg->
pkt.
data_len = (uint16_t)len;
- out_pkt->pkt
.pkt
_len = (uint16_t)(len +
- out_pkt->pkt
.pkt
_len);
- out_pkt->
pkt.
nb_segs += 1;
+ out_seg->
data_off = in_seg->data_off +
in_seg_data_pos;
+ out_seg->data_len = (uint16_t)len;
+ out_pkt->pkt_len = (uint16_t)(len +
+ out_pkt->pkt_len);
+ out_pkt->nb_segs += 1;
in_seg_data_pos += len;
/* Current output packet (i.e. fragment) done ? */
in_seg_data_pos += len;
/* Current output packet (i.e. fragment) done ? */
- if (unlikely(out_pkt->pkt
.pkt
_len >= mtu_size))
+ if (unlikely(out_pkt->pkt_len >= mtu_size))
more_out_segs = 0;
/* Current input segment done ? */
more_out_segs = 0;
/* Current input segment done ? */
- if (unlikely(in_seg_data_pos == in_seg->
pkt.
data_len)) {
- in_seg = in_seg->
pkt.
next;
+ if (unlikely(in_seg_data_pos == in_seg->data_len)) {
+ in_seg = in_seg->next;
in_seg_data_pos = 0;
if (unlikely(in_seg == NULL))
in_seg_data_pos = 0;
if (unlikely(in_seg == NULL))
@@
-202,17
+188,17
@@
rte_ipv4_fragmentation(struct rte_mbuf *pkt_in,
/* Build the IP header */
/* Build the IP header */
- out_hdr =
(struct ipv4_hdr*) out_pkt->pkt.data
;
+ out_hdr =
rte_pktmbuf_mtod(out_pkt, struct ipv4_hdr *)
;
__fill_ipv4hdr_frag(out_hdr, in_hdr,
__fill_ipv4hdr_frag(out_hdr, in_hdr,
- (uint16_t)out_pkt->pkt
.pkt
_len,
+ (uint16_t)out_pkt->pkt_len,
flag_offset, fragment_offset, more_in_segs);
fragment_offset = (uint16_t)(fragment_offset +
flag_offset, fragment_offset, more_in_segs);
fragment_offset = (uint16_t)(fragment_offset +
- out_pkt->pkt
.pkt
_len - sizeof(struct ipv4_hdr));
+ out_pkt->pkt_len - sizeof(struct ipv4_hdr));
out_pkt->ol_flags |= PKT_TX_IP_CKSUM;
out_pkt->ol_flags |= PKT_TX_IP_CKSUM;
- out_pkt->
pkt.vlan_macip.f.
l3_len = sizeof(struct ipv4_hdr);
+ out_pkt->l3_len = sizeof(struct ipv4_hdr);
/* Write the fragment to the output list */
pkts_out[out_pkt_pos] = out_pkt;
/* Write the fragment to the output list */
pkts_out[out_pkt_pos] = out_pkt;