Skip to content

Commit

Permalink
If packet clone needs to be modified, create a copy of the DPDK mbuf.
Browse files Browse the repository at this point in the history
Change-Id: Icfad13451bffd37c8d2a786c43c28243e41e6e1c
Closes-BUG: 1630772
  • Loading branch information
srajag committed Oct 19, 2016
1 parent 5bb795b commit 29d3886
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 8 deletions.
2 changes: 1 addition & 1 deletion dp-core/vr_flow.c
Expand Up @@ -777,7 +777,7 @@ vr_flow_action(struct vrouter *router, struct vr_flow_entry *fe,
pkt_clone = vr_pclone(pkt);
if (pkt_clone) {
vr_preset(pkt_clone);
if (vr_pcow(pkt_clone, sizeof(struct vr_eth) +
if (vr_pcow(&pkt_clone, sizeof(struct vr_eth) +
sizeof(struct agent_hdr))) {
vr_pfree(pkt_clone, VP_DROP_PCOW_FAIL);
} else {
Expand Down
4 changes: 2 additions & 2 deletions dp-core/vr_mirror.c
Expand Up @@ -437,7 +437,7 @@ vr_mirror(struct vrouter *router, uint8_t mirror_id,
if (pkt_nh->nh_family == AF_INET)
clone_len += pkt_nh->nh_encap_len;

if (vr_pcow(pkt, clone_len))
if (vr_pcow(&pkt, clone_len))
goto fail;
clone_len = 0;

Expand All @@ -454,7 +454,7 @@ vr_mirror(struct vrouter *router, uint8_t mirror_id,
vr_preset(pkt);

if (clone_len) {
if (vr_pcow(pkt, clone_len))
if (vr_pcow(&pkt, clone_len))
goto fail;
}

Expand Down
2 changes: 1 addition & 1 deletion dp-core/vr_nexthop.c
Expand Up @@ -527,7 +527,7 @@ nh_mcast_clone(struct vr_packet *pkt, unsigned short head_room)
}

/* Increase the head space by the head_room */
if (vr_pcow(clone_pkt, head_room)) {
if (vr_pcow(&clone_pkt, head_room)) {
vr_pfree(clone_pkt, VP_DROP_PCOW_FAIL);
return NULL;
}
Expand Down
24 changes: 23 additions & 1 deletion dpdk/vr_dpdk_host.c
Expand Up @@ -685,9 +685,31 @@ dpdk_pheader_pointer(struct vr_packet *pkt, unsigned short hdr_len, void *buf)

/* VRouter callback */
static int
dpdk_pcow(struct vr_packet *pkt, unsigned short head_room)
dpdk_pcow(struct vr_packet **pktp, unsigned short head_room)
{
struct vr_packet *pkt = *pktp;
struct rte_mbuf *mbuf = vr_dpdk_pkt_to_mbuf(pkt);
struct rte_mbuf *m_copy;
struct vr_packet *p_copy;

/*
* If this is an indirect mbuf, allocate a new mbuf and copy
* its data. Then free the original mbuf.
*/
if (RTE_MBUF_INDIRECT(mbuf)) {
m_copy = vr_dpdk_pktmbuf_copy(mbuf, mbuf->pool);
if (!m_copy) {
return -ENOMEM;
}

p_copy = vr_dpdk_mbuf_to_pkt(m_copy);
*p_copy = *pkt;
p_copy->vp_head = m_copy->buf_addr;

rte_pktmbuf_free(mbuf);
mbuf = m_copy;
*pktp = p_copy;
}

if (head_room > rte_pktmbuf_headroom(mbuf)) {
return -ENOMEM;
Expand Down
2 changes: 1 addition & 1 deletion freebsd/vrouter_mod.c
Expand Up @@ -481,7 +481,7 @@ fh_pheader_pointer(struct vr_packet *pkt, unsigned short hdr_len, void *buf)
}

static int
fh_pcow(struct vr_packet *pkt, unsigned short head_room)
fh_pcow(struct vr_packet **pkt, unsigned short head_room)
{

vr_log(VR_ERR, "%s: not implemented\n", __func__);
Expand Down
2 changes: 1 addition & 1 deletion include/vrouter.h
Expand Up @@ -179,7 +179,7 @@ struct host_os {
unsigned short, unsigned short *,
int (*is_label_l2)(unsigned int,
unsigned int, unsigned short *));
int (*hos_pcow)(struct vr_packet *, unsigned short);
int (*hos_pcow)(struct vr_packet **, unsigned short);
uint16_t (*hos_get_udp_src_port)(struct vr_packet *,
struct vr_forwarding_md *,
unsigned short);
Expand Down
3 changes: 2 additions & 1 deletion linux/vrouter_mod.c
Expand Up @@ -552,10 +552,11 @@ lh_put_defer_data(void *data)
}

static int
lh_pcow(struct vr_packet *pkt, unsigned short head_room)
lh_pcow(struct vr_packet **pktp, unsigned short head_room)
{
unsigned int old_off, new_off;
int data_off = 0;
struct vr_packet *pkt = *pktp;

struct sk_buff *skb = vp_os_packet(pkt);

Expand Down

0 comments on commit 29d3886

Please sign in to comment.