Skip to content

Commit

Permalink
Free the defer data in case of errors
Browse files Browse the repository at this point in the history
To make sure that we flush all the packets that are queued in a flow
entry, we run a defer function. If for any reason this defer was not
scheduled (because the function was called with no hold queue), the
defer data has to be freed.

Change-Id: Ideabe252ff6c56c6e01ccbc3a27044bac09933f3
Closes-BUG: #1436798
  • Loading branch information
anandhk-juniper committed Apr 23, 2015
1 parent 294d9cc commit 311b48c
Showing 1 changed file with 24 additions and 6 deletions.
30 changes: 24 additions & 6 deletions dp-core/vr_flow.c
Expand Up @@ -107,7 +107,7 @@ vr_valid_link_local_port(struct vrouter *router, int family,
if (proto == VR_IP_PROTO_UDP)
tmp += (router->vr_link_local_ports_size * 8 / 2);

data = router->vr_link_local_ports[(tmp /8)];
data = router->vr_link_local_ports[(tmp / 8)];
if (data & (1 << (tmp % 8)))
return true;

Expand All @@ -118,7 +118,6 @@ static void
vr_clear_link_local_port(struct vrouter *router, int family,
int proto, int port)
{

unsigned char *data;
unsigned int tmp;

Expand All @@ -136,15 +135,16 @@ vr_clear_link_local_port(struct vrouter *router, int family,
if (proto == VR_IP_PROTO_UDP)
tmp += (router->vr_link_local_ports_size * 8 / 2);

data = &router->vr_link_local_ports[(tmp /8)];
data = &router->vr_link_local_ports[(tmp / 8)];
*data &= (~(1 << (tmp % 8)));

return;
}

static void
vr_set_link_local_port(struct vrouter *router, int family,
int proto, int port)
{

unsigned char *data;
unsigned int tmp;

Expand All @@ -162,8 +162,10 @@ vr_set_link_local_port(struct vrouter *router, int family,
if (proto == VR_IP_PROTO_UDP)
tmp += (router->vr_link_local_ports_size * 8 / 2);

data = &router->vr_link_local_ports[tmp /8];
data = &router->vr_link_local_ports[tmp / 8];
*data |= (1 << (tmp % 8));

return;
}

static void
Expand Down Expand Up @@ -201,7 +203,13 @@ vr_reset_flow_entry(struct vrouter *router, struct vr_flow_entry *fe,
unsigned int index)
{
memset(&fe->fe_stats, 0, sizeof(fe->fe_stats));
memset(&fe->fe_hold_list, 0, sizeof(fe->fe_hold_list));;

if (fe->fe_hold_list) {
vr_printf("vrouter: Potential memory leak @ %s:%d\n",
__FILE__, __LINE__);
}
fe->fe_hold_list = NULL;

fe->fe_key.key_len = 0;
fe->fe_type = VP_TYPE_NULL;
memset(&fe->fe_key, 0, sizeof(fe->fe_key));
Expand Down Expand Up @@ -322,6 +330,7 @@ vr_flow_queue_free_defer(struct vr_flow_md *flmd, struct vr_flow_queue *vfq)

vdd->vdd_data = (void *)vfq;
vr_defer(flmd->flmd_router, vr_flow_queue_free, (void *)vdd);
flmd->flmd_defer_data = NULL;

return;
}
Expand Down Expand Up @@ -913,6 +922,11 @@ vr_flow_flush(void *arg)
}

exit_flush:
if (flmd->flmd_defer_data) {
vr_put_defer_data(flmd->flmd_defer_data);
flmd->flmd_defer_data = NULL;
}

vr_free(flmd);

return;
Expand Down Expand Up @@ -1518,6 +1532,8 @@ vr_link_local_ports_reset(struct vrouter *router)
memset(router->vr_link_local_ports,
0, router->vr_link_local_ports_size);
}

return;
}

static void
Expand All @@ -1528,6 +1544,8 @@ vr_link_local_ports_exit(struct vrouter *router)
router->vr_link_local_ports = NULL;
router->vr_link_local_ports_size = 0;
}

return;
}

static int
Expand Down

0 comments on commit 311b48c

Please sign in to comment.